Mysql使用点的空间距离-不工作

Mysql使用点的空间距离-不工作,mysql,geolocation,geospatial,spatial,Mysql,Geolocation,Geospatial,Spatial,我的目标是使用mysql POINT(lat,long)在数据库中查找附近的实体。我试图做一些类似于本教程底部的事情。以下是我得到的: 表: 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; 插入一些测试数据: INSE

我的目标是使用mysql POINT(lat,long)在数据库中查找附近的实体。我试图做一些类似于本教程底部的事情。以下是我得到的:

表:

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;
或:

选择DISTINCT
目的地名称,
距离(起始位置、目的位置)作为距离
从…起
马克·奥里格,
马克·德斯特
距离小于10的
订购人
距离限制10;
我遇到的问题是:错误1367(22007):非法的非几何“aswkb”(a@0)'在分析过程中找到值,或 错误1416(22003):无法从发送到“几何体”字段的数据中获取几何体对象

我似乎想不出如何解决这个问题。重要的是“距离”函数可以动态使用

我也尝试过这个解决方案:

这是我的mysql版本mysql Ver 14.14发行版5.5.23,适用于使用readline 5.1的Linux(x86_64)


希望有人能帮助我。干杯

因此,我将此作为计算距离的查询,例如:

 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”。如果有人知道更好的方法,请随意评论。

定义自定义函数

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))

结果以米为单位

Try
round(glength(LineStringFromWKB)(LineString(GeomFromText(astext(a)),GeomFromText(astext(b‘‘)’))
@acraig5075-感谢您的建议,我得到了几乎相同的结果。
SELECT geoDistance(X(point1), Y(point1), X(spoint2), Y(point2))