Phát hiện hình dạng đa giác phân nhánh?


13

Tôi có một lớp vectơ với hàng triệu đa giác tạo độ phủ liên tục. Tôi cần phân loại chúng theo hình dạng của chúng. Tôi đã sử dụng một số chỉ mục hình dạng từ sinh thái cảnh quan như độ nén ( 4piA / P ^ 2 ), chiều rộng trung bình ( 2A / P ), số hình dạng ( P / sqrt (A) ), tôi cũng thấy câu trả lời này để Tính độ tròn / độ nén của đa giác?

Vấn đề của tôi là tất cả các số liệu này chỉ sử dụng một số tỷ lệ diện tích và chu vi. Ngay cả chỉ số Kích thước Fractal cũng chỉ sử dụng diện tích và chu vi ( 2ln (0,25P) / ln (A) ). Nhưng làm thế nào tôi có thể phân biệt hai đa giác có cùng diện tích và chu vi nhưng hình dạng hoàn toàn khác nhau? Giống như đa giác phân nhánh A này:

đa giác phân nhánh vs dải cong

mà tôi đã cố vẽ với cùng diện tích và chu vi như dải cong B. Tất cả các chỉ số đã biết của tôi sẽ giống nhau đối với chúng. Nhưng đối với tôi, việc phân biệt các dải đơn giản (bao gồm cả cong như mặt trăng mới) là rất quan trọng với các hình dạng phân nhánh phức tạp.

Tôi cố tình chỉ ra đa giác B là một dải cong chứ không phải là một dải thẳng bởi vì tôi biết về chỉ số Vòng tròn liên quan phát hiện các hình dạng kéo dài thẳng nhưng đa giác của tôi cũng có thể có cùng một đường tròn. Ngay cả khi tôi xây dựng thân tàu Convex và tính tỷ lệ các khu vực Apolygon / Aconvex , nó có thể rất giống nhau ở đây.

Vì vậy, làm thế nào tôi có thể phân biệt rõ ràng đa giác A phân nhánh với đa giác B trong dữ liệu vectơ ? (Chuyển đổi chúng thành raster sẽ yêu cầu kích thước ô cực nhỏ, bộ dữ liệu khổng lồ và thiếu bộ nhớ, vì vậy điều đó là không thể). Có các chỉ số hình dạng khác bao gồm các tham số khác? Lý tưởng nhất, phương pháp này sẽ phân biệt không chỉ các đa giác phân nhánh rõ ràng mà ngay cả C và D:

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

Ý tưởng duy nhất của tôi là xây dựng thân tàu lồi sau đó xóa đa giác khỏi thân tàu lồi và đếm số lượng mảnh lớn mà nó để lại (xóa đa giác bằng đa giác chứ không phải toàn bộ lớp). Điều này có thể cho thấy sự phức tạp biên giới.

Tôi hoan nghênh các giải pháp / thuật toán toán học mà sau này tôi sẽ triển khai trong Python.


1
Bạn không cần nhiều Python. Thử ! hình dạng!. lồi (). đối xứngDifference (! hình!) trong máy tính trường. Hãy thử đầu tiên trên một bản sao tập hợp nhỏ. Xem trợ giúp hình học arcpy cho cú pháp chính xác.
FelixIP

Đây có thể là một câu hỏi tuyệt vời nhưng tại thời điểm này, bạn đang hỏi nhiều câu hỏi bằng cách không nhấn vào việc bạn đang hỏi về QGIS hay ArcGIS Desktop và sau đó cũng ném vào Python. Khi bạn xác định chính xác những gì bạn đã thử, người trả lời tiềm năng sẽ dễ dàng hơn trong việc giúp bạn giải quyết vấn đề ở đâu. Tôi đề nghị tập trung vào QGIS để tránh mắc kẹt câu trả lời đầu tiên của bạn.
PolyGeo

1
Tôi có dữ liệu trong Cơ sở dữ liệu địa lý Esri vì một shapefile đã vượt quá 2 gb. Tôi có thể làm gì đó về việc này nếu có một giải pháp hoạt động trong QGIS hoặc ở đâu đó. Nhưng tôi không hỏi bên trong một phần mềm cụ thể. Tôi đang hỏi về một số liệu, một phương pháp làm thế nào để phát hiện một cách toán học một hình dạng với đường viền phức tạp (phân nhánh). 1 câu hỏi. Bài báo khoa học với một công thức cũng sẽ ổn, tôi sẽ nghĩ cách tự thực hiện nó.
nadya

1
Suy nghĩ đầu tiên của tôi cũng giống như bạn, nhìn vào sự khác biệt giữa số lượng và kích thước của đa giác còn lại sau khi trừ đi bản gốc từ thân lồi (hoặc lõm) của nó (xem thêm hình dạng alpha).
dùng2856

1
Nếu chỉ bộ xương là đủ nhanh để tính toán tôi sẽ sử dụng để tính toán 4A / PL, diện tích, chu vi, chiều dài giữa các nút của bộ xương trang trại để thu gọn. Áp dụng tương tự cho vòng tròn ghi lớn nhất.
FelixIP

Câu trả lời:


11

Bạn có thể có một cái nhìn tại các phương pháp sau đây: làm cho gầy đa giác của bạn và thay vì làm việc trên loại dòng tính năng liên quan đến đa giác ban đầu của bạn với một ID nguồn đa giác độc đáo. Tôi đoán có một số dự đoán phải làm (ví dụ: khi xem xét một đa tuyến là một đường trung tâm thực sự: độ dài tối thiểu để một đa tuyến đủ điều kiện để trạng thái đường trung tâm). Khi số lượng đường trung tâm nhiều hơn 1 cho một đa giác nguồn đơn, thì nó sẽ được phân nhánh.

Một đa giác phân nhánh, khi được làm sạch đến một đường trung tâm, sẽ có nhiều đường thẳng trong khi một đa giác thẳng có thể chỉ có một đường lớn ở trung tâm (thực tế giống như cách giải thích của con người).

Thí dụ :

  • Khi bạn vẽ một chữ Y, bạn sử dụng ít nhất 2 nét liên tục (= 2 polylines) ,, vì vậy nó được phân nhánh vì số lượng nét tối thiểu là> 1.
  • Khi bạn vẽ một chữ L, bạn sử dụng ít nhất 1 nét liên tục. Nó không phân nhánh.

Thêm ví dụ về logic này:

  • Khi bạn vẽ A: 2 nét = nó phân nhánh
  • Khi bạn nhận được B: 3 nét = nó phân nhánh
  • khi bạn vẽ một nét C: 1 = nó không phân nhánh
  • Vân vân

Tôi chưa thử bất cứ thứ gì, chỉ thử logic, nhưng tôi nghĩ nó có thể hoạt động.

Xem: Các vectơ Skeletonize trong QGIS / Python hoặc http://postgis.net/docs/ST_St ứcSkeleton.html

Hoặc là

Thí dụ

Nguồn: Trích xuất đường trung tâm của Đa giác phức trong PostGIS / Python

EDIT: Đối với các trường hợp C & D, bạn cần phải có các hình dạng B được lọc (không phân nhánh).

  • Đảm bảo một ID duy nhất liên kết đường trung tâm và đa giác nguồn.
  • Biến đổi đa giác của bạn thành polylines
  • Mật độ đa tuyến trung tâm và đa tuyến biên với các điểm thông thường (không quá nhiều để tránh các vấn đề về bộ nhớ sau này nhưng đủ để "bắt" các bit không đều.
  • Tạo ma trận khoảng cách giữa các điểm của đường tâm và các điểm của đường biên
  • Chỉ giữ các dòng ma trận trong đó ID_centerline = ID_borderline
  • Tạo số liệu thống kê để có giá trị độ lệch chuẩn
  • Đặt giá trị ràng buộc để biểu thị cho các giá trị SD cao rằng đó là một đường viền không đều và tạo chỉ báo cần thiết cho mỗi ID duy nhất
  • Lấy lại chỉ báo cho đa giác ban đầu bằng cách tham gia trường trên cơ sở của ID duy nhất.

Cảm ơn bạn vì ý tưởng này, tôi sẽ cố gắng tạo ra các đường trung tâm
nadya

Chỉ là, vấn đề để phân biệt đa giác C và D của tôi sẽ vẫn còn
nadya

Bạn có thể cần các phương pháp khác nhau cho các trường hợp khác nhau và phân chia công việc. Khi bạn có đa giác không phân nhánh (B), bạn có thể tinh chỉnh B để thử và tìm C và D. Vấn đề là tôi không thấy logic nào bạn sử dụng để phân biệt C với D. bạn có thể sẽ phải diễn đạt rõ ràng với tiêu chí.
gisnside

1
Sự khác biệt giữa C và D dường như là ở C, các cạnh của đa giác có khoảng cách đồng đều từ đường tâm, trong khi ở D, các cạnh là khoảng cách không đồng đều so với đường tâm.
csk

1
@csk Tôi thấy điều đó. Tôi đoán việc dịch mã thành mã sẽ được tính toán thống kê về khoảng cách giữa đường trung tâm và đường biên. Bằng cách tăng mật độ đa tuyến biên với nhiều điểm hơn sau đó chuyển đổi đường viền này thành các điểm + tạo khoảng cách với công việc tương đương trên đường trung tâm sẽ đưa ra số liệu thống kê về hành vi này. Nếu độ lệch chuẩn cao, thì có lẽ hình dạng sẽ không đều. Thật khó để thấy làm thế nào để làm điều đó trên hàng loạt đa giác mặc dù ... thử thách tốt ở đó
gisnside
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.