6

私の目標は、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;     

関数を使用して検索しようとしています。例:

 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;

私が得ている問題は次のとおりです:エラー1367(22007):解析中に不正な非ジオメトリ'aswkb(a @ 0)'値が見つかりました、またはエラー1416(22003):GEOMETRYフィールドに送信したデータからジオメトリオブジェクトを取得できません

私はこれを解決する方法を理解できないようです。重要なのは、「距離」関数を動的に使用できることです。

私もこの解決策を試しました:MYSQLの2点間の距離を見つけます。(ポイントデータ型を使用)

これは私のmysqlバージョンですmysqlVer14.14 Distrib 5.5.23、Linux(x86_64)用でreadline5.1を使用しています

誰かの専門知識が私を助けてくれることを願っています。乾杯!

4

2 に答える 2

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」です。誰かがもっと良い方法を知っているなら、遠慮なくコメントしてください。

于 2012-07-12T11:49:26.780 に答える
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))

結果はメートル単位で表示されます

于 2013-01-02T12:27:18.317 に答える