Trợ giúp với hình học đa giác PostGIS - các vòng không đóng


10

Tôi đã nhặt được một bản sao của cuốn sách siêu độc ác 'Phát triển không gian địa lý Python' của Erik Westra ( liên kết Amazon ) và tôi đang làm việc với nó. Hiện tại, nó đang dạy tôi tải dữ liệu đường bờ biển GSHHS từ một shapefile vào cơ sở dữ liệu PostGIS, để chuẩn bị xây dựng một ứng dụng web không gian địa lý.

Vấn đề của tôi là: khi tôi cố gắng nhập dữ liệu GSHHS vào PostGIS, nó bị từ chối do đa giác đường bờ biển không được coi là "hợp lệ". Cụ thể, tôi nhận được một thông báo lỗi mô tả một số (nhưng không phải tất cả) các đa giác đường bờ biển là 'các vòng không đóng'.

Tôi hiểu rằng lỗi này đang cố nói với tôi rằng điểm đầu tiên và điểm cuối của đa giác không giống nhau. Tuy nhiên, điều này chỉ đơn giản là không đúng sự thật. Tôi đã kiểm tra đại diện WKT của nhiều đa giác, và chúng là chính xác. Họ chắc chắn bắt đầu và kết thúc với cùng một phối hợp.

Các đa giác được trích xuất từ ​​các shapefiles bằng thư viện OGR và xuất từng tính năng đa giác sang WKT. Tôi đã thử khôi phục lại đa giác thông qua Shapely và thử nghiệm với WKB, nhưng không có kết quả. Tôi đã có thể tải cùng một dữ liệu vào PostGIS dưới dạng bảng MULTIPOLYGON, sử dụng trình tải shp2pgsql.

Tôi đã tự hỏi nếu có ai ngoài đó có:
(a) có lẽ đã sử dụng cùng một cuốn sách, bị mắc kẹt trong cùng một vấn đề, và có câu trả lời cho tôi không?
(b) đã gặp phải một vấn đề tương tự, và tìm ra giải pháp?
(c) không thành công, có một số lời khuyên 'thực tiễn tốt nhất' để đảm bảo hình học hợp lệ trước khi tải vào PostGIS?

CẬP NHẬT: một đồng nghiệp đã gợi ý rằng vấn đề 'vòng không đóng' có thể chỉ là triệu chứng của một vấn đề khác. Có thể cấu hình PostGIS / PostgreSQL của tôi có giới hạn kích thước (trên các giao dịch chèn, gói tin nhận được, chuỗi văn bản, v.v.).

Vì tôi đang sử dụng các đa giác WKT rất dài làm đầu vào, PostGIS có thể sẽ cắt chúng quá sớm để cho phép mỗi đa giác hoàn thành. Tôi sẽ kiểm tra nó vào ngày mai, nhưng nó có vẻ có khả năng. Biên giới quốc gia của tôi chỉ chấp nhận một số hồ sơ chứ không phải những hồ sơ khác. Từ bộ nhớ, hình học được chấp nhận là dành cho các quốc đảo nhỏ như Antigua (và do đó có lẽ có các đại diện WKT ngắn).

Vì vậy, điều này cuối cùng có thể là nhiều hơn một luồng quản trị cơ sở dữ liệu PostGIS, chứ không phải là một luồng hình học không hợp lệ.


bạn có thể cung cấp một tập tin shp mẫu?
Mario Miler

không phải lo lắng. Dữ liệu bờ biển GSHHS tôi đang sử dụng là tải xuống 96mb từ đây . Dữ liệu biên giới thế giới tôi đang sử dụng là Bộ dữ liệu Biên giới thế giới từ thematicmapping.org
timmy

Câu trả lời:


6

Tôi đã xem xét dữ liệu của bạn và ví dụ về cuốn sách, vấn đề là có ba đa giác không hợp lệ trong dữ liệu được xử lý trong sách:

GSHHS_l_L1.shp

ID = 92-W

POLYGON ((-180.0 71.514793999999995,-179.69008299999999 71.577888999999999,-178.648889 71.577416999999997,-178.40644399999999 71.549916999999994,-177.406306 71.244167000000004,-177.877444 71.022889000000006,-179.500111 70.863749999999996,-179.93011100000001 70.979583000000005,-180.0 70.962072000000006))

ID = 486-W

POLYGON ((-180.0 -16.799126,-179.84419399999999 -16.691278,-179.80041700000001 -16.789193999999998,-179.850472 -16.878361000000002,-180.0 -16.959561))

GSHHS_l_L2.shp

ID = 7333-W

POLYGON ((-180.0 65.393473,-179.76583299999999 65.428332999999995,-179.95416700000001 65.385555999999994,-179.90972199999999 65.316389,-180.0 65.321635))

Bởi vì đây là một ví dụ nên dễ dàng nhất để xóa các đa giác đó khỏi tập dữ liệu hoặc chỉ cần thêm một câu lệnh if trong mã của bạn

if geometry.IsValid():
       cursor.execute("INSERT INTO gshhs (level, geom) VALUES (%s, ST_GeomFromText(%s, 4326))", (level, wkt))

Cảm ơn Mario, có vẻ như tôi đã vượt lên chính mình, thay vì xác nhận hợp lệ TẤT CẢ các đa giác đầu vào của tôi. Câu trả lời của bạn đã đúng - những đa giác này hiển thị là không hợp lệ khi được kiểm tra với OGR. Thật thú vị, trông rất ổn trong QGis, nhưng ArcMap cho thấy họ thiếu một chiếc nhẫn hoàn chỉnh. Cả ba đa giác đều rơi trên đường dữ liệu và tôi đoán rằng hình dạng shapefile không đếm cạnh đa giác dọc theo đường dữ liệu. Giải pháp của bạn là một cách hay và dễ dàng để phát hiện các đa giác không hợp lệ. Tôi sẽ đánh dấu bài viết như đã trả lời.
timmy

Nếu bạn cảm thấy từ thiện, bạn có giải pháp tốt nào cho bước tiếp theo trong quy trình, đó là sửa các đa giác không hợp lệ? Tôi đã thử sử dụng hàm .CloseRing () của OGR nhưng không có kết quả. Nó chỉ đơn giản là bỏ qua các cuộc gọi chức năng, tôi nghĩ.
timmy

Tôi đã thử sử dụng "thủ thuật đệm" ( Workshop.opengeo.org/postgis-intro/valids.html ) với hình dạng và ogr nhưng không thành công. Không thể đọc đa giác không hợp lệ và ogr sẽ không thực hiện thao tác đệm, hiện tại tôi không biết tại sao. Nếu tôi vấp phải câu trả lời, tôi sẽ cho bạn biết. Có lẽ ai đó khác có nhiều thành công hơn với vấn đề này. Lấy làm tiếc.
Mario Miler

Tôi nghĩ rằng tôi đã có xác nhận đa giác của tôi làm việc bây giờ. Tôi nghĩ rằng tôi đã sử dụng hàm .CloseRings () của OGR theo cách sai. Tôi đã được gọi nó như là một phương thức của đa giác (tức là poly.CloseRings ()). Thay vào đó, tôi phải trích xuất Vòng tuyến tính từ đa giác, và sau đó chạy nó trên đó (tức là lr = poly.GetGeometryRef (0); lr.CloseRings ()). Các kết quả đang được chèn thành công vào PostGIS và tôi có thể sử dụng 3 đa giác vấn đề trong QGis witj mà không phải lo lắng. Chỉ có một chút chi phí tính toán trong việc kiểm tra tính hợp lệ cho MỌI đa giác.
timmy
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.