应手写符合rfc 7946的导出结构体并用json.marshal序列化,geometry字段须为指针以支持null,避免map[string]interface{};推荐使用go.geojson库,调用fc.marshaljson()写入紧凑utf-8格式的.geojson文件,并用jq和geojsonhint验证。

用 json.Marshal 序列化 GeoJSON 结构体再写入文件
Go 本身没有内置 GeoJSON 类型,得自己定义结构体或用第三方库。最轻量的做法是按 GeoJSON 规范(RFC 7946)手写结构体,然后用标准 json.Marshal 编码。注意字段名必须导出(首字母大写),且建议加 json tag 显式控制键名和空值行为。
常见错误是直接传入 map[string]interface{} 导致嵌套 map 的键序混乱、浮点精度丢失,或未处理 nil geometry 导致 panic。GeoJSON 要求 type 字段严格为字符串(如 "Feature"),geometry 可为 null,所以结构体中 geometry 字段应设为指针类型。
示例结构体片段:
type Feature struct {
Type string `json:"type"`
Geometry *Geometry `json:"geometry,omitempty"`
Properties map[string]interface{} `json:"properties"`
}
type Geometry struct {
Type string `json:"type"`
Coordinates []float64 `json:"coordinates"`
}
写入文件时用 os.WriteFile 或 os.Create + json.Encoder,后者更适合大文件流式写入。
用 github.com/paulmach/go.geojson 库避免手动建模
手写结构体容易漏掉 FeatureCollection、MultiPolygon 坐标嵌套层级等细节。推荐直接用 go.geojson —— 它完整覆盖 RFC 7946,支持所有 geometry 类型、坐标校验、CRS(虽已不推荐)、以及 Validate() 方法。
关键点:
详细的 Three.js 3D 图形参考,涵盖场景设置、相机、几何体、材质、光照、动画、控制器、加载器、数学工具和调试。
-
geojson.NewFeature()和geojson.NewFeatureCollection()是起点,别直接 new struct - 坐标数组必须按
[longitude, latitude]顺序传入,反了会导致地图错位 - 写文件前调用
fc.MarshalJSON()(返回[]byte),不是json.Marshal(fc)—— 后者会绕过库内坐标标准化逻辑 - 如果 Properties 含非基础类型(如 time.Time),需提前转成 string/float64,该库不自动序列化
写入文件时注意换行、缩进与 UTF-8 BOM
GeoJSON 是 JSON,但地理信息系统(如 QGIS、Mapbox)对格式敏感:部分工具要求 LF 换行(非 CRLF),拒绝带 BOM 的 UTF-8 文件,还有些依赖紧凑格式(无空格)来校验哈希。
实操建议:
- 用
json.Marshal得紧凑 JSON;用json.MarshalIndent加缩进仅用于调试,上线前关掉 - 写文件务必指定
utf-8编码,Go 的os.WriteFile默认就是 UTF-8,无需额外处理 - Windows 下用
os.WriteFile不会加 BOM;若用编辑器另存,选 “UTF-8 no BOM” - 文件扩展名统一用
.geojson(不是.json),某些服务端路由靠后缀识别 MIME 类型
验证写入结果是否被主流工具识别
写完别急着导入,先用命令行快速验证:
用 jq 检查基础结构:jq '.type' data.geojson 应输出 "FeatureCollection";用 geojsonhint(npm 包)跑合规性:npx geojsonhint data.geojson。常见失败点:
-
coordinates数组长度为 0 或奇数(纬度经度必须成对) -
geometry.type拼写错误,如写成"Point "(尾部空格)或"point"(大小写错) -
FeatureCollection.features是 nil 切片而非空切片[]*geojson.Feature{},导致 JSON 里 missing field - 中文属性值没被正确编码(实际极少发生,Go 的 json 包默认转义 Unicode)
QGIS 打开失败时,优先看日志里报的是 “invalid JSON” 还是 “invalid coordinate”,前者查编码和括号匹配,后者查坐标维度嵌套层数。
golang免费学习笔记(深入):立即使用
在学习笔记中,你将探索golang的核心概念和高级技巧!










