处理坐标可能是一个巨大的痛苦,所以为什么不采取简单的方法呢?与其在前端与坐标搏斗,不如把它推到后端,让mongoDB来做这些工作。今天,我们将研究如何在mongoDB或mongoose中处理地理空间数据。我们清单上的第一项是GeoJSON。
GeoJSON
它有各种数据类型,使处理坐标变得容易。请记住,经度排在纬度之前。
点
所有类型中最简单的,它基本上是一个坐标,即一个经度和一个纬度。
// A point
线字符串
这是一个坐标数组,它将被连接成一条线。它基本上由一个点的数组组成。
// A linestring
多边形
这是一个多边形,就是这样!正方形、长方形、六边形、十边形、四边形等等。这必须是一个封闭的图形(第一个点必须与最后一个点相同,我现在听起来像我的数学老师😅)。
我们使用LineStrings绘制多边形的边。现在,为了更好地说明这一点,我将画一个非常非常简单的坐标网格(别担心,没有什么复杂的)。
(我代表我糟糕的设计技巧为这个粗糙的网格道歉😅)
现在,让我们画一个简单的多边形。
下面是我们如何在代码中表示这个。
{
这里面有几个需要注意的地方。
- 嵌套的数组有3层之深,我一会再来讨论这个问题。
- 在图中,只有4个点,但我们在代码中却写了5个点。这是因为第一个点和最后一个点在图中是重叠的,所以看不出来。为了使其成为一个封闭的图形和一个有效的多边形,我们需要指定最后一个值与第一个值相同,以告诉mongoDB这个图形已经结束。
正如我之前承诺的,我将解释嵌套数组的秘密。
- 第一个数组存放所有的戒指(我将在第二部分解释这个问题)。
- 第二个数组保存每个戒指
戒指
现在,什么是环?基本上就是多边形里面的一个洞。所以,图中持有多边形之间的面积。这里有一个图。
里面的白色三角形是一个环。图中包含了外部多边形内但在白色区域外的区域(红色阴影的区域被包含)。
这个多边形的代码会是这样的。
{
这是一堂漫长的(希望不是无聊的)数学课。让我们实际玩一玩这些类型,了解更多的运算符。
$geometry
它持有我们的几何数据类型(例如:点、多边形),并与其他运算符一起使用。
{
$geoIntersects
它检查文档中的坐标是否与所提供的几何类型(必须是二维类型,如多边形)相交(不一定完全在里面)。
Places.find(
$geoWithin
检查文档中的坐标是否完全在提供的多边形内(单环/多环)。
如果你想做同样的事情,但在一个圆内(即在坐标的一个特定半径内),我们使用$center。它接收一个数组,其中有两个元素。第一个是中心的坐标,第二个是半径。格式是[[coordinateX, coordinateY], radius] 。
Places.find(
$near
抓取所有与指定坐标有一定距离的文件,可以用最小和最大长度来控制。此外,它还会将文件从最近的到最远的进行排序。
Places.find(
我们可以选择指定maxDistance。
Places.find(
总结
你可能在想,这有什么用呢?好吧,假设我们的用户正在寻找他附近的餐馆,我们可以提供半径为10英里的所有餐馆。
谢谢你读到这里。如果你喜欢这篇文章,并且今天学到了一些东西,别忘了留下一个赞,并在媒体上关注我另外,请查看我的twitter,我在那里为开发者发布技巧、窍门和备忘录。
地理空间MongoDB数据的沉浸式指南》最初发表在《Dev Genius》杂志上,人们通过强调和回应这个故事来继续对话。