2012-02-05 78 views
1

如果我有一个表地理编码 - 获得位置

id, location, latitude, longitude 

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

!有两个问题:我应该使用什么字段类型的经纬度?双?或者可能是空间的东西?但是对于计算距离来说更是如此?

不管怎样,我想找到的位置(或者一个最准确的) 我在想轻松,如果我只想做这2个查询:

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 
} 

和经度相同...或者我只是想在这里过于simpel?

+0

我有一个很难理解你的问题。你是否试图找到2个位置中的哪个更靠近第三个位置? – thenetimp 2012-02-05 12:11:38

+0

不,我想查找经纬度的位置。但是给定的项目可能并不像db中那样精确,所以需要找到最接近的地方。 – renevdkooi 2012-02-05 12:13:11

+0

虽然我不知道具体的答案,但我知道你可以用一个SQL查询来做到这一点,然后返回第一行。我做了类似的商店定位器,这一切都在SQL中。 – thenetimp 2012-02-05 12:18:00

回答

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