2008-10-10 35 views
11

Tôi gặp sự cố tương tự với this post. Tôi cần hiển thị tối đa 1000 đa giác trên bản đồ Google được nhúng. Các đa giác nằm trong cơ sở dữ liệu SQL và tôi có thể hiển thị từng tệp dưới dạng tệp KML đơn lẻ khi đang sử dụng HttpHandler tùy chỉnh (trong ASP.NET), như thế này http://alpha.foresttransparency.org/concession.1.kml.Làm thế nào để đơn giản hóa (giảm số điểm) trong KML?

Ngay cả trên máy phát triển (rất nhanh) của tôi, phải mất một lúc để tải lên ngay cả một vài chục hình dạng. Vì vậy, hai câu hỏi, thực sự:

  1. Chiến lược nào tốt để hiển thị chúng dưới dạng điểm đánh dấu thay vì lớp phủ khi tôi vượt quá một mức thu phóng nhất định?

  2. Có thuật toán công khai để đơn giản hóa đa giác (giảm số điểm) sao cho tôi không hiển thị nhiều điểm hơn ý nghĩa ở một mức thu phóng nhất định không?

Trả lời

13

Đối với câu hỏi thứ hai của bạn: bạn cần Douglas-Peucker Generalization Algorithm

+0

Cảm ơn, đây là những gì tôi cần. Tôi đã thích nghi với việc triển khai C# của D-P mà tôi tìm thấy trên CodeProject - dường như hoạt động khá tốt. –

0

Tôi không biết nhiều aobut KML, nhưng tôi nghĩ rằng giải pháp thông thường đặt câu hỏi # 2 liên quan đến iterating qua các điểm, và xóa bất kỳ đoạn thẳng dưới một kích thước nhất định. Điều này sẽ gây ra một số hiệu ứng "không may" trong một số trường hợp, nhưng nó tương đối nhanh và dễ thực hiện.

0

Tôi muốn giới thiệu 2 điều: - Tính toán và kết hợp các đa giác đang chạm vào. Điều này liên quan đến một LOT của chế biến và toán học khó khăn, nhưng tôi đã thực hiện nó vì vậy tôi biết nó có thể. - Tạo lớp phủ của riêng bạn thay vì sử dụng KML ở định dạng PNG, trong khi bạn kết hợp chúng trong đề xuất trước đó. Bạn sẽ phải tạo ra rất nhiều PNG nhưng nó rất nhanh trên máy khách.

Chúc may mắn :)

+0

Cảm ơn - Tôi thực sự không có tài nguyên để sao chép quá nhiều những gì Google API cung cấp miễn phí. –

2

Đối với câu hỏi đầu tiên của bạn, bạn có thể tính toán diện tích của một đa giác đặc biệt, và liên hệ mỗi mức độ phóng đến một khu vực đặc biệt tối thiểu , vì vậy khi bạn phóng to hoặc thu nhỏ hình đa giác biến mất và các điểm đánh dấu sẽ xuất hiện tùy thuộc vào mức thu phóng.

Đối với câu hỏi thứ hai, tôi muốn sử dụng gợi ý của Mark Bessey.

0

Tôi cần một giải pháp cho câu hỏi số 2 của bạn một chút trước và sau khi xem xét một vài thuật toán đơn giản hóa sẵn có, tôi đã tạo thuật toán của riêng mình.

Quá trình này là đơn giản và có vẻ như để làm việc tốt, mặc dù nó có thể là một chút chậm nếu bạn không thực hiện nó một cách chính xác:

P[0..n] là mảng lại điểm Hãy T[n] được định nghĩa dưới dạng tam giác được tạo thành bởi các điểm P[n-1], P[n], P[n+1] Max là số điểm bạn đang cố gắng giảm dòng này.

  1. Tính diện tích của mọi tam giác có thể T[1..n-1] trong bộ này.
  2. Chọn tam giác T[i] với diện tích nhỏ nhất
  3. Tháo điểm P[i] để về cơ bản phẳng tam giác
  4. Tính toán lại diện tích của tam giác bị ảnh hưởng T[n-1], T[n+1]
  5. Go To BướC# 2 nếu số lượng điểm>Max
+0

Vì tò mò, tại sao không đi cùng Douglas-Peucker? Thoạt nhìn, thuật toán của bạn dường như kém hiệu quả hơn nhiều. Nó cũng nhằm mục đích cho một số lượng cố định của các điểm, chứ không phải là một dung sai nhất định - vì vậy làm thế nào bạn sẽ áp dụng nó cho một số lượng lớn các hình dạng khác nhau phức tạp? –

+0

Bạn biết đấy ... Tôi có thể thử triển khai sớm. Điều này một phần của ứng dụng của tôi được chạy khá thường xuyên, nhưng nhìn vào nó một lần nữa, nó trông giống như một phương pháp tốt hơn. Cảm ơn. –

Các vấn đề liên quan