1

ジオメトリ タイプ フィールドを使用して、いくつかのマップ ゾーンをテーブルに保存しました。

したがって、挿入は次のようになります。

INSERT INTO zones (zoneName, coords) VALUES ('name',
PolygonFromText('POLYGON((
41.11396418691335 1.2562662363052368,
41.11370552595821 1.2560248374938965,
41.11851079510035 1.2459397315979004,
41.11880984984478 1.2461864948272705,
41.11396418691335 1.2562662363052368))'));

次に、ユーザーの位置を取得し、彼がゾーン内にいるかどうかを知る必要があります。これはこれでうまくいきます:

SELECT id 
  FROM zones 
 WHERE MBRContains(coords,GeomFromText('POINT(41.117783 1.260590)'))

ただし、ユーザーの位置が完全ではない場合もあるため、ユーザーの位置に最も近いゾーンを知っておくとよいと思います。

それは私がまったく知らない部分です... 2つのポイント間の距離を取得するためのクエリをいくつか見つけましたが、ポイントとポリゴンは取得しませんでした。

4

1 に答える 1

0

MBRシリーズの関数(などMBRContains)は、実行しようとしていることには適していません。境界矩形の包含のみをテストします。

MySQL 5.6.1にジャンプして、のようなST_関数を使用することをお勧めしますST_Contains。これらの関数は実際にジオメトリをテストします。

あなたが取り組んでいる問題は、境界アイテム POINTのコレクションと比較するときのあなたの位置の不確実性として定義することができます。POLYGON

これを試してください:POLYGONあなたの不確実性のサイズで正方形であるあなたのポイントからを作成してください。この正方形は「あいまいな」点と考えることができます。(長方形の代わりに八角形または円の別の近似を使用することもできますが、クエリ速度は遅くなります。)

次に、ST_Withinを使用して、ファジーポイントを完全に含む一意のポリゴンがあるかどうかを確認します。ポリゴンが1つしかない場合は、これで完了です。

ファジーポイントを完全に含む複数のポリゴンを取得した場合、それは境界ポリゴンの一部が他のポリゴンとオーバーラップしていることを意味します。問題空間でこれが何を意味するのかを理解する必要があります。データが適切に構造化された地図作成境界データであることが意図されている場合、それはデータの間違いがあることを意味します。(注:これは前代未聞ではありません:-)

ファジーポイントを完全に含むポリゴンがない場合、ファジーポイントは少なくとも1つのポリゴンの境界と重なる場合と重ならない場合があります。ST_Overlapsそれらのポリゴンを見つけるために使用します。

1つだけ取得すると、完了です。ファジーポイントは1つのポリゴンの境界の近くにあります。

何も得られない場合は、完了です。ファジーポイントは、すべてのポリゴンの境界から離れています。

複数のヒットを取得した場合、あいまいさが生じます。ファジーポイントは複数のポリゴンの境界の近くにあります。

これは整理するのが難しいケースです。ファジーポイントのサイズを縮小して、再試行できます。これにより、ポリゴンの結果が1つだけになる可能性があります。しかし、これを行うことで、自分のポイントがより正確であると思い込ませることができます。

MySQLには幾何演算子がありませんArea(Intersection(Polygon, FuzzyPoint))。もしそうなら、あなたはあなたのファジーポイントとの交差の最大の面積を持つポリゴンを選ぶことができました、そしてそれは良い曖昧さを解消するでしょう。しかし、それでもあなたのポイントの位置と同じくらい不正確です。

たぶん、アプリケーションは「確かにA、B、Cの境界に近すぎる」という結果のカテゴリを処理する必要があります。

于 2012-06-19T12:28:28.300 に答える