如何检查位置是不是在我的圈子区域内?

Posted

技术标签:

【中文标题】如何检查位置是不是在我的圈子区域内?【英文标题】:How to check if locations are within my circle region?如何检查位置是否在我的圈子区域内? 【发布时间】:2016-02-23 01:34:09 【问题描述】:

我可以使用 GPS 获取我的当前位置,我想检索我圈子区域内的所有 POI。

    圆的中心点是我当前的位置,圆区域的半径是x。 POI 项目及其位置和其他信息存储在数据库中。

哪种解决方案是检索我圈子内所有 POI 的最佳方式。

有什么建议吗?

谢谢,

【问题讨论】:

使用什么提供商?您需要一个可以为您提供该数据的 Web 服务。那里有多个提供商,每个提供商都有不同的 TOS、成本和速率限制。我们真的无法为您挑选一个。 (可能不适合您的情况)但我建议使用 mongoDB 存储所有 POI。然后您可以轻松检索您想要的内容,因为有地理查询.. 您不需要为此提供网络服务 我不认为我可以通过一次查询来检索那些在圆形区域内的 POI。如果是的话,你能给我一个如何将我的 POI 存储在 mongodb 中的架构吗? 【参考方案1】:

考虑到您已检索到所有位置点,使用 LocationManager 检索了您的位置并希望检查其中哪些位于您的圈子区域内,这可能是实现目标的一种方法:

int RADIUS;
ArrayList<Point> points;
Location myLocation;
for(Point point : points)
    Location pointLocation = Location("");
    pointLocation.setLatitude(point.x);    // assume x values are latitudes
    pointLocation.setLongitude(point.y);    // assume y values are longitudes
    if(myLocation.distanceTo(Location pointLocation) < RADIUS)
        // This point lies inside
    

另一种不太像 android 的方法是检查您的数据点是否满足等式:

(myLocation.getLatitude() - pointLocation.getLatitude()) ^ 2 + (myLocation.getLongitude()) - pointLocation.getLongitude()) ^ 2 <= RADIUS ^ 2

由于该等式假定地球表面是平坦的,因此结果将包含误差,其大小会随着 RADIUS 值的增加而增加。

【讨论】:

感谢您的回复。我不想从服务器检索所有积分。如果我的数据库中有大量数据,那将非常昂贵。我只想用我的圈子检索点。我认为这应该是一个常见的问题,比如 redfin 在你周围找房子。 好的,我明白了。您确实知道您仍然需要执行比较(这也可能发生在服务器端,也可能是预打包的解决方案),对吗?我建议您在服务器端实现上添加更多信息,因为这不是一个真正的 android 问题 是的,我认为这也是一个服务器问题。我很好奇 redfin 如何检索用户选择的区域内的所有 POI。我认为他们也有这个问题。

以上是关于如何检查位置是不是在我的圈子区域内?的主要内容,如果未能解决你的问题,请参考以下文章

检查用户位置是不是在颤动的2个地理点的区域内

如何检查地理位置是不是在半径范围内?

OpenGL如何检查一个点是不是在由伯恩斯坦曲线组成的区域内

如何检查鼠标是不是在 freeglut 的三角形区域内单击?

如何检查位置是不是在给定范围内?

在ionic 3中检查我的区域圈内的纬度和经度