あなたがしていることのいくつかのバージョンは正しいですが、特にMyISAMを使用していて、Rツリー空間インデックスを作成できる場合は、実際のジオメトリタイプを使用したいと思うでしょう。サポートされている任意のタイプ(つまり、point
)の列を持つことができます 、polygon
)、またはキャッチオールのgeometry
タイプ:
mysql> create table spatial_table (id int, my_spots point, my_polygons geometry);
Query OK, 0 rows affected (0.06 sec)
次に、WKT構文でクエリと更新を行います。
mysql> insert into spatial_table values (1, GeomFromText('POINT(1 1)'), GeomFromText('POLYGON((1 1, 2 2, 0 2, 1 1))'));
Query OK, 1 row affected (0.00 sec)
mysql> insert into spatial_table values (1, GeomFromText('POINT(10 10)'), GeomFromText('POLYGON((10 10, 20 20, 0 20, 10 10))') );
Query OK, 1 row affected (0.00 sec)
次に、終点がポイント1 =経度-増分、lon-増分、y =経度+増分、緯度+増分、つまりここでは+-が1の線ストリングの最小境界矩形に対して、クエリ(つまり近傍)を実行できます。 :
mysql> select * from spatial_table where MBRContains(GeomFromText('LINESTRING(9 9, 11 11)'), my_spots);
+------+---------------------------+-----------------------------------------------------------------------------------+
| id | my_spots | my_polygons |
+------+---------------------------+-----------------------------------------------------------------------------------+
| 1 | [email protected] [email protected] | [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] [email protected] |
+------+---------------------------+-----------------------------------------------------------------------------------+
1 row in set (0.00 sec)
これは、経度と緯度を表す一連のフロートで算術演算を実行するよりもはるかに優れたパフォーマンスを発揮します。ところで、サンフランシスコの場所については、次の定数が経度と緯度のkmと度の間で変換するのに非常にうまく機能します(つまり、サンタクルスのきれいな正方形の地図が必要な場合):
lonf 0.01132221938
latf 0.0090215040
つまり、(x +-2 * lonf、y +-2 * latf)は、関連する$lat_floor
を提供します。 興味のあるポイントの周りの2km幅の男の子の等の値。