地理位置找到最近的城市

时间:2011-11-01 18:38:07

标签: php jquery mysql apache

我有一个城市名称数据库(芝加哥,纽约,纳什维尔等)。只有少数人有坐标。对于我来说,最简单的方法是将数据库中最近的城市/区域与移动设备或桌面上的当前位置进行编程匹配?

我在共享服务器上,因此无法安装任何apache模块。

更新

让我们说坐标不是问题。如果我的数据库中的坐标不是问题,那么最好的方法是什么?使用HTML 5获取当前用户的坐标,并运行一个简单的查询来确定最近的位置?

3 个答案:

答案 0 :(得分:2)

使用像GeoIP这样的服务,您可以下载免费数据库或使用他们的API。

*编辑*

以下是他们的城市特定页面 - http://www.maxmind.com/app/geolitecity

答案 1 :(得分:0)

我想说得到一个更好的数据库。在线查看美国人口普查邮政编码数据库。它具有美国各个邮政编码的坐标。从那里开始,对用户进行地理定位,并使用圆距离公式找到最近的邮政编码,城市或其他任何内容。

OR

得到fancypants。对整个邮政编码数据库进行Geohash(参见:http://en.wikipedia.org/wiki/Geohash)。然后geohash用户的坐标。比较geohashes找到最近的邮政编码,城市,等等。关于geohash的最好的事情是它不需要任何疯狂的圆距离公式。

这可能不是最新的和最好的,但你明白了这一点:http://www.census.gov/tiger/tms/gazetteer/zips.txt

答案 2 :(得分:0)

您可以拥有一个美国邮政编码数据库,您可以使用该数据库获得所需的输出。

从IPinfo DB下载Zipcode数据库。请参阅以下网址 http://ipinfodb.com/zipcode_database.php

现在使用MYSQL函数来找出与currunt地理位置(纬度和经度)的距离。

DELIMITER $$    
DROP FUNCTION IF EXISTS `great_circle_distance`$$
    CREATE DEFINER=`root`@`localhost` FUNCTION `great_circle_distance`(
    lat1 DOUBLE(10,6),
    lon1 DOUBLE(10,6),
    lat2 DOUBLE(10,6),
    lon2 DOUBLE(10,6)
    ) RETURNS double(10,2)
        DETERMINISTIC
    BEGIN
                    DECLARE delta_lat DOUBLE(10,6);
                    DECLARE delta_lon DOUBLE(10,6);
                    DECLARE temp1 DOUBLE(10,6);
                    DECLARE EARTH_RADIUS DOUBLE(10,2);
                    DECLARE distance DOUBLE(10,2);
                    SET lat1 = RADIANS(lat1);
                    SET lon1 = RADIANS(lon1);
                    SET lat2 = RADIANS(lat2);
                    SET lon2 = RADIANS(lon2);
                    SET delta_lat = lat2 - lat1;
                    SET delta_lon = lon2 - lon1;

                    SET temp1 = pow(sin(delta_lat/2.0),2) + cos(lat1) * cos(lat2) * pow(sin(delta_lon/2.0),2);
                    SET EARTH_RADIUS = 3956.0;
                    SET distance = EARTH_RADIUS * 2 * atan2(sqrt(temp1),sqrt(1-temp1));
                    RETURN distance;
        END$$

    DELIMITER ;

以下查询将帮助您获得结果,或者您可以根据需要修改查询。

Select TA.city, great_circle_distance(TA.lat,TA.log, 32.2342,-72.42342) AS Distance FROM zipcodes AS TA Order BY Distance Limit 1;