Mysql POINT列用于距离搜索

标签 mysql search geolocation geospatial mariadb

是的,我知道这个问题已经被问了很多时间,但从 2012 年开始,所有这些似乎都已经过时了,这些问题/答案的基础, 我尝试使用 POINT 列执行经典搜索距离 但我有一些无法解决的麻烦..

我的 POINT 栏看起来像这样正常吗?

0x00000000010100000085B1852007052040C0B2D2A414684840

这是我的所有步骤,我看不出有什么问题, 我是根据最后一堆问题/答案做的。

我使用 mariadb 10 和 Heideisql gui。

我有 2 列经纬度, 我创建了一个地理点 POINT 列, 像这样填充地理点:

 UPDATE  geoFRA 
SET     geopoints = GeomFromText(CONCAT('POINT (', lon, ' ', lat, ')'))

之后我的地理点列如下所示:

  0x00000000010100000085B1852007052040C0B2D2A414684840

然后我尝试以两种方式执行查询,首先尝试:

SET@lat = 48.88;
SET@lon = 2.34;

SELECT  *
FROM    geoFRA
WHERE   MBRContains(LineFromText(CONCAT(
        '('
        , @lon + 700 / ( 111.1 / cos(RADIANS(@lon)))
        , ' '
        , @lat + 700 / 111.1
        , ','
        , @lon - 700 / ( 111.1 / cos(RADIANS(@lat)))
        , ' '
        , @lat - 700 / 111.1 
        , ')' )
        ,geopoints)

第二次尝试:

SET@lat = 48.88;
SET@lon = 2.34;
SET @kmRange = 172; -- = 50 Miles

SELECT *, (3956 * 2 * ASIN(SQRT(POWER(SIN((@lat - abs(`lat`)) * pi()/180 / 2),2) + COS(@lat * pi()/180 ) * COS(abs(`lat`) *  pi()/180) * POWER(SIN((lon - `lon`) *  pi()/180 / 2), 2)))) as distance
FROM    `geoFRA`
WHERE   MBRContains(LineString(Point(@lat + @kmRange / 111.1, @lon + @kmRange / (111.1 / COS(RADIANS(@lat)))), Point(@lat - @kmRange / 111.1, @lon - @kmRange / (111.1 / COS(RADIANS(@lat))))), `geopoints`)
Order By distance

我开始认为存在一些 mariadb 不兼容问题?!或者我错过了什么?

感谢您的帮助.., 弗劳

最佳答案

CREATE TABLE geoFRA (id int NOT NULL, geopoints point NOT NULL);
INSERT INTO geoFRA (id, geopoints) VALUES
(1, geomFromText('POINT(48 2)')),
(2, geomFromText('POINT(48 3)')),
(3, geomFromText('POINT(48.88 2.34)')),
(4, geomFromText('POINT(49 2)')),
(5, geomFromText('POINT(49 3)'));

SET @p=geomFromText('POINT(48.88 2.34)');
SELECT X(geopoints), Y(geopoints), asText(geopoints), ST_Distance(geopoints, @p) as d
FROM   geoFRA
ORDER BY d;

这将返回按距离排序的地理点。使用不带 X()、Y() 和 asText() 的地理点以众所周知的二进制 (WKB) 格式返回它们:http://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html#gis-wkb-format

关于Mysql POINT列用于距离搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26675156/

相关文章:

Javascript 地理位置缓存

elasticsearch - Kibana 4 检测地理数据但不在 map 上显示任何结果

mysql - Auth0 创建用户脚本给我一个错误 "mysql is not a function"

mysql - Wordpress 分散多站点

javascript - 连接具有多对多关系字段的两个表

Azure 搜索 - 多对多索引

c++ - 如何改进 vector 搜索功能?

mysql - 连接将结果限制为连接表,无需子选择

jquery - jqgrid ie8 多重搜索过滤器在使用 cmTemplate 时不选取搜索数据

Javascript - 返回变量失败