如何使用 Geo API (Sharpmap) 获取几何点
How to get Geometry points using Geo API (Sharpmap)
我有一个 EPSG:4326 WGS 84 Shapefile,我已将其转换为 Sql 空间数据 我可以使用 sharpmap 1.1 渲染地图(之前使用的是 Sharpmap 0.9) .
我想要实现的是当我点击一个生成的多边形时,点击的多边形必须填充一种颜色(为了识别目的)所以我能够得到我点击的点但是如何使用该点并查询该多边形内的所有点,以便我可以为所有可能导致为所有多边形着色的点着色。
问题是我不知道如何在 sharpmap 1.1 版中执行此操作。
以前,当我使用 Sharpmap 0.9 时,我使用下面的行来获取所有点,为整个多边形着色。
pointArray.Collection.Add(SharpMap.Geometries.LinearRing.GeomFromWKB((byte[])Row["the_geom"]));
我的数据来自 Sql 空间数据库,因此行 ["the_geom"]。
到目前为止我已经完成了这个。(这只突出显示了点并且需要将点添加到 Geo API 集合中)
Collection<GeoAPI.Geometries.IGeometry> geomColl = new Collection<GeoAPI.Geometries.IGeometry>();
GeoAPI.GeometryServiceProvider.Instance = new NetTopologySuite.NtsGeometryServices();
GeoAPI.Geometries.IGeometryFactory gf = GeoAPI.GeometryServiceProvider.Instance.CreateGeometryFactory();
SharpMap.Layers.VectorLayer mySuggestedLayer = new SharpMap.Layers.VectorLayer("Higlight");
fillcolor = shapeFillColor;
var factory = GeoAPI.GeometryServiceProvider.Instance.CreateGeometryFactory(_SRID);
var pointArraySubject = factory.CreateGeometryCollection(null);
var mySubjectLayer = new SharpMap.Layers.VectorLayer("SubjectIcon");
DataRow Row = accounts.NewRow();
for (int i = 0; i < accounts.Rows.Count; i++)
{
Row = accounts.Rows[i];
GeoAPI.Geometries.Coordinate PinPnt = new GeoAPI.Geometries.Coordinate();
double x = Double.Parse(Row["Xcoord_geo"].ToString());
double y = Double.Parse(Row["Ycoord_geo"].ToString());
PinPnt.X = x;
PinPnt.Y = y;
//pointArray.Collection.Add(SharpMap.Geometries.LinearRing.GeomFromWKB((byte[])Row["the_geom"]));
geomColl.Add(gf.CreatePoint(PinPnt));
mySuggestedLayer.DataSource = new SharpMap.Data.Providers.GeometryFeatureProvider(geomColl);
mySuggestedLayer.Style.Fill = new System.Drawing.SolidBrush(fillcolor);
mySuggestedLayer.Style.EnableOutline = true;
mySuggestedLayer.SRID = _SRID;
_map.Layers.Add(mySuggestedLayer);
return _map;
任何 idea/help 都会让我开心。
在 FObermaier 的 Sharpmap 讨论的帮助下,我自己弄明白了 here
,我发布它可能会对某人有所帮助。
The problem was with the geometry transformation of the layer
好像转换格式不对
GeoAPI.Geometries.Coordinate PinPnt = new GeoAPI.Geometries.Coordinate();
NetTopologySuite.IO.WKBReader reader = new NetTopologySuite.IO.WKBReader();
var wkb = (byte[])Row["the_geom"];
Geometry geom = (Geometry)reader.Read(wkb);
var p = new GeometryFeatureProvider(geom);
myLayer.DataSource = p;
myLayer.Style.Fill = new System.Drawing.SolidBrush(fillcolor);
ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory ctFact = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
myLayer.CoordinateTransformation = ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84, ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator);
myLayer.ReverseCoordinateTransformation = ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator, ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84);
_map.Layers.Add(myLayer);
在上面
Row["the_geom"]
有图层需要高亮显示。
使用 ProjNet 我已经将几何图形转换为 web 墨卡托并且它有效。
我有一个 EPSG:4326 WGS 84 Shapefile,我已将其转换为 Sql 空间数据 我可以使用 sharpmap 1.1 渲染地图(之前使用的是 Sharpmap 0.9) .
我想要实现的是当我点击一个生成的多边形时,点击的多边形必须填充一种颜色(为了识别目的)所以我能够得到我点击的点但是如何使用该点并查询该多边形内的所有点,以便我可以为所有可能导致为所有多边形着色的点着色。
问题是我不知道如何在 sharpmap 1.1 版中执行此操作。
以前,当我使用 Sharpmap 0.9 时,我使用下面的行来获取所有点,为整个多边形着色。
pointArray.Collection.Add(SharpMap.Geometries.LinearRing.GeomFromWKB((byte[])Row["the_geom"]));
我的数据来自 Sql 空间数据库,因此行 ["the_geom"]。
到目前为止我已经完成了这个。(这只突出显示了点并且需要将点添加到 Geo API 集合中)
Collection<GeoAPI.Geometries.IGeometry> geomColl = new Collection<GeoAPI.Geometries.IGeometry>();
GeoAPI.GeometryServiceProvider.Instance = new NetTopologySuite.NtsGeometryServices();
GeoAPI.Geometries.IGeometryFactory gf = GeoAPI.GeometryServiceProvider.Instance.CreateGeometryFactory();
SharpMap.Layers.VectorLayer mySuggestedLayer = new SharpMap.Layers.VectorLayer("Higlight");
fillcolor = shapeFillColor;
var factory = GeoAPI.GeometryServiceProvider.Instance.CreateGeometryFactory(_SRID);
var pointArraySubject = factory.CreateGeometryCollection(null);
var mySubjectLayer = new SharpMap.Layers.VectorLayer("SubjectIcon");
DataRow Row = accounts.NewRow();
for (int i = 0; i < accounts.Rows.Count; i++)
{
Row = accounts.Rows[i];
GeoAPI.Geometries.Coordinate PinPnt = new GeoAPI.Geometries.Coordinate();
double x = Double.Parse(Row["Xcoord_geo"].ToString());
double y = Double.Parse(Row["Ycoord_geo"].ToString());
PinPnt.X = x;
PinPnt.Y = y;
//pointArray.Collection.Add(SharpMap.Geometries.LinearRing.GeomFromWKB((byte[])Row["the_geom"]));
geomColl.Add(gf.CreatePoint(PinPnt));
mySuggestedLayer.DataSource = new SharpMap.Data.Providers.GeometryFeatureProvider(geomColl);
mySuggestedLayer.Style.Fill = new System.Drawing.SolidBrush(fillcolor);
mySuggestedLayer.Style.EnableOutline = true;
mySuggestedLayer.SRID = _SRID;
_map.Layers.Add(mySuggestedLayer);
return _map;
任何 idea/help 都会让我开心。
在 FObermaier 的 Sharpmap 讨论的帮助下,我自己弄明白了 here ,我发布它可能会对某人有所帮助。
The problem was with the geometry transformation of the layer
好像转换格式不对
GeoAPI.Geometries.Coordinate PinPnt = new GeoAPI.Geometries.Coordinate();
NetTopologySuite.IO.WKBReader reader = new NetTopologySuite.IO.WKBReader();
var wkb = (byte[])Row["the_geom"];
Geometry geom = (Geometry)reader.Read(wkb);
var p = new GeometryFeatureProvider(geom);
myLayer.DataSource = p;
myLayer.Style.Fill = new System.Drawing.SolidBrush(fillcolor);
ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory ctFact = new ProjNet.CoordinateSystems.Transformations.CoordinateTransformationFactory();
myLayer.CoordinateTransformation = ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84, ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator);
myLayer.ReverseCoordinateTransformation = ctFact.CreateFromCoordinateSystems(ProjNet.CoordinateSystems.ProjectedCoordinateSystem.WebMercator, ProjNet.CoordinateSystems.GeographicCoordinateSystem.WGS84);
_map.Layers.Add(myLayer);
在上面
Row["the_geom"]
有图层需要高亮显示。 使用 ProjNet 我已经将几何图形转换为 web 墨卡托并且它有效。