【问题标题】:Finding cities close to one another using longitude and latitude [duplicate]使用经度和纬度查找彼此靠近的城市[重复]
【发布时间】:2011-01-11 19:47:21
【问题描述】:

我的数据库中的每个用户都与一个城市相关联(带有经度和纬度)

我将如何找出哪些城市彼此靠近?

即在英格兰,剑桥离伦敦很近。

如果我有一个住在剑桥的用户。靠近他们的用户将是居住在周边城市的用户,例如伦敦、赫特福德等。

有什么想法可以解决这个问题吗?而且,我将如何定义什么是接近的?即在英国的收盘价比在美国的收盘价要近得多,因为美国的分布要广得多。

想法和建议。另外,您知道提供此类功能的任何服务吗?

谢谢

【问题讨论】:

  • 你想要“乌鸦飞”的距离,还是行车距离?还是开车时间?他们是不同的

标签: php algorithm logic euclidean-distance


【解决方案1】:

如果您可以调用外部网络服务,则可以使用 GeoNames API 来定位您定义的某个半径内的附近城市:

http://www.geonames.org/export/web-services.html

【讨论】:

    【解决方案2】:

    从城市名称中获取坐标称为反向地理编码。谷歌地图有一个很好的 Api fot。

    还有Geonames 项目,您可以在其中获得包含城市、邮政编码等及其坐标的庞大数据库

    但是,如果您已经有了坐标,则可以通过简单的计算来获得距离。

    棘手的事情是获得一个性能不错的版本。您可能将其存储在 mysql 数据库中,因此您需要在那里快速完成。

    绝对有可能。我曾经做过一个包含该代码的项目,我将获取它并发布在此处。

    但是,为了加快速度,我建议首先围绕中心坐标进行矩形选择。使用蜜蜂树索引甚至更好的东西,如多维范围搜索,这非常非常快。然后在其中,您可以计算有限数据集的确切距离。 在矩形选择之外,方向是如此之大,以至于不需要如此精确地显示或计算。或者只显示国家、大陆或类似的东西。

    我还在办公室,但是当我回到家时,我可以为您取密码。同时,如果您能告诉我您如何存储数据,那就太好了。

    编辑:与此同时,您有一个对我来说看起来正确的函数(我在一个查询中没有函数就做到了......)

       CREATE FUNCTION `get_distance_between_geo_locations`(`lat1` FLOAT, `long1` FLOAT, `lat2` FLOAT, `long2` FLOAT)
      RETURNS FLOAT
      LANGUAGE SQL
      DETERMINISTIC
      CONTAINS SQL
      SQL SECURITY DEFINER
      COMMENT ''
    BEGIN
    DECLARE distance FLOAT DEFAULT -1;
    DECLARE earthRadius FLOAT DEFAULT 6371.009;
    -- 3958.761 --miles
    -- 6371.009 --km
    DECLARE axis FLOAT;
    
    IF ((lat1 IS NOT NULL) AND (long1 IS NOT NULL) AND (lat2 IS NOT NULL) AND (long2 IS NOT NULL)) THEN -- bit of protection against bad data
    
      SET axis = (SIN(RADIANS(lat2-lat1)/2) * SIN(RADIANS(lat2-lat1)/2) + COS(RADIANS(lat1)) * COS(RADIANS(lat2)) * SIN(RADIANS(long2-long1)/2) * SIN(RADIANS(long2-long1)/2));
      SET distance = earthRadius * (2 * ATAN2(SQRT(axis), SQRT(1-axis)));
    
    END IF;
    
    RETURN distance;
    END;
    

    我从这里引用了这个:http://sebastian-bauer.ws/en/2010/12/12/geo-koordinaten-mysql-funktion-zur-berechnung-des-abstands.html

    这是另一个链接:http://www.andrewseward.co.uk/2010/04/sql-function-to-calculate-distance.html

    【讨论】:

      【解决方案3】:

      执行此操作的最简单方法是根据城市的纬度和经度以及距离(通过将距离转换为经度度)来计算边界框。

      一旦你有了那个框(最小纬度,最大纬度,最小经度,最大经度),查询其纬度和经度在边界框内的其他城市。这将为您提供一个近似列表,并且应该非常快,因为它将能够使用您在纬度和经度列上可能拥有的任何索引。

      如果需要,您可以使用真正的“球体上点之间的距离”函数缩小列表范围。

      【讨论】:

        【解决方案4】:

        您需要空间索引或 GIS 功能。你用的是什么数据库? MySQL 和 PostgreSQL 都支持 GIS,可以让您使用 SQL 查询找到最近的 N 个城市。

        【讨论】:

          【解决方案5】:

          您可能要考虑的另一个选项是将所有城市放入一个空间搜索树中,例如 kd-tree。 Kd-trees 有效地支持最近邻搜索,以及快速搜索给定边界框中的所有点。然后,您可以通过搜索一些城市最近的邻居来找到附近的城市,然后使用与这些邻居的距离来估计要搜索的边界框的大小。

          【讨论】:

            猜你喜欢
            • 2013-05-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-03-03
            • 1970-01-01
            相关资源
            最近更新 更多