地理位置搜索

4

应用程序中有一个要求,即查找绑定到特定国家和/或城市的所有对象并显示在谷歌地图上。

我们使用谷歌地图API预先计算出相应纬度和经度的对象,并将其存储在数据库中。有时,这些对象在某个服务范围/半径内提供服务。

例如,现在的情况是我想找出位于阿姆斯特丹的所有对象。

该应用程序应查找所有位于阿姆斯特丹的对象,以及附近的不完全位于阿姆斯特丹但具有服务范围达到阿姆斯特丹的对象。

因此,我已知道谷歌地图返回的阿姆斯特丹的纬度、经度值,以及具有相应纬度、经度值和服务范围/半径的对象存储在数据库中。如何实现呢?


阿姆斯特丹(或任何其他地方)不应该由代表城市边界的不规则多边形来表示吗? - Paul Tomblin
天啊,这让我想起了我的物理时代:假设阿姆斯特丹是一个球体... - annakata
这不是你自己的问题的副本吗:http://stackoverflow.com/questions/610496? - vartec
Yah Vertec,有点相似。在那种情况下,我们从两侧都有范围/半径。但是现在,在这种情况下,我们只有一个。 - Asif
4个回答

2
您应该将国家/城市表示为数据库中的多边形,然后使用OpenGIS样式的多边形交集函数进行交叉处理。
但是,MySQL没有正确实现多边形交集(仅MBR-最小边界矩形)。因此,虽然从理论上讲这种方法是正确的,但在MySQL中它根本行不通。您可能需要考虑转移到Postgres。
您可以使用DB的MBR交集功能,并使用自己的代码来进行多边形/点交集处理(您可以找到执行此操作的库)。

这个解决方案可能行不通,因为我要么必须更改数据库模式,要么整个数据库都要改变。是否有另一种方法,例如我可以获取阿姆斯特丹所在的边界框和服务范围与阿姆斯特丹边界框重叠的对象的边界框? - Asif
如果你没有阿姆斯特丹的多边形,我不认为它能够运行。 - Assaf Lavie
我不确定你能否做到,你需要查看文档。但我相信如果你在谈论国家/主要城市,你可以在网上找到这些信息。 - Assaf Lavie

1

你可能想要查看MySQL的空间扩展

你需要使用包含函数。然而,正如保罗在他的评论中所述,区域应该表示为多边形。如果不是这样,那么我认为你最好创建一个以你已有的点为中心的多边形。


我如何根据已有的点计算多边形数据?另外,如果要使用MySQL空间扩展,是否需要更改数据库结构? - Asif
你需要使用多边形函数,或者如果是圆形,可以直接使用距离函数。是的,你需要使用空间字段和索引。 - Can Berk Güder
是的,我必须使用多边形函数。但是为了使用多边形函数,我需要一组定义我的国家或城市的坐标。我们从哪里可以获取这些坐标? - Asif
谷歌地图,也许?这就是保罗·汤布林在他的评论中的意思。 - Can Berk Güder

1

从我的理解来看,您基本上是想计算两个经纬度点之间的距离。我会先排除那些超出您(假设)10英里范围的点。因此,从您的中心点开始,您将需要获取东、西、南和北10英里的坐标。为此,您需要使用大圆距离公式。

从那一点开始,如果您希望进一步分解这些数据,则需要按距离中心点的距离对这些点进行排序。为此,您需要使用Haversine公式

我看到您有一个PHP标签,但我已经在SQL(主要)和C#中包含了一些公式和示例。

C#和SQL中的Haversine公式

使用C#确定邮政编码之间的距离

Great Circle SQL

Great Circle 2


谢谢你的帮助。但这只会给你两点之间的距离。 同时,你假设你将找到在10英里范围内的点。 - Asif
在我的情况下,我想找出特定国家/城市的点(无论范围或半径如何),还有那些不在该国家或城市但在附近地区具有可能重叠国家/城市边界的服务的点。 - Asif

1

如果你想把邻近性的机制交给外部服务,你也可以考虑使用LocalSolr/LocalLucene之类的工具。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接