/// <summary> /// 通过ID数组提取出所有要素 /// </summary> /// <param name="dzLine"></param> /// <param name="pdLing"></param> /// <param name="savePath"></param> public static void selectFeat(string dzLine, string pdLing, string savePath) { //获得数组 int[] a = getMinIdGroup(dzLine, pdLing); OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); //读取原Layer OSGeo.OGR.DataSource dzDS = dr.Open(dzLine, 0); OSGeo.OGR.Layer dzLayer = dzDS.GetLayerByIndex(0); //新建Layer if (System.IO.File.Exists(savePath)) { System.IO.File.Delete(savePath); } OSGeo.OGR.DataSource ds = dr.CreateDataSource(savePath, null); OSGeo.OGR.Layer fileLayer = ds.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbPolygon, null); //get featuer by ID for (int i = 0; i < a.Length; i++) { OSGeo.OGR.Feature dzFeat = dzLayer.GetFeature(a[i]); OSGeo.OGR.Geometry dzGeom = dzFeat.GetGeometryRef(); OSGeo.OGR.Geometry fileGeom = dzGeom; OSGeo.OGR.Feature fileFeat = new OSGeo.OGR.Feature(dzFeat.GetDefnRef()); fileFeat.SetGeometry(fileGeom); fileLayer.CreateFeature(dzFeat); } fileLayer.Dispose(); ds.Dispose(); dzDS.Dispose(); }
/************************************ 生成等值线 **********************************************/ public static string dzx(string filePath) { Console.WriteLine("开始创建等值线!"); OSGeo.OGR.Ogr.RegisterAll(); OSGeo.GDAL.Gdal.AllRegister(); //无效值 double noDataValue; //0不使用无效值,1使用无效值 int hasDataValue; //读入数据源 OSGeo.GDAL.Dataset inData = OSGeo.GDAL.Gdal.Open(filePath, OSGeo.GDAL.Access.GA_ReadOnly); //分析数据源 inData.GetRasterBand(1).GetNoDataValue(out noDataValue, out hasDataValue); double min, max, mean, std; inData.GetRasterBand(1).GetStatistics(0, 1, out min, out max, out mean, out std); int jianG = 2; int count = Convert.ToInt32((max - min) / jianG + 0.5); double[] shu = new double[count]; for (int i = 0; i < count; i++) { shu[i] = min + jianG * i; } //创建空的SHP OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); string a = StaticTools.tempFilePath("shp", "原始等值线"); OSGeo.OGR.DataSource ds = dr.CreateDataSource(a, null); OSGeo.OGR.Layer dzxLayer = ds.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbMultiLineString, null); OSGeo.OGR.FieldDefn fieldDf0 = new OSGeo.OGR.FieldDefn("LID", OSGeo.OGR.FieldType.OFTInteger); OSGeo.OGR.FieldDefn fieldDf1 = new OSGeo.OGR.FieldDefn("EVE", OSGeo.OGR.FieldType.OFTReal); dzxLayer.CreateField(fieldDf0, 1); //ID dzxLayer.CreateField(fieldDf1, 1); //Value //Band(1), 间隔, 起始高度, 分段数量, 分段值数组, 是否有无效值, 无效值, 预置图层. ID字段, 高度值字段, null , null OSGeo.GDAL.Gdal.ContourGenerate(inData.GetRasterBand(1), jianG, min, count, shu, hasDataValue, noDataValue, dzxLayer, 0, 1, null, null); if (dzxLayer.GetFeatureCount(0) > 0) { Console.WriteLine("等值线创建完成!"); } else { Console.WriteLine("等值线创建失败!"); } ds.Dispose(); inData.Dispose(); return(a); }
//返回值是函数的系数 //例如:y=a0+a1*x 返回值则为a0 a1 //例如:y=a0+a1*x+a2*x*x 返回值则为a0 a1 a2 #endregion /*************************************************************************************************/ /************************************ 生成等值线 **********************************************/ public static string dzxPath(string filePath) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.GDAL.Gdal.AllRegister(); //无效值 double noDataValue; //0不使用无效值,1使用无效值 int hasDataValue; //读入数据源 OSGeo.GDAL.Dataset inData = OSGeo.GDAL.Gdal.Open(filePath, OSGeo.GDAL.Access.GA_ReadOnly); //分析数据源 inData.GetRasterBand(1).GetNoDataValue(out noDataValue, out hasDataValue); double min, max, mean, std; inData.GetRasterBand(1).GetStatistics(0, 1, out min, out max, out mean, out std); int jianG = 2; int count = Convert.ToInt32((max - min) / jianG + 0.5); double[] shu = new double[count]; for (int i = 0; i < count; i++) { shu[i] = min + jianG * i; } //创建空的SHP string dzSavePath = filePath.Substring(0, filePath.LastIndexOf(".")) + "_dzx.shp"; OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); if (System.IO.File.Exists(dzSavePath)) { System.IO.File.Delete(dzSavePath); } OSGeo.OGR.DataSource ds = dr.CreateDataSource(dzSavePath, null); OSGeo.OGR.Layer dzxLayer = ds.CreateLayer("等值线", null, OSGeo.OGR.wkbGeometryType.wkbMultiLineString, null); OSGeo.OGR.FieldDefn fieldDf0 = new OSGeo.OGR.FieldDefn("LID", OSGeo.OGR.FieldType.OFTInteger); OSGeo.OGR.FieldDefn fieldDf1 = new OSGeo.OGR.FieldDefn("EVE", OSGeo.OGR.FieldType.OFTReal); dzxLayer.CreateField(fieldDf0, 1); //ID dzxLayer.CreateField(fieldDf1, 1); //Value //Band(1), 间隔, 起始高度, 分段数量, 分段值数组, 是否有无效值, 无效值, 预置图层. ID字段, 高度值字段, null , null OSGeo.GDAL.Gdal.ContourGenerate(inData.GetRasterBand(1), jianG, min, count, shu, hasDataValue, noDataValue, dzxLayer, 0, 1, null, null); dzxLayer.Dispose(); ds.Dispose(); return(dzSavePath); }
/******************************** 等值线转换为多边形 ***********************************************/ /// <summary> /// 等值线转为POLYGON /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static string dzPoly(string filePath) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); string a = StaticTools.tempFilePath("shp", "等值线POLY"); OSGeo.OGR.DataSource newDS = dr.CreateDataSource(a, null); OSGeo.OGR.Layer polyLayer = newDS.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbPolygon, null); OSGeo.OGR.FieldDefn fieldDf0 = new OSGeo.OGR.FieldDefn("LID", OSGeo.OGR.FieldType.OFTInteger); OSGeo.OGR.FieldDefn fieldDf1 = new OSGeo.OGR.FieldDefn("EVE", OSGeo.OGR.FieldType.OFTReal); polyLayer.CreateField(fieldDf0, 1); //ID polyLayer.CreateField(fieldDf1, 1); //Value OSGeo.OGR.FeatureDefn featDF = new OSGeo.OGR.FeatureDefn(""); Console.WriteLine("开始等值线转POLY!"); OSGeo.OGR.DataSource cleanDS = dr.Open(filePath, 0); OSGeo.OGR.Layer cleanLayer = cleanDS.GetLayerByIndex(0); for (int i = 0; i < cleanLayer.GetFeatureCount(0); i++) { OSGeo.OGR.Feature lineFeat = cleanLayer.GetFeature(i); OSGeo.OGR.Geometry lineGeom = lineFeat.GetGeometryRef(); OSGeo.OGR.Feature polyFeat = new OSGeo.OGR.Feature(featDF); OSGeo.OGR.Geometry polyGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon); OSGeo.OGR.Geometry subGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); int u = lineGeom.GetPointCount(); for (int s = 0; s < u; s++) { double x = lineGeom.GetX(s); double y = lineGeom.GetY(s); double z = lineGeom.GetZ(s); subGeom.AddPoint(x, y, z); } polyGeom.AddGeometry(subGeom); polyFeat.SetGeometry(polyGeom); polyLayer.CreateFeature(polyFeat); lineGeom.Dispose(); polyGeom.Dispose(); subGeom.Dispose(); lineFeat.Dispose(); polyFeat.Dispose(); } cleanLayer.Dispose(); polyLayer.Dispose(); cleanDS.Dispose(); newDS.Dispose(); Console.WriteLine("等值线转POLY完成!"); return(a); }
/// <summary> /// DotSpatial to Ogr at layer level /// </summary> /// <param name="featureSet">DotSpatial IFeatureSet</param> /// <returns>Ogr Layer</returns> public static OSGeo.OGR.Layer DS2OrgLayer(DotSpatial.Data.IFeatureSet featureSet) { using (OSGeo.OGR.Driver driver = OSGeo.OGR.Ogr.GetDriverByName("Memory")) { OSGeo.OGR.DataSource dataSource = driver.CreateDataSource(featureSet.Name, null); OSGeo.OGR.Layer layer = dataSource.CreateLayer("Result", DS2OgrProjection(featureSet.Projection), DS2OgrGeometryType(featureSet.FeatureType), new string[] { }); OSGeo.OGR.FeatureDefn featureDefn = DS2OgrDataTable(featureSet.DataTable); for (int k = 0; k < featureDefn.GetFieldCount(); k++) { layer.CreateField(featureDefn.GetFieldDefn(k), 0); } for (int i = 0; i < featureSet.NumRows(); i++) { DotSpatial.Data.IFeature feature = featureSet.GetFeature(i); OSGeo.OGR.Feature ogrFeature = new OSGeo.OGR.Feature(featureDefn); ogrFeature.SetGeometry(DS2OgrGeometry(feature.Geometry, featureSet)); for (int j = 0; j < feature.DataRow.ItemArray.Length; j++) { #region Set Value to Feature object value = feature.DataRow.ItemArray.GetValue(j); if (value is int) { ogrFeature.SetField(j, (int)value); } else if (value is double) { ogrFeature.SetField(j, (double)value); } else if (value is string) { ogrFeature.SetField(j, (string)value); } else if (value is DateTime) { DateTime dateTime = (DateTime)value; ogrFeature.SetField(j, dateTime.Year, dateTime.Month, dateTime.Day, dateTime.Hour, dateTime.Minute, (float)dateTime.Second, 0); } #endregion } layer.CreateFeature(ogrFeature); } dataSource.FlushCache(); return(layer); } }
/// <summary> /// LineD to shpLine /// </summary> /// <param name="savePath"></param> /// <param name="aLine"></param> public static void LineDtoshpLine(string savePath, LineD aLine) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource ds = dr.CreateDataSource(savePath, null); OSGeo.OGR.Layer fileLayer = ds.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbLineString, null); OSGeo.OGR.FeatureDefn FeatDf = new OSGeo.OGR.FeatureDefn(""); OSGeo.OGR.Feature fileFeat = new OSGeo.OGR.Feature(FeatDf); OSGeo.OGR.Geometry fileGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLineString); fileGeom.AddPoint(aLine.Start.X, aLine.Start.Y, aLine.Start.Z); fileGeom.AddPoint(aLine.End.X, aLine.End.Y, aLine.End.Z); fileFeat.SetGeometry(fileGeom); fileLayer.CreateFeature(fileFeat); fileLayer.Dispose(); ds.Dispose(); }
/// <summary> /// 清理等值线上的点 /// </summary> /// <param name="filePath"></param> public static void claenPoint(string filePath) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); //进来的Layer OSGeo.OGR.DataSource oriDs = dr.Open(filePath, 0); OSGeo.OGR.Layer oriLayer = oriDs.GetLayerByIndex(0); //出去的Layer if (System.IO.File.Exists(filePath.Substring(0, filePath.LastIndexOf(".")) + "_targ.shp")) { // UsefullTools.deleteFiles(filePath.Substring(0, filePath.LastIndexOf(".")) + "_targ.shp"); } OSGeo.OGR.DataSource targDs = dr.CreateDataSource(filePath.Substring(0, filePath.LastIndexOf(".")) + "_targ.shp", null); OSGeo.OGR.Layer targLayer = targDs.CreateLayer("targ", null, OSGeo.OGR.wkbGeometryType.wkbPolygon, null); int featCount = oriLayer.GetFeatureCount(0); for (int i = 0; i < featCount; i++) { ///进来的Featuer OSGeo.OGR.Feature oriFeat = oriLayer.GetFeature(i); ///把一个Featuer转为点数组 OSGeo.OGR.Geometry oriGeom = oriFeat.GetGeometryRef(); OSGeo.OGR.Geometry subGeom = oriGeom.GetGeometryRef(0); int pointCount = subGeom.GetPointCount(); Point[] aFeat = new Point[pointCount]; for (int c = 0; c < pointCount; c++) { aFeat[c].X = subGeom.GetX(c); aFeat[c].Y = subGeom.GetY(c); aFeat[c].Z = subGeom.GetZ(c); } ///调选点方法,得到一个新的Featuer OSGeo.OGR.Feature newFeat = JID(aFeat); if (newFeat != null) { targLayer.CreateFeature(newFeat); } } oriDs.Dispose(); targDs.Dispose(); }
/// <summary> /// Point[] to shpPoint /// </summary> /// <param name="savePath"></param> /// <param name="allFeat"></param> public static void pointGToShpPoint(string savePath, Point[] allFeat) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource ds = dr.CreateDataSource(savePath, null); OSGeo.OGR.Layer fileLayer = ds.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbPoint, null); for (int i = 0; i < allFeat.Length; i++) { OSGeo.OGR.FeatureDefn FeatDf = new OSGeo.OGR.FeatureDefn(""); OSGeo.OGR.Feature fileFeat = new OSGeo.OGR.Feature(FeatDf); OSGeo.OGR.Geometry fileGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint); fileGeom.AddPoint(allFeat[i].X, allFeat[i].Y, allFeat[i].Z); fileFeat.SetGeometry(fileGeom); fileLayer.CreateFeature(fileFeat); } fileLayer.Dispose(); ds.Dispose(); }
/************************************** 清理等值线 *****************************************/ /// <summary> /// 通过线长,值 清理等值线 /// </summary> /// <param name="filePath"></param> public static string cleanDS(string dzx) { Console.WriteLine("开始清理等值线!"); double aue, bzc; _标准差(dzx, out aue, out bzc); double minLength = 50; double maxLength = 2600; double minValue = aue - bzc * 2; double maxValue = aue + bzc * 2; //open dzx OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource dzxDS = dr.Open(dzx, 0); OSGeo.OGR.Layer dzxLayer = dzxDS.GetLayerByIndex(0); //new a shp string cleanline = StaticTools.tempFilePath("shp", "清理后的等值线"); OSGeo.OGR.DataSource newdzxDS = dr.CreateDataSource(cleanline, null); OSGeo.OGR.Layer newdzxLayer = newdzxDS.CreateLayer(dzxLayer.GetName(), dzxLayer.GetSpatialRef(), dzxLayer.GetGeomType(), null); for (int i = 0; i < dzxLayer.GetFeatureCount(0); i++) { OSGeo.OGR.Feature fileFeat = dzxLayer.GetFeature(i); OSGeo.OGR.Geometry fileGeom = fileFeat.GetGeometryRef(); double FeatLength = fileGeom.Length(); bool s1 = FeatLength > minLength && FeatLength < maxLength; double featValue = fileFeat.GetFieldAsDouble("EVE"); bool s2 = featValue > minValue && featValue < maxValue; bool isR = fileGeom.IsRing(); if (s1 && s2 && isR) { newdzxLayer.CreateFeature(fileFeat); } fileFeat.Dispose(); } newdzxDS.Dispose(); dzxDS.Dispose(); Console.WriteLine("清理等值线完成!"); return(cleanline); }
/// <summary> /// List<Point[]> To shpLine /// </summary> /// <param name="savePath"></param> /// <param name="allFeat"></param> public static void pointGtoshpLine(string savePath, List <Point[]> allFeat) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource ds = dr.CreateDataSource(savePath, null); OSGeo.OGR.Layer fileLayer = ds.CreateLayer("", null, OSGeo.OGR.wkbGeometryType.wkbLineString, null); for (int u = 0; u < allFeat.Count; u++) { Point[] a = allFeat[u]; OSGeo.OGR.FeatureDefn FeatDf = new OSGeo.OGR.FeatureDefn(""); OSGeo.OGR.Feature fileFeat = new OSGeo.OGR.Feature(FeatDf); OSGeo.OGR.Geometry fileGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLineString); for (int i = 0; i < a.Length; i++) { fileGeom.AddPoint(a[i].X, a[i].Y, a[i].Z); } fileFeat.SetGeometry(fileGeom); fileLayer.CreateFeature(fileFeat); } fileLayer.Dispose(); ds.Dispose(); }
private void pdfToolStripMenuItem_Click(object sender, EventArgs e) { for (int i = 0; i < mapBox1.Map.Layers.Count; i++) { if (mapBox1.Map.Layers[i].LayerName == SelectedLayer) { var layer = mapBox1.Map.Layers[i] as VectorLayer; var dataSource = layer.DataSource as GeometryFeatureProvider; OSGeo.OGR.Driver driverSH = OSGeo.OGR.Ogr.GetDriverByName("PDF"); var referance = new SpatialReference("PROJCS[\"WGS 84 / Pseudo-Mercator\",GEOGCS[\"WGS 84\",DATUM[\"WGS_1984\",SPHEROID[\"WGS 84\",6378137,298.257223563,AUTHORITY[\"EPSG\",\"7030\"]],AUTHORITY[\"EPSG\",\"6326\"]],PRIMEM[\"Greenwich\",0,AUTHORITY[\"EPSG\",\"8901\"]],UNIT[\"degree\",0.0174532925199433,AUTHORITY[\"EPSG\",\"9122\"]],AUTHORITY[\"EPSG\",\"4326\"]],PROJECTION[\"Mercator_1SP\"],PARAMETER[\"central_meridian\",0],PARAMETER[\"scale_factor\",1],PARAMETER[\"false_easting\",0],PARAMETER[\"false_northing\",0],UNIT[\"metre\",1,AUTHORITY[\"EPSG\",\"9001\"]],AXIS[\"X\",EAST],AXIS[\"Y\",NORTH],EXTENSION[\"PROJ4\",\"+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs\"],AUTHORITY[\"EPSG\",\"3857\"]]"); OSGeo.OGR.DataSource dataSourceSH = driverSH.CreateDataSource(Application.StartupPath + "\\" + SelectedLayer + ".pdf", new string[] { "ENCODING=UTF-16" }); var layerSH = dataSourceSH.CreateLayer("PointLayer", referance, OSGeo.OGR.wkbGeometryType.wkbPoint, new string[] { "ENCODING=UTF-16" }); layerSH.StartTransaction(); for (int k = 0; k < dataSource.Features.Columns.Count; k++) { OSGeo.OGR.FieldDefn field = new OSGeo.OGR.FieldDefn(dataSource.Features.Columns[k].Caption, OSGeo.OGR.FieldType.OFTString); layerSH.CreateField(field, 1); } for (int k = 0; k < dataSource.Features.Rows.Count; k++) { OSGeo.OGR.Feature feature = new OSGeo.OGR.Feature(layerSH.GetLayerDefn()); if (!string.IsNullOrEmpty(dataSource.Features.Rows[k]["geom_wkt"].ToString())) { OSGeo.OGR.Geometry geom = OSGeo.OGR.Geometry.CreateFromWkt(dataSource.Features.Rows[k]["geom_wkt"].ToString()); feature.SetGeometry(geom); } for (int x = 0; x < dataSource.Features.Columns.Count; x++) { var data = dataSource.Features.Rows[k][x].ToString(); feature.SetField(dataSource.Features.Columns[x].Caption, data); } try { layerSH.CreateFeature(feature); feature.Dispose(); } catch (Exception) { } } layerSH.CommitTransaction(); layerSH.SyncToDisk(); layerSH.Dispose(); dataSourceSH.FlushCache(); dataSourceSH.Dispose(); driverSH.Dispose(); } } }
static void Main(string[] args) { OSGeo.GDAL.Gdal.AllRegister(); OSGeo.OGR.Ogr.RegisterAll(); //shp驱动 OSGeo.OGR.Driver shpDataDriver = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); //shp数据源 shpDataSet = shpDataDriver.CreateDataSource(shpSavePath, null); //img驱动 gdalDriver = OSGeo.GDAL.Gdal.GetDriverByName("HFA"); //dsm数据源 dsmDataset = OSGeo.GDAL.Gdal.Open(dsmPath, OSGeo.GDAL.Access.GA_Update); //dsm数据信息 dsmDataset.GetGeoTransform(dsm_Transform); dsm_Xsize = dsmDataset.RasterXSize; dsm_Ysize = dsmDataset.RasterYSize; //投影信息 srs = dsmDataset.GetProjectionRef() == "" ? null : new OSGeo.OSR.SpatialReference(dsmDataset.GetProjectionRef()); Stopwatch aTime = new Stopwatch(); aTime.Start(); //1 坡度图 buildSlope(); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //2 坡度线 OSGeo.OGR.Layer pdx = getPDX(1); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); OSGeo.OGR.Layer slopeCleanLayer = cleanLayer(pdx, 200, 5000); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //3 等高线 OSGeo.OGR.Layer dzx = getDZX_(); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); OSGeo.OGR.Layer dzxPolyLayer = cleanDZX(dzx); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //4 筛选 OSGeo.OGR.Layer selectLayer = selectionFeatuers(slopeCleanLayer, dzxPolyLayer); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); OSGeo.OGR.Layer resLayer = cleanLayer_FF(selectLayer); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); // 最小外接矩形 getMinOutLineFromLayerToLayer(resLayer); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //5 简化 jianhua(resLayer, 175, 5); StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); //6 高度值 未完成 //getH(resLayer); //StaticTools.msgLine($"完成!用时:{aTime.Elapsed.ToString()}\n"); aTime.Restart(); shpDataSet.Dispose(); shpDataDriver.Dispose(); dsmDataset.Dispose(); gdalDriver.Dispose(); // aTime.Stop(); Console.Write("Press any key to continue . . . "); Console.ReadKey(true); }