2016-09-07 3 views
0

У меня есть файл EPSG: 4326 WGS 84 Shapefile, и я преобразовал его в пространственные данные Sql. Я могу отображать карту, используя ее с помощью sharpmap 1.1 (Ранее использовался Sharpmap 0.9).Как получить точки геометрии с помощью Geo API (Sharpmap)

То, что я пытаюсь достичь, - это когда я нажимаю на сгенерированный многоугольник, щелкнутый многоугольник должен быть заполнен цветом (для целей идентификации). Таким образом, я могу получить точку, в которой я нажимаю, но как использовать эту точку и запрос для всей точки внутри этого многоугольника, чтобы я мог раскрасить всю точку, которая может привести к окрашиванию всего полигона.

Проблема в том, что я не знаю, как это сделать в sharpmap версии 1.1.

Раньше, когда я использовал Sharpmap 0.9, я использовал нижнюю строку, чтобы получить все точки для окрашивания всего полигона.

pointArray.Collection.Add (SharpMap.Geometries.LinearRing.GeomFromWKB ((байт []) Строка [ "the_geom"]));

Мои данные из Sql Spatial DB, следовательно, Row ["the_geom"].

До сих пор я сделал это. (Что выделяет только точку и нужно добавить пункты в коллекции API Geo)

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; 

Любая идея/помощь будет сделать мой день.

ответ

0

Я понял это с помощью помощи от обсуждения FObermaier of Sharpmap here , я отправляю его так, чтобы кто-то мог помочь.

Проблема была с геометрией трансформации слоя

Кажется, что преобразование было в неправильном формате

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 Я преобразовал геометрию в веб-меркатор, и это сработало.