Tạo sơ đồ voronoi từ các đoạn đường


14

Tôi đang tìm cách tạo sơ đồ voronoi dựa trên các phân đoạn dòng thay vì điểm. Xem ví dụ dưới đây (lấy từ bài trình bày này ).

Lý tưởng nhất là tôi muốn một cái gì đó tôi có thể viết kịch bản từ Python, nhưng một giải pháp sử dụng ArcGIS hoặc tương tự cũng có thể được chấp nhận.

sơ đồ voronoi từ các đoạn đường

Thư viện duy nhất để làm điều này tôi đã tìm thấy cho đến nay là openvoronoi , có vẻ đầy hứa hẹn. Có ai khác không?


1
Điều này có thể sẽ giúp: gis.stackexchange.com/questions/53414/ Khăn
Dan C

Cảm ơn. Không chắc tại sao câu hỏi đó không xuất hiện trong các tìm kiếm của tôi.
Snorfalorpagus

Câu trả lời:


5

Chúng tôi (một nhóm trường đại học) đã thiết kế một triển khai cho việc này bằng cách sử dụng một addin và ArcObjects ArcGIS 10.0. Ứng dụng này hoàn toàn miễn phí. Việc triển khai sử dụng một phương pháp raster lấy các điểm đầu vào, đường hoặc đa giác để tạo các sơ đồ Voronoi thông thường hoặc đa trọng số (hoặc kết hợp các yếu tố trên, tức là bạn có thể sử dụng một trong từng loại hình, tạo một sơ đồ duy nhất từ ba lớp tính năng riêng biệt). Nó vẫn đang được phát triển nhưng sẽ khá ổn định, đặc biệt nếu bạn chỉ muốn thực hiện các dòng. Addin yêu cầu giấy phép Spatial Analyst để hoạt động. Bản thân mã này là mã nguồn mở, vì vậy hãy thoải mái thực hiện với nó khi bạn muốn.

https://github.com/UNTGeography/VoronoiDiagramsGIS

Nó sử dụng một phương pháp tương tự như "Phân bổ Euclide" được mô tả trong câu trả lời của @ radouxju và sử dụng raster Flow Direction / Basin để tạo đa giác vector từ raster kết quả.


Phần quan trọng cho những người quan tâm: github.com/UNTGeography/VoronoiDiagramsGIS/blob/master/ chủ
Sancarn

3

Voronoï ban đầu được thiết kế cho các điểm. Dưới đây là hai phương pháp tôi có thể tưởng tượng cho vấn đề của bạn (trích dẫn các công cụ ArcGIS, nhưng có thể có thể với hình dạng):

1)

a) tạo các điểm dọc theo các đường (ví dụ: tăng mật độ rồi tính năng các đỉnh thành đường thẳng)

b) tạo đa giác Thiessen

c) hòa tan các đa giác Thiessen dựa trên các đường mà chúng giao nhau

2)

a) với nhà phân tích không gian, tính toán phân bổ Euclidian cho các dòng

b) chuyển đổi từng khu vực thành một đa giác


3

Đối với một số khách hàng, một vài đồng nghiệp và tôi đã làm việc để tạo ra 2 công cụ xử lý địa lý thực hiện điều đó. Mặc dù các công cụ xử lý địa lý không có sẵn công khai, nhưng python và C # chúng tôi đã sử dụng là:

Cả C # và trình bao bọc python thực sự dựa trên API C ++ Boost Voronoi: http://www.boost.org/doc/libs/1_54_0/libs/polygon/doc/voronoi_main.htm

Lưu ý rằng API tiêu thụ rất nhiều bộ nhớ. Đây không phải là vấn đề nếu bạn đang sử dụng Công cụ địa lý cho 64 bit, ArcGIS Pro hoặc QGIS. Đây là một hạn chế nếu bạn đang ở trên ArcGIS Desktop vì nó là 32 bit. (Mạng lưới đường chi tiết từ 40.000 hàng trở lên phải đủ để đạt đến giới hạn bộ nhớ)


1
Tôi thực sự đã tạo ra một công cụ xử lý địa lý cho ArcMap và ArcGIS Pro dựa trên thư viện pyvoronoi: github.com/fabanc/Boost-Voronoi-For-ArcGIS
Fabien Ancelin

2

ET Geowizards (Một plugin cho Arc) có một công cụ cho việc này chấp nhận Polylines (xem ảnh chụp màn hình bên dưới). Thật không may, bạn sẽ cần sản phẩm được cấp phép để chạy công cụ, nhưng tôi nghĩ rằng nó nên làm điều đó.

nhập mô tả hình ảnh ở đây


0

Thêm một cách nữa để giải quyết công việc của bạn bằng PostgreSQL / PostGIS.

Nếu các dòng ngắn và đơn giản, thì hãy chạy tập lệnh:

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;

Xem kết quả.

Nếu các dòng dài, sau đó chạy tập lệnh:

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;

Xem kết quả.

Nếu cần, hãy thu gọn số điểm trên các dòng, trong ví dụ của tôi đây là 10 điểm.

Giải pháp ban đầu.

Kịch bản này được gọi là: ST_VoronoiDiagramsFromLines.


Tôi chưa chạy nó, nhưng có vẻ như nó tạo ra các đa giác voroni bằng cách sử dụng các đỉnh của hình học sau đó hợp nhất chúng (với một liên kết) nếu chúng chạm vào hình học ban đầu. Đúng không? Nếu vậy, đó là một xấp xỉ OK miễn là hình học ban đầu của bạn có rất nhiều đỉnh và không có phân đoạn dài mà không có bất kỳ.
Snorfalorpagus
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.