1

地理座標や地名などの場所に関する情報を含む多くの行を持つ mysql MyISAM テーブルがあります。

入力された緯度と経度に応じて、このテーブルから最も近い場所を選択したいと思います。空間インデックスと MBRContains を使用してデータを選択し、地理座標のポイントを含む列を作成して、これを実行したいと考えています。

データの選択時にエラーが発生します。ここで行った手順を書き留めます。

ステップ1

ALTER TABLE mytable ADD mypoint Point;

UPDATE  mytable
SET     mypoint = Point(lat, lon);

ALTER TABLE mytable MODIFY mypoint NOT NULL;

CREATE SPATIAL INDEX sx_mytable_coords ON mytable(mypoint );

結果: mypoint 列に次のように表示されます (これが正しいかどうかはわかりませんが、すべてのレコードで同じです):[GEOMETRY - 25Bytes] インデックスが追加されていることがわかります。Name: mypoint Type: SPATIAL Field: mypoint (32) Collation: A

ステップ2

2 つの方法でデータを選択しようとしました。

  1. これは、MySQL 5.1 より前のバージョンに推奨されます (私の場合)。

    SET @lat = 40;
    SET @lon = -10;
    
    
    SELECT  *
    FROM    mytable
    WHERE   MBRContains(LineFromText(CONCAT(
            '('
            , @lon + 10 / ( 111.1 / cos(RADIANS(@lon)))
            , ' '
            , @lat + 10 / 111.1
            , ','
            , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
            , ' '
            , @lat - 10 / 111.1 
            , ')' )
            ,mypoint)
    

    次のエラーが表示されます。

    1064 - SQL 構文にエラーがあります。15 行目の 'LIMIT 0, 30' 付近で使用する正しい構文については、MySQL サーバーのバージョンに対応するマニュアルを確認してください。

  2. これは、MySQL 5.1 以降のバージョンに推奨されます。

    SET @lat = 40;
    SET @lon = -10;
    
    SELECT  *
        FROM    mytable
        WHERE   MBRContains
                        (
                        LineString
                                (
                                Point
                                        (
                                        @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
                                        @lat + 10 / 111.1
                                        ) 
                                Point
                                        (
                                        @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
                                        @lat - 10 / 111.1
                                        ) 
                                ),
                        mypoint
                        )
    

    次のエラーが表示されます。

    1064 - SQL 構文にエラーがあります。MySQL サーバーのバージョンに対応するマニュアルを参照して、12 行目の 'Point ( ' の近くで使用する正しい構文を確認してください。

4

3 に答える 3

2

ブラケットがありません。LineFromText を閉じていません。

試す:

SELECT  *
FROM    mytable
WHERE   MBRContains(LineFromText(CONCAT(
    '('
    , @lon + 10 / ( 111.1 / cos(RADIANS(@lon)))
    , ' '
    , @lat + 10 / 111.1
    , ','
    , @lon - 10 / ( 111.1 / cos(RADIANS(@lat)))
    , ' '
    , @lat - 10 / 111.1 
    , ')' ))
    ,mypoint)
于 2012-05-04T09:11:15.877 に答える
0
  1. がありません)

  2. 2 つの関数呼び出しの,間にa がありません。Point

于 2012-05-04T09:05:24.433 に答える
0

,LineString のポイント間にセパレーターは必要ありませんか? 何かのようなもの

LineString(1 1,2 2,3 3)

また

LineString
(
   Point
   (
        @lon + 10 / ( 111.1 / COS(RADIANS(@lat))),
        @lat + 10 / 111.1
   ) 
   ,
   Point
   (
        @lon - 10 / ( 111.1 / COS(RADIANS(@lat))),
        @lat - 10 / 111.1
   ) 
)
于 2012-05-04T09:05:56.930 に答える