/// <summary> /// 清理原文件 /// </summary> /// <param name="filePath"></param> public static void claenPoint(string filePath, double jiaodu, int cishu) { OSGeo.OGR.Ogr.RegisterAll(); OSGeo.OGR.Driver dr = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile"); OSGeo.OGR.DataSource oriDs = dr.Open(filePath, 1); OSGeo.OGR.Layer oriLayer = oriDs.GetLayerByIndex(0); int featCount = oriLayer.GetFeatureCount(0); for (int i = 0; i < featCount; i++) { OSGeo.OGR.Feature oriFeat = oriLayer.GetFeature(i); 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); } OSGeo.OGR.Geometry newGeom = null; if (aFeat.Length > cishu * 3) { newGeom = JID(aFeat, jiaodu, cishu); } else { oriFeat.Dispose(); continue; } if (newGeom != null) { oriFeat.SetGeometry(newGeom); oriLayer.SetFeature(oriFeat); } Console.WriteLine("cleanPoint已完成{0}/{1}", i, featCount); oriFeat.Dispose(); } oriDs.Dispose(); }
public static void getH(string DSMfile, string oriShp) { Console.WriteLine("开始提取建筑高度!"); Gdal.AllRegister(); Ogr.RegisterAll(); Stopwatch aTime = new Stopwatch(); aTime.Start(); //创建一个BUFFER,BUFFER距离为1米 string bufShp = bufferFile(oriShp, 1); //打开原文件和Buffer文件 OSGeo.OGR.Driver dr = Ogr.GetDriverByName("ESRI shapefile"); DataSource oriDs = dr.Open(oriShp, 1); DataSource bufDs = dr.Open(bufShp, 0); OSGeo.OGR.Layer bufLayer = bufDs.GetLayerByIndex(0); OSGeo.OGR.Layer oriLayer = oriDs.GetLayerByIndex(0); //判断原文件中是否有以下字段,没有就创建 if (oriLayer.FindFieldIndex("MIN", 1) == -1) { FieldDefn min = new FieldDefn("MIN", FieldType.OFTReal); oriLayer.CreateField(min, 1); } if (oriLayer.FindFieldIndex("MAX", 1) == -1) { FieldDefn max = new FieldDefn("MAX", FieldType.OFTReal); oriLayer.CreateField(max, 1); } if (oriLayer.FindFieldIndex("HIGHT", 1) == -1) { FieldDefn hight = new FieldDefn("HIGHT", FieldType.OFTReal); oriLayer.CreateField(hight, 1); } //打开栅格 Dataset dsmDs = Gdal.Open(DSMfile, Access.GA_ReadOnly); double[] transfrom = new double[6]; dsmDs.GetGeoTransform(transfrom); int allX = dsmDs.RasterXSize; int allY = dsmDs.RasterYSize; //开始计算每个Feature需要读取的栅格参数 int featCount = oriLayer.GetFeatureCount(0); for (int i = 0; i < featCount; i++) { int[] subRasterOff_Size = subRasterInfo(transfrom, allX, allY, bufLayer.GetFeature(i)); Feature oriFeat = oriLayer.GetFeature(i); Feature bufFeat = bufLayer.GetFeature(i); getMaxMinValue(dsmDs, oriFeat, bufFeat, subRasterOff_Size); oriLayer.SetFeature(oriFeat); oriFeat.Dispose(); Console.WriteLine("当前处理:{0}/{1}", i, featCount); } oriLayer.Dispose(); bufLayer.Dispose(); oriDs.Dispose(); bufDs.Dispose(); dsmDs.Dispose(); aTime.Stop(); Console.WriteLine("建筑高度值提取完成!用时:{0}", aTime.Elapsed.ToString()); }