2

JTSTopologySuiteを使用して作成された一連のポリゴンがあります。各ポリゴンは、以下に示すように、形状を形成する点、経度、緯度のセットです。

((lat1,lon1),(lat2,lon2),....(lat1,lon1))

これらのポリゴンのそれぞれの隣、物理的にそれらの隣にある他の形状を見つけたいと思います。一致するポイントを探すことを考えましたが、明らかにそれがすべての場合に機能するとは限りません。ポリゴンがこの状況で使用できるのと同じエッジを共有しているかどうかを確認するパッケージがあるかどうか疑問に思いました。または、そうでない場合は、Javaでこれを行う別の方法。

ありがとう。

4

3 に答える 3

1

共有エッジを探しているので、エッジをキーとして使用し、そのエッジをアイテムとして持つポリゴンのリストを使用するハッシュテーブルを作成できます。

次に、各ポリゴンを調べて、テーブルを埋めます。これは、エッジの数が線形です。

次に、テーブルを調べて、複数のポリゴンに関連付けられているエッジを探します。これが、探しているものです。これは、一意のエッジの数に比例します。

Javaがハッシュテーブルをどのように実装するかわからないので、この設定を取得するのは少し手間がかかるかもしれません。エッジ(A、B)がエッジ(B、A)と異なることを防ぐために、エッジがソートされていることを確認してください。これにより、アルゴリズムが混乱します。

ライブラリに関しては、あなたがやろうとしていることは少し専門的であるように思われるので、ライブラリの実装が見つかるかどうかわからないので、なぜアルゴリズムの概要を説明しました。

于 2013-01-27T16:31:15.567 に答える
1

実際、これを行うには非常に簡単な方法がありました。オブジェクトの配列を含む配列リストを作成しました。オブジェクトは、ポリゴンの名前/ ID、実際のポリゴン座標、および隣接するポリゴンのIDを含む文字列を参照していました。

JTS Topologyスイートには、ブール値を返すtouchsと呼ばれるポリゴンを呼び出すことができるメソッドがあります。だから私はdoubleforループを持っていて、配列リストを2回調べて、メソッドを呼び出すとpolygon(i)に触れます。

arraylist<object[]>..
//where in the array the objects are
object[0] = id
object[1] = polygon
object[2] = neighbours

for (int i=0;i<arraylist;i++)
  for (int j=0;j<arraylist;j++)
    if (i)[1].touches(j)[1]
      update i[2]..

これはおそらく最善の方法ではありませんが、うまくいくようです。

于 2013-01-28T11:00:54.687 に答える
1

とにかくJTSジオメトリを使用している場合は、任意のGeometryオブジェクトで使用できる空間リレーションを使用できます。

ネイバー間の少なくとも1つのポイントが共通であり、それらの内部が交差しないようにすることができる場合は、タッチを使用します。

内部が交差しないことを保証できない場合は、交差を使用します。データソースによっては、これがおそらくより良い選択です。

ポリゴンを考えると、ネイバーを取得するメソッドは次のようになります。

public ArrayList<Polygon> getNeighbourList(Polygon center, ArrayList<Polygon> possibleNeighbourList){
    // result list
    ArrayList realNeighbourList = new ArrayList();
    for(Polygon p : possibleNeighbourList){
        // check if current polygon is a neighbour of the center polygon by using the spatial relation touches or intersects
        if(center.intersects(p)){
            realNeighbourList.add(p);
        }
    }
    return realNeighbourList;
}
于 2016-07-11T16:25:26.823 に答える