2016-09-01 26 views
13

Tôi đang vẽ vùng (sử dụng SqlGeometry/SqlGeography và dịch chúng sang tương đương WPF LocationCollection) trên Điều khiển WPF của Bing Maps và cần gắn nhãn chúng . Tôi nhận được các nhãn được vẽ trên các khu vực và đính kèm chúng vào điểm được tìm thấy bởi STCentroid(). Tất nhiên như bạn tưởng tượng đây là một vấn đề với các khu vực hình chữ 'U' hoặc 'C', nơi mà trọng tâm kết thúc bên ngoài khu vực, khiến cho nhãn không chính xác.Sử dụng dữ liệu không gian Sql (C#) để tìm trung tâm "trực quan" của đa giác bất thường

Có cách nào sử dụng SqlGeometry/SqlGeography để tìm trung tâm "trực quan" hoặc có thể tìm thấy vòng tròn lớn nhất có thể vừa với hình dạng và sử dụng trung tâm đó? Tôi đã thử sử dụng various methodsSTPointOnSurface() nhưng có vẻ như STPointOnSurface() luôn chọn một điểm trên mép như vậy DCREHA (nhãn đối với khu vực màu xanh đậm phía dưới luôn kết thúc lên trên các cạnh:

enter image description here

+0

Giả sử rằng chỉ có một hình dạng, một giải pháp có thể là tìm mặt mở và sau đó di chuyển nhãn ở phía đối diện cho đến khi nhãn nằm trong hình. Bạn cũng có thể làm một số bộ lọc để loại bỏ một số khu vực. Hoặc bạn có thể cố gắng tìm khu vực lõm lớn nhất (tôi không biết nếu có thuật toán cho điều đó). – Phil1970

+0

Related: http://stackoverflow.com/q/1203135/3628232 –

+0

Vậy đâu là "trung tâm hình ảnh" của một hình chữ U? –

Trả lời

9

Một gần như giống hệt câu hỏi đã được yêu cầu here Trong trường hợp của bạn, câu trả lời phù hợp nhất có lẽ là this. Câu trả lời khó xác định nơi vẽ đường thẳng chia tách đa giác thành hai khu vực bằng nhau. bên dưới cho SQL Server:

  1. Sử dụng STCentroid để tìm trung tâm khối lượng
  2. Nếu điều này nằm trong đa giác (STWithin), thì không cần xử lý thêm; khác:
  3. Xác định trọng tâm của khung giới hạn của đa giác (ví dụ như sử dụng STEnvelope để có được phong bì của đa giác và thông qua đó như là đối số để STCentroid)
  4. Nếu trọng tâm này nằm trong đa giác (STWithin), nó có thể đủ tốt (sẽ cần thử nghiệm); khác:
  5. Mở rộng vào đường nối trọng tâm của đa giác và centroid của phong bì để nó kéo dài đến ngay bên ngoài phong bì của đa giác mỗi chiều (có thể dễ dàng hơn trong mã C#, hoặc xem here kiếm một giải pháp PostGIS)
  6. Xác định các điểm giao nhau giữa đường mở rộng và đa giác (STIntersection)
  7. Tìm điểm giao nhau gần nhất với điểm trung tâm của đa giác từ bước 1 (xem here). Điểm này là một xấp xỉ cho "điểm cắt đầu tiên" được nêu chi tiết trong linked answer.
  8. Tìm điểm giao nhau gần nhất với điểm giao nhau được tìm thấy ở trên ở bước 7. Điểm này là xấp xỉ cho "điểm cắt thứ 2" được mô tả chi tiết trong linked answer.
  9. Điểm giữa của đường nối hai điểm giao nhau sẽ nằm bên trong đa giác và phải là một xấp xỉ hợp lý cho "trung tâm hình ảnh" của đa giác.

Ví dụ, với đa giác cho ví dụ DCREHA trên, GIF sau sinh động các thủ tục nêu trên (được đánh giá bằng mắt - kết quả thực tế sẽ khác nhau):

enter image description here

+1

Tôi sẽ chấp nhận điều này vì nó rất gần với những gì tôi đã làm (và sẽ làm việc cho bất kỳ ai có vấn đề tương tự) và tôi đánh giá cao nỗ lực đã đi vào nó. Tôi đã đi với đúc 8 tia từ centroid (nếu không phải bên trong hình dạng) để NW, N, NE, E, SE, S, SW, W, đã giao nhau của những dòng với hình dạng được hình thành bởi hình học thực tế và viewbox , đo chúng và đặt nhãn tại điểm giữa của đường dài nhất. – Hershizer33

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