地理编码 - 获取位置

Posted

技术标签:

【中文标题】地理编码 - 获取位置【英文标题】:geocode - get the location 【发布时间】:2012-02-05 11:54:58 【问题描述】:

如果我有一张桌子

id, location, latitude, longitude

例如,我会有一个位置代码:(13.779242,100.472915)。

!有 2 个问题:我应该为 lat 和 lon 使用什么字段类型?双倍的?或者空间的东西?但是计算距离不是更多吗?

无论如何,我想找到位置(或最准确的位置) 如果我只做这两个查询,我是否很容易想到:

Select * from location_table WHERE latitude > 13.779242 AND longitude > 100.472915." LIMIT 1"; // return as row 1
Select * from location_table WHERE latitude < 13.779242 AND longitude < 100.472915." LIMIT 1"; // return as row2

然后进行比较

$lat_dis_1 = $row1->latitude - 13.779242;
$lat_dis_2 = 13.779242 - $row2->latitude;

if ($lat_dis_1 > $lat_dis_2) 
// row2 was closer
 else 
//row1 closer

经度也一样...或者我只是在这里想得太简单了?

【问题讨论】:

我很难理解你的问题。您是否要查找 2 个位置中的哪一个更接近第 3 个位置? 不,我想找到经纬度的位置。但是给定的项目可能与数据库中的不完全相同,因此需要找到最近的位置。 虽然我不知道具体的答案,但我知道您可以使用一个 SQL 查询来执行此操作,然后返回第一行。我做了类似做商店定位器的事情,都在sql中。 【参考方案1】:

您首先要考虑的是,距离增加的是圆形而不是方形,这意味着仅分别比较经度和纬度可能尤其是在较长距离的情况下会导致错误结果。 这是一个公式,它解释了如何相对轻松地计算两点之间的真实距离的基本概念:http://www.purplemath.com/modules/distform.htm。

另一个点是当您越过日期变更线时,其中 2 个点在地理上可能相距几公里,但仅使用这种方法会出现在半个世界之外。

还有一个问题是,与准确性相比,您期望从中获得什么样的性能。如果准确性不那么重要,但速度很重要,那么使用简单的平方比较会更有效。另一种可能性是将这两种技术结合起来。

第一种技术的示例是(未测试:)):

SELECT SQRT(POW(latitude-[INPUT LATITUDE], 2)+POW(longitude-[INPUT LONGITUDE])) as dist, * FROM location_table ORDER BY dist ASC LIMIT 1

【讨论】:

【参考方案2】:

实际上,谷歌搜索给了我这个。

http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates

SELECT * FROM Places WHERE acos(sin(1.3963) * sin(Lat) + cos(1.3963) * cos(Lat) * cos(Lon - (-0.6981))) * 6371 <= 1000;

抱歉,第二个链接不好。

【讨论】:

以上是关于地理编码 - 获取位置的主要内容,如果未能解决你的问题,请参考以下文章

Android - 获取位置(地理编码器/谷歌播放服务)?

如何准确地从 Eircode/邮政编码获取地理位置

如何使用推文中的位置字段从地理编码器结果中获取坐标

Android Dev - 获取邮政编码的地理位置[重复]

反向地理位置:邮政编码问题

Android高德通过经纬度获取地理位置