2012-07-11 23 views
6

Mục tiêu của tôi là sử dụng mysql POINT (lat, long) để tìm các thực thể lân cận trong cơ sở dữ liệu. Tôi đang cố gắng làm một cái gì đó như ở dưới cùng của hướng dẫn này http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL. Dưới đây là những gì tôi đã có:Khoảng cách không gian Mysql bằng cách sử dụng LƯU Ý - Không hoạt động

Bảng:

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; 

Chèn một số kiểm tra dữ liệu:

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

Tuyên bố chức năng khoảng cách:

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

Đang cố gắng để sử dụng chức năng để tìm kiếm ví dụ:

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

hay:

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

Vấn đề tôi đang nhận được là: ERROR 1367 (22.007): bất hợp pháp phi hình học 'aswkb (một @ 0) giá trị được tìm thấy trong phân tích cú pháp, hoặc ERROR 1416 (22003): Không thể lấy đối tượng hình học từ dữ liệu bạn gửi đến trường GEOMETRY

Tôi không thể tìm ra cách giải quyết vấn đề này. Điều quan trọng là chức năng 'khoảng cách' có thể được sử dụng động.

Tôi cũng đã thử giải pháp này: Find the distance between two points in MYSQL. (using the Point Datatype)

này được phiên bản mysql mysql tôi Ver 14,14 distrib 5.5.23, dành cho Linux (x86_64) sử dụng readline 5.1

Hope ai đó chuyên môn có thể giúp tôi. Chúc mừng!

+1

Hãy thử 'tròn (glength (LineStringFromWKB (LineString (GeomFromText (astext (a)), GeomFromText (astext (b)))))) ' – acraig5075

+0

@ acraig5075 - Cảm ơn bạn đã gợi ý, tôi đã kết thúc với kết quả tương tự. – OMA

Trả lời

7

Vì vậy, tôi đã kết thúc với điều này như truy vấn để tính khoảng cách, một ví dụ:

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

Tôi nhân nó bằng 100 để có được một xấp xỉ bằng km. Kết quả là không chính xác, nhưng "ok". Nếu ai đó biết một cách tốt hơn, hãy bình luận.

3

xác định một chức năng tùy chỉnh

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 

sau đó gọi

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

kết quả đi kèm trong mét

Các vấn đề liên quan