【问题标题】:Mysql spatial distance using POINT - Not working使用 POINT 的 Mysql 空间距离 - 不工作
【发布时间】:2012-07-11 07:00:27
【问题描述】:

我的目标是使用 mysql POINT(lat,long) 在数据库中查找附近的实体。我正在尝试做类似本教程底部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;     

尝试使用函数搜索ex.:

 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): Illegal non geometry 'aswkb(a@0)' value found during parsing,或者 ERROR 1416 (22003): 无法从您发送到 GEOMETRY 字段的数据中获取几何对象

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

我也试过这个解决方案:Find the distance between two points in MYSQL. (using the Point Datatype)

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

希望有人的专业知识可以帮助我。干杯!

【问题讨论】:

  • 试试round(glength(LineStringFromWKB(LineString(GeomFromText(astext(a)),GeomFromText(astext(b))))))
  • @acraig5075 - 感谢您的建议,我最终得到了几乎相同的结果。

标签: mysql geolocation geospatial spatial


【解决方案1】:

定义一个自定义函数

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

结果以米为单位

【讨论】:

    【解决方案2】:

    所以我最终将其作为计算距离的查询,例如:

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

    【讨论】:

      猜你喜欢
      • 2020-03-14
      • 1970-01-01
      • 2018-08-23
      • 1970-01-01
      • 2017-03-12
      • 2018-11-18
      • 2017-11-24
      • 1970-01-01
      • 2016-05-17
      相关资源
      最近更新 更多