Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Geometry MySQL 5.6查找距离内的点并按距离排序ASC_Geometry_Geospatial_Mysql 5.6 - Fatal编程技术网

Geometry MySQL 5.6查找距离内的点并按距离排序ASC

Geometry MySQL 5.6查找距离内的点并按距离排序ASC,geometry,geospatial,mysql-5.6,Geometry,Geospatial,Mysql 5.6,我有下表: CREATE TABLE `places` ( `id` int(11) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(256) DEFAULT NULL, `coordinates` point DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; INSERT INTO `places` ( `name`, `coordinate

我有下表:

CREATE TABLE `places` (
 `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(256) DEFAULT NULL,
 `coordinates` point DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Louvre ", POINT(48.861105, 2.335337));

INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Eiffel Tower", POINT(48.858271, 2.293795));

INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Pere Lachaise", POINT(48.861131, 2.394683));

INSERT INTO `places` ( `name`, `coordinates`)
VALUES ("Brooklyn", POINT(40.711089, -73.948391));
我想返回卢浮宫5英里范围内的所有地方,其中应返回3张记录(卢浮宫、埃菲尔铁塔、佩雷·拉查斯)

我运行了以下查询,但最终得到了所有4条记录。我做错了什么

 SET @radius = 5 * 1609.344; -- convert miles to meters

 SELECT name, ST_Distance(coordinates,POINT(48.861105, 2.335337)) AS distance 
   FROM places
  WHERE ST_Within(coordinates, ST_Buffer(POINT(48.861105, 2.335337),@radius))
ORDER BY distance ASC
注意:我知道MySQL5.7有ST_Distance_Sphere()函数来实现上述功能,但目前我仍坚持使用5.6


感谢您的帮助。

您可以使用哈弗公式对ST_Distance_球体进行多边形填充:

DELIMITER $$

CREATE FUNCTION `ST_Distance_Sphere` (point1 POINT, point2 POINT)

    RETURNS FLOAT
    no sql deterministic
    BEGIN
        declare R INTEGER DEFAULT 6371000;
        declare `φ1` float;
        declare `φ2` float;
        declare `Δφ` float;
        declare `Δλ` float;
        declare a float;
        declare c float;
        set `φ1` = radians(y(point1));
        set `φ2` = radians(y(point2));
        set `Δφ` = radians(y(point2) - y(point1));
        set `Δλ` = radians(x(point2) - x(point1));

        set a = sin(`Δφ` / 2) * sin(`Δφ` / 2) + cos(`φ1`) * cos(`φ2`) * sin(`Δλ` / 2) * sin(`Δλ` / 2);
        set c = 2 * atan2(sqrt(a), sqrt(1-a));

        return R * c;
    END$$

DELIMITER ;
被盗自: