Exemple #1
0
 public Geometry GetGeometry()
 {
     OSGeo.OGR.Geometry geo2 = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbLinearRing);
     // 2   1
     // 3   4
     geo2.AddPoint(MaxX, MaxY, 0);
     geo2.AddPoint(MinX, MaxY, 0);
     geo2.AddPoint(MinX, MinY, 0);
     geo2.AddPoint(MaxX, MinY, 0);
     OSGeo.OGR.Geometry poly2 = new Geometry(wkbGeometryType.wkbPolygon);
     poly2.AddGeometryDirectly(geo2);
     return(poly2);
 }
Exemple #2
0
        /// <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>
 /// 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();
 }
Exemple #4
0
 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);
 }
Exemple #5
0
        /// <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>
        /// 等值线转为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 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>
 /// 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();
 }
Exemple #9
0
        //筛选
        public void getUsefulTriangles(OSGeo.OGR.Geometry outGeom)
        {
            OSGeo.OGR.Ogr.RegisterAll();

            int tCount = this.triangles.triangleList.Count();

            List <int> tempID = new List <int>();

            for (int i = 0; i < tCount; i++)
            {
                Triangle           aT     = this.triangles.triangleList[i];
                OSGeo.OGR.Geometry apoint = new OSGeo.OGR.Geometry(OSGeo.OGR.wkbGeometryType.wkbPoint);
                apoint.AddPoint((aT.A.X + aT.B.X + aT.C.X) / 3, (aT.A.Y + aT.B.Y + aT.C.Y) / 3, 0);
                if (!apoint.Within(outGeom))
                {
                    tempID.Add(i);
                }
            }

            for (int i = 0; i < tempID.Count; i++)
            {
                this.triangles.triangleList.RemoveAt(i);
            }
        }
Exemple #10
0
        /// <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);
        }