ポイントの代わりに線分に基づいてボロノイ図を作成する方法を探しています。以下の例を参照してください(このプレゼンテーションから引用)。
Pythonからスクリプトを作成できるものが欲しいのですが、ArcGISなどを使用したソリューションでも問題ありません。
私がこれまでに見つけた唯一のライブラリは、有望に見えるopenvoronoiです。他に何かありますか?
ポイントの代わりに線分に基づいてボロノイ図を作成する方法を探しています。以下の例を参照してください(このプレゼンテーションから引用)。
Pythonからスクリプトを作成できるものが欲しいのですが、ArcGISなどを使用したソリューションでも問題ありません。
私がこれまでに見つけた唯一のライブラリは、有望に見えるopenvoronoiです。他に何かありますか?
回答:
私たち(大学のチーム)は、ArcGIS 10.0アドインとArcObjectsを使用して、この実装を設計しました。アプリケーションは完全に無料です。実装は、入力点、線、または多角形を入力として通常または多重に重み付けされたボロノイ図を作成するラスター手法を使用します(または上記の組み合わせ、つまり、各タイプの形状のいずれかを使用して、最大1つの図セットを作成します) 3つの異なるフィーチャクラス)。まだ開発中ですが、特に行だけを行いたい場合は、かなり安定しているはずです。アドインを使用するには、Spatial Analystライセンスが必要です。コード自体はオープンソースですので、お気軽に自由に使ってください。
https://github.com/UNTGeography/VoronoiDiagramsGIS
@radouxjuの回答で説明されている「ユークリッド割り当て」と同様の方法を使用し、フロー方向/流域ラスタを使用して、結果のラスタからベクトルポリゴンを作成します。
一部の顧客では、2人の同僚と私はそれを行う2つのジオプロセシングツールの作成に取り組んできました。ジオプロセシングツールは公開されていませんが、使用したPythonとC#は次のとおりです。
C#とpythonラッパーの両方は、実際にはC ++ Boost Voronoi APIに依存しています:http : //www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm
APIは大量のメモリを消費することに注意してください。64ビットのジオプロセシング、ArcGIS Pro、またはQGISを使用している場合、これは問題ではありません。ArcGIS Desktopを32ビットで使用している場合、これは制限です。(40,000行以上の詳細な道路ネットワークは、メモリ制限に達するのに十分なはずです)
ET Geowizards(Arcのプラグイン)には、ポリラインを受け入れるためのツールがあります(下のスクリーンショットを参照)。残念ながら、このツールを実行するにはライセンス製品が必要になりますが、うまくいくと思います。
さらに、PostgreSQL / PostGISを使用してタスクを解決するもう1つの方法。
行が短く単純な場合は、スクリプトを実行します。
WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (SELECT (ST_DumpPoints(geom)).geom geom FROM tbla
UNION
SELECT ST_Centroid(geom) geom FROM tbla),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;
結果をご覧ください。
行が長い場合は、スクリプトを実行します。
WITH
tbla AS (SELECT (ST_Dump(geom)).geom geom FROM <line_name_table>),
tblb AS (WITH btbl AS (SELECT (ST_Dump(geom)).geom geom FROM tbla),
intervals AS (SELECT generate_series (0, 9) as steps)
SELECT steps AS stp, ST_LineInterpolatePoint(geom, steps/(SELECT count(steps)::float-1 FROM intervals)) geom FROM btbl, intervals GROUP BY intervals.steps, geom),
tblc AS (SELECT ((ST_Dump(ST_VoronoiPolygons(ST_Collect(geom)))).geom) geom FROM tblb)
SELECT ST_Union(a.geom) geom FROM tblc a JOIN tbla b ON ST_Intersects(a.geom, b.geom) GROUP BY b.geom;
結果をご覧ください。
必要に応じて、線上のポイントの数を圧縮します。この例では10ポイントです。
オリジナルのソリューション。
このスクリプトは、ST_VoronoiDiagramsFromLinesと呼ばれます。