ArcGISの新機能で、「魚が泳ぐように」2点間の距離を計算したい


9

特定の割り当ての水域であるHydrographyという名前のレイヤーがあります。ステーションポイントとターゲットポイントがあります。これらの2点間の距離を計算する必要がありますが、水路の内側です。(ボートは陸を越えられません)

DefenseServiceの距離計算はまずまずですが、Rasterを入力として使用しないため、直線のように見えます。ユークリッドはほとんど存在するようですが、簡単なものは見つかりません。

ArcGIS Explorer 2500、ArcGIS for Server 10.1 SP1 Enterpriseを使用していますが、サービスとツールはC#で作成しています。

水路の読み込み、IPointsの作成がありますが、次に何をすべきかについて途方に暮れています!

どんな助けでも感謝してください。


1
ここには「受け入れられない回答」がありますが、それは非常によく似た質問だと思います。gis.stackexchange.com
Mapperz

彼がプログラマーではないと彼が言うまで、私の興奮レベルはすぐに上がり始めました。これは、ツールを使用して行うことはできません。選択した場所とターゲットのリストを含むカスタムツールウィンドウがあります。サーバーでメソッドを呼び出して、各ターゲットまでの距離をリストに入力する必要があります。
SASS_Shooter 2013年

水路レイヤーの線またはポリゴンですか?
Conor 2013年

これは、ラスターに変換するポリゴンです。
SASS_Shooter 2013年

あなたのユースケースは少し混乱しています。湖の端に沿った2点から最短距離を見つけようとしていますか?またはあなたのステーションは川のステーション(湖の底にあります)に対応していますか?
DPierce 2013年

回答:


4

Spatial Analyst Extension のコスト距離ツールとコストパスツールを使用します

Hydrographyポリゴンからラスターを作成できます。次に、水を表すラスターセルが低い値(たとえば1)を取得し、他のラスターセルが高い値(たとえば1000)を取得することを確認します。その後、このラスターを使用することができ、コスト距離ラスタコストパスツール


はい-Cost Distanceは入力としてラスターを受け取り、開始と終了のハイドログラフィーラスター上のポイントを取得することがわかりました。戻り値は、長さを取得できるポリラインです。
SASS_Shooter 2013年

1

運河や自然の水路の中心線についても、同様のことを行いました。私が使用したアプローチは、ポイントにTINを設定し、TINを2等分してから、元の頂点から2番目のTINを作成し、2等分線は、変更されたダイクストラのアルゴリズムを使用してトラバースし、オプションが破棄され、最も単純なソリューションが形成されないことが明らかです。変更点は、ラインが「ソリューション」ポイントで終了するか、既存のパスが存在する場合は以前のパスで終了することでした。これにはすぐに使用できるソリューションはありません。プログラマーでない場合、または少なくとも1つのメリットを得られる立場にある場合、ジオデータベースへのオフセットを使用してトレースし、 shape_lengthフィールド。


TIN = Triangular Irregular Network。ポイントと接続線のラティスで、各ポイントは最も近い隣接線に接続され、線は交差しません。このために参照http://en.wikipedia.org/wiki/Delaunay_triangulationを。私はESRI TINオブジェクトを使用しませんでしたが、代わりに三角測量用のコードを見つけてメモリに保持しました

最短パスアルゴリズムについては、http://en.wikipedia.org/wiki/Dijkstraのs_algorithmを参照してください。複雑な名前にもかかわらず、それは本当に非常に単純です。

線を形成する点から、ドローネ三角形分割を行い、三角形の各エッジの中間点(基本形状...平均X、平均Y)を見つけて、ポリゴン内にある点をメッシュに挿入しました。パスを中央に配置し、境界上のすべての頂点にリンクします。次に、水路の土手に続くファセットを除外すると、ダイクストラのアルゴリズムを使用してネットワークがトレースされ、最終的に、水路のほぼ中央を下って走る点Aから点Bへのパスが見つかります。可能なパスはたくさんあるので、累積長さが既に記録されている長さを超えたときに各頂点に重みを付けてパスを停止し、それが少ない場合は、短い累積長で頂点を更新します-これにより、トレースされたパス。

または、三角形分割された後、三角形のエッジをフィーチャクラスとして2つのポイントラインに変換し、ネットワークを構築してからトレースを実行できます。ESRIトレースルーチンは私のものよりはるかに速いと確信していますが、特定のニーズがあり、ジオメトリックネットワークを使用してそれを解決できませんでした。


マイケル-私はC#開発者です。ArcGISとそのプログラミングツールは非常に新しいものです。Military Analystを使用してすぐに使用できるソリューションを1つ見つけましたが、ESRIの知恵はそれを落としてしまいました。ポイントをTINでどのように意味し、どのDyjkstraアルゴリズムを使用しましたか?
SASS_Shooter 2013年

1

このスレッドを読む将来の人のためにこれを追加します。

この問題を掘り下げ、ポイントコール間の完全な距離を取得するために私が学んだすべてはここにあります。

最初の問題は、RasterCatalogの静的な性質から生じました。これが基づいているラスターを変更しても、RasterCatalog内のラスターは変更されません。私たちのものは海岸線地図のどこにもない古いバージョンを持っていることが判明しました。教訓:基になるラスターを変更するたびにRasterCatalogを再構築する。

ウェイトが追加された距離ラスターは、扱いにくくなります。次のシナリオを見てください。ラスターの元の値は、1つの合計距離が117 kmです。セルのサイズは1メートルです。ラスタの加重値が48の場合、見たい距離の合計は117 km * 48になります。したがって、CostDistanceメソッドの距離は、セル距離ではなく重み付けされた距離であり、各セルの合計が合計距離として渡される値になるまで、各セルの値を追加しているようです。セルサイズ自体が1メートルでも!!!

距離ラスターはすべて原点に焦点を合わせています。したがって、CostDistanceルーチンを呼び出すときに、そのリストに起点を含めたくありません。実行すると、距離が0の1つのポイントが取得されます(ESRIのサポートも問題になります)。

多くの方法ではエンベロープを使用してプロセスを制限していますが、最も高価な2つの方法は、ラスターに値を設定し、ポリゴン内の領域なしでラスターを抽出します。すべてのエンベロープ設定を無視し、これを常にラスター全体に自動的に適用します。残念ながら、これを短くするには、重複する大規模なセグメントを作成し、セグメントを特定のボックス領域に割り当てる必要があります。ただし、そうする際には、プライマリ操作領域が間違ったオーバーラップ領域に存在しないように注意する必要があります(これは難しい)。(つまり、すべてのオーバーラップは、主要な関心のあるポイントを含まないように慎重に選択する必要があります!)これは、RasterCatalogをナビゲートして、選択したCoast Guardステーションが存在する場所に基づいて正しいラスターを選択するためです。プロセスをさらに複雑にするために、オーバーラップは、マップの端から外れることなく、起点から最大120 km離れてナビゲートし、他の主要な主要ポイントと重ならないようにする必要があります。シーッシュ。

私が学んだ他の唯一のことは、ラスターに数学で計算するのは簡単ですが、ラスターに「穴を開ける」(障害物)、または値でドーナツを設定し、ドーナツの内部に値1(ロックのような遅延)の場合、ツールとArcObject呼び出しの複雑な組み合わせになります。これは、最後に学んだ教訓につながります。ArcObjectsはすべてを実行できるわけではありません。そのため、私は時々、すべてPythonで作成された、遅くて扱いにくいツールで物事を行うことを強いられます。また、ESRIツールの開発者は一貫性の維持について何も知らないことも学びました。時々彼らはラスターデータベースを取得し、時にはラスターを必要とし、時には機能セットを必要としました。そして、それらは入力として必要なのと同じ形式でデータを返しません!

混乱していますか?心配しないで、それはESRIです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.