Exemplo n.º 1
0
        /// <summary>
        /// DotSpatial to Ogr at geometry level
        /// </summary>
        /// <param name="geometry">GeoAPI/DotSpatial IGeometry</param>
        /// <param name="featureSet">DotSpatial IFeatureSet</param>
        /// <returns>Ogr Geometry</returns>
        public static OSGeo.OGR.Geometry DS2OgrGeometry(GeoAPI.Geometries.IGeometry geometry, DotSpatial.Data.IFeatureSet featureSet)
        {
            string wkbGeometry = geometry.AsText();

            OSGeo.OGR.Geometry result = OSGeo.OGR.Ogr.CreateGeometryFromWkt(ref wkbGeometry, DS2OgrProjection(featureSet.Projection));
            return(result);
        }
Exemplo n.º 2
0
        public IGeometry GetGeometry(string wkt)
        {
            OSGeo.OGR.Geometry geometry     = OSGeo.OGR.Geometry.CreateFromWkt(wkt);
            IGeometry          destGeometry = geometry?.ToGeometry();

            return(destGeometry);
        }
Exemplo n.º 3
0
        /// <summary>
        /// Returns the data associated with all the geometries that are intersected by 'geom'
        /// </summary>
        /// <param name="geom">Geometry to intersect with</param>
        /// <param name="ds">FeatureDataSet to fill data into</param>
        protected override void OnExecuteIntersectionQuery(Geometry geom, FeatureDataSet ds)
        {
            OgrGeometry ogrGeometry = OgrGeometry.CreateFromWkb(GeometryToWKB.Write(geom));

            _ogrLayer.SetSpatialFilter(ogrGeometry);
            ExecuteIntersectionQuery(ds);
        }
Exemplo n.º 4
0
        /// <summary>
        /// Ogr to DotSpatial at layer level
        /// </summary>
        /// <param name="layer">Ogr Layer</param>
        /// <returns>DotSpatial IFeatureSet</returns>
        public static DotSpatial.Data.IFeatureSet Ogr2DSLayer(OSGeo.OGR.Layer layer)
        {
            DotSpatial.Data.IFeatureSet featureSet = new DotSpatial.Data.FeatureSet();
            featureSet.FeatureType = Ogr2DSGeometryType(layer.GetGeomType());
            featureSet.DataTable   = Ogr2DSDataTable(layer.GetLayerDefn());
            featureSet.Projection  = Ogr2DSProjection(layer.GetSpatialRef());

            for (int i = 0; i < layer.GetFeatureCount(0); i++)
            {
                OSGeo.OGR.Geometry       geometry   = layer.GetFeature(i).GetGeometryRef();
                DotSpatial.Data.IFeature feature    = new DotSpatial.Data.Feature(Ogr2DSGeometry(geometry));
                OSGeo.OGR.Feature        ogrFeature = layer.GetFeature(i);
                feature.DataRow = featureSet.DataTable.NewRow();
                for (int j = 0; j < layer.GetLayerDefn().GetFieldCount(); j++)
                {
                    object value = GetOgrValue(ogrFeature, j);
                    if (value == null)
                    {
                        value = DBNull.Value;
                    }
                    feature.DataRow[j] = value;
                }
                featureSet.Features.Add(feature);
            }

            return(featureSet);
        }
Exemplo n.º 5
0
            private IGeometry ReadWkb(OgrGeometryType type, OgrGeometry geom)
            {
                var b = new byte[geom.WkbSize()];

                geom.ExportToWkb(b);
                return(Reader.Read(b));
            }
Exemplo n.º 6
0
        public void QueryShape(IGeometry pGeometry)
        {
            if (pGeometry == null)
            {
                return;
            }

            try
            {
                OSGeo.OGR.Geometry ogrGeometry = m_currentOGRFeature.GetGeometryRef();

                //export geometry from OGR to WKB
                int    wkbSize   = ogrGeometry.WkbSize();
                byte[] wkbBuffer = new byte[wkbSize];
                ogrGeometry.ExportToWkb(wkbBuffer);

                //import geometry from WKB to ESRI Shape
                IWkb pWKB = pGeometry as IWkb;
                pWKB.ImportFromWkb(wkbSize, ref wkbBuffer[0]);

                pGeometry.SpatialReference = m_pDataset.SpatialReference;
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(" Error: " + ex.Message);
                pGeometry.SetEmpty();
            }
        }
Exemplo n.º 7
0
        private static void _标准差(string dzx, out double aue, out double bzc)
        {
            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);

            //获取Featuer数
            int featCount = dzxLayer.GetFeatureCount(0);

            // 1 拿到每个Featuer的Value
            double[] values = new double[featCount];
            for (int i = 0; i < featCount; i++)
            {
                OSGeo.OGR.Feature  fileFeat = dzxLayer.GetFeature(i);
                OSGeo.OGR.Geometry fileGeom = fileFeat.GetGeometryRef();
                values[i] = fileFeat.GetFieldAsDouble("EVE");
                fileGeom.Dispose();
                fileFeat.Dispose();
            }
            dzxDS.Dispose();
            // 2 求Values的平均值
            aue = values.Average();

            // 3 求values与平均值差的平方和
            double pingFangHe = 0;

            for (int i = 0; i < featCount; i++)
            {
                pingFangHe += (values[i] - aue) * (values[i] - aue);
            }
            // 4 每个值与平均值的差相加,除Featuer数.再开方,得到标准差
            bzc = Math.Sqrt(pingFangHe / featCount);
        }
Exemplo n.º 8
0
            private IGeometry ReadLineString(OgrGeometryType type, OgrGeometry geom)
            {
                var count     = geom.GetPointCount();
                var dimension = geom.GetCoordinateDimension();

                var cs = _factory.CoordinateSequenceFactory.Create(count, dimension);

                if (dimension > 2)
                {
                    for (var i = 0; i < cs.Count; i++)
                    {
                        cs.SetOrdinate(i, Ordinate.X, geom.GetX(i));
                        cs.SetOrdinate(i, Ordinate.Y, geom.GetY(i));
                        cs.SetOrdinate(i, Ordinate.Z, geom.GetZ(i));
                    }
                }
                else
                {
                    for (var i = 0; i < cs.Count; i++)
                    {
                        cs.SetOrdinate(i, Ordinate.X, geom.GetX(i));
                        cs.SetOrdinate(i, Ordinate.Y, geom.GetY(i));
                    }
                }

                return(_factory.CreateLineString(cs));
            }
Exemplo n.º 9
0
        static void getMinOutLineFromLayerToLayer(OSGeo.OGR.Layer inLayer)
        {
            shpDataSet.deleteLayerByName("minOutLine");
            OSGeo.OGR.Layer   minoutline = shpDataSet.CreateLayer("minOutLine", inLayer.GetSpatialRef(), inLayer.GetGeomType(), null);
            OSGeo.OGR.Feature aFeat      = null;

            StaticTools.msgLine("getMinOutline...");
            int featCount = inLayer.GetFeatureCount(0);

            for (int i = 0; i < featCount; i++)
            {
                aFeat = inLayer.GetFeature(i);
                OSGeo.OGR.Geometry oGeometry = aFeat.GetGeometryRef();
                OSGeo.OGR.Geometry ogeo      = oGeometry.GetGeometryRef(0);
                QTGeometry         qtGeo     = new QTGeometry(ogeo);
                minoutline.CreateFeature(qtGeo.GetSMBR());
                StaticTools.progress((i + 1) * 100 / featCount, $"{i} / {featCount}");
            }
            minoutline.Dispose();
            //inLayer.ResetReading();
            //while ((aFeat = inLayer.GetNextFeature()) != null)
            //{
            //    OSGeo.OGR.Geometry oGeometry = aFeat.GetGeometryRef();
            //    OSGeo.OGR.Geometry ogeo = oGeometry.GetGeometryRef(0);
            //    QTGeometry qtGeo = new QTGeometry(ogeo);
            //    minoutline.CreateFeature(qtGeo.GetSMBR());
            //}
        }
Exemplo n.º 10
0
        public FeatureDataSet ExecuteQuery(string query, OgrGeometry filter)
        {
            try
            {
                var results = _ogrDataSource.ExecuteSQL(query, filter, "");
                results.ResetReading();

                //reads the column definition of the layer/feature
                var ds   = new FeatureDataSet();
                var myDt = ReadColumnDefinition(results);

                myDt.BeginLoadData();
                var        reader = new OgrGeometryReader(Factory);
                OgrFeature ogrFeature;
                while ((ogrFeature = results.GetNextFeature()) != null)
                {
                    //LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, Factory);
                    LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, reader);
                    ogrFeature.Dispose();
                }
                myDt.EndLoadData();

                ds.Tables.Add(myDt);
                _ogrDataSource.ReleaseResultSet(results);

                return(ds);
            }
            catch (Exception exc)
            {
                _log.Debug(t => t(exc.ToString()));
                return(new FeatureDataSet());
            }
        }
Exemplo n.º 11
0
        /*************************************************************************************************/



        /***************************读入SHP文件***************************/
        /// <summary>
        /// shpPolygon To List<Point[]>
        /// </summary>
        /// <param name="filePath"></param>
        /// <returns></returns>
        public static List <Point[]> shpPolygonToPointGL(string filePath)
        {
            List <Point[]> allFeature = new List <Point[]>();

            OSGeo.OGR.Ogr.RegisterAll();
            OSGeo.OGR.Driver     dr        = OSGeo.OGR.Ogr.GetDriverByName("ESRI shapefile");
            OSGeo.OGR.DataSource ds        = dr.Open(filePath, 0);
            OSGeo.OGR.Layer      fileLayer = ds.GetLayerByIndex(0);

            int FeatCount = fileLayer.GetFeatureCount(0);

            for (int u = 0; u < FeatCount; u++)
            {
                OSGeo.OGR.Feature  fileFeature = fileLayer.GetFeature(u);
                OSGeo.OGR.Geometry fileGeom    = fileFeature.GetGeometryRef();
                OSGeo.OGR.Geometry subGeom     = fileGeom.GetGeometryRef(0);
                int     k     = subGeom.GetPointCount();
                Point[] aFeat = new Point[k];
                for (int i = 0; i < k; i++)
                {
                    aFeat[i].X = subGeom.GetX(i);
                    aFeat[i].Y = subGeom.GetY(i);
                    aFeat[i].Z = subGeom.GetZ(i);
                }
                allFeature.Add(aFeat);
            }
            return(allFeature);
        }
Exemplo n.º 12
0
        /// <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();
        }
Exemplo n.º 13
0
        /// <summary>
        /// Ogr to DotSpatial at geometry level
        /// </summary>
        /// <param name="geometry">Ogr Geometry</param>
        /// <returns>GeoAPI/DotSpatial IGeometry</returns>
        public static GeoAPI.Geometries.IGeometry Ogr2DSGeometry(OSGeo.OGR.Geometry geometry)
        {
            geometry.FlattenTo2D();
            Byte[] wkbGeometry = new Byte[geometry.WkbSize()];
            geometry.ExportToWkb(wkbGeometry, OSGeo.OGR.wkbByteOrder.wkbXDR);

            NetTopologySuite.IO.WKBReader wkbReader = new NetTopologySuite.IO.WKBReader();
            return(wkbReader.Read(wkbGeometry));
        }
Exemplo n.º 14
0
        /// <summary>
        /// 根据区块范围,获取对应的pdx,dzx
        /// </summary>
        /// <param name="pdLayer"></param>
        /// <param name="dzxlayer"></param>
        /// <returns></returns>
        static List <CutBox> buildTree(OSGeo.OGR.Layer pdLayer, OSGeo.OGR.Layer dzxlayer = null)
        {
            StaticTools.msgLine("buildTree...");
            OSGeo.OGR.Layer cutLayer = createCutLayer(3000);

            //用 cutLayer 中的 Featuers 创建一个容器,容器中是对应 Featuer 的 cutBox
            List <CutBox> allBoxes = new List <CutBox>();

            int cutFeatCount = cutLayer.GetFeatureCount(0);
            int pdFeatCount  = pdLayer.GetFeatureCount(0);

            if (dzxlayer != null)
            {
                int dzFeatCount = dzxlayer.GetFeatureCount(0);
                for (int cuti = 0; cuti < cutFeatCount; cuti++)
                {
                    CutBox cb = new CutBox();
                    //把与盒子相交的等值线塞入盒子,向外Buffer一定距离,避免尴尬
                    OSGeo.OGR.Geometry cutGeom = cutLayer.GetFeature(cuti).GetGeometryRef().Buffer(5, 0);
                    for (int dzi = 0; dzi < dzFeatCount; dzi++)
                    {
                        if (cutGeom.Intersect(dzxlayer.GetFeature(dzi).GetGeometryRef()))
                        {
                            cb.dzxIDs.Add(dzi);
                        }
                    }
                    allBoxes.Add(cb);
                    StaticTools.progress((cuti + 1) * 100 / cutFeatCount, $"{cuti}/{cutFeatCount}");
                }
            }
            //遍历坡度线,放入对应的cutBox
            //不会重复,要素只会放入第一个匹配上的盒子里
            for (int pdi = 0; pdi < pdFeatCount; pdi++)
            {
                //拿出一个坡度要素
                OSGeo.OGR.Geometry aGeom = pdLayer.GetFeature(pdi).GetGeometryRef();
                for (int cuti = 0; cuti < cutFeatCount; cuti++)
                {
                    //拿出一个盒子,与要素求交
                    OSGeo.OGR.Geometry cutGeom = cutLayer.GetFeature(cuti).GetGeometryRef();
                    if (aGeom.Intersects(cutGeom))
                    {
                        //塞入盒子,盒子ID ,坡度线ID
                        allBoxes[cuti].pdxIDs.Add(pdi);
                        break;
                    }
                }
                StaticTools.progress((pdi + 1) * 100 / pdFeatCount, $"{pdi}/{pdFeatCount}");
            }
            if (IsDelete)
            {
                shpDataSet.deleteLayerByName(cutLayer.GetName());
            }

            return(allBoxes);
        }
Exemplo n.º 15
0
 public Geometry(OSGeo.OGR.Geometry geometry)
 {
     if (geometry == null)
     {
         throw new Exception("geometry不能为空");
     }
     OgrGeometry = geometry;
     Geometries.CollectionChanged  += Geometries_CollectionChanged;
     Coordinates.CollectionChanged += Coordinates_CollectionChanged;
 }
Exemplo n.º 16
0
        public IGeometry GetLineString(IEnumerable <ICoordinate> coordinates)
        {
            Geometry geometry = null;

            OSGeo.OGR.Geometry ogrGeometry = coordinates?.ToOgrLineString();
            if (ogrGeometry != null)
            {
                geometry = new Geometry(ogrGeometry);
            }
            return(geometry);
        }
Exemplo n.º 17
0
            private IGeometry ReadPoint(OgrGeometryType type, OgrGeometry geom)
            {
                var c = new Coordinate(geom.GetX(0), geom.GetY(0));

                if ((int)type > 0x1000000)
                {
                    c.Z = geom.GetZ(0);
                }

                return(_factory.CreatePoint(c));
            }
Exemplo n.º 18
0
        public IGeometry GetPolygon(IEnumerable <IEnumerable <ICoordinate> > ringList)
        {
            Geometry geometry = null;

            OSGeo.OGR.Geometry ogrGeometry = ringList?.ToOgrPolygon();
            if (ogrGeometry != null)
            {
                geometry = new Geometry(ogrGeometry);
            }
            return(geometry);
        }
Exemplo n.º 19
0
        public IGeometry GetPoint(ICoordinate coordinate)
        {
            Geometry geometry = null;

            OSGeo.OGR.Geometry ogrGeometry = coordinate?.ToOgrPoint();
            if (ogrGeometry != null)
            {
                geometry = new Geometry(ogrGeometry);
            }
            return(geometry);
        }
Exemplo n.º 20
0
 /// <summary>
 /// Returns the data associated with all the geometries that are intersected by 'geom'
 /// </summary>
 /// <param name="geom">Geometry to intersect with</param>
 /// <param name="ds">FeatureDataSet to fill data into</param>
 protected override void OnExecuteIntersectionQuery(Geometry geom, IFeatureCollectionSet fcs, CancellationToken?ct = null)
 {
     using (var ogrGeometry = OgrGeometry.CreateFromWkb(GeometryToWKB.Write(geom)))
     {
         _ogrLayer.SetSpatialFilter(ogrGeometry);
         var fds = new FeatureDataSet();
         ExecuteIntersectionQuery(fds);
         foreach (var fd in fds)
         {
             fcs.Add(fd);
         }
     }
 }
Exemplo n.º 21
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);
 }
Exemplo n.º 22
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);
 }
Exemplo n.º 23
0
 /// <summary>
 /// Returns the data associated with all the geometries that are intersected by 'geom'
 /// </summary>
 /// <param name="geom">Geometry to intersect with</param>
 /// <param name="ds">FeatureDataSet to fill data into</param>
 protected override void OnExecuteIntersectionQuery(Geometry geom, FeatureDataSet ds)
 {
     using (var ogrGeometry = OgrGeometry.CreateFromWkb(GeometryToWKB.Write(geom)))
     {
         OgrDataSource ogrDataSource;
         using (var ogrLayer = GetLayer(_layerIndex, out ogrDataSource))
         {
             ogrLayer.SetSpatialFilter(ogrGeometry);
             ExecuteIntersectionQuery(ds, ogrLayer);
             ogrDataSource.Dispose();
         }
     }
 }
Exemplo n.º 24
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);
        }
Exemplo n.º 25
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);
        }
Exemplo n.º 26
0
        /// <summary>
        /// 通过slope的位置和面积筛选dzxPoly
        /// </summary>
        /// <param name="slopePolyLayer"></param>
        /// <param name="dzxPolyLayer"></param>
        /// <returns></returns>
        static OSGeo.OGR.Layer selectionFeatuers(OSGeo.OGR.Layer slopePolyLayer, OSGeo.OGR.Layer dzxPolyLayer)
        {
            shpDataSet.deleteLayerByName("resLayer");
            OSGeo.OGR.Layer resLayer = shpDataSet.CreateLayer("resLayer", srs, dzxPolyLayer.GetGeomType(), null);

            List <CutBox> selectTree = buildTree(slopePolyLayer, dzxPolyLayer);

            StaticTools.msgLine("selection...");

            for (int i = 0; i < selectTree.Count; i++)
            {
                CutBox abox = selectTree[i];

                for (int pdi = 0; pdi < abox.pdxIDs.Count; pdi++)
                {
                    int ff = abox.pdxIDs[pdi];
                    OSGeo.OGR.Geometry pdGeom   = slopePolyLayer.GetFeature(ff).GetGeometryRef();
                    double             pdArea   = pdGeom.GetArea();
                    double             afterCha = double.MaxValue;
                    int yesID = -1;

                    for (int dzi = 0; dzi < abox.dzxIDs.Count; dzi++)
                    {
                        int tt = abox.dzxIDs[dzi];
                        OSGeo.OGR.Geometry dzGeom = dzxPolyLayer.GetFeature(tt).GetGeometryRef();
                        if (pdGeom.Intersect(dzGeom))
                        {
                            double cha = Math.Abs(dzGeom.GetArea() - pdArea);
                            if (cha < afterCha)
                            {
                                afterCha = cha;
                                yesID    = tt;
                            }
                        }
                    }

                    if (yesID != -1)
                    {
                        resLayer.CreateFeature(dzxPolyLayer.GetFeature(yesID));
                    }
                    StaticTools.progress((pdi + 1) * 100 / abox.pdxIDs.Count, $"{pdi}/{abox.pdxIDs.Count} @ {i + 1} / {selectTree.Count}");
                }
            }
            if (IsDelete)
            {
                shpDataSet.deleteLayerByName(slopePolyLayer.GetName());
                shpDataSet.deleteLayerByName(dzxPolyLayer.GetName());
            }
            return(resLayer);
        }
Exemplo n.º 27
0
        /********************************   等值线转换为多边形   ***********************************************/

        /// <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);
        }
Exemplo n.º 28
0
        public FeatureDataSet ExecuteQuery(string query, OgrGeometry filter)
        {
            try
            {
                FeatureDataSet   ds   = new FeatureDataSet();
                FeatureDataTable myDt = new FeatureDataTable();

                OgrLayer results = _ogrDataSource.ExecuteSQL(query, filter, "");

                //reads the column definition of the layer/feature
                ReadColumnDefinition(myDt, results);

                OgrFeature ogrFeature;
                results.ResetReading();
                while ((ogrFeature = results.GetNextFeature()) != null)
                {
                    FeatureDataRow dr = OgrFeatureToFeatureDataRow(myDt, ogrFeature, Factory);
                    myDt.AddRow(dr);

                    /*
                     * myDt.NewRow();
                     * for (int iField = 0; iField < ogrFeature.GetFieldCount(); iField++)
                     * {
                     *  if (myDt.Columns[iField].DataType == Type.GetType("System.String"))
                     *      dr[iField] = ogrFeature.GetFieldAsString(iField);
                     *  else if (myDt.Columns[iField].GetType() == Type.GetType("System.Int32"))
                     *      dr[iField] = ogrFeature.GetFieldAsInteger(iField);
                     *  else if (myDt.Columns[iField].GetType() == Type.GetType("System.Double"))
                     *      dr[iField] = ogrFeature.GetFieldAsDouble(iField);
                     *  else
                     *      dr[iField] = ogrFeature.GetFieldAsString(iField);
                     * }
                     *
                     * dr.Geometry = ParseOgrGeometry(ogrFeature.GetGeometryRef());
                     * myDt.AddRow(dr);
                     */
                }
                ds.Tables.Add(myDt);
                _ogrDataSource.ReleaseResultSet(results);

                return(ds);
            }
            catch (Exception exc)
            {
                Debug.WriteLine(exc.ToString());
                return(new FeatureDataSet());
            }
        }
Exemplo n.º 29
0
 /// <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();
 }
Exemplo n.º 30
0
        /// <summary>
        /// Spatial filter using OGR
        /// </summary>
        /// <param name="featureSet">FeatureSet</param>
        /// <param name="geometry">Spatial geometry</param>
        /// <returns>Indexs of selected features</returns>
        public static List <int> OgrSpatialFilter(IFeatureSet featureSet, IGeometry geometry)
        {
            List <int> result = new List <int>();

            OSGeo.OGR.Layer    layer = GIS.GDAL.VectorConverter.DS2OrgLayer(featureSet);
            OSGeo.OGR.Geometry geo   = GIS.GDAL.VectorConverter.DS2OgrGeometry(geometry, featureSet);
            layer.SetSpatialFilter(geo);

            OSGeo.OGR.Feature feature = layer.GetNextFeature();
            while (feature != null)
            {
                result.Add(Convert.ToInt32(feature.GetFID()));
                feature = layer.GetNextFeature();
            }

            return(result);
        }
Exemplo n.º 31
0
        public FeatureDataSet ExecuteQuery(string query, OgrGeometry filter)
        {
            try
            {
                var results = _ogrDataSource.ExecuteSQL(query, filter, "");
                results.ResetReading();

                //reads the column definition of the layer/feature
                var ds = new FeatureDataSet();
                var myDt = ReadColumnDefinition(results);

                myDt.BeginLoadData();
                OgrFeature ogrFeature;
                while ((ogrFeature = results.GetNextFeature()) != null)
                {
                    LoadOgrFeatureToFeatureDataRow(myDt, ogrFeature, Factory);
                    ogrFeature.Dispose();
                }
                myDt.EndLoadData();

                ds.Tables.Add(myDt);
                _ogrDataSource.ReleaseResultSet(results);

                return ds;
            }
            catch (Exception exc)
            {
                Debug.WriteLine(exc.ToString());
                return new FeatureDataSet();
            }
        }
Exemplo n.º 32
0
 private static Geometry ParseOgrGeometry(OgrGeometry ogrGeometry, GeoAPI.Geometries.IGeometryFactory factory)
 {
     if (ogrGeometry != null)
     {
         //Just in case it isn't 2D
         ogrGeometry.FlattenTo2D();
         var wkbBuffer = new byte[ogrGeometry.WkbSize()];
         ogrGeometry.ExportToWkb(wkbBuffer);
         var geom = GeometryFromWKB.Parse(wkbBuffer, factory);
         if (geom == null)
             Debug.WriteLine("Failed to parse '{0}'", ogrGeometry.GetGeometryType());
         return geom;
     }
     return null;
 }
Exemplo n.º 33
0
 private static Geometry ParseOgrGeometry(OgrGeometry ogrGeometry)
 {
     if (ogrGeometry != null)
     {
         //Just in case it isn't 2D
         ogrGeometry.FlattenTo2D();
         byte[] wkbBuffer = new byte[ogrGeometry.WkbSize()];
         ogrGeometry.ExportToWkb(wkbBuffer);
         Geometry geom = GeometryFromWKB.Parse(wkbBuffer);
         if (geom == null)
             Debug.WriteLine(string.Format("Failed to parse '{0}'", ogrGeometry.GetGeometryType()));
         return geom;
     }
     return null;
 }
Exemplo n.º 34
0
        public FeatureDataSet ExecuteQuery(string query, OgrGeometry filter)
        {
            try
            {
                FeatureDataSet ds = new FeatureDataSet();
                FeatureDataTable myDt = new FeatureDataTable();

                OgrLayer results = _ogrDataSource.ExecuteSQL(query, filter, "");

                //reads the column definition of the layer/feature
                ReadColumnDefinition(myDt, results);

                OgrFeature ogrFeature;
                results.ResetReading();
                while ((ogrFeature = results.GetNextFeature()) != null)
                {
                    FeatureDataRow dr = OgrFeatureToFeatureDataRow(myDt, ogrFeature);
                    myDt.AddRow(dr);
                    /*
                    myDt.NewRow();
                    for (int iField = 0; iField < ogrFeature.GetFieldCount(); iField++)
                    {
                        if (myDt.Columns[iField].DataType == Type.GetType("System.String"))
                            dr[iField] = ogrFeature.GetFieldAsString(iField);
                        else if (myDt.Columns[iField].GetType() == Type.GetType("System.Int32"))
                            dr[iField] = ogrFeature.GetFieldAsInteger(iField);
                        else if (myDt.Columns[iField].GetType() == Type.GetType("System.Double"))
                            dr[iField] = ogrFeature.GetFieldAsDouble(iField);
                        else
                            dr[iField] = ogrFeature.GetFieldAsString(iField);
                    }

                    dr.Geometry = ParseOgrGeometry(ogrFeature.GetGeometryRef());
                    myDt.AddRow(dr);
                     */
                }
                ds.Tables.Add(myDt);
                _ogrDataSource.ReleaseResultSet(results);

                return ds;
            }
            catch (Exception exc)
            {
                Debug.WriteLine(exc.ToString());
                return new FeatureDataSet();
            }
        }