地理空间MongoDB数据的沉浸式指南

235 阅读3分钟

处理坐标可能是一个巨大的痛苦,所以为什么不采取简单的方法呢?与其在前端与坐标搏斗,不如把它推到后端,让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(

我们可以选择指定minDistanceminDistance和maxDistance。

Places.find(

总结

你可能在想,这有什么用呢?好吧,假设我们的用户正在寻找他附近的餐馆,我们可以提供半径为10英里的所有餐馆。

谢谢你读到这里。如果你喜欢这篇文章,并且今天学到了一些东西,别忘了留下一个赞,并在媒体上关注我另外,请查看我的twitter,我在那里为开发者发布技巧、窍门和备忘录。


地理空间MongoDB数据的沉浸式指南》最初发表在《Dev Genius》杂志上,人们通过强调和回应这个故事来继续对话。