Çizgi parçalarından voronoi diyagramı oluşturma


14

Nokta yerine çizgi parçalarını temel alan bir voronoi diyagramı oluşturmak için bir yol arıyorum. Aşağıdaki örneğe bakın ( bu sunumdan alınmıştır ).

İdeal olarak Python'dan senaryo yazabileceğim bir şey istiyorum, ancak ArcGIS veya benzeri bir çözüm de kabul edilebilir.

çizgi parçalarından voronoi diyagramı

Bunu yapmak için şimdiye kadar bulduğum tek kütüphane umut verici görünüyor openvoronoi olduğunu . Başka var mı?


1
Bu muhtemelen yardımcı olacaktır: gis.stackexchange.com/questions/53414/…
Dan C

Teşekkürler. Bu sorunun aramalarımda neden gelmediğinden emin değilim.
Snorfalorpagus

Yanıtlar:


5

Biz (bir üniversite ekibi) bunun için bir ArcGIS 10.0 eklentisi ve ArcObjects kullanarak bir uygulama tasarladık. Uygulama tamamen ücretsizdir. Uygulama, normal veya çok ağırlıklı ağırlıklı Voronoi diyagramları (veya yukarıdakilerin bir kombinasyonunu) oluşturmak için giriş noktaları, çizgiler veya çokgenler olarak alan bir raster metodolojisi kullanır, yani her bir şekil türünden birini kullanabilirsiniz üç farklı özellik sınıfı). Hâlâ geliştirme aşamasındadır, ancak özellikle sadece çizgiler yapmak istiyorsanız, oldukça kararlı olmalıdır. Eklentinin çalışması için Spatial Analyst lisansı gerekir. Kodun kendisi açık kaynak, bu yüzden istediğiniz gibi yapmaktan çekinmeyin.

https://github.com/UNTGeography/VoronoiDiagramsGIS

@ Radouxju'nun cevabında açıklanan "Öklid Tahsisi" ile benzer bir yöntem kullanır ve elde edilen rasterden vektör çokgenler oluşturmak için Akış Yönü / Havzası rasterini kullanır.



3

Voronoï başlangıçta noktalar için tasarlanmıştır. Sorununuz için hayal edebileceğim iki yöntem (ArcGIS araçlarına atıfta bulunarak, ancak muhtemelen düzgün bir şekilde mümkündür):

1)

a) çizgiler boyunca noktalar oluşturun (örneğin yoğunlaştırdıktan sonra çizgiye köşe noktaları ekleyin)

b) Thiessen çokgenleri oluşturun

c) Thiessen çokgenlerini kesiştikleri çizgilere göre çözer

2)

a) mekansal analistle, hatlara Öklid tahsisini hesaplayın

b) her bir bölgeyi bir çokgene dönüştürün


3

Bazı müşteriler için birkaç iş arkadaşı ve ben bunu yapan 2 coğrafi işleme aracı oluşturmak için çalışıyoruz. Coğrafi işleme araçları herkese açık olmasa da, kullandığımız python ve C # şunlardır:

Hem C # hem de python sarıcı aslında C ++ Boost Voronoi API'sine dayanır: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

API'nın çok fazla bellek harcadığını unutmayın. 64 bit, ArcGIS Pro veya QGIS için Geoprocessing kullanıyorsanız bu bir sorun değildir. Bu, 32 bit olduğu için ArcGIS Desktop'taysanız bir sınırlamadır. (Bellek sınırına ulaşmak için 40.000 veya daha fazla satırdan oluşan ayrıntılı bir yol ağı yeterli olmalıdır)


1
: Aslında ArcMap'te ve ArcGIS Pro pyvoronoi kütüphanesine güvenir bir coğrafi işlem aracı oluşturduk github.com/fabanc/Boost-Voronoi-For-ArcGIS
Fabien ANCELIN

2

ET Geowizards (Arc için bir eklenti) bunun için Çoklu Hatları kabul eden bir araca sahiptir (aşağıdaki ekran görüntüsüne bakın). Maalesef aracı çalıştırmak için lisanslı ürüne ihtiyacınız olacak, ancak bunun hile yapması gerektiğini düşünüyorum.

resim açıklamasını buraya girin


0

Ayrıca PostgreSQL / PostGIS kullanarak görevinizi çözmenin bir yolu daha.

Satırlar kısa ve basitse, komut dosyasını çalıştırın:

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;

Sonuca bakın.

Çizgiler uzunsa, betiği çalıştırın:

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;

Sonuca bakın.

Gerekirse, çizgilerdeki nokta sayısını sıkıştırın, örneğimde bu 10 nokta.

Orijinal çözümler.

Bu komut dosyasının adı: ST_VoronoiDiagramsFromLines.


Bunu henüz çalıştırmadım, ancak geometrilerin köşelerini kullanarak voroni çokgenleri oluşturuyor gibi görünüyor, sonra orijinal geometrilere dokunurlarsa onları (birleşim ile) birleştiriyorlar. Bu doğru mu? Eğer öyleyse, orijinal geometrileriniz çok fazla köşeye sahip olduğu ve uzun segmentleri olmayan uzun bir tamamlamadır.
Snorfalorpagus

Test eden: PostgreSQL 11.1, PostGIS 2.5 USE_GEOS = 1 USE_PROJ = 1 USE_STATS = 1 ...
Cyril Mikhalchenko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.