我正在寻找一个文档齐全的开源库,该库可以从.NET创建和写入shapefile。我需要较低的操纵杆访问权限,即我应该能够逐个功能地编写功能。
我已经调查并发现以下内容:
- SharpMap声称可以在v 2.0中写入shapefile,但是该版本尚未发布。
- NTS绝对没有任何文档。
- Catfood shapefile阅读器提供只读访问权限。
是否有一个可用于编写新shapefile的库?
我正在寻找一个文档齐全的开源库,该库可以从.NET创建和写入shapefile。我需要较低的操纵杆访问权限,即我应该能够逐个功能地编写功能。
我已经调查并发现以下内容:
是否有一个可用于编写新shapefile的库?
Answers:
我感到你很痛苦。我使用NetTopologySuite(v1.13)进行了同样的工作,并且在单元测试方面取得了一些成功。
首先,您可能会签出DotSpatial库,该库在特定于DS shapefile操作的类似问题中被引用
我个人对NTS库感到满意。一旦弄清了对象模型,就可以放在一起。由于可能多次引用此主题,因此这里有一个快速的代码转储,用于从NTS编写shapefile。
1)下载NTS(1.13.0)二进制文件
2)参考以下程序集:
-GeoAPI,NetTopologySuite,NetTopologySuite.IO,NetTopologySuite.IO.GeoTools(猜测弄清楚这最后一个需要多长时间)
3)编写一些代码(这是10分钟的黑客工作)
为NetTopologySuite,NetTopologySuite.IO,NetTopologySuite.Features,GeoAPI,GeoAPI.Geometries添加using语句(很抱歉,我无法弄清楚如何格式化这些格式)
string path = @"C:\data\atreides";
string firstNameAttribute = "firstname";
string lastNameAttribute = "lastname";
//create geometry factory
IGeometryFactory geomFactory = NtsGeometryServices.Instance.CreateGeometryFactory();
//create the default table with fields - alternately use DBaseField classes
AttributesTable t1 = new AttributesTable();
t1.AddAttribute(firstNameAttribute, "Paul");
t1.AddAttribute(lastNameAttribute, "Atreides");
AttributesTable t2 = new AttributesTable();
t2.AddAttribute(firstNameAttribute, "Duncan");
t2.AddAttribute(lastNameAttribute, "Idaho");
//create geometries and features
IGeometry g1 = geomFactory.CreatePoint(new Coordinate(300000, 5000000));
IGeometry g2 = geomFactory.CreatePoint(new Coordinate(300200, 5000300));
Feature feat1 = new Feature(g1, t1);
Feature feat2 = new Feature(g2, t2);
//create attribute list
IList<Feature> features = new List<Feature>() { feat1, feat2 };
ShapefileDataWriter writer = new ShapefileDataWriter(path) { Header = ShapefileDataWriter.GetHeader(features[0], features.Count) };
System.Collections.IList featList = (System.Collections.IList)features;
writer.Write(featList);
因此,没有足够的文档记录,但是一旦您开始,就可以傻瓜傻瓜相机。
也有shapelib:http ://shapelib.maptools.org/
网页上列出了.NET包装器。
Feature Data Objects(FDO)通过其SHP提供程序进行SHP读/写,并具有C ++和.net的API
也许有点但是...
PyShp使用纯Python为您提供功能级别的shapefile控件或更多功能:http : //code.google.com/p/pyshp/
IronPython让您在.NET CLR上运行纯Pythin脚本:http ://ironpython.net/
将IronPython脚本转换为.Net库,例如以下线程:https : //stackoverflow.com/questions/1578010/ironpython-2-6-py-exe/9609120#9609120
尽管已经回答了这一问题,但以后建议任何人使用的建议还是EGIS(简易GIS),它允许将shapefile逐个特征地写入。
ShapeFileWriter sfw = ShapeFileWriter.CreateWriter(dir,fileName,shapeType,dataFieldHeadings);
sfw.AddRecord(pointArray, pointCount, fieldData);
这会将一个功能添加到所选的shapefile中,并且AddRecord方法具有7个重载。
我可以推荐EasyGIS。从https://www.easygisdotnet.com下载最新版本,EGIS.ShapeFileLib
并在其中加上几行内容来创建您的第一个shapefile。下面的代码创建一个Polygon shapefile,其中包含一个属性char字段“ Name”和一个形状(一个名为“ FirstRecord”的矩形)。
DbfFieldDesc[] lFields = new DbfFieldDesc[1];
DbfFieldDesc fld1 = new DbfFieldDesc();
fld1.FieldName = "Name";
fld1.FieldType = DbfFieldType.Character;
fld1.FieldLength = 16;
lFields[0] = fld1;
ShapeFileWriter sfw = ShapeFileWriter.CreateWriter(sExportDir, "testShapeFile", ShapeType.Polygon, lFields);
PointD[] lPoints = new PointD[4];
lPoints[0] = new PointD(1, 1);
lPoints[1] = new PointD(1, 2);
lPoints[2] = new PointD(2, 2);
lPoints[3] = new PointD(2, 1);
String[] lFieldValues = new String[1];
lFieldValues[0] = "FirstRecord";
sfw.AddRecord(lPoints, 4, lFieldValues);
sfw.Close();