如何使用nettopologysuite
发布网友
发布时间:2024-01-11 17:10
我来回答
共1个回答
热心网友
时间:2024-12-02 07:34
下面是一个简单的例子,演示了如何为Shape文件进行缓冲区分析:
public void InitializeMap(SharpMap.Map map)
{
//创建Shape文件的数据源
SharpMap.Data.Providers.ShapeFile shp = new SharpMap.Data.Providers.ShapeFile("rivers.shp", true);
//创建NTS数据源,从Shape文件获取数据,然后调用NtsOperation方法
SharpMap.Data.Providers.NtsProvider nts = new SharpMap.Data.Providers.NtsProvider(shp,new SharpMap.Data.Providers.NtsProvider.GeometryOperationDelegate(NtsOperation));
//创建渲染图层
SharpMap.Layers.VectorLayer layRivers = new SharpMap.Layers.VectorLayer("Rivers");
layRivers.DataSource = nts;
layRivers.Style.Fill = Brushes.Blue;
map.Layers.Add(layRivers);
}
//定义一个缓冲区分析的委托
public static void NtsOperation(List<GisSharpBlog.NetTopologySuite.Features.Feature> geoms)
{
foreach (GisSharpBlog.NetTopologySuite.Features.Feature f in geoms)
f.Geometry = f.Geometry.Buffer(0.5);
}
从上面的例子,我们可以看到,通过.net的委托,使用NTS Data Provider,可以在SharpMap中使用NTS的空间分析方法。
SharpMap的作者Morten Nielsen在Blog上也给出了如何在SharpMap中使用NTS的例子:
1. 对几何对象进行空间分析,本示例是缓冲区分析;
首先创建一个NTS的数据源,代表要进行空间分析的数据,其中myShapeFileDatasource代表一个Shape文件的数据源(参加上面的示例):
NtsProvider ntsDataSource = new NtsProvider(myShapeFileDatasource, CreateBuffers);
创建缓冲区:
private void CreateBuffers(List<GisSharpBlog.NetTopologySuite.Features.Feature> features)
{
foreach (GisSharpBlog.NetTopologySuite.Features.Feature feature in features)
feature.Geometry = feature.Geometry.Buffer(0.5);
}
2. 使用NTS做精确的交集判断,本示例通过点击,高亮选择对象,返回相应的属性。
可以使'ntsDataSource'对象指向一个矢量图层对象(vectorlayer),点击并高亮选择对象。可以通过ImageButton (ASP.NET)或者PictureBox (Windows.Forms)的点击事件(Click-Event)来触发的:
protected void imgMap_Click(object sender, ImageClickEventArgs e)
{
//转换图形坐标到地图坐标
Point ClickPnt = myMap.ImageToWorld(new System.Drawing.Point(e.X, e.Y));
SharpMap.Data.FeatureDataSet ds = new SharpMap.Data.FeatureDataSet();
//在第一层进行查询,注意使用了NTS的ExecuteIntersectionQuery方法
(myMap.Layers[0] as SharpMap.Layers.VectorLayer).DataSource.ExecuteIntersectionQuery(ClickPnt, ds);
if (ds.Tables.Count > 0) //得到了结果
{
//增加点击选择的对象到selection图层
//这样就新增了一个图层,因此渲染该副地图则显示选中对象
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);
}
//渲染地图
GenerateMap();
}
这样,只要点击地图,就会选择并高亮选中对象。