Go go-shp 怎样把点数据写成Shapefile
用 Go 写点数据时,可以把坐标放进 shp.Point,再用 shp.Create("points.shp", shp.POINT) 创建写入器。随后先用 SetFields 定义 DBF 属性字段,再对每个点分别调用 Write 和 WriteAttribute。写完后关闭 Writer,目录中会得到同名的几何、索引和属性文件。
官方资料:https://pkg.go.dev/github.com/jonas-p/go-shp
下面的示例只讨论点要素和简单字符串属性,不负责坐标投影转换,也不把示意图当成程序运行截图。
先分清 Shapefile 不是一个单独文件
一个可用的 Shapefile 通常是同名文件组:.shp 保存点、线或面的几何记录,.shx 保存几何记录的索引信息,.dbf 保存与要素行对应的属性字段。go-shp 的 Writer 会围绕你传入的主文件名处理这些组件,所以不要只把 points.shp 当成最终交付物。
坐标参考系统通常由旁边的 .prj 文件描述。当前写入示例只给出 X、Y 数值,go-shp 不会根据数值猜测经纬度或自动生成投影定义。若数据有明确坐标系,应由业务流程另外生成或提供正确的 .prj,并把它与前三个同名文件一起交付。

安装依赖并选择 POINT 写入类型
在已有 Go 模块中安装包:
# 安装用于读取和写入 ESRI Shapefile 的 Go 包 go get github.com/jonas-p/go-shp
示例程序使用 shp.POINT 创建点类型 Writer。这里的类型要和后续传入的几何对象一致;如果输入的是折线或面,不能仍然使用点类型。
package main
import (
"log"
"strconv"
shp "github.com/jonas-p/go-shp"
)
func main() {
points := []shp.Point{
{X: 116.3913, Y: 39.9075},
{X: 121.4737, Y: 31.2304},
{X: 113.2644, Y: 23.1291},
}
// 用 POINT 声明几何类型,文件名会成为同名文件组的基名。
writer, err := shp.Create("points.shp", shp.POINT)
if err != nil {
log.Fatalf("创建 Shapefile 失败: %v", err)
}
defer writer.Close()
// DBF 字段必须先定义,后续属性值按字段下标写入。
fields := []shp.Field{
shp.StringField("NAME", 32),
shp.StringField("CODE", 16),
}
if err := writer.SetFields(fields); err != nil {
log.Fatalf("设置属性字段失败: %v", err)
}
for row, point := range points {
// 写入几何记录;返回值是库内部的记录编号,不替代属性行号管理。
writer.Write(&point)
// row 与几何记录保持同一顺序,两个字段分别写入 NAME 和 CODE。
if err := writer.WriteAttribute(row, 0, "地点-"+strconv.Itoa(row+1)); err != nil {
log.Fatalf("写入 NAME 失败: %v", err)
}
if err := writer.WriteAttribute(row, 1, "P"+strconv.Itoa(row+1)); err != nil {
log.Fatalf("写入 CODE 失败: %v", err)
}
}
}
这个程序的关键不是把所有代码塞进一个循环,而是维持两条对应关系:每次 Write 写一个点,每次 WriteAttribute 用同一个 row 写该点的属性。字段下标 0 和 1 分别对应 SetFields 中的两个字段。
字段定义和点记录要保持同一套顺序
DBF 属性表是按字段数组建立的。字段名、字段类型和长度应该在写入前确定;字符串字段长度不要只按当前样例值设置,否则真实数据变长时容易出现截断或写入失败。需要数值或日期时,可以换用包提供的 NumberField、FloatField 或 DateField,但每个字段都应在设计阶段固定用途。
写属性时,row 表示要关联的要素行,field 是字段下标。不要在写完几何后用另一套排序写 DBF;例如点按时间排序、属性按名称排序,会让地图上的要素和属性错位。

关闭 Writer 后怎样整理交付文件
Close 是写入流程的一部分。示例用 defer writer.Close() 确保函数退出时关闭文件;如果是更复杂的批处理,可以在关闭后再把输出目录交给下一个处理阶段。不要在 Writer 仍未关闭时就复制、压缩或上传文件组。
交付前可以按以下清单整理:
| 文件 | 用途 | 本例是否由 Writer 负责 |
|---|---|---|
points.shp | 点几何记录 | 是 |
points.shx | 几何索引和定位信息 | 是 |
points.dbf | NAME、CODE 等属性行 | 是 |
points.prj | 坐标参考定义 | 本例不自动生成 |
如果输出路径带目录,先确保目录存在;如果目标文件已经存在,按项目策略决定是覆盖、换文件名还是使用 shp.Append 追加。不要把旧的 .dbf 或 .shx 留在目录里冒充新结果。
常见问题和速查结论
为什么地图软件能打开 shp,却看不到属性?
通常是文件组不完整、DBF 字段没有正确写入,或者几何文件和属性文件来自不同一批数据。确认三个同名文件同时生成,并保持同一输出基名。
经纬度点写入后位置不对怎么办?
go-shp 只接收 X、Y 数值,不会替你判断坐标顺序或投影坐标系。先确认输入是经度在前、纬度在后,还是已经投影的平面坐标;再为文件组补上与数据一致的 .prj。
能不能只保存 shp 文件?
不建议。Shapefile 的实用交付单位是同名文件组,属性需求还需要 DBF,空间索引通常需要 SHX;缺少配套文件会降低兼容性。
写点和写属性哪个先调用?
推荐在同一轮中先写几何,再用同一行号写属性,最容易保持对应关系。关键是字段已经通过 SetFields 定义,并且所有记录使用稳定的行顺序。
结语
把 Go 点数据写成 Shapefile 的最小路径是:创建 POINT Writer,定义字段,逐条写入 shp.Point 和属性,关闭 Writer,再把同名文件组与正确的坐标参考说明一起交付。只要把几何记录、DBF 行号和字段下标固定在同一套顺序里,后续接入地图软件或批处理流程就不会因为属性错位而返工。
Go go-shp 怎样读取DBF属性字段
- 上一篇
- Go go-shp 怎样读取DBF属性字段
- 下一篇
- Python wave 以不可定位输出写文件时怎样确定帧数
-
- Golang · Go教程 | 37分钟前 |
- Go go-colorful 怎样生成具有区分度的配色集合
- 492浏览 收藏
-
- Golang · Go教程 | 39分钟前 | Go教程 · Go HCL go-colorful 颜色混合 BlendHcl
- Go go-colorful 怎样在HCL空间混合两种颜色
- 389浏览 收藏
-
- Golang · Go教程 | 44分钟前 | Go教程 · Go 十六进制颜色 go-colorful Lab
- Go go-colorful 怎样把十六进制颜色转换为Lab坐标
- 344浏览 收藏
-
- Golang · Go教程 | 1小时前 | Go教程 · Go DBF Shapefile go-shp ReadAttribute
- Go go-shp 怎样读取DBF属性字段
- 301浏览 收藏
-
- Golang · Go教程 | 1小时前 | go · Go go-geom Polygon LinearRing 外环 内环
- Go go-geom 怎样为多边形添加外环与内环
- 287浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go go-geom 怎样计算几何对象的坐标包围盒
- 380浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go go-geom 怎样用平铺坐标构造二维折线
- 134浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go groot 怎样把ROOT对象写入新文件
- 121浏览 收藏
-
- Golang · Go教程 | 1小时前 |
- Go groot 怎样列出ROOT文件中的对象键
- 445浏览 收藏
-
- Golang · Go教程 | 2小时前 |
- Go fitsio 怎样向FITS表追加一条结构化记录
- 464浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 801次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 792次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 879次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 849次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 680次使用
-
- Java 性能优化上线清单:从定位、改造到灰度发布
- 2026-06-11 860浏览
-
- Spring Boot 压测验证:Gatling、JMeter 与性能回归门禁
- 2026-06-11 843浏览
-
- Java NMT 非堆内存排查:Direct Buffer、线程栈与 Metaspace 分析
- 2026-06-11 826浏览
-
- Spring Boot 容器内存优化:JVM 堆、非堆与 MaxRAMPercentage
- 2026-06-11 809浏览
-
- Tomcat 连接与线程参数调优:maxThreads、acceptCount 与 KeepAlive
- 2026-06-11 792浏览

