bằng cách sử dụng shapely: dịch giữa Polygons và MultiPolygons


12

[EDIT: giải pháp cho vấn đề này chỉ đơn giản là sử dụng OGR để đọc shapefiles. Xem ví dụ của geographika.]

Trong một shapefile ESRI, không có sự phân biệt giữa Đa giác và MultiPolygons. Hơn nữa, không có sự phân biệt rõ ràng giữa các lỗ bên trong và các vòng bên ngoài (bên cạnh "độ thuận tay" của một đa giác nhất định).

Vì vậy, sau khi đọc một shapefile, tôi có một danh sách các chuỗi tọa độ mô tả các vòng, nhưng không có quá trình xử lý chuyên sâu hơn, tôi không thể phân biệt được những vòng này là vòng ngoài, lỗ bên trong hay đa giác bổ sung.

Dường như để quyến rũ 's Polygon và MultiPolygon nhà thầu, thì phải có một sự phân biệt rõ ràng giữa bên ngoài và nhẫn nội thất, vậy làm thế nào tôi nên chuyển từ một danh sách rõ ràng của chiếc nhẫn để một bộ thứ tự các đa giác tách ra, với nội thất được chỉ định rõ ràng và nhẫn bên ngoài ?

Tóm lại: nếu tôi có một danh sách các vòng đa giác, nhưng tôi không biết vòng nào là lỗ trong nội thất hoặc là đa giác riêng biệt, làm thế nào tốt nhất tôi nên phân loại chúng thành các đa giác riêng biệt với các lỗ bên trong được chỉ định?

Tôi đang tìm kiếm một giải pháp thuật toán đơn giản mà tôi có thể thực hiện trên python, có thể được sử dụng để xử lý hàng trăm đa giác trong ~ một phút hoặc ít hơn và tôi đang làm điều này để thực hiện một số lượng lớn các giao lộ.


Câu hỏi này thiếu thông tin quan trọng như những gì bạn sử dụng để đọc Shapefile.
inc42

@ inc42 Tôi đang sử dụng python để đọc tệp trực tiếp.
BenjaminGolder

Ah, sau đó bit Shapely là sai lệch. Vấn đề thực tế của bạn là tìm ra cách xác định "loại" vòng theo định dạng Shapefile. :)
inc42

Câu trả lời:


10

Hơn nữa để trả lời câu trả lời về cách lấy các đa giác riêng lẻ, sau đó bạn có thể chạy một giao điểm trên tất cả các đa giác để tạo các lỗ. Nếu tập dữ liệu của bạn chứa các đa giác chồng chéo mặc dù bạn không gặp may.

Giải thích lại những gì là sai với độc giả shapefile hiện có?

Sẽ không dễ dàng hơn để xuất ID tính năng và giá trị M từ shapefile và sau đó nối chúng lại với đa giác sau khi sử dụng trình đọc shapefile hiện có?

Đối với bội số, bạn có thể sử dụng cùng một kỹ thuật gán ID đa giác cho "ID bản vá" và sau đó thêm thuộc tính này trở lại các tính năng.

Chỉnh sửa: Trong khi bạn nói rằng bạn không muốn sử dụng OGR, chỉ trong trường hợp bạn thay đổi quyết định ..

import ogr
# Get the driver
driver = ogr.GetDriverByName('ESRI Shapefile')
# Open a shapefile
shapefileName = "D:/temp/myshapefile.shp"
dataset = driver.Open(shapefileName, 0)

layer = dataset.GetLayer()
for index in xrange(layer.GetFeatureCount()):
    feature = layer.GetFeature(index)
    geometry = feature.GetGeometryRef()
    #geometry for polygon as WKT, inner rings, outer rings etc. 
    print geometry

Hình dạng nên được xuất ra như sau:

POLYGON ((79285 57742,78741 54273...),(76087 55694,78511 55088,..))

Khung đầu tiên chứa các dây của vòng ngoài, sau đó là khung của vòng trong. Nếu bạn có điểm giá trị Z thì phải ở định dạng 79285 57742 10 (trong đó tọa độ cuối cùng là chiều cao).

Nếu không, bạn có thể sử dụng các hàm Shapely Chứa và Trong để đánh giá mọi đa giác với nhau và áp dụng chỉ số không gian trước - http://pypi.python.org/pypi/Rtree/ để tăng tốc độ xử lý.


cảm ơn, đây không phải là điều tôi đang tìm kiếm, nhưng tôi đã thấy một số giải thích rõ hơn mà tôi có thể làm cho câu hỏi của mình. Để trả lời câu hỏi của bạn: 1, vì tôi sắp xếp chúng để thực hiện hàng tấn giao lộ ngay từ đầu. 2, không có gì, tôi chỉ cần một thứ nhẹ và tôi có thể dễ dàng sử dụng từ trăn, và tôi chưa học được ogr. 3, không, nó sẽ không dễ dàng hơn trong trường hợp này.
BenjaminGolder

1
ồ Cảm ơn địa lý! Bây giờ tôi tin chắc 90% rằng ogr là giải pháp ở đây. Tôi gặp phải một số vấn đề về cài đặt với ogr, nhưng có vẻ như chúng đáng để xử lý. Vì vậy, ogr tổ chức các vòng trong đầu ra wkt của nó? và nó có ổn với shapefiles 3d không (tôi sử dụng rất nhiều 3d)?
BenjaminGolder

Có vẻ như câu trả lời cho câu hỏi của tôi là có và có. Và cảm ơn bạn đã giới thiệu tôi với rtree. OGR xuất hiện để giải quyết vấn đề của tôi hoàn toàn - miễn là tôi có thể định cấu hình cài đặt chính xác vào lúc này.
BenjaminGolder

Cài đặt lại OGR - hãy nhớ rằng bạn sẽ cần các tệp nhị phân cho Windows và các ràng buộc Python phù hợp.
địa lý

9

Đầu tiên, sử dụng ogr để mở shapefile:

from osgeo import ogr
source = ogr.Open("mpolys.shp")
layers =  source.GetLayerByName("mpoly")
len(layers)
1

chuyển đổi hình học shapefile thành hình học hình dạng

from shapely.wkb import loads
element=layers[0] #(because lenght of layer =1, else you need "for element in layers: ...")
geom = loads(element.GetGeometryRef().ExportToWkb())
geom.geom_type
'MultiPolygon'
print geom
MULTIPOLYGON ((..... # the geometry in shapely wkt format

Đối với đa giác trong đa giác:

poly=[]
for pol in geom:
    poly.append(pol)
poly[0]
<shapely.geometry.polygon.Polygon object at 0x00B82CB0>
poly[0].geom_type
'Polygon'
print(poly[1])
POLYGON ((.... # the geometry in shapely wkt format

Và bây giờ, bạn có thể sử dụng tất cả các chức năng của hình dạng ( hình dạng )


1

Tôi không quá quen thuộc với cách đa giác thực sự được lưu trữ trong các tệp hình dạng, nhưng - không nên một vòng đa giác là một vòng khép kín nếu và chỉ khi tọa độ bắt đầu được lặp lại? Vì vậy, nếu bạn so sánh từng tọa độ tiếp theo với tọa độ bắt đầu, bạn sẽ tìm thấy điểm đầu tiên nơi đa giác được đóng lại. Nếu đó là tọa độ cuối cùng của đa giác, thì đó là một đa giác đơn giản, nếu không, nó là một đa giác và yêu cầu xử lý các vòng lặp khác.

Đó có thể là 'xử lý chuyên sâu hơn' mà bạn muốn tránh, nhưng nó thực sự chỉ là một phép lặp thông qua các tọa độ miễn phí khi bạn phải đọc chúng bằng mọi cách.


Tôi xin lỗi - câu hỏi của tôi hơi sai lệch và tôi đã chỉnh sửa nó. Tôi có các vòng đa giác, và tôi biết khi tôi có một danh sách nhiều vòng đa giác, nhưng ngoài thứ tự theo chiều kim đồng hồ hoặc ngược chiều kim đồng hồ, tôi không biết chúng là vòng trong hay ngoài. Nếu chúng là nhẫn bên trong, tôi không có cách nào chắc chắn chúng thuộc về chiếc nhẫn bên ngoài nào, ngoài việc đo vị trí của chúng.
BenjaminGolder

Tôi hiểu rồi. Tôi cũng rất vui khi thấy bạn tìm đường đến ogr. ;)
đăng lại

-2

Như được chỉ định bởi @ inc42 , trên trang 8 của Mô tả kỹ thuật Shapefile ESRI: Sách trắng ESRI - Tháng 7 năm 1998 (trang 12 trên 34 trong PDF) có một cuộc thảo luận về nội dung bản ghi đa giác có thể là những gì bạn đang theo dõi:

Một đa giác có thể chứa nhiều vòng ngoài. Thứ tự của các đỉnh hoặc hướng cho một vòng cho biết phía nào của vòng là bên trong của đa giác.


p.10 có nó "Một đa giác có thể chứa nhiều vòng ngoài. Thứ tự các đỉnh hoặc hướng cho một vòng cho biết phía nào của vòng là bên trong của đa giác."
inc42

@ inc42 được cập nhật tương ứng mặc dù tôi nghĩ số trang phải là 8 (hoặc 12 trên 34).
PolyGeo
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.