地理编码 - 获取位置

时间:2012-02-05 11:54:58

标签: php mysql geolocation

如果我有一张

的表格
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 个答案:

答案 0 :(得分:1)

你要考虑的第一件事是距离在一个圆圈而不是一个正方形上增加,这意味着只是分别比较经度和纬度,尤其是在长距离导致错误结果的情况下。 这是一个公式,解释了如何相对轻松地计算两点之间的真实距离的基本思路:http://www.purplemath.com/modules/distform.htm

另一点是当你越过日期线时,其中2点可以在地理位置上几公里的appart,但是使用这种方法将会出现在半个世界之外。

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

第一种技术的样本是(没有测试:)):

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

答案 1 :(得分:0)

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

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;

抱歉第二个链接不好。