地理编码-获取位置


geocode - get the location

如果我有一个带有的表

id, location, latitude, longitude

我会有一个位置代码:例如:(13.779242100.472915)。

有两个问题: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
}

经度也是如此。。。还是我只是觉得这里太傻了?

您必须考虑的第一件事是,距离在圆形而不是正方形中增加,这意味着仅单独比较经度和纬度可能会导致错误的结果,尤其是在距离较长的情况下。以下是一个公式,它解释了如何相对容易地计算两点之间的真实距离的基本思想: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

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

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;

抱歉第二个链接不正确。