Как получить очки геометрии, используя Geo API (Sharpmap)
У меня есть шейп-файл EPSG:4326 WGS 84, и я преобразовал его в пространственные данные Sql. Я могу визуализировать карту, используя ее с sharpmap 1.1(ранее использовался Sharpmap 0.9).
Я пытаюсь добиться того, чтобы при нажатии на сгенерированный полигон выбранный полигон должен быть заполнен цветом (для целей идентификации), чтобы я мог получить точку, в которой я щелкаю, но как использовать эту точку и запросить для всей точки внутри этого многоугольника, чтобы я мог закрасить всю точку, что может привести к окрашиванию всего многоугольника.
Проблема в том, что я не знаю, как это сделать в sharpmap версии 1.1.
Ранее, когда я использовал Sharpmap 0.9, я использовал нижнюю линию, чтобы получить все точки, чтобы закрасить весь многоугольник.
pointArray.Collection.Add (SharpMap.Geometries.LinearRing.GeomFromWKB ((байт []) Строка ["the_geom"]));
Мои данные взяты из Sql Spatial DB, отсюда и строка ["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;
Любая идея / помощь сделает мой день.
1 ответ
Я понял это сам с помощью FObermaier из обсуждения Sharpmap здесь, я публикую это, чтобы кто-то мог помочь.
Проблема была с преобразованием геометрии слоя
Кажется, преобразование было в неправильном формате
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);
В выше
Строка ["the_geom"]
имеет слой, который должен быть выделен. Используя ProjNet, я преобразовал геометрию в web mercator, и это сработало.