【问题标题】:Calculating distance (pythagoras)计算距离(毕达哥拉斯)
【发布时间】:2014-05-31 12:35:37
【问题描述】:

这里的总 SQL 新手。我创建了两个 SQL 表,一个包含有关酒店的信息,另一个包含有关景点的信息。

SELECT hotels.*, attractions.*,  
    ((ACOS(SIN(hotels.Hotel_Lat * PI() / 180) * SIN(attractions.Attraction_Lat * PI() / 180) +  
        COS(hotels.Hotel_Long * PI() / 180) * COS(attractions.Attraction_Long * PI() / 180) *  
        COS((hotels.Hotel_Long - attractions.Attraction_Long) * PI() / 180)) *   
        180 / PI()) * 60 * 1.1515) as distance  
FROM hotels join attractions

此查询返回“空”的距离。请问有什么想法吗?如果这有影响,我有负值经度?

【问题讨论】:

  • 是的,但是哪个版本的 MySQL?工作台只是一个连接到 MySQL 的应用程序。
  • 对不起,mysql 社区服务器版本 5.6.17。听起来对吗?
  • 请编辑您的问题并显示您当前使用的查询。
  • 请将 SQL 发布为纯文本,而不是图片链接。更好的是用示例数据制作一个 sqlfiddle。
  • 您的距离公式看起来不正确。您正在计算正常的笛卡尔距离,而不是球体上的距离。见en.wikipedia.org/wiki/Geographical_distance

标签: mysql sql distance


【解决方案1】:

你不能这样计算距离,因为它没有考虑地球的曲率。

经过一番谷歌搜索后,您将获得以下链接:http://zcentric.com/2010/03/11/calculate-distance-in-mysql-with-latitude-and-longitude/ 并且有正确的 SQL 查询:

SELECT ((ACOS(SIN($lat * PI() / 180) * SIN(`lat` * PI() / 180) + COS($lat * PI() / 180) * COS(`lat` * PI() / 180) * COS(($lon – `lon`) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) AS distance 
FROM `members` 
HAVING distance<=’10′ 
ORDER BY distance ASC

所以对你来说它看起来像这样:

SELECT h.*, a.*,
    ((ACOS(SIN(h.Hotel_Lat * PI() / 180) * SIN(a.Attractions_Lat * PI() / 180) +
        COS(h.Hotel_Long * PI() / 180) * COS(a.Attractions_Long * PI() / 180) *
        COS((h.Hotel_Long - a.Attractions_Long) * PI() / 180)) * 
        180 / PI()) * 60 * 1.1515) as distance
FROM hotel h join attractions a

【讨论】:

  • 非常感谢您的帮助,谢谢。我需要更改公式中的任何内容吗?我收到语法错误。
  • 我可能有错字 - 确切的错误是什么?
  • 14:14:59 选择 h.*, a.*, ((COS(SIN(h.Hotel_Lat * PI() / 180) * SIN(a.Attractions_Lat * PI() / 180) ) + COS(h.Hotel_Long * PI() / 180) * COS(a.Attractions_Long * PI() / 180) * 180 / PI()) * 60 * 1.1515 作为距酒店的距离 h 加入景点 a 错误代码:1064 . 您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 4 行 0.000 秒的“距离酒店 h 加入景点 a”附近使用正确的语法
  • 公式末尾缺少一个括号 - 它现在在那里
  • 选择酒店。*,景点。*,((ACOS(SIN(hotels.Hotel_Lat * PI() / 180) * SIN(attractions.Attraction_Lat * PI() / 180) + COS(酒店.Hotel_Long * PI() / 180) * COS(attractions.Attraction_Long * PI() / 180) * COS((hotels.Hotel_Long -tractions.Attraction_Long) * PI() / 180)) * 180 / PI()) * 60 * 1.1515) 从酒店到景点的距离
【解决方案2】:

你为什么要让自己变得如此复杂?只需启用MySQL Geospatial extensionsuse ST_Distance 即可解决您的问题:

SELECT hotels.*, a.*,  ST_Distance(ST_MakePoint(hotels.Hotel_Lon, hotels.Hotel_Lat),  ST_MakePoint(a.Attractions_Long, a.Attractions_Lat) as distance FROM hotels join attractions a;

请注意,mysql 的 St_Distance 函数不利用索引,只处理极坐标。

希望对您有所帮助,如果您还有其他问题,请发表评论。

【讨论】:

  • 因为不幸的是我不知道自己在做什么。我什至看不到如何启用扩展。
  • 请尝试我发布的查询并报告回来?
  • 16:20:12 SELECT hotel.*,traction.*, ST_Distance(ST_MakePoint(hotel.long, hotel.lat), ST_MakePoint(attraction.long,traction.lat) as distance FROM hotel join景点 a 错误代码:1064。您的 SQL 语法有错误;请查看与您的 MySQL 服务器版本相对应的手册,以获取正确的语法,以便在第 3 行 0.000 秒的“从酒店加入景点 a”附近使用我对其进行了一些更改因为我制作了一些新表,将 lats 和 longs 指定为几何数据类型。
  • 我今天早上确实开始使用这个程序,我看过 fiddle 但不知道该怎么做。如果有帮助,我可以发布屏幕截图吗?
  • 在左侧窗格中,放置用于创建数据的 DDL 语句,在右侧,放置 SELECT 1 和“运行 SQL”。将生成的 URL 放在此处的评论中,我会查看它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多