GeoJSON 的 Point、LineString、Polygon 和 FeatureCollection 怎么理解?
GeoJSON 看起来很像普通 JSON,但小的结构错误就可能让地图渲染到错误位置,或者直接加载失败。调试地图组件前,先确认 GeoJSON 对象结构是否正确,往往比反复改样式更有效。
核心概念很简单:GeoJSON 用 geometry 表示形状,用 Feature 给形状附加属性,用 FeatureCollection 组织多个要素。GeoJSON 地球查看 可以帮助你预览这些结构,但先理解类型,会更容易发现错误。
坐标顺序先记住
GeoJSON 的位置坐标是经度在前,纬度在后:
[-122.4194, 37.7749]
这和很多人口头说“纬度,经度”的习惯相反。如果不小心把纬度写在前面,点位可能跑到错误国家、错误海域,甚至完全不在可见范围内。
位置坐标还可以带第三个数字表示高度:
[-122.4194, 37.7749, 20]
很多简单查看工具会忽略高度,但仍然应该能解析这个坐标。
Point 和 MultiPoint
Point 表示一个位置:
{
"type": "Point",
"coordinates": [-122.4194, 37.7749]
}
它适合门店、传感器、地标、地址、设备等单点数据。MultiPoint 表示同一个 geometry 里的多个点。如果这些点属于同一个业务对象,可以用 MultiPoint;如果每个点都有独立属性,多个 Feature 往往更清晰。
LineString 和 MultiLineString
LineString 表示由两个或更多坐标组成的路径:
{
"type": "LineString",
"coordinates": [
[-122.42, 37.77],
[-73.98, 40.75]
]
}
它适合路线、边界、轨迹、线缆、巡检记录和连接关系。MultiLineString 则把多条线放在同一个 geometry 里。
如果一条线突然跨过整个地球,优先检查经纬度顺序和是否跨越 180 度经线。很多“地图画错线”的问题,其实不是渲染库坏了,而是坐标解释错了。
Polygon 和 MultiPolygon
Polygon 表示一个面。它的 coordinates 是 ring 数组。第一个 ring 是外边界,后面的 ring 可以表示洞。
{
"type": "Polygon",
"coordinates": [
[
[-122.5, 37.7],
[-122.3, 37.7],
[-122.3, 37.9],
[-122.5, 37.9],
[-122.5, 37.7]
]
]
}
注意第一个点和最后一个点相同,这表示 ring 闭合。MultiPolygon 用于一个要素包含多个分离区域的情况,比如由多个岛屿组成的范围。
Feature 和 FeatureCollection
原始 geometry 只描述形状。Feature 会把 geometry 和 properties 包在一起:
{
"type": "Feature",
"properties": { "name": "Example area" },
"geometry": {
"type": "Polygon",
"coordinates": []
}
}
FeatureCollection 则组织多个 Feature:
{
"type": "FeatureCollection",
"features": []
}
多数地图数据会用 FeatureCollection,因为每个形状都可以带自己的名称、分类、状态、颜色或业务字段。
怎么选择合适的类型?
选择 geometry 时,先看这个对象在业务上是什么,而不是先想怎么画样式。门店、设备、地址通常是 Point。配送路线、轨迹、边界线通常是 LineString。服务区域、行政范围、覆盖范围通常是 Polygon。
如果一个业务对象包含多个分离形状,要看这些形状是否需要独立属性。五家门店通常更适合五个 Feature,每个 Feature 一个 Point,并带自己的门店名和编号。由多个岛屿组成的同一个保护区,则可能更适合一个 MultiPolygon,因为它们属于同一个命名区域。
预览不对时怎么排查?
GeoJSON 预览结果不对时,可以从外到内检查:
- 先看最外层
type。 - 如果是
FeatureCollection,看features数量。 - 打开一个 Feature,确认里面有
geometry。 - 看 geometry 的
type。 - 按类型检查坐标嵌套层级。
- 确认坐标是经度在前、纬度在后。
- 看 bounds 是否有异常离群点。
这个顺序比随机改地图配置更有效。很多显示问题不是样式问题,而是数据结构、坐标顺序、投影假设或某一个坏要素造成的。
Geometry 不是样式
GeoJSON 只说明形状,不保证它应该怎么显示。一个 Polygon 的 properties 里可以有分类或颜色字段,但最终怎么填充、描边、标注,要由渲染器决定。LineString 也一样,它可能是道路、航线、线缆、边界或轨迹。
导出数据时要把这两件事分开:geometry 负责形状,properties 负责业务含义,前端或 GIS 工具负责样式。不要指望通用查看工具理解每个自定义字段,但这些字段可以帮助你在自己的应用里做分类和交互。
还有一点要注意:GeoJSON 默认讨论的是地理坐标,不是任意平面坐标。如果你把 Web Mercator 米制坐标、CAD 坐标或本地投影坐标直接塞进 GeoJSON,经纬度查看工具可能会把它们当成经纬度解释,结果自然会错。遇到坐标数值特别大、bounds 明显超出 -180..180 和 -90..90 时,先检查是否需要投影转换。
常见错误
| 错误 | 表现 |
|---|---|
| 纬度写在经度前 | 点位出现在错误位置。 |
| 只有数组,没有 GeoJSON 对象 | 解析器提示缺少 type。 |
| Polygon ring 没闭合 | 面可能渲染异常或校验失败。 |
| properties 没放在 Feature 里 | 属性可能被忽略或结构无效。 |
| 坐标嵌套层级错 | 线或面无法通过校验。 |
一句话总结
GeoJSON 使用“经度、纬度”的坐标顺序。Point 表示单点,LineString 表示路径,Polygon 表示区域,Feature 给几何附加属性,FeatureCollection 组织多个要素。预览结果不对时,先查坐标顺序、嵌套层级和 Polygon 是否闭合。