mysql空間拡張を使用して、緯度と経度をポイントデータ型として保存し、それを空間インデックスにすることができます。このようにして、曲線に沿って座標を並べ替え、寸法を減らし、空間情報を保持することができます。空間インデックスをバウンディングボックスとして使用してクエリをフィルタリングし、ハーベシン数式を使用して最適な結果を選択できます。バウンディングボックスは、大円の半径よりも大きくする必要があります。 Mysqlはいくつかの空間インデックスを持つrtreeを使用し、私の例はz曲線またはヒルベルト曲線に関するものでした: https://softwareengineering.stackexchange.com/questions/113256/what-is-the-difference-between-btree-and-rtree-indexing 次に、地理座標をポイント列に直接挿入できます。 http://dev.mysql.com/doc/refman/5.0/en/creating-spatial-values.html 。または、ジオメトリデータ型を使用できます: http:// markmaunder.com/2009/10/10/mysql-gis-extensions-quick-start/ 。次に、MBRcontains関数を次のように使用できます。 http://dev.mysql.com/doc/refman/4.1/en/relations-on-geometry-mbr.html またはその他の関数: http://dev.mysql.com/doc/refman/5.5/en/functions-for-testing-spatial-relations-between-geometric-objects.html 。したがって、バウンディングボックスが必要です。いくつかの例を次に示します。
- Latの保存空間ポイントタイプを使用したMySQLのLng値
- https://gis.stackexchange.com/questions/28333/how-to-speed-up-this-simple-mysql-points-in-the-box-query
ポイントデータ型の簡単な例を次に示します。
CREATE SPATIAL INDEX sx_place_location ON place (location)
SELECT * FROM mytable
WHERE MBRContains
(
LineString
(
Point($x - $radius, $y - $radius),
Point($x + $radius, $y + $radius)
)
location
)
AND Distance(Point($x, $y), location) <= $radius
バウンディングボックス関数で半径変数を使用しているため、機能するかどうかはわかりません。 MBRwithinは引数を必要としないため、少し単純なようです。 MySQL:ネストされたセットツリーでのスーパーノードの検索の最適化 。