線分からボロノイ図を作成


14

ポイントの代わりに線分に基づいてボロノイ図を作成する方法を探しています。以下の例を参照してください(このプレゼンテーションから引用)。

Pythonからスクリプトを作成できるものが欲しいのですが、ArcGISなどを使用したソリューションでも問題ありません。

線分からのボロノイ図

私がこれまでに見つけた唯一のライブラリは、有望に見えるopenvoronoiです。他に何かありますか?


1
これはおそらく役立つでしょう:gis.stackexchange.com/questions/53414/…-
ダンC

ありがとう。その質問が私の検索で出てこなかった理由がわかりません。
Snorfalorpagus 14

回答:


5

私たち(大学のチーム)は、ArcGIS 10.0アドインとArcObjectsを使用して、この実装を設計しました。アプリケーションは完全に無料です。実装は、入力点、線、または多角形を入力として通常または多重に重み付けされたボロノイ図を作成するラスター手法を使用します(または上記の組み合わせ、つまり、各タイプの形状のいずれかを使用して、最大1つの図セットを作成します) 3つの異なるフィーチャクラス)。まだ開発中ですが、特に行だけを行いたい場合は、かなり安定しているはずです。アドインを使用するには、Spatial Analystライセンスが必要です。コード自体はオープンソースですので、お気軽に自由に使ってください。

https://github.com/UNTGeography/VoronoiDiagramsGIS

@radouxjuの回答で説明されている「ユークリッド割り当て」と同様の方法を使用し、フロー方向/流域ラスタを使用して、結果のラスタ​​からベクトルポリゴンを作成します。


興味のある人のための重要な部分:github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/...
Sancarn

3

Voronoïは最初はポイント用に設計されています。あなたの問題に対して私が想像できる2つの方法を以下に示します(ArcGISツールを引用しますが、おそらくshapelyでは可能です)。

1)

a)線に沿ってポイントを作成します(例:密度を高くしてから、頂点を線に合わせます)

b)ティーセンポリゴンの作成

c)交差する線に基づいてティーセンポリゴンをディゾルブします

2)

a)空間アナリストを使用して、ラインへのユークリッド割り当てを計算します

b)各ゾーンをポリゴンに変換します


3

一部の顧客では、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行以上の詳細な道路ネットワークは、メモリ制限に達するのに十分なはずです)


1
実際に、pyvoronoiライブラリに依存するArcMapおよびArcGIS Pro用のジオプロセシングツールを作成しました。github.com/ fabanc
Fabien Ancelin

2

ET Geowizards(Arcのプラグイン)には、ポリラインを受け入れるためのツールがあります(下のスクリーンショットを参照)。残念ながら、このツールを実行するにはライセンス製品が必要になりますが、うまくいくと思います。

ここに画像の説明を入力してください


0

さらに、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と呼ばれます。


まだ実行していませんが、ジオメトリの頂点を使用してボロニポリゴンを作成し、元のジオメトリに触れるとそれらを(結合して)マージするようです。あれは正しいですか?その場合、元のジオメトリに多くの頂点があり、長いセグメントがない場合は、近似値として問題ありません。
Snorfalorpagus

テスト対象:PostgreSQL 11.1、PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril M
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.