使用NetTopologySuite在C#中创建点Shapefile遇Header设置异常
解决NetTopologySuite创建点Shapefile时的“Header must be set first!”异常
你的问题出在没有为ShapefileDataWriter正确设置ShapefileHeader和要素属性的Schema。虽然你创建了ShapefileHeader实例,但既没有配置它的关键参数,也没有关联到writer对象,同时writer需要明确知道要素的属性字段定义才能正确写入。
以下是修正后的代码,附带关键步骤说明:
using System; using System.IO; using NetTopologySuite.Features; using NetTopologySuite.Geometries; using NetTopologySuite.IO; namespace SHP { class Program { static void Main(string[] args) { string shpDir = @"D:\SHP"; // 确保输出目录存在,避免路径错误 if (!Directory.Exists(shpDir)) { Directory.CreateDirectory(shpDir); } string filePath = Path.Combine(shpDir, "point_Created.shp"); var geometryFactory = new GeometryFactory(); var point = geometryFactory.CreatePoint(new Coordinate(10, 20)); var attributes = new AttributesTable { { "Name", "My Point" } }; var feature = new Feature(point, attributes); var featureCollection = new FeatureCollection { feature }; // 1. 定义属性字段Schema:指定字段名和对应数据类型 var schema = new FeatureSchema(); schema.AddAttribute("Name", typeof(string)); // 2. 初始化并配置ShapefileHeader:设置几何类型、传入要素的边界范围 var header = new ShapefileHeader(GeometryType.Point, featureCollection.EnvelopeInternal); // 3. 创建writer并绑定header和schema var writer = new ShapefileDataWriter(filePath, geometryFactory) { Header = header, Schema = schema }; // 写入要素集合 writer.Write(featureCollection); } } }
关键修正点:
- 确保输出目录存在:避免因目录不存在引发的隐性错误
- 定义FeatureSchema:告诉writer要素的属性字段结构,否则无法生成配套的dbf属性文件
- 正确配置ShapefileHeader:必须指定几何类型(此处为
GeometryType.Point),并传入要素集合的边界范围(通过featureCollection.EnvelopeInternal自动计算) - 绑定header和schema到writer:这是解决“Header must be set first!”异常的核心,writer依赖这两个配置完成文件头的初始化
若你之前使用DotSpatial遇到类似问题,核心逻辑一致:必须先明确要素的几何类型、属性结构,再关联到写入器,不能直接写入未定义结构的要素集合。
内容的提问来源于stack exchange,提问作者Krink
相关产品推荐
相关产品推荐

