Estoy tratando de trazar mapas de previsión de huracanes usando python. Tengo varias posiciones de previsión derivadas de los avisos oficiales, y las interpolo en una curva suavizada, luego dibujo un polígono de "cono de incertidumbre" basado en la curva. Ejemplo:
Básicamente, el "cono de incertidumbre" es la huella de un círculo que se mueve y se amplía. He probado muchos enfoques, pero ninguno de ellos es lo suficientemente bueno. Mi enfoque actual es producir ~100 círculos basados en la curva interpolada, y hacer un polígono compuesto usando cascaded_union
método en shapely
.
import numpy as np
from shapely.geometry import MultiPolygon
from shapely.ops import cascaded_union
from scipy.interpolate import interp1d
# x, y: coords of forecast position
y = [18.3, 19.2, 20.0, 20.4, 20.7, 21.3, 21.6, 21.5, 20.8, 20.8, 21.5]
x = [111.3, 111.2, 110.9, 110.5, 110.2, 110.5, 110.0, 109.2, 109.4, 110.3, 111.8]
# r: radius of uncertainty
r = [0, 0.05, 0.1, 0.15, 0.2, 0.3, 0.4, 0.5, 0.5, 0.5, 0.5]
hours = [0, 6, 12, 18, 24, 36, 48, 60, 72, 96, 120]
# interpolate
points_num = 100
interp_hours = np.linspace(min(hours), max(hours), points_num)
x = interp1d(hours, x, kind='cubic')(interp_hours)
y = interp1d(hours, y, kind='cubic')(interp_hours)
r = interp1d(hours, r, kind='linear')(interp_hours)
# make polygon
thetas = np.linspace(0, 2 * np.pi, 360)
polygon_x = x[:,None] + r[:,None] * np.sin(thetas)
polygon_y = y[:,None] + r[:,None] * np.cos(thetas)
polygons = MultiPolygon([Polygon(i) for i in np.dstack((polygon_x, polygon_y))])
polygons = cascaded_union(polygons).buffer(0)
Pero se ve mal cerca del punto de partida:
Aumentar el número de círculos sólo puede resolver parcialmente el problema y lleva más tiempo. Así que me pregunto si hay una hermosa, eficiente y pitonisa ¿se puede hacer el "cono de incertidumbre"? Hay que tener en cuenta que los huracanes pueden cambiar sus direcciones bruscamente, ¡e incluso estar estacionados!
0 votos
Intente buscar formas de casco convexo o alfa
1 votos
Lo que se necesita es un búfer de ancho variable que conecte las tangentes de los círculos siguientes, véase twitter.com/geospacedman/status/978172211579228162 para saber cómo lo hace QGIS. Esto no está integrado en Shapely por lo que sé, sería súper útil sin embargo, si te apetece un PR.