【问题标题】:mysql: store latitude and longitude of a lot of POIs, using mysql spatial, and calculating distancesmysql:存储很多POI的经纬度,使用mysql空间,计算距离
【发布时间】:2012-05-03 15:19:38
【问题描述】:

我要创建一个包含意大利很多餐厅的数据库 (>100000),并且我想创建一个“靠近我”的功能。我想创建一个包含所有餐厅的纬度和经度的表,我想使用 mysql spatial。

您是否知道如何创建查询以查找我周围 10 公里半径内的所有餐馆(我的坐标将由 gps 获取)?

我试图了解距离,但谷歌搜索我没有发现任何有趣的东西。

你认为使用 mysql spatial 是个好主意吗?我可以改用浮点数吗?在这种情况下,如何创建查询以查找我周围 10 公里半径内的所有餐馆?

非常感谢

【问题讨论】:

    标签: mysql distance latitude-longitude spatial-query


    【解决方案1】:

    MySQL 空间的 MBRIntersects 或 MBRContains 函数似乎是您需要熟悉的。

    请参阅this question 接受的答案作为开始。

    在 gis.stackexchange.com 上提问可能会针对 MySQL 空间提供更好的答案。

    【讨论】:

      【解决方案2】:

      是的,您可以使用地理空间功能 - 但它相当复杂。仅根据纬度和经度(以及经度和纬度!)索引条目会简单得多。至于查询数据,我建议您运行查询以查找与以当前位置为中心的 20km X 20km 边界框匹配的行(可以使用索引),而不是尝试查询实际上在 10km 内的记录 - 您可以丢弃查询中半径eksewhere之外的那些,例如

      SELECT * FROM (
        SELECT p.id, p.description,
        SQRT((x.current_latitiude-p.latitude)*(x.current_latitiude-p.latitude)
            + (x.current_longitude-p.longitude)*(x.current_longitude-p.longitude)) 
            AS distance
        FROM places p
        WHERE p.latitude BETWEEN (x.current_latitiude - x.max_range) 
           AND (x.current_latitiude + x.max_range) 
        AND p.longitude BETWEEN (x.current_longitiude - x.max_range) 
           AND (x.current_longitiude - x.max_range)
      ) ilv
      WHERE ilv.distance<x.max_range
      

      (您需要将 10km 转换为您用于经度/纬度的单位,并替换 x.max_range 的值)。

      【讨论】:

      • 非常感谢。我不明白为什么我应该使用 20 x 20 公里:你能解释一下吗?
      • 因为西 10 公里 + 东 10 公里 = 20 公里跨度
      • 纬度和经度是角量,不是线性的。在毕达哥拉斯斜边计算中直接使用它们会给出一个非常奇怪的数字。而是使用here 和其他地方讨论的近似距离公式,假设地球是一个具有恒定半径的球体(事实并非如此)。
      猜你喜欢
      • 1970-01-01
      • 2017-12-13
      • 2012-11-22
      • 2021-09-05
      • 1970-01-01
      • 2011-04-11
      • 2012-10-13
      • 2012-01-26
      • 2023-03-08
      相关资源
      最近更新 更多