示例#1
0
        public VectorLayer getPolygonPoints(PointF points, VectorLayer veclayer)
        {
            //VectorLayer veclayer = (VectorLayer)m_viewBox.Map.GetLayerByName("province");
            SharpMap.Layers.VectorLayer laySelected = new SharpMap.Layers.VectorLayer("Selection");;
            CustomTheme myTheme = new CustomTheme(FeatureColoured);
            ShapeFile   vecshp  = (ShapeFile)veclayer.DataSource;
            ShapeFile   shp     = vecshp;

            if (!shp.IsOpen)
            {
                shp.Open();
            }

            FeatureDataSet   featDataSet   = new FeatureDataSet();
            FeatureDataTable featDataTable = null;
            //将point的大地坐标转为经纬度
            Projection pj = new Projection();

            points = pj.GetLatLonFromXY(points, cfg.pjPara);


            //   获取feature数量
            uint featCount = (uint)shp.GetFeatureCount();

            for (uint index = 0; index < featCount; index++)
            {
                FeatureDataRow r = shp.GetFeature(index);
                GeoAPI.Geometries.Coordinate[] geomes = r.Geometry.Coordinates;
                double[] geomsX = new double[geomes.Length];
                double[] geomsY = new double[geomes.Length];
                for (int j = 0; j < geomes.Length; j++)
                {
                    geomsX[j] = geomes[j].X;
                    geomsY[j] = geomes[j].Y;
                }

                if ((points.X < geomsX.Min()) || (points.X > geomsX.Max()) || (points.Y < geomsY.Min()) || (points.Y > geomsY.Max()))
                {
                    continue;
                }

                PointF p1 = new PointF();
                p1.X = points.X;
                p1.Y = points.Y;
                if (InPolygon(geomes, p1))
                {
                    //首先把geomes传出去,供其他使用
                    ContourGeomes = geomes;
                    //如果在某区域内,选中某个区域,放入新图层
                    laySelected.DataSource = new SharpMap.Data.Providers.GeometryProvider(shp.GetFeature(index));
                    polygon = ((NetTopologySuite.Geometries.Polygon)r.Geometry);
                    laySelected.Style.Fill = new System.Drawing.SolidBrush(Color.HotPink);
                    laySelected.CoordinateTransformation = veclayer.CoordinateTransformation;
                }
            }
            return(laySelected);
        }
        public void ExecuteRobustIntersectionQuery(ShapeFile shapeFile, Envelope bbox, FeatureDataSet ds)
        {
            //Use the spatial index to get a list of features whose boundingbox intersects bbox
            var objectlist = shapeFile.GetObjectIDsInView(bbox);

            Stream stream    = new FileStream(shapeFile.Filename, FileMode.Open, FileAccess.Read);
            string dbfFile   = Path.ChangeExtension(shapeFile.Filename, ".dbf");
            string indexFile = Path.ChangeExtension(shapeFile.Filename, ".shx");

            DbaseReader dbaseReader = null;

            if (File.Exists(dbfFile))
            {
                dbaseReader = new DbaseReader(dbfFile);
                dbaseReader.Open();
            }

            using (BinaryReader br = new BinaryReader(stream))
            {
                using (DbaseReader dbaseFile = dbaseReader)
                {
                    var dt = dbaseFile.NewTable;
                    dt.BeginLoadData();

                    for (var i = 0; i < objectlist.Count; i++)
                    {
                        FeatureDataRow fdr;
                        try
                        {
                            var geometry = shapeFile.GetFeature(objectlist[i]).Geometry;
                            //fdr.Geometry = ReadGeometry(objectlist[i], br, dbaseFile);
                            fdr          = (FeatureDataRow)dt.LoadDataRow(dbaseFile.GetValues(objectlist[i]), true);
                            fdr.Geometry = geometry;
                        }
                        catch (Exception)
                        {
                            Debug.WriteLine("ERROR: Bad geometry for feature at index " + objectlist[i]);
                        }
                    }

                    dt.EndLoadData();
                    dt.AcceptChanges();

                    ds.Tables.Add(dt);
                    dbaseFile.Close();
                }
                br.Close();
            }
        }
示例#3
0
        public void TestShapeFile(SqlServerSpatialObjectType spatialType)
        {
            using (var p = new ShapeFile(TestUtility.GetPathToTestFile("SPATIAL_F_SKARVMUFF.shp"), true))
            {
                p.Open();

                var env = p.GetExtents();
                if (spatialType == SqlServerSpatialObjectType.Geography && (env.MaxY > 90 || env.MaxY < -90))
                {
                    Assert.Ignore("Test file Y values exceed valid latitudes");
                }

                for (uint i = 0; i < p.GetFeatureCount(); i++)
                {
                    var fdr = p.GetFeature(i);
                    if (fdr.Geometry == null)
                    {
                        continue;
                    }

                    try
                    {
                        fdr.Geometry.SRID = 4326;
                        var res = ToSqlServerAndBack(fdr.Geometry, spatialType);
                        Assert.AreEqual(fdr.Geometry, res);
                        System.Diagnostics.Trace.WriteLine(string.Format("Feature {0} ({1}) converted!", i, fdr[0]));
                    }
                    catch (SqlGeometryConverterException)
                    {
                        System.Diagnostics.Trace.WriteLine(string.Format("Feature {0} ({1}) conversion failed!", i, fdr[0]));
                    }
                    catch (SqlGeographyConverterException)
                    {
                        System.Diagnostics.Trace.WriteLine(string.Format("Feature {0} ({1}) conversion failed!", i, fdr[0]));
                    }
                }
            }
        }
        public void ShowFeature(Predicate <System.Data.DataRow> p = null)
        {
            List <SharpMap.Geometries.Geometry> geometries = new List <SharpMap.Geometries.Geometry>();

            m_shapeFileData.Open();
            for (uint i = 0; i < m_shapeFileData.GetFeatureCount(); ++i)
            {
                SharpMap.Data.FeatureDataRow featureDataRow = m_shapeFileData.GetFeature(i);
                if (p == null || p(featureDataRow))
                {
                    geometries.Add(m_shapeFileData.GetGeometryByID(i));
                }
            }
            m_shapeFileData.Close();

            m_shapeLayer.DataSource = new GeometryFeatureProvider(geometries);
            if (myMap.Layers.IndexOf(m_shapeLayer) == -1)
            {
                myMap.Layers.Add(m_shapeLayer);
            }

            //myMap.ZoomToExtents();
        }