Chia một shapefile phức tạp thành một lưới


11

Tôi có một shapefile chi tiết rõ ràng với các tính năng đa giác / đa giác (tệp khoảng 500mb). Nó thực sự là một shapefile của toàn thế giới, với các tính năng đại diện cho đường bờ biển. Tôi cần chia dữ liệu này bằng lưới. Để rõ ràng, tôi không muốn 'sắp xếp' dữ liệu, nhưng thực sự đã cắt các đa giác thành các ô. Tôi nhận ra câu hỏi này đã được hỏi trước đây nhưng các giải pháp tôi tìm thấy không hiệu quả với tôi.

Tôi đã thử:

  • Sử dụng QGIS và giao nội dung shapefile của tôi với lưới vector - kết quả thật tồi tệ. Hầu hết các vùng đất chính biến mất một cách kỳ diệu, mặc dù có vẻ như những mảnh đất nhỏ hơn đôi khi tạo ra nó. Tôi nên lưu ý rằng phương pháp này hoạt động thực sự tốt với dữ liệu đơn giản hơn nhiều (ví dụ: ít điểm hơn)

  • Sử dụng các công cụ Giao lộ của OGR. Tôi đã thử cả hai thông qua ogr2ogr và thậm chí bằng cách cuộn công cụ C ++ của riêng tôi. Cả hai đều có cùng một vấn đề như QGIS. Họ cũng không thể hiện vấn đề này cho các tệp đơn giản, nhưng thất bại với những tệp phức tạp hơn. Để tham khảo, tôi đang sử dụng một shapefile của Úc và New Zealand, có kích thước dưới 20mb, và cả QGIS và OGR đều không thể 'tạo lưới'.

Ai đó đã đề xuất sử dụng PostGIS tại một thời điểm, vì nó có chức năng giao nhau - nhưng ST_Intersect của PostGIS sử dụng cùng một mặt sau GEOS giống như OGR. Trên thực tế, cả hai đều gọi cùng một chức năng như tôi có thể nói, vì vậy tôi không nghĩ rằng PostGIS sẽ mang lại kết quả khác nhau.

Tôi đang tìm kiếm gợi ý về những gì tôi có thể thử. Tôi cần một ứng dụng hoặc bộ công cụ mạnh mẽ có thể phân chia các shapefile chi tiết cao thành các ô.

EDIT: Thêm một số thông tin

Đáp lại Simbamangu:

  • Shapefile về cơ bản là dữ liệu đường bờ biển từ OpenStreetMap. Đây là phiên bản hợp nhất của tệp 'Xử lý_p' (vì vậy nó không bị chia thành các ô) mà tôi nhận được bằng cách gửi email danh sách nhà phát triển của họ. Lưu ý rằng việc chia gạch của chúng (thành các khối 100km x 100km có chồng chéo) không nhất thiết là điều tôi muốn - Tôi không muốn chồng chéo và tôi muốn tự do chọn kích thước lưới hoặc tôi chỉ sử dụng xử lý mặc định_p.

  • Theo mặc định, dữ liệu đường bờ biển có lỗi hình học được báo cáo bởi QGIS. Tôi sửa các lỗi này bằng một công cụ nhỏ mà tôi đã sử dụng một số mã tôi thấy được thiết kế để giải quyết cụ thể vấn đề này (sửa các lỗi hình học trong dữ liệu đường bờ biển: https://github.com/tudelft-gist/prepair ). Chạy trên các tệp với công cụ này sẽ sửa hầu như tất cả các lỗi mà QGIS mắc phải. Tôi chỉ cố gắng làm giao lộ sau khi làm sạch các tập tin.

  • Chính xác những gì tôi đã làm bằng cách sử dụng QGIS: Mở dữ liệu để đảm bảo nó trông ổn trong QGIS. Hãy thử chia nó thành các ô bằng cách tạo một lớp gạch bằng Vector Grid với khoảng cách được chỉ định, sau đó giao giữa hai lớp - không đi. Hãy thử sử dụng một tập dữ liệu nhỏ hơn - chọn các tính năng ở Châu Đại Dương (Úc, New Zealand) để thử một tập dữ liệu nhỏ hơn - tệp hình dạng này có kích thước <20mb. Một lần nữa thử chia nó, không hoạt động.

  • Những gì tôi đã làm với OGR: ogr2ogr trực tiếp sử dụng các tùy chọn '-spat' và '-clipsrc' với spat_extent. Cũng đã viết một công cụ C ++ nhỏ hoạt động trên WKT, vì vậy tôi chuyển đổi shapefile thành WKT bằng ogr2ogr, sau đó cung cấp tệp văn bản cho ứng dụng của tôi. Nó chạy qua tệp và gọi phương thức Intersection () được ghi lại ở đây: http://www.gdal.org/ogr/ classOGRGeometry.html . Tôi nghĩ rằng nó kết thúc việc làm chính xác như sử dụng ogr2ogr trực tiếp.

Đáp lại Brent:

  1. Nó làm. Mọi thứ đều ở WGS84 Lat / Lon
  2. Tôi đã nghĩ rằng điều ngược lại là đúng - rằng đối với một tập hợp các ô lưới nhất định, sẽ mất nhiều thời gian hơn để giao với một đa tuyến khổng lồ thay vì một loạt các tính năng phân mảnh có thể được định vị theo không gian hơn cho mỗi ô, nhưng đây là một gợi ý thú vị - Tôi sẽ thử và báo cáo lại.
  3. Không có trường thuộc tính nào được giữ trong suốt quá trình, tôi chỉ quan tâm đến hình học.
  4. Tôi không chắc chắn, nhưng tôi nghĩ rằng bạn đang nói rằng tôi nên chọn các đa giác chồng lên một ô lưới nhất định và sau đó thực hiện giao cắt. Điều này là quá cồng kềnh bằng tay với QGIS. Công cụ của tôi đã thực hiện điều này ở một mức độ nhất định với kiểm tra hộp giới hạn. Có một chút tăng tốc, nhưng kết quả cuối cùng vẫn còn kém và không khác biệt rõ rệt.
  5. Đây không phải là một lựa chọn. Ngay bây giờ tôi đang cố gắng phân chia dữ liệu sao cho 1 độ trễ x 1 độ của nó và tôi đang tìm kiếm một phương pháp chung / mạnh mẽ phù hợp với mọi trường hợp. Tôi đã thử tăng kích thước lưới (tức là 10 x 10) để xem liệu tôi có nhận được kết quả tốt hơn không và tôi không thấy bất kỳ mối tương quan nào giữa kích thước lưới và chất lượng đầu ra.

Chỉnh sửa # 2:

Tôi đã thử chơi với nó nhiều hơn và nói chung có vẻ như kết quả không đáng tin cậy cả khi sử dụng GEOS và với QGIS (sử dụng fTools, tôi không biết liệu lần lượt có sử dụng GEOS nữa không). Tôi đã sai khi nói kích thước của lưới không liên quan gì đến kết quả - lưới càng lớn thì kết quả càng tốt (điều đó tốt để biết nhưng vẫn không phải là giải pháp). Đây là một ảnh chụp màn hình của một lưới thực sự cách nhau hầu hết hoạt động, nhưng đã thất bại một phần trong một ô:

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

Hình dạng rõ ràng - QGIS hiển thị 0 lỗi với công cụ "Kiểm tra tính hợp lệ". Tôi không tìm cách tiếp cận vấn đề này từng bước một; xác minh xem các tính năng nhất định có làm thất bại giao lộ trên tập dữ liệu lớn này hay không khi nó không rõ ràng (và nó sẽ không có các ô nhỏ hơn) không thực tế.


Nơi mà bạn có được shapefile thế giới hoặc Úc? Tôi nghi ngờ rằng hình dạng của tệp đó có thể có một số vấn đề (thử Vector | Công cụ hình học | Kiểm tra tính hợp lệ của hình học trong QGIS). Vừa mới thử một giao điểm trên một shapefile thế giới nhỏ hơn và gạch 5 độ và nó hoạt động hoàn hảo trong QGIS.
Simbamangu

1
Đã thử điều này với đường bờ biển Úc 100K từ Geoscience Australia (20MB) và gạch 4 độ, cũng hoạt động tốt (QGIS 1.7.4, OSX 10.7). Bạn có thể mô tả chi tiết hơn dữ liệu của bạn và những gì bạn đã làm?
Simbamangu

Cảm ơn tất cả các thông tin thêm. Tôi nghi ngờ có điều gì đó kỳ lạ về dữ liệu OSM; Hãy thử nó với bộ dữ liệu tôi đã đề cập và xem nếu bạn có kết quả tốt hơn. Tôi dường như nhớ đã trải qua một số điều kỳ lạ với dữ liệu hồ OSM trong quá khứ, sẽ cố gắng tìm kiếm nó.
Simbamangu

Bạn có thể chia sẻ tập dữ liệu, hoặc thậm chí một phần bị cắt của nó (như trong ví dụ của bạn ở trên) không?
Simbamangu

Câu trả lời:


7

Tôi vừa mới tạo ra các công cụ của riêng tôi để làm điều này.

Tôi đã sử dụng thư viện Clipper ( http://www.angusj.com/delphi/clipper.php ) cùng với OGR để phân chia dữ liệu của tôi được thiết lập. Một cái gì đó cần lưu ý là việc thực hiện các giao điểm một cách ngây thơ với lib này mất rất nhiều thời gian, vì vậy tôi thay vào đó sử dụng cách tiếp cận tứ giác ... tức là chia thành bốn ô lưới, chia mỗi ô thành bốn ô, v.v., cho đến khi bạn có được độ phân giải mong muốn. Mặc dù vậy, lib hoạt động rất tốt, tôi đã đính kèm một ảnh chụp màn hình hiển thị kết quả ở bán cầu đông:

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

Kết quả trên mất khoảng 4,5 giờ trên bộ xử lý 1.33GHz.

Dưới đây là các công cụ trong trường hợp ai đó gặp phải vấn đề tương tự trong tương lai. Xin lưu ý rằng họ đã bị hack cùng với các bằng chứng về khái niệm và có lẽ bạn không nên sử dụng chúng trực tiếp (có thể đóng vai trò là điểm khởi đầu tốt cho một cái gì đó):

https://github.com/preet/scratch/tree/master/gis/polytoolkit

https://github.com/preet/scratch/tree/master/gis/shapefiles/shptk


Mã được liên kết không còn khả dụng :-(
Shaun McDonald

Tôi đã chuyển kho lưu trữ sang github.com/preet/scratch/tree/master/gis/polytoolkit . Tùy thuộc vào chính xác những gì bạn đang cố gắng thực hiện, bạn có thể thấy github.com/preet/scratch/tree/master/gis/shapefiles/shptk sẽ hữu ích hơn.
Pris

Cái sau hữu ích hơn. Bây giờ tôi đã tìm thấy một phương pháp sử dụng PostGIS, mặc dù sẽ quan tâm đến việc tìm hiểu xem liệu phương pháp này có nhanh hơn không. Bạn có một readme để biên dịch và cài đặt?
Shaun McDonald

Bạn có thể chỉnh sửa câu trả lời của bạn để sửa liên kết không? Cảm ơn
Afr

4

Nó chắc chắn có vẻ như bạn có vấn đề hình học. Không chắc là sẽ có thể mang lại kết quả sạch từ tệp đầu vào bẩn bất kể phần mềm được sử dụng, trừ khi trước tiên bạn giải quyết các vấn đề hình học của mình. Khi bạn đã sắp xếp các vấn đề hình học của mình, bạn có thể thử các cách sau nếu bạn vẫn gặp sự cố:

1) Đảm bảo rằng tập dữ liệu lưới của bạn có cùng phép chiếu với tập dữ liệu đa giác thế giới của bạn. Nếu không, tạo lại nó trong hình chiếu thích hợp.

2) Chuyển đổi tất cả các tính năng thành một phần - dễ xử lý hơn nhiều

3) Xóa tất cả các trường không liên quan chỉ giữ trường id sẽ cho phép bạn tham gia lại các thuộc tính của mình sau khi giao lộ được thực hiện - một lần nữa dễ dàng hơn để xử lý

4) Thay vì giao toàn bộ tập dữ liệu lưới với toàn bộ tập dữ liệu đa giác thế giới, hãy thử lặp qua đa giác lưới của bạn, chọn đa giác giao nhau trong tập dữ liệu thế giới của bạn và thực hiện clip dựa trên đa giác lưới của bạn. Điều này sẽ cho phép bạn cách ly mọi vấn đề và cuối cùng bạn có thể hợp nhất các kết quả lại với nhau để đạt được mục tiêu ban đầu.

5) Thử sử dụng đa giác lưới lớn hơn.


+1 Thực sự thú vị - nó ảnh hưởng đến tốc độ xử lý địa lý đến mức nào nếu bạn giữ trường ID hoặc nhiều phần trong dữ liệu?
Simbamangu

1
Tôi chưa bao giờ thực sự cố gắng định lượng sự khác biệt. Tôi chỉ có thể nói từ kinh nghiệm khi các hoạt động địa lý quá mức thất bại và đây là những điều giúp giải quyết vấn đề.
Brent Edwards

Tôi đã không thành công trong việc khiến (2) làm việc. Việc chọn các tính năng và cố gắng hợp nhất chúng bằng cách sử dụng QGIS về cơ bản dường như khóa hệ thống của tôi - có thể nó vẫn đang xử lý công cụ, nhưng với tốc độ đó thì không thực tế: Tôi đã để hệ thống của mình qua đêm với QGIS vẫn cố gắng hợp nhất một vài tính năng trong tập dữ liệu và nó vẫn còn ở đó vào buổi sáng.
Pris

1
Không nên có bất kỳ sự hợp nhất liên quan. Mục tiêu là để bùng nổ các tính năng nhiều phần. Ví dụ, trong ảnh chụp màn hình của ô không thành công, mục tiêu là làm nổ tất cả các bản ghi của bạn có chứa các đa giác được phân nhóm theo không gian như các đặc điểm của đảo dọc theo bờ biển BC và Alaska, thành các bản ghi đa giác một phần riêng biệt. Điều này có thể đạt được trong QGIS bằng cách sử dụng công cụ "Multipart to singleparts" trong menu Vector> Geometry Tools.
Brent Edwards

Khi bạn chuyển đổi sang tính năng một phần, bạn nên xác thực lại hình học của mình, để chắc chắn rằng mọi thứ đều sạch sẽ.
Brent Edwards

0

Một cách tiếp cận khác có thể là thử chuyển đổi từ vector sang raster để tạo tập dữ liệu điểm và sau đó sử dụng tập dữ liệu điểm làm cơ sở để viết một số mã để tạo các ô của bạn.

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.