2

セットアップ
ラインストリングを含むテーブルがあります。線ストリングは、複数の地理的ポイントで構成されています。各ポイントは緯度と経度で構成されています。注:ラインストリング値は、データベースにTEXTとして格納されます。

したがって、テーブルの1つの行は次のようになります。id:
整数の
線文字列:x1、y2、x2、y2、x3、y3、x4、y4

問題
Googleマップでは、一度に最大1000個の要素しか表示できません。私の場合、850行の行を表示しているので、将来さらに多くの行を追加する必要があります。

質問
かなりの数の線ストリングが1つまたは複数の他の線ストリングと接続しています。つまり、同じ座標で開始および/または終了します。私がやりたいのは、データセットを最適化して、両端で接続するラインストリングがDBテーブルにマージされるようにするための最良の方法を見つけることです。これにより、DBテーブルを解析して、Googleマップの表示ファイルを作成するときに要素の総数が減ります。


この例では、アルファ(A、B、C)値が地理的なポイントを表すと想像してください。最適化されていないテーブルは次のようになります。

最適化前:
id linestring
1 A、B、C
2 C、D
3 B、A
4 F、G、H
5 G、I
6 H、J


最適化後:
1 A、B、C、D
2 F、G、H、J
3 G、I


では、データを最適化するための最良の方法は何ですか?最適に機能する特定のアルゴリズムはありますか?私は私が定式化して追加する解決策についていくつかのアイデアを持っていますが、それらは冗長であり、混乱しているようです。

私はCS専攻ではないので、ずさんな用語を言い訳して、どこかで説明が必要かどうか教えてください。ありがとう!


参考までに..MySQLDBを使用しています。私は空間拡張を使用していません。空間拡張を使用する恥ずかしいほど単純なソリューションがある場合は、とにかくそれについて聞いてみたいと思います。

4

3 に答える 3

1

認識すべきことの 1 つは、特定の線ストリングに接続できる線ストリングが複数ある場合、どれを選択しても問題ないということです。最適化されたテーブル内の線ストリングの最終的な数は同じになります。

したがって、その場合、結合できる線ストリングのペアを繰り返し見つけて、そのようなペアが見つからなくなるまでそれらを結合するという単純な貪欲な戦略により、最適なテーブルが得られます。基本的に擬似コードは次のとおりです。

while (there exists a pair of linestrings x and y that share an endpoint) {
    delete(x)
    delete(y)
    insert(x . y)
}

結果のラインストリングが再度使用される可能性があるため、これは単一の SQL クエリでは実行できませんx . y。T-SQL などの手続き型言語やスクリプト言語 (データベース アクセスに DBI を使用する Perl など) を使用して while ループを記述し、SQL SELECT クエリを使用してペアまたはペアのリストを検索し、次に、DELETE および INSERT ステートメントを使用してそれぞれを処理します。

beginテーブルにとの 2 つのフィールドを追加しend、インデックスを作成して検索を高速化することをお勧めします。

于 2009-01-21T18:07:33.777 に答える
1

ここに行く最も簡単な方法は、MySQL 空間拡張機能を使用することだと思います。

特に、私は Oracle の空間拡張しか使用していません。Oracle では、 SDO_GEOM.RELATESDO_RELATEなどの関数を使用して、2 つのオブジェクト間の空間的な関係 (contains、touches、intersects など) を見つけることができます。

MySQLには同等の空間関数があると確信しています

編集:

これは、利用可能なすべての MySQL 空間関数を一覧表示するリンクです。

于 2009-01-20T19:35:56.563 に答える
0

すべてのエンドポイントが最大で 2 回 (1 つのラインストリングを終了し、別のラインストリングを開始する) 表示される場合、固有の解決策がありますが、それは保証されていますか? たとえば、次の場合はどうなりますか。

  1. A、B、C
  2. CD
  3. C、E、F

これが生成する必要があります:

  1. あいうえお
  2. C、E、F

また:

  1. A、B、C、E、F
  2. CD

?

それとも気にしませんか?

于 2009-01-21T13:29:02.777 に答える