¿Cómo se pueden determinar las bahías y los estrechos en un mapa generado por procedimientos?

40

Tengo un mapa generado por procedimientos que usa celdas Voronoi, con un nivel del mar definido y un mapa de altura creíble.

Corriente

Hasta ahora, he logrado etiquetar ciertas características geográficas: tierra, océano, lagos, ríos, estuarios, confluencias, montañas y biomas. Los biomas incluyen tundra, bosque boreal, pastizales y bosque templado. También hay un par de otros biomas allí, pero para mis propósitos no son importantes en este momento.

Me gustaría etiquetar las bahías y los estrechos a continuación, pero no sé cómo hacerlo correctamente. Una bahía es un cuerpo de agua costero empotrado que se conecta directamente con el océano.

Un estrecho es una vía fluvial estrecha y naturalmente formada que conecta dos partes del océano. Básicamente, donde dos trozos de tierra casi se tocan y hay océano a ambos lados. También llamado "canal".

Para determinar las características, puedo recorrer cualquier característica por tipo como este:

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));
Olin Kirkland
fuente
8
Recomiendo un clasificador baysiano.
Acumulación
1
@Acumulación ¿Es esto un juego de palabras con "bahía" o es una sugerencia seria? Si es lo último, debe escribir una respuesta adecuada sobre esto.
Philipp
Estoy como 99% seguro de que está haciendo una broma.
Olin Kirkland

Respuestas:

29

La forma en que Dragons Abound identifica las bahías es caminar a lo largo de la costa y encontrar dos puntos en la costa donde la distancia en línea recta entre los puntos es menor que la distancia a lo largo de la costa entre los puntos. Esta es la sinuosidad de la costa entre los dos puntos. Al seleccionar un límite de sinuosidad y límites para la distancia en línea recta entre los puntos, puede identificar bahías estrechas y profundas, bahías amplias y poco profundas, etc.

En esta imagen, los puntos rojos y morados muestran los dos puntos candidatos y la línea verde es la línea de costa entre los puntos. La sinuosidad es la relación de esas dos longitudes:

Ejemplo de una bahía

Alternativamente, puede seleccionar dos puntos en la costa y crear un polígono conectando los dos puntos y la línea costera entre los dos puntos (es decir, conecte la línea verde arriba del punto rojo al punto púrpura). Mide el área de este polígono. Una bahía tendrá un área más grande que una no bahía.

En mi experiencia, una combinación de estas dos medidas fue la mejor para identificar de manera confiable lo que la gente ve como bahías.

Tenga en cuenta que esto también detectará puntos. Para encontrar solo bahías, debe verificar que el "interior" de la bahía contenga agua y no tierra. Una manera rápida y fácil de hacer esto es verificar el punto medio de la línea entre los dos puntos para ver si es agua. (Esto puede ser engañado pero generalmente es suficiente).

Un problema relacionado es identificar la "boca" de la bahía, es decir, la mejor opción para los dos puntos que marcan la apertura a la bahía. Por lo general, tendrás un montón de candidatos para la "boca". En el mapa de ejemplo anterior, podría poner la boca de esa bahía más adentro o más afuera. En términos generales, probablemente no importa demasiado, pero una heurística que funciona razonablemente bien es minimizar la distancia en línea recta a través de la boca.

Todavía no he hecho estrecho, pero mi intuición es verificar los puntos a lo largo de la costa para encontrar el punto más cercano en cualquier otra costa; si eso está por debajo de algún límite establecido, es un estrecho.

Dr. Pain
fuente
3
Debería haber sabido que Dragons Abound tendría las respuestas que necesito.
Olin Kirkland
48

Aquí hay una idea aproximada usando transformaciones de procesamiento de imágenes para aislar las características de interés:

  1. Aplique un relleno de inundación desde una célula oceánica para hacer una máscara de todas las células oceánicas. Dependiendo de cómo estén configurados sus ríos, es posible que necesite un criterio adicional de elevación o despeje para evitar que la máscara del océano fluya tierra adentro. ;)

    Máscara de océano

  2. Aplique un suavizado local al borde de esta máscara, manteniendo la conectividad / topología igual, pero suavizando las pequeñas características ruidosas de la costa que pueden distraer. Esto nos permite enfocarnos en grandes bahías sobre pequeñas entradas. Puede usar el ancho de su núcleo de filtro / número de iteraciones para controlar con precisión la escala de las características que conserva.

    Aquí apliqué un filtro de mediana algunas veces. Los autómatas celulares son otra forma popular de erosionar formas suaves de una entrada ruidosa.

    Costa lisa

  3. Convierta la máscara en un campo de distancia, donde cada celda almacena su distancia de la costa suavizada.

    Campo de distancia

Ahora vemos algunas características destacadas prometedoras. En un campo de distancia firmado, las bahías y los estrechos se muestran como crestas afiladas, con la distancia cayendo a los lados. Podemos usar un filtro de detección de bordes para resaltar estas crestas:

Crestas resaltadas

Luego puede distinguir entre bahías y estrechos siguiendo la cresta para determinar su conectividad. Una bahía es una cresta que se extiende hacia la costa y se vuelve cada vez menos profunda (a cierta distancia de la tierra) hasta que termina en un punto. Un estrecho es una cresta que conecta una región de alta distancia con otra región de alta distancia, pasando por una región de menor distancia en el camino.

O, otra forma es asignar a cada isla un ID (búsqueda de componente conectado), luego, cuando esté haciendo su campo de distancia, propague el "ID de la isla más cercana" junto a la frontera de la distancia. Una bahía o entrada es entonces una cresta en el agua adyacente a la misma masa continental en ambos lados, mientras que un canal es una cresta que separa el agua adyacente a dos masas continentales diferentes.

Puede establecer restricciones mínimas y máximas de distancia a la costa o longitud de la cresta para controlar qué características etiquetar, si necesita excluir estrechos excesivamente estrechos / anchos, por ejemplo.

DMGregory
fuente
9
¡Esto se ve realmente genial, y probablemente podría acelerarse considerablemente usando directamente la estructura de la celda para aplicar los diversos pasos en lugar de la representación gráfica!
Quentin
77
El segundo enfoque (asignar a cada masa de tierra distinta una ID y distinguirlo en función de si es la misma masa de tierra a ambos lados del cuerpo de agua) parece ser la cosa más fácil de hacer ...
Monty Harder
La "ID de masa de tierra" es una buena idea de todos modos, ya que también la necesitará en el etiquetado del mapa para generar nombres de islas.
MSalters
6

Básicamente, debe pensar en lo que quiere decir, precisamente, por una bahía o estrecho, y por qué desea diferenciarlos (¿es para cálculos de IA, o para etiquetar puntos de referencia, o algo más?). Juega con algunas definiciones para encontrar la que mejor te parezca. Luego, formule condiciones para controlar sus células Voronoi. Algunas sugerencias

Bahía

  • Cualquier célula oceánica que solo se conecta a una sola célula oceánica
  • O: Cualquier célula oceánica que se conecta a más tierra que las células oceánicas, con todas las células oceánicas una al lado de la otra.
  • O: igual que el anterior, pero con un criterio basado en la longitud del borde (por ejemplo, el doble de tierra que el borde del agua)

Estrecho

  • Cualquier célula oceánica que se conecta exactamente a dos células oceánicas que no están juntas
  • O: Cualquier célula oceánica que se conecta a dos células terrestres que no pertenecen a la misma masa terrestre (debe averiguar qué células terrestres se conectan primero y asignar ID a cada masa terrestre)
  • O: Marche alrededor de la frontera y cuente las transiciones tierra / agua y agua / tierra. Necesita al menos dos de cada uno.
  • Dependiendo de su método y de lo que quiera hacer con las categorías, es posible que desee eliminar los estrechos que solo conducen a una bahía, o etiquetarlos como bahía.
Autolykos
fuente
2
Cuando un estrecho conduce a una bahía, estos dos juntos podrían etiquetarse como un fiordo.
Philipp
1
Si las celdas son pequeñas en relación con el tamaño de una bahía / estrecho, entonces es posible que deba propagar esto para ver las celdas más allá de los vecinos adyacentes.
DMGregory
Sí, el escalado es un problema y afectará la forma en que define las cosas y declara las 'celdas'. Considere un mapa de Canadá y compare lo siguiente: Bahía de Hudson, Bahía de James, Golfo de San Lorenzo y Bahía de Fundy. ¿Cómo aplica de manera confiable estas reglas para obtener los nombres relacionados deseados? - ¿Hay una "recta" entre Terranova y Nueva Escocia?
TheLuckless