Làm thế nào có thể xác định vịnh và eo biển trong bản đồ được tạo theo thủ tục?


40

Tôi đã có một bản đồ được tạo theo thủ tục bằng cách sử dụng các ô Voronoi, với mực nước biển xác định và bản đồ chiều cao đáng tin cậy.

Hiện hành

Cho đến nay, tôi đã thành công trong việc dán nhãn các đặc điểm địa lý nhất định: đất, đại dương, hồ, sông, cửa sông, ngã ba sông, núi và quần xã. Các quần xã bao gồm lãnh nguyên, rừng nhiệt đới, đồng cỏ và rừng ôn đới. Ngoài ra còn có một vài quần xã sinh vật khác ở đó nhưng với mục đích của tôi chúng không quan trọng ngay bây giờ.

Tôi muốn dán nhãn vịnh và tiếp theo, nhưng tôi không biết làm thế nào để làm điều này đúng. Một vịnh là một vùng nước lõm, ven biển kết nối trực tiếp với đại dương.

Eo biển là một tuyến đường thủy hẹp, hình thành tự nhiên, kết nối hai phần của đại dương. Về cơ bản, nơi hai mảnh đất gần như chạm vào nhau và có đại dương ở cả hai phía. Cũng được gọi là một "kênh".

Để xác định các tính năng, tôi có thể lặp qua bất kỳ tính năng nào theo loại như sau:

for each (var feature:Object in geography.getFeaturesByType(Geography.LAND))
  // loop through lands
  for each (var cell:Cell in feature.cells)
  // loop through cells
    for each (var neighbor:Cell in cell.neighbors)
    // loop through a cell's neighbors
      trace(neighbor.hasFeatureType(Geography.LAND));

8
Tôi đề nghị một phân loại Baysian.
Tích lũy

1
@Acccumulation Đây có phải là một cách chơi chữ "bay" hay đây là một gợi ý nghiêm túc? Nếu sau này, bạn nên viết một câu trả lời thích hợp về điều này.
Philipp

Tôi giống như 99% chắc chắn anh ấy đang làm một trò đùa.
Olin Kirkland

Câu trả lời:


29

Cách Dragons Abound xác định các vịnh là đi dọc theo bờ biển và tìm hai điểm trên đường bờ biển nơi khoảng cách đường thẳng giữa các điểm nhỏ hơn khoảng cách dọc theo bờ biển giữa các điểm. Đây là sự quanh co của đường bờ biển giữa hai điểm. Bằng cách chọn giới hạn và giới hạn hình sin cho khoảng cách đường thẳng giữa các điểm, bạn có thể xác định các vịnh sâu hẹp, vịnh nông rộng, v.v.

Trong bức tranh này, các chấm đỏ và tím cho thấy hai điểm ứng cử viên và đường màu xanh lá cây là đường bờ biển giữa các điểm. Độ ngoằn ngoèo là tỷ lệ của hai độ dài đó:

Ví dụ về một vịnh

Ngoài ra, bạn có thể chọn hai điểm trên bờ biển và tạo đa giác bằng cách kết nối hai điểm và đường bờ biển giữa hai điểm (nghĩa là kết nối đường màu xanh lá cây ở trên từ chấm đỏ đến chấm tím). Đo diện tích của đa giác này. Một vịnh sẽ có diện tích lớn hơn một vịnh.

Theo kinh nghiệm của tôi, sự kết hợp của hai biện pháp này là tốt nhất để xác định một cách đáng tin cậy những gì mọi người coi là vịnh.

Lưu ý rằng điều này cũng sẽ phát hiện các điểm. Để chỉ tìm vịnh, bạn cần kiểm tra xem "bên trong" của vịnh có chứa nước và không phải đất liền không. Một cách nhanh chóng và dễ dàng để làm điều này là kiểm tra điểm giữa của đường giữa hai điểm để xem đó có phải là nước không. (Điều này có thể bị lừa nhưng nói chung là đủ.)

Một vấn đề liên quan là xác định "miệng" của vịnh - tức là sự lựa chọn tốt nhất cho hai điểm đánh dấu lối vào vịnh. Thông thường, bạn sẽ có một loạt các ứng cử viên cho "miệng". Trong bản đồ ví dụ ở trên, bạn có thể đặt miệng vịnh đó xa hơn hoặc xa hơn. Nói chung, nó có thể không quá quan trọng, nhưng một phương pháp trị liệu hoạt động tốt là giảm thiểu khoảng cách đường thẳng qua miệng.

Tôi chưa thực hiện được eo biển nào, nhưng trực giác của tôi là kiểm tra các điểm dọc theo bờ biển để tìm điểm gần nhất trên bất kỳ bờ biển nào khác; nếu đó là dưới một số giới hạn thiết lập thì đó là một eo biển.


3
Tôi nên biết Dragons Abound sẽ có câu trả lời tôi cần.
Olin Kirkland

48

Đây là một ý tưởng sơ bộ sử dụng các biến đổi xử lý hình ảnh để tách biệt các tính năng quan tâm:

  1. Áp dụng một vùng lũ từ một tế bào đại dương để làm mặt nạ cho tất cả các tế bào đại dương. Tùy thuộc vào cách các con sông của bạn được thiết lập, bạn có thể cần thêm một tiêu chí nâng cao hoặc giải phóng mặt bằng để giữ cho mặt nạ đại dương không chảy vào đất liền. ;)

    Mặt nạ đại dương

  2. Áp dụng làm mịn cục bộ cho cạnh của mặt nạ này, giữ cho kết nối / cấu trúc liên kết giống nhau, nhưng làm mịn các đặc điểm bờ biển nhỏ ồn ào có thể gây mất tập trung. Điều này cho phép chúng tôi tập trung vào các vịnh lớn trên các cửa nhỏ. Bạn có thể sử dụng chiều rộng của bộ lọc kernal / số lần lặp để kiểm soát chính xác quy mô của các tính năng bạn bảo tồn.

    Ở đây tôi áp dụng một bộ lọc trung bình một vài lần. Cellata automata là một cách phổ biến khác để ăn mòn các hình dạng mịn từ đầu vào ồn ào.

    Bờ biển mịn

  3. Biến mặt nạ thành một trường khoảng cách, trong đó mỗi ô lưu trữ khoảng cách của nó từ đường bờ biển được làm mịn.

    Trường khoảng cách

Bây giờ chúng ta thấy một số tính năng nổi bật hứa hẹn. Trong một trường khoảng cách đã ký, cả vịnh và eo biển đều xuất hiện dưới dạng những đường vân sắc nét, với khoảng cách rơi xuống hai bên. Chúng ta có thể sử dụng bộ lọc phát hiện cạnh để bật ra các đường vân này:

Ridges làm nổi bật

Sau đó, bạn có thể phân biệt vịnh và eo biển bằng cách đi theo sườn núi để xác định kết nối của nó. Một vịnh là một sườn núi chạy về phía bờ biển, nhận được nông và nông hơn (ở khoảng cách từ đất liền) cho đến khi nó kết thúc tại một điểm. Eo biển là một sườn núi kết nối một khu vực khoảng cách cao với một khu vực khoảng cách cao khác, đi qua một khu vực khoảng cách thấp hơn trên đường đi.

Hoặc, một cách khác là gán cho mỗi đảo một ID (tìm kiếm thành phần được kết nối), sau đó khi bạn thực hiện trường khoảng cách của mình, hãy truyền "ID đảo gần nhất" dọc theo biên giới khoảng cách. Một vịnh hoặc cửa vào sau đó là một sườn núi trong nước liền kề với cùng một vùng đất ở cả hai bên, trong khi một kênh là một sườn núi ngăn cách nước liền kề với hai vùng đất khác nhau.

Bạn có thể đặt các ràng buộc khoảng cách tối thiểu và tối đa từ xa đến bờ hoặc chiều dài sườn núi để kiểm soát các tính năng cần gắn nhãn, nếu bạn cần loại trừ các eo hẹp quá mức / rộng chẳng hạn.


9
Điều này trông thực sự thú vị và có thể được tăng tốc đáng kể bằng cách sử dụng trực tiếp cấu trúc tế bào để áp dụng các bước khác nhau thay vì biểu diễn đồ họa!
Quentin

7
Cách tiếp cận thứ hai (gán cho mỗi vùng đất riêng biệt một ID và phân biệt dựa trên việc đó có phải là cùng một vùng đất ở hai bên thân nước hay không) dường như là cách dễ nhất để làm ..
Monty Harder

"ID đất đai" dù sao cũng là một ý tưởng hay, vì bạn cũng sẽ cần nó trong nhãn bản đồ để tạo tên đảo.
MSalters

6

Về cơ bản, bạn cần suy nghĩ về ý nghĩa của bạn, chính xác là bởi một vịnh hoặc eo biển và lý do tại sao bạn muốn phân biệt chúng (đó là để tính toán AI, hoặc để đánh dấu các mốc, hoặc một cái gì khác?). Chơi xung quanh với một vài định nghĩa để tìm ra cái phù hợp nhất với bạn. Sau đó, xây dựng các điều kiện để kiểm tra các ô Voronoi của bạn. Một vài gợi ý:

Vịnh

  • Bất kỳ tế bào đại dương nào chỉ kết nối với một tế bào đại dương khác
  • HOẶC: Bất kỳ tế bào đại dương nào kết nối với nhiều vùng đất hơn các tế bào đại dương, với tất cả các tế bào đại dương nằm cạnh nhau
  • HOẶC: Tương tự như trên, nhưng với tiêu chí dựa trên chiều dài đường viền (ví dụ: gấp đôi diện tích đất so với đường viền nước)

Eo biển

  • Bất kỳ tế bào đại dương nào kết nối với chính xác hai tế bào đại dương không nằm cạnh nhau
  • HOẶC: Bất kỳ ô đại dương nào kết nối với hai ô đất không thuộc cùng một vùng đất (bạn cần tìm ra ô đất nào được kết nối trước và gán ID cho từng vùng đất)
  • HOẶC: Tháng ba quanh biên giới, và đếm chuyển tiếp đất / nước và nước / đất. Bạn cần ít nhất hai trong số mỗi.
  • Tùy thuộc vào phương pháp của bạn và những gì bạn muốn làm với các danh mục, bạn có thể muốn loại bỏ các eo biển chỉ dẫn đến một vịnh hoặc thay vào đó là nhãn chúng.

2
Khi một eo biển dẫn đến một vịnh, thì hai cái này có thể được gắn nhãn là một vịnh hẹp.
Philipp

1
Nếu các ô nhỏ tương đối với kích thước của vịnh / eo biển, thì bạn có thể cần phải truyền nó để xem xét các ô bên ngoài các lân cận liền kề.
DMGregory

Có, tỷ lệ là một vấn đề và sẽ ảnh hưởng đến cách bạn xác định mọi thứ và khai báo 'ô'. Xem xét bản đồ của Canada và so sánh các nội dung sau: Vịnh Hudson, Vịnh James, Vịnh St Lawrence và Vịnh Fundy. Làm thế nào để bạn áp dụng các quy tắc này một cách đáng tin cậy để có được các tên liên quan mong muốn? - Có "đường thẳng" giữa Newfoundland và Nova Scotia không?
TheLuckless
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.