【问题标题】:Efficient way to select all points inside radius选择半径内所有点的有效方法
【发布时间】:2019-06-29 05:28:40
【问题描述】:

我正在使用 meanstack 应用程序。所以我有包含全球位置的 mongodb 集合。架构如下所示。

[{
address : "example address",
langitude : 79.8816,
latitude : 6.773
},
{...}]

选择圆内所有点的有效方法是什么(预定义的点和预定义的半径)..??

使用 SQL 查询我们也可以做到这一点。但是我想要一种有效的方法,而无需逐个迭代并检查天气是否在该半径内。

【问题讨论】:

  • @MrUpsidown 手工操作(在代码中或通过 SQL 查询)效率非常低。这就是为什么建议使用 Elasticsearch。我认为我们不应该将人们指向低效率的方向。
  • 是的@Divanshu 使用 SQL 查询效率非常低。与该方法相比,Elasticsearch 似乎很有效。我参考了一些文件。

标签: mongodb google-maps-api-3 mean-stack


【解决方案1】:

坐标为 {lat1,lon1} 和 {lat2,lon2} 的两点之间的距离 d 由下式给出

d = 2*asin(sqrt((sin((lat1-lat2)/2))^2 +
    cos(lat1)*cos(lat2)*(sin((lon1-lon2)/2))^2))

以上公式以弧度表示 d。要获得以公里为单位的答案,请使用以下公式。

distance_km ≈ radius_km * distance_radians ≈ 6371 * d

在这里,幻数 6371 约为。地球的半径。这是在您的情况下您必须进行的最小计算。您可以计算此距离并选择距离小于您的半径值的所有记录。

更好的方法

您可以使用支持地理位置查询的Elasticsearch 以获得更好的性能。

【讨论】:

  • @Amith 如果您需要计算距离的中心点不断变化,您将不得不进行迭代。否则,如果中心点没有改变或中心列表是一个小的有限集,那么您可以预先计算这些距离。最好的方法是使用 Elasticsearch。
  • 我们可以将 mongodb elasticsearch 与节点后端集成吗??
  • @Amith Elasticsearch 是一个搜索引擎。您将 JSON 格式的数据推送到 Elasticsearch 中,它会将其编入索引以进行更快的搜索查询。然后您对 Elasticsearch 进行查询。 Elasticsearch 提供了 REST API 来完成这一切。是的,您可以将 Elasticsearch 与 Node 集成。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 1970-01-01
  • 2017-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多