Aquí hay un mapa de contorno para el que están disponibles todos los polígonos de niveles.
Vamos a preguntar cómo suavizar los polígonos manteniendo todos los vértices preservados en sus ubicaciones exactas.
De hecho, el contorno se realiza sobre los datos de una cuadrícula, puede sugerir que luego suavice los datos de la cuadrícula y, por lo tanto, el contorno resultante será más suave. Tenga en cuenta que esto no funciona como lo deseo, ya que la función de suavizado como el filtro Gaussiano eliminará pequeños paquetes de datos y cambiará el rango de la tercera variable, por ejemplo, la altura que no está permitida en mi aplicación.
En realidad, estoy buscando un fragmento de código (preferiblemente en Python ) que pueda suavizar los polígonos 2D (cualquier tipo: convexo, cóncavo, auto-intersectorial, etc.) razonablemente indoloro (olvide las páginas de códigos) y preciso.
Para su información, hay una función en ArcGIS que hace esto perfectamente, pero el uso de aplicaciones comerciales de terceros no es mi elección para esta pregunta.
1)
Scipy.interpolate:
Como puede ver, las splines resultantes (rojo) no son satisfactorias.
2)
Aquí está el resultado usando el código dado aquí . ¡No está funcionando bien!
3)
Para mí, la mejor solución debería ser algo como la siguiente figura en la que un cuadrado se suaviza gradualmente cambiando solo un valor. Espero un concepto similar para suavizar cualquier forma de polígonos.
Satisfaciendo la condición de que la spline pase los puntos:
4)
Aquí está mi implementación de "idea de whuber" línea por línea en Python en sus datos. Posiblemente hay algunos errores ya que los resultados no son buenos.
K = 2 es un desastre y por lo tanto para k> = 4.
5)
Eliminé un punto en la ubicación problemática y la spline resultante ahora es idéntica a la de Whuber. Pero todavía es una pregunta de por qué el método no funciona en todos los casos.
6)
Un buen suavizado para los datos de Whuber puede ser el siguiente (dibujado por un software de gráficos vectoriales) en el que se ha agregado un punto extra sin problemas (compárese con la actualización
4):
7)
Vea el resultado de la versión de Python del código de Whuber para algunas formas icónicas:
Tenga en cuenta que el método parece no funcionar para las polilíneas. Para la esquina, la polilínea (contorno) verde es lo que quiero pero se puso rojo. Esto debe abordarse ya que los mapas de contorno son siempre polilíneas, aunque las polilíneas cerradas pueden tratarse como polígonos como en mis ejemplos. Tampoco es que el problema surgido en la actualización 4 aún no se haya abordado.
8) [mi último]
Aquí está la solución final (¡no perfecta!):
Recuerde que tendrá que hacer algo sobre el área señalada por las estrellas. Quizás haya un error en mi código o el método propuesto necesita un mayor desarrollo para considerar todas las situaciones y proporcionar los resultados deseados.