【问题标题】:Geolocation to find nearest city地理位置找到最近的城市
【发布时间】:2011-11-01 18:38:06
【问题描述】:

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

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

更新

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

【问题讨论】:

    标签: php jquery mysql apache


    【解决方案1】:

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

    * 编辑 *

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

    【讨论】:

    • 这太棒了,但它需要一个我没有权限在我的共享服务器上安装的 apache mod。
    • 不确定您真正需要什么,但您可以通过将文件“GeoIP.dat”和“geoip.inc”复制到一个目录中来使用 GeoIP。不需要安装任何东西,我就是这样用的,效果很好。
    • 真的吗?太棒了,我会试一试
    【解决方案2】:

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

    得到花哨的裤子。 Geohash 整个邮政编码数据库(参见:http://en.wikipedia.org/wiki/Geohash)。然后geohash用户的坐标。比较 geohashes 以找到最近的邮政编码、城市等。 geohash 最好的一点是它不需要任何疯狂的圆距离公式。

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

    【讨论】:

      【解决方案3】:

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

      从 IPinfo DB 下载邮政编码数据库。参考以下网址 http://ipinfodb.com/zipcode_database.php

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

      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;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-12-16
        • 2011-05-22
        相关资源
        最近更新 更多