为啥多边形 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 对象的坐标存储在数组数组中?的主要内容,如果未能解决你的问题,请参考以下文章
C#MongoDb api - Geojson几何存储成一个类