来气象局这边实习近半个月,主要工作内容为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);
}