I've created a small demo showing how to utilize NetTopologySuite in SharpMap. The great thing about NetTopologySuite is that is has a bunch of geoprocessing methods that SharpMap doesn't have (yet anyway). The demo uses the NetTopologySuite library for the following:
- Apply some geoprocessing to the geometries (in this case it puts a buffer on all rivers)
- Uses NTS for making exact intersection queries. By clicking on an object the buffered feature(s) are highlighted and attribute data shown beneath.
The basics are:
Create a NTS datasource based on another datasource which takes a delegate to apply to all geometries:
NtsProvider
ntsDataSource = new NtsProvider(myShapeFileDatasource, CreateBuffers);
Create the geometry-operation delegate method which should be applied to all features:
private
void CreateBuffers(List<GisSharpBlog.NetTopologySuite.Features.Feature> features)
{
foreach (GisSharpBlog.NetTopologySuite.Features.Feature feature in features)
feature.Geometry = feature.Geometry.Buffer(0.5);
}
The 'ntsDataSource' object can then be assigned as datasource to a vectorlayer.
Clicking and highlighting features are done by reacting to a click-event on an ImageButton (in ASP.NET) or a PictureBox (in Windows.Forms).
protected
void imgMap_Click(object sender, ImageClickEventArgs e)
{
//Convert click-point in image coordinates to world coordinates
Point ClickPnt = myMap.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
//Execute click-query on first layer in layers collection
(myMap.Layers[0] as SharpMap.Layers.VectorLayer).DataSource.ExecuteIntersectionQuery(ClickPnt, ds);
if (ds.Tables.Count > 0) //We have a result
{
//Add clicked features to a new selection layer
SharpMap.Layers.VectorLayer laySelected = new SharpMap.Layers.VectorLayer("Selection");
laySelected.DataSource = new GeometryProvider(ds.Tables[0]);
laySelected.Style.Fill = new System.Drawing.SolidBrush(System.Drawing.Color.Yellow);
myMap.Layers.Add(laySelected);
}
//Call method that renders a new map and displays it to the user
GenerateMap();
}
Download NetTopologySuite_Demo.zip (544,32 KB)