sql >> データベース >  >> RDS >> Mysql

バウンディングボックス内のすべての地理空間ポイントを選択します

    おそらく、geometryのPOINTデータのxアイテムとyアイテムです。 列は緯度と経度の度数です。

    MySQLでこのルックアップを効率的に行うには、いくつかのことが必要になります。

    • MyISAMテーブル(またはMySQLバージョン5.7以降およびInnoDBまたはMyISAMのいずれか)
    • ジオメトリ列のNOTNULL資格
    • 空間インデックスALTER TABLE flags ADD SPATIAL INDEX (coordinates)
    • 検索する長方形のテキスト表現を作成するためのコード
    • SELECTステートメントでのGeomFromTextおよびMBRContains/MBRWithin関数の使用。

    緯度/経度のボックスが、ウィンチェスター大聖堂(51.0606、-1.3131) 。そのポイントの周りにバウンディングボックスが必要です。このMySQLクエリは、その境界ボックスを斜めに横切る線のLINESTRING(テキスト)を生成します。

    SELECT 
           CONCAT('LINESTRING(',
                  latitude-0.5,' ',longitude-0.5,
                  ',', 
                  latitude+0.5 ,' ',longitude +0.5,
                  ')') AS box
       FROM (
          SELECT 51.0606 AS latitude, -1.3131 AS longitude
       ) AS coord
    

    クエリはこれを取得します:

    LINESTRING(50.5606 -1.8131,51.5606 -0.8131)
    

    また、ホスト言語で文字列処理を使用して、同様の種類のテキスト文字列を作成することもできます。必要なフォーマットはこれです。

     LINESTRING(lat1 long1, lat2 long2) 
    

    次に、これを使用して、次のように空間テーブルを検索できます。

    SELECT whatever, whatever 
      FROM flags
     WHERE MBRContains(
            GeomFromText( 'LINESTRING(50.5606 -1.8131,51.5606 -0.8131)' ),
            flags.coordinates)     
    

    これにより、空間インデックスが活用され、flagsのすべての行が検索されます。 その座標は、その対角線の境界ボックス内にあります。

    ここにいくつかのドキュメント があります 。

    flagsの場合 テーブルに含まれる行が数十万行未満の場合、緯度と経度の列(FLOATデータ型、インデックス付き)を備えた通常のテーブル(空間テーブルではない)も同様に機能し、開発とデバッグが容易であることがわかります。

    私はそのテクニックに関するチュートリアルを書きました。 http://www.plumislandmedia.net/mysql/haversine-mysql-最寄-loc/



    1. 関係代数

    2. MySQLは最初の行をスキップします

    3. mysql:select max(score)は関連する行データを返しません

    4. SQLServerのローカルおよびグローバル一時テーブル