static OSGeo.OGR.Feature polyFeat(OSGeo.OGR.Geometry lineGeom) { OSGeo.OGR.Feature polyFeat = new OSGeo.OGR.Feature(new OSGeo.OGR.FeatureDefn("")); OSGeo.OGR.Geometry polyGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon); OSGeo.OGR.Geometry subGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); for (int s = 0; s < lineGeom.GetPointCount(); s++) { subGeom.AddPoint(lineGeom.GetX(s), lineGeom.GetY(s), lineGeom.GetZ(s)); } polyGeom.AddGeometry(subGeom); polyFeat.SetGeometry(polyGeom); return(polyFeat); }
/// <summary> /// 三点夹角的判定条件,输出为满足条件的成员的ID所组成的ID数组 /// </summary> /// <param name="aFeat"></param> /// <returns></returns> private static OSGeo.OGR.Geometry JID(Point[] aFeat, double userSet, int seleTime) { List <Point[]> pjGroupL = new List <Point[]>(); List <Point[]> zjGroupL = new List <Point[]>(); List <Point> pjGroup = new List <Point>(); List <Point> zjGroup = new List <Point>(); for (int i = 0; i < aFeat.Length; i++) { int frontId, thisId, backId; bool[] yon = new bool[seleTime]; for (int t = 1; t <= seleTime; t++) { frontId = i < t ? aFeat.Length - 1 + i - t : i - t; thisId = i; backId = i > aFeat.Length - 1 - t ? i - (aFeat.Length - 1) + t : backId = i + t; double jiaodu = cosCalculator(aFeat[frontId], aFeat[thisId], aFeat[backId]); yon[t - 1] = jiaodu > userSet; } if (yon.Contains(true)) { pjGroup.Add(aFeat[i]); } else { zjGroup.Add(aFeat[i]); } } OSGeo.OGR.Geometry outGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon); OSGeo.OGR.Geometry subGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); for (int g = 0; g < zjGroup.Count(); g++) { Point a = zjGroup[g]; subGeom.AddPoint(a.X, a.Y, a.Z); } if (subGeom.GetPointCount() < 4) { return(null); } subGeom.CloseRings(); outGeom.AddGeometry(subGeom); return(outGeom); }
/// <summary> /// 根据dsm的坐标划分区域 /// </summary> /// <param name="tileSize">区块尺寸</param> /// <returns></returns> static OSGeo.OGR.Layer createCutLayer(double tileSize) { shpDataSet.deleteLayerByName("cutLayer"); OSGeo.OGR.Layer cutLayer = shpDataSet.CreateLayer("cutLayer", srs, OSGeo.OGR.wkbGeometryType.wkbPolygon, null); double[] trans = new double[6]; dsmDataset.GetGeoTransform(trans); //四边坐标 double top = trans[3]; double left = trans[0]; double right = trans[0] + dsmDataset.RasterXSize * trans[1]; double bottom = trans[3] + dsmDataset.RasterYSize * trans[5]; //子块角点 Point LB, LT, RT, RB; //横竖块数 int hCount = (int)((top - bottom) / tileSize) + 1; int wCount = (int)((right - left) / tileSize) + 1; for (int h = 0; h < hCount; h++) { for (int w = 0; w < wCount; w++) { OSGeo.OGR.Geometry subCutGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); LB.X = left + tileSize * w; LB.Y = bottom + tileSize * h; subCutGeom.AddPoint(LB.X, LB.Y, 0); LT.X = LB.X; LT.Y = LB.Y + tileSize; subCutGeom.AddPoint(LT.X, LT.Y, 0); RT.X = LB.X + tileSize; RT.Y = LT.Y; subCutGeom.AddPoint(RT.X, RT.Y, 0); RB.X = RT.X; RB.Y = LB.Y; subCutGeom.AddPoint(RB.X, RB.Y, 0); //封闭poly subCutGeom.AddPoint(LB.X, LB.Y, 0); OSGeo.OGR.Geometry cutGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon); cutGeom.AddGeometry(subCutGeom); OSGeo.OGR.Feature cutFeat = new OSGeo.OGR.Feature(new OSGeo.OGR.FeatureDefn("")); cutFeat.SetGeometry(cutGeom); cutLayer.CreateFeature(cutFeat); } } return(cutLayer); }
/******************************** 等值线转换为多边形 ***********************************************/ /// <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> /// Point[] to shp poly /// </summary> /// <param name="savePath"></param> /// <param name="allFeat"></param> public static void TEMPPointGtoshpPoly(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.wkbPolygon, 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.wkbPolygon); OSGeo.OGR.Geometry subGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); for (int i = 0; i < allFeat.Length; i++) { subGeom.AddPoint(allFeat[i].X, allFeat[i].Y, allFeat[i].Z); } fileGeom.AddGeometry(subGeom); fileFeat.SetGeometry(fileGeom); fileLayer.CreateFeature(fileFeat); fileLayer.Dispose(); ds.Dispose(); }
/// <summary> /// 三点夹角的判定条件,输出为满足条件的成员的ID所组成的ID数组 /// </summary> /// <param name="aFeat"></param> /// <returns></returns> private static OSGeo.OGR.Feature JID(Point[] aFeat) { int userSet = 165; int seleTime = 10; List <Point[]> pjGroupL = new List <Point[]>(); List <Point[]> zjGroupL = new List <Point[]>(); List <Point> pjGroup = new List <Point>(); //平角 List <Point> zjGroup = new List <Point>(); //平角 for (int i = 0; i < aFeat.Length; i++) { int frontId, thisId, backId; bool[] yon = new bool[seleTime]; for (int t = 1; t <= seleTime; t++) { if (i < t) { frontId = aFeat.Length - 1 + i - t; } else { frontId = i - t; } thisId = i; if (i > aFeat.Length - 1 - t) { backId = i - (aFeat.Length - 1) + t; } else { backId = i + t; } double jiaodu = cosCalculator(aFeat[frontId], aFeat[thisId], aFeat[backId]);//求角度 yon[t - 1] = jiaodu > userSet; } //判定条件为:以上两条件满足其一则被选为平角,并输出为结果 //当两有任意一个角度大于 160度. 则认为是平角 if (yon.Contains(true)) { //if (zjGroup.Count != null) //{ // zjGroupL.Add(zjGroup.ToArray()); // zjGroup.Clear(); //} pjGroup.Add(aFeat[i]); } //否则认为是直角 else { //if (pjGroup.Count >3 ) //{ // pjGroupL.Add(pjGroup.ToArray()); // pjGroup.Clear(); //} zjGroup.Add(aFeat[i]); } } ///输出Featuer OSGeo.OGR.FeatureDefn featDf = new OSGeo.OGR.FeatureDefn(""); OSGeo.OGR.Feature outFeat = new OSGeo.OGR.Feature(featDf); OSGeo.OGR.Geometry outGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPolygon); OSGeo.OGR.Geometry subGeom = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing); for (int g = 0; g < zjGroup.Count(); g++) { Point a = zjGroup[g]; subGeom.AddPoint(a.X, a.Y, a.Z); } if (subGeom.GetPointCount() < 4) { return(null); } subGeom.CloseRings(); outGeom.AddGeometry(subGeom); outFeat.SetGeometry(outGeom); return(outFeat); }