-2

一連の地球座標 (緯度/経度) と関連する半径を含むテーブルがあります。また、これらの円と一致させたいポイントの束を含むテーブルもあり、その逆も同様です。どちらも動的です。つまり、いつでも新しい円または新しい点を追加または削除できます。いずれかが追加されたら、新しい円または点を、適用可能なすべての点または円とそれぞれ一致させたいと考えています。

私は現在、座標が与えられた地球上の 2 点間の距離を見つけるための C 関数を含む PostgreSQL モジュールを持っていますが、うまくいくようです。問題はスケーラビリティです。その機能を実行するために、関数は現在、テーブル全体をスキャンし、各行に対して三角関数の計算を行う必要があります。どちらのテーブルも緯度と経度でインデックスが作成されていますが、関数はそれらを使用できません。2 つのことが一致するかどうかを知る前に、それが実行されなければなりません。新しい情報が 1 秒間に数回投稿されることもあり、すべてのポイントを毎回チェックするのは非常に面倒になり始めています。

PostgreSQL の幾何学的型を見てきましたが、それらは球上の点よりも直角座標に適しているようです。

このデータを調整/最適化/フィルタリング/事前計算して、マッチングを高速化し、負荷を軽減するにはどうすればよいですか?

4

3 に答える 3

3

あなたはPostGISについて言及していません- なぜそれを可能性として除外したのですか?

http://postgis.refractions.net/documentation/manual-2.0/PostGIS_Special_Functions_Index.html#PostGIS_GeographyFunctions

于 2012-07-29T10:19:42.767 に答える
2

ここで少し大声で考えてください...あなたはポイント(緯度/経度)と半径を持っています、そしてあなたは重複するかもしれないすべての既存のポイントと半径の組み合わせを見つけたいですか?(またはそのようなもの...)

クエリ中にどこにも近くない他の人を除外するのに役立つ可能性のある数値とともに、さらにいくつかの情報を格納できる可能性があります...これにより、多くのトリガー操作を回避できる可能性があります。

たとえば、ポイントx、yと半径rを使用すると、別のポイントに対して不必要な計算を行う場合に除外するために使用できる、実行可能な緯度/経度(角張った領域)の範囲を簡単に計算できます。

次に、maxとmin latとlongを、そのポイントとともにデータベースに保存できます。次に、すべての行でトリガーを実行する前に、結果をフィルター処理して、明らかに範囲外のポイントを削除できます。

于 2012-07-28T18:34:59.077 に答える
0

私があなたを正しく理解していれば、私の最初のアイデアは、いくつかのデータをキャッシュして、ほとんどのチェックを排除することです.

あなたの円が実際には箱で、4つの側面があると想像してみてください

実際の地図上に線 (メッシュ) があるように、これらの線のベース座標を格納できます。したがって、各円の東、西、北、南の端を保存します

座標とそのボックスの外側を取得すると、ボックスが円よりも​​大きいため、円の内側にもないと確信できます。

そうでない場合は、今と同じように確認する必要があります。しかし、すでにほとんどの手順を省略できると思います。

于 2012-07-28T18:28:34.887 に答える