You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 08:32:12