地理座標や地名などの場所に関する情報を含む多くの行を持つ 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 つの方法でデータを選択しようとしました。
これは、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 サーバーのバージョンに対応するマニュアルを確認してください。
これは、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 ( ' の近くで使用する正しい構文を確認してください。