MySQL中的空间距离,使用点 - 不工作(Mysql spatial distance using

2019-06-26 05:05发布

我的目标是使用mysql POINT(纬度,经度),以在数据库中找到附近的实体。 我试图做这样的事情在本教程的底部http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL 。 以下是我有:

表:

CREATE TABLE mark (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(20) DEFAULT NULL,
loc POINT NOT NULL,
SPATIAL KEY loc (loc)
) ENGINE=MyISAM;

插入一些测试数据:

 INSERT INTO mark (loc,name) VALUES (POINT(59.388433,10.415039), 'Somewhere 1');
 INSERT INTO mark (loc,name) VALUES (POINT(63.41972,10.39856), 'Somewhere 2');

声明的距离函数:

 DELIMITER $$
 CREATE FUNCTION `distance`
 (a POINT, b POINT)
 RETURNS double DETERMINISTIC
 BEGIN
 RETURN
 round(glength(linestringfromwkb(linestring(asbinary(a),
 asbinary(b)))));
 END $$
 DELIMITER;     

要使用该功能来搜索例:

 SELECT name, distance(mark.loc, GeomFromText( ' POINT(31.5 42.2) ' )) AS cdist
 FROM mark
 ORDER BY
 cdist limit 10;

要么:

 SELECT DISTINCT
 dest.name,
 distance(orig.loc, dest.loc) as sdistance
 FROM
 mark orig,
 mark dest
 having sdistance < 10
 ORDER BY
 sdistance limit 10;

我得到的问题是:ERROR 1367(22007):非法非几何“aswkb(一@ 0)”在分析过程中发现的价值,或者ERROR 1416(22003):无法从数据中获取几何对象发送到几何领域

我似乎无法弄清楚如何解决这个问题。 重要的是,“距离”功能可以动态地使用。

我也曾尝试这种解决方案: 查找MYSQL两点之间的距离。 (使用点数据类型)

这是我的MySQL版本的MySQL版本14.14 5.5.23 DISTRIB,使用readline的5.1的Linux(x86_64的)

希望某人的专业知识能帮助我。 干杯!

Answer 1:

所以我结束了这个作为查询计算距离,例如:

 SELECT  glength(LineStringFromWKB(LineString(GeomFromText(astext(PointFromWKB(POINT(63.424818,10.402457)))),GeomFromText(astext(PointFromWKB(POINT(663.422238,10.398996)))))))*100 
 AS distance;

我乘以100,以获得公里的近似值。 其结果是不准确的,但“OK”。 如果有人会知道一个更好的方式,随意评论。



Answer 2:

定义一个自定义功能

CREATE DEFINER=`test`@`%` FUNCTION `geoDistance`(`lon1` DOUBLE, `lat1` DOUBLE, `lon2` DOUBLE, `lat2` DOUBLE)
    RETURNS double
    LANGUAGE SQL
    DETERMINISTIC
    NO SQL
    SQL SECURITY DEFINER
    COMMENT ''
    BEGIN
    DECLARE v DOUBLE;
    SELECT cos(radians(lat1))
        * cos(radians(lat2))
        * cos(radians(lon2) - radians(lon1)) 
        + sin(radians(lat1)) 
        * sin(radians(lat2)) INTO v;
    RETURN IF(v > 1, 0, 6371000 * acos(v));
END

然后调用

SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2))

结果进来米



文章来源: Mysql spatial distance using POINT - Not working