地理位置查找最近的城市

问题描述:

我有一个城市名称数据库(芝加哥,纽约,纳什维尔等)。只有少数人有坐标。无论是在移动设备上还是在桌面上,以我的方式将我的数据库中最接近的城市/区域与其当前位置匹配的最简单方法是什么?地理位置查找最近的城市

我在共享服务器上,所以我不能安装任何apache模块。

更新

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

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

*编辑*

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

+0

这太棒了,但它需要一个Apache模块,我没有权限安装在我的共享服务器上。 – Webnet

+3

不确定你真正需要什么,但是你可以通过将文件“GeoIP.dat”和“geoip.inc”复制到目录中来使用GeoIP。无需安装任何东西,我以这种方式使用它,并且效果很好。 – martinstoeckli

+0

真的吗?太棒了,我会给它一个镜头 – Webnet

我想说获得更好的数据库。在线查看美国人口普查邮政编码数据库。它拥有美国各地邮政编码的坐标。从那里,地理位置的用户,并找到最接近的邮政编码,城市,或任何使用圆距公式。

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

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

您可以使用它,你可以得到的欲望输出美国邮政编码数据库。

从IPinfo DB下载Zipcode数据库。请参考下面的URL 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;