2014-10-31 122 views
0

是我知道这个问题有史以来问充足的时间,但似乎从2012年,这个问题/ ansewers的基础, 我试图执行经典搜索距离列点 ,但我有一些麻烦无法解决..Mysql POINT专栏为距离搜索

是否正常我的POINT列看起来像这样?

0x00000000010100000085B1852007052040C0B2D2A414684840 

这里是我的脚步,我不能够看到什么错, 我并基于从最后一个堆问题/解答。

我使用mariadb 10和Heideisql gui。

我有2个colums纬度和经度, 我创建了一个geopoints点一栏, 填入的GeoPoint这样的:

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

之后,我geopoints列如下:

0x00000000010100000085B1852007052040C0B2D2A414684840 

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

[email protected] = 48.88; 
[email protected] = 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) 

和第二次尝试:

[email protected] = 48.88; 
[email protected] = 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的?!还是我错过了什么?

感谢您的帮助.., flau

回答

0
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; 

这将返回按距离排序的geopoints。使用没有X(),Y()和asText()的地址点以已知二进制(WKB)格式返回它们:http://dev.mysql.com/doc/refman/5.7/en/gis-data-formats.html#gis-wkb-format