为啥多边形 GeoJSON 对象的坐标存储在数组数组中?

Posted

技术标签:

【中文标题】为啥多边形 GeoJSON 对象的坐标存储在数组数组中?【英文标题】:Why are coordinates of polygon GeoJSON Objects stored in an array of array?为什么多边形 GeoJSON 对象的坐标存储在数组数组中? 【发布时间】:2018-04-05 15:42:29 【问题描述】:

如official documentation中所见,多边形GeoJSON对象的结构如下图所示:

db.someCollection.insert(
  type: "Polygon",
  coordinates: [[[0, 0], [3, 6], [6, 1], [0, 0]]]
);

为什么不像下图那么简单:

A型

db.someCollection.insert(
  type: "Polygon",
  coordinates: [[0, 0], [3, 6], [6, 1], [0, 0]]
);

我认为原因可能是存储多个地理围栏。像这样的:

B型

db.someCollection.insert(
  type: "Polygon",
  coordinates: [
    [[0, 0], [3, 6], [6, 1], [0, 0]],
    [[1, 1], [3, 6], [6, 1], [1, 1]]
  ]
);

我发布这个问题的原因是因为我猜我的假设在使用 Mongo DB 中的某些功能(如 $geoIntersects$geoWithin)后是错误的,这需要结构在 Type A 格式。

【问题讨论】:

【参考方案1】:

MongoDB 没有定义 GeoJSON 格式。相反,它是在一个标准中定义的:RFC7946

这是 RFC 中关于多边形的相关部分:https://www.rfc-editor.org/rfc/rfc7946#section-3.1.6 其中声明:

对于“Polygon”类型,“coordinates”成员必须是线性环坐标数组的数组。
对于具有多个这些环的多边形,第一个必须是 外环,其他必须是内环。这 外环限定表面,内环(如果 存在)表面内的结合孔。

其中线性环定义为:

线性环是具有四个或更多位置的闭合 LineString。

LineString 是https://www.rfc-editor.org/rfc/rfc7946#section-3.1.4:

对于“LineString”类型,“坐标”成员是一个包含两个或 更多职位。

基本上,多边形被定义为一系列闭合的线串,第一个线串定义多边形的边界,随后的线串定义第一个线串中的“孔”。

以这种方式定义,可以创建一个带有多边形的甜甜圈形状。

这种类型的构造只有在表示为数组数组时才有可能,因此是标准。

【讨论】:

以上是关于为啥多边形 GeoJSON 对象的坐标存储在数组数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 geoJson 获取坐标?

C#MongoDb api - Geojson几何存储成一个类

在 MongoDB 中存储 GeoJSON 多边形

用于测试点是不是在 geojson 多多边形中的 Node.js/Javascript 库

谷歌地图 GeoComplete 与 GeoJson

将 geoJson 数据转换为 sql server 空间数据类型(GIS)