2012-07-11 13 views
6

私の目標は、データベース内の近くのエンティティを見つけるためにmysql POINT(lat、long)を使用することです。私はこのチュートリアルの一番下にある何かをしようとしていますhttp://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQLPOINTを使用したMysql空間距離 - 動作していません

表:機能を使用しようと

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

:距離関数を宣言

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

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; 

は、いくつかのテスト・データを挿入ここに私が持っているものです検索の例:

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):不正な非幾何学的な 'aswkb(@ 0')解析中に検出された値、または ERROR 1416(22003): GEOMETRYフィールドに送信したデータからジオメトリオブジェクトを取得できません

これを解決する方法がわかりません。重要なことは、「距離」機能を動的に使用できることです。 Find the distance between two points in MYSQL. (using the Point Datatype)

これは私のMySQLのバージョンのMySQLは14.14按分5.5.23 Verは、Linuxの(x86_64版)のために誰かの専門知識は、私を助けることができるのreadline 5.1

希望を使用している:

私はまた、このソリューションを試してみました。乾杯!

+1

てみ 'ラウンド(glength(LineStringFromWKB(ラインストリング(GeomFromText(astext(a))は、GeomFromTextで来ます(astext(b))))) ' – acraig5075

+0

@ acraig5075 - おかげで、私はほぼ同じ結果に終わった。 – OMA

答えて

7

だから私は、例を距離を計算するためのクエリとしてこれで終わった:

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」です。誰かがより良い方法を知っている場合は、自由にコメントしてください。

3

カスタム関数に

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)) 
を呼ぶ結果はメートル

関連する問題