【问题标题】:Get surronding places in SQL在 SQL 中获取周围的地方
【发布时间】:2011-10-26 05:22:56
【问题描述】:

我有不同城市不同酒店的数据库。每个酒店都有经纬度。

我可以通过 SQL 获取周围的酒店吗,比如说 25 公里以内。 我正在使用 mySQL。

【问题讨论】:

  • 不要忘记经度是非线性的
  • @Seph,你想说什么?
  • 您可以在重复的问题中找到解决方案。
  • @ErwinBrandstetter,这是不同类型的问题。仔细看。呵呵

标签: mysql sql latitude-longitude


【解决方案1】:

首先,在控制台模式下运行它。它将创建一个新的 MySQL 函数(请参阅下面的 phpMyAdmin)。

DELIMITER |
DROP FUNCTION IF EXISTS GPS_Distance_Meters|
CREATE FUNCTION GPS_Distance_Meters (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS DOUBLE
BEGIN
    DECLARE rlo1 DOUBLE;
    DECLARE rla1 DOUBLE;
    DECLARE rlo2 DOUBLE;
    DECLARE rla2 DOUBLE;
    DECLARE dlo DOUBLE;
    DECLARE dla DOUBLE;
    DECLARE a DOUBLE;

    SET rlo1 = RADIANS(lng1);
    SET rla1 = RADIANS(lat1);
    SET rlo2 = RADIANS(lng2);
    SET rla2 = RADIANS(lat2);
    SET dlo = (rlo2 - rlo1) / 2;
    SET dla = (rla2 - rla1) / 2;
    SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo);
    RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
END|
DELIMITER ;

或者您可以在 phpMyAdmin 中运行它,但记得将分隔符更改为 |而不是 ;

DROP FUNCTION IF EXISTS GPS_Distance_Meters|
CREATE FUNCTION GPS_Distance_Meters (lat1 DOUBLE, lng1 DOUBLE, lat2 DOUBLE, lng2 DOUBLE) RETURNS DOUBLE
BEGIN
    DECLARE rlo1 DOUBLE;
    DECLARE rla1 DOUBLE;
    DECLARE rlo2 DOUBLE;
    DECLARE rla2 DOUBLE;
    DECLARE dlo DOUBLE;
    DECLARE dla DOUBLE;
    DECLARE a DOUBLE;

    SET rlo1 = RADIANS(lng1);
    SET rla1 = RADIANS(lat1);
    SET rlo2 = RADIANS(lng2);
    SET rla2 = RADIANS(lat2);
    SET dlo = (rlo2 - rlo1) / 2;
    SET dla = (rla2 - rla1) / 2;
    SET a = SIN(dla) * SIN(dla) + COS(rla1) * COS(rla2) * SIN(dlo) * SIN(dlo);
    RETURN (6378137 * 2 * ATAN2(SQRT(a), SQRT(1 - a)));
END|

现在使用该功能。示例:

    SELECT *
    FROM restaurants 
    WHERE GPS_Distance_Meters('48.858205', '2.294359', lat, lng) < 1000 ORDER BY proximite ASC 
    LIMIT 10

这里我们在 1000 米 (1KM) 范围内搜索 48.858205、2.294359(与字段 lat 和 lng 相比)的 limit 10 结果。

【讨论】:

  • 第一部分是什么? PHPmyadmin 在执行第一部分时返回错误。请
  • 将分隔符更改为 |代替 ;并使用我帖子中的第二部分将其与 phpMyAdmin 一起使用。
  • 一点也不。我确定mysql不支持这样的查询。
  • 确实如此。我在我的网站上使用它。错误是什么?在控制台模式下尝试。
  • 查询:SELECT * AS proximite FROM shk_resturants WHERE GPS_Distance_Meters('48.858205', '2.294359', latitude, longitute)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-04
  • 1970-01-01
  • 2013-03-04
  • 1970-01-01
  • 2017-08-30
  • 1970-01-01
相关资源
最近更新 更多