GeoJSON 到底是什么?搞懂这种地理数据格式并不难
上篇聊了坐标系,这篇把"容器"讲清楚,也就是 GeoJSON。说实话,我刚接触的时候也被它一堆 FeatureCollection、geometry 绕晕过,但真拆开看,它其实就是用 JSON 描述地理要素的一套约定,没那么玄乎。
先给个定义
GeoJSON 是用 JSON 语法表示地理数据的格式。点、线、面,还有一堆带属性的要素,全都能用 {} 和 [] 装进去。它最大的好处是人类能读、机器能解析、浏览器直接能处理,不用装任何二进制解析库。
最常见的三种几何类型
日常 90% 场景只会碰到这三个:
| 类型 | 干啥用 | 坐标长相 |
|---|---|---|
Point | 标记一个点(比如某个坐标) | [经度, 纬度] |
LineString | 一条线(河流、道路、边界线) | [[lon,lat], [lon,lat], ...] |
Polygon | 一个面(省界、市界、地块) | [[ [lon,lat], ... , [lon,lat] ]] |
注意 Polygon 是"数组的数组":最外层是"环"的列表,第一个环是外边界,后面的环是洞(比如一个省里有飞地或者湖泊)。这点新手特别容易写错。
一个完整的例子
{
"type": "FeatureCollection",
"features": [
{
"type": "Feature",
"properties": {
"name": "北京市",
"level": "province",
"code": "110000"
},
"geometry": {
"type": "Polygon",
"coordinates": [
[
[116.0, 40.0],
[116.5, 40.0],
[116.5, 40.5],
[116.0, 40.5],
[116.0, 40.0]
]
]
}
}
]
}
要点:
- FeatureCollection 就是一筐要素;
- 每个 Feature 分两部分:properties(你爱存啥存啥,名称、行政代码、层级都行)和 geometry(几何形状);
- 坐标顺序是 [经度, 纬度],不是纬度在前。这个坑我踩过,画出来直接跑到非洲去了。
为什么选它而不是 KML / Shapefile
- Shapefile:ArcGIS 老家伙,强但二进制,还得配套好几个文件(.shp/.shx/.dbf),浏览器不友好;
- KML:谷歌系,XML 写法,体积大、解析慢;
- GeoJSON:纯文本、前端 JSON.parse 一行搞定、配合 Canvas/SVG 直接画。
所以在 Web 地图项目里,GeoJSON 几乎是默认选择。我做的 GeoJSONcn 就把全国行政区划边界全做成了 GeoJSON,前端拿到就能渲染,不用任何中间转换。
几个实战里容易翻车的地方
1. 坐标顺序:永远 [lon, lat],别被某些库的 (lat, lon) 习惯带偏。 2. 多边形必须闭合:首尾坐标要一样,不然 Canvas 填充会裂。 3. 经纬度别用字符串:写成数字,否则算距离、面积时全变字符串拼接。 4. 小数精度:行政区划边界留 5~6 位小数足够,再多纯属浪费体积。
最后
GeoJSON 就是用 JSON 装地理要素,记住 FeatureCollection → Feature → properties/geometry 这个三层结构,坐标 [经度, 纬度] 别写反,Polygon 注意闭合和"环的数组"就稳了。
下一篇聊点更实用的:拿到 GeoJSON 之后,怎么把它转成 KML、SVG、CSV 甚至 PNG 大图,每种格式又该在什么场景用。