SharpMap功能拓展之空间分析功能

来气象局这边实习近半个月,主要工作内容为GWASS系统编写空间分析功能。GWASS系统是在开源类库基础上建立起来的服务系统,基于的开源类库包括WorldWind、SharpMap、Proj.4等等。SharpMap主要被用来读取矢量格式的文件,如果要用到空间分析,第一个想到的就是JTS的.NET版本NetTopologySuite(NTS)。

NetTopologySuite是著名的JTS Topology Suite的C#/.net版本,简称NTS,JTSTopology Suite为一个OpenGIS标准的GIS分析、操作类库。NTS项目的目的是提供一个基于.net,快速、稳定的GIS解决方案,以应用于所有.net平台,包括各类嵌入式设备。

在SharpMap中使用NetTopologySuite的简单例子可以参照Mars写的这篇文章

虽然SharpMap和NTS都是基于OGC的简单要素规范,不过NTS为了可以进行方便的空间分析,Geometry的定义与SharpMap的并不是完全相同,因此在进行空间分析操作的时候切记要将SharpMap的Geometry转换到NTS的Geometry上来。

GisSharpBlog.NetTopologySuite.Geometries.Geometry geo = GeometryConverter.ToNTSGeometry(geometry, geometryFactory);

NTS的Geometry提供了许多空间关系的判断操作,比如Disjoint、Touches、Intersects、Crosses、Within、Contains、Overlaps、Covers、CoveredBy、Relate等,还有一些是空间叠置分析。目前,NTS只提供四种空间叠置分析,分别是Intersection、Union、Difference和SymDifference。总体上说来,这四种操作基本满足一般的空间分析需求了。

除了Overlap以外,NTS还提供Buffer、Distance、Linemerge、Polygonize、Predicate、Relate等分析功能。

下面是我写的一个查询某图层中与某个Geometry相交的例子:

        public void ExecuteClipQuery(GisSharpBlog.NetTopologySuite.Geometries.Geometry geometry, FeatureDataSet ds)
        {
           // GisSharpBlog.NetTopologySuite.Geometries.Geometry geometry = GeometryConverter.ToNTSGeometry(geom, geometryFactory);
            SharpMap.Data.FeatureDataTable dataTable = CreateFeatureDataTable(“area”);

            foreach (GisSharpBlog.NetTopologySuite.Features.Feature feature in features)
                if (feature.Geometry.Intersects(geometry))
                {
                    GisSharpBlog.NetTopologySuite.Geometries.Geometry intersectGeo;
                    if(geometry.Contains(feature.Geometry))
                        intersectGeo = feature.Geometry;
                    else
                        intersectGeo=  feature.Geometry.Intersection(geometry);
                    GisSharpBlog.NetTopologySuite.Features.Feature newFeature = new GisSharpBlog.NetTopologySuite.Features.Feature(intersectGeo, feature.Attributes);
                    FeatureDataRow dataRow = CreateNewRowBySHG(dataTable, newFeature);
                    dataRow[“area”] = intersectGeo.Area;
                    dataTable.AddRow(dataRow);
                }
            ds.Tables.Add(dataTable);
        }

 

 

 

转载自:https://blog.csdn.net/wsh6759/article/details/7422658

You may also like...