Quiero crear un ráster con una resolución de 25 metros × 25 metros, donde cada celda contiene la distancia a la costa más cercana, calculada desde el centro de la celda. Para hacer esto, todo lo que tengo es un archivo de forma de las costas de Nueva Zelanda .
He intentado seguir el tutorial de Dominic Roye para hacerlo en R, que funciona ... más o menos. Está bien hasta una resolución de aproximadamente 1 km × 1 km, pero si trato de subir más la RAM, requiere mucho más que la disponible en mi PC (se requieren ~ 70 gb de RAM) o cualquier otra a la que tenga acceso. Al decir eso, creo que esto es una limitación de R y sospecho que QGIS podría tener una forma más eficiente desde el punto de vista computacional de crear este ráster, pero soy nuevo en él y no puedo entender cómo hacerlo.
He intentado seguir ¿ Crear ráster con distancia a la característica usando QGIS? para crearlo en QGIS pero devuelve este error:
_core.QgsProcessingException: no se pudo cargar la capa de origen para INPUT: C: /..../ Coastline / nz-coastlines-and-islands-polygons-topo-150k.shp no encontrado
Y no estoy seguro de por qué.
¿Alguien tiene alguna sugerencia de lo que podría estar yendo mal o una forma alternativa de hacerlo?
Editar:
El ráster que espero producir tendría aproximadamente 59684 filas y 40827 columnas para que se superponga con el ráster anual de déficit de agua de LINZ. Si el ráster que se produce es más grande que el ráster anual de déficit de agua, puedo cortarlo en R ...
Una cosa que creo que podría ser un problema potencial es que el archivo de forma de la costa de Nueva Zelanda tiene una gran cantidad de mar entre las islas, y no estoy interesado en calcular la distancia a la costa de estas celdas. Realmente solo quiero calcular los valores para las celdas que incluyen algún segmento de tierra. No estoy seguro de cómo hacer esto, o si es realmente un problema.
fuente
Respuestas:
Con PyQGIS y GDAL, la biblioteca de Python no es muy difícil de hacer. Necesita parámetros de transformación geográfica (arriba a la izquierda x, resolución de píxeles x, rotación, arriba a la izquierda y, rotación, resolución de píxeles ns) y número de filas y columnas para crear el ráster resultante. Para calcular la distancia al litoral más cercano, es necesaria una capa vectorial para representar el litoral.
Con PyQGIS , cada punto ráster como centro de la celda se calcula y su distancia al litoral se mide utilizando el método 'más cercanoSegmentoConContexto' de la clase QgsGeometry . La biblioteca Python GDAL se usa para producir un ráster con estos valores de distancia en filas x columnas.
El siguiente código se usó para crear un ráster de distancia (resolución de 25 m × 25 m y 1000 filas x 1000 columnas) comenzando en el punto (397106.7689872353, 4499634.06675821); cerca de la costa oeste de EE. UU.
Después de ejecutar el código anterior, el ráster resultante se cargó en QGIS y se ve como en la siguiente imagen (pseudocolor con 5 clases y rampa espectral). La proyección es UTM 10 N (EPSG: 32610)
fuente
Puede ser una solución para probar:
Ahora debería tener una nueva capa de puntos con la distancia a la costa como en este ejemplo
fuente
Dentro de QGIS puedes probar el complemento GRASS. Hasta donde sé, administra la memoria mejor que R, y espero que la otra solución falle en áreas grandes.
el comando GRASS se llama r.grow.distance, que puede encontrar en la barra de herramientas de procesamiento. Tenga en cuenta que primero debe convertir su línea en ráster.
Uno de sus problemas podría ser el tamaño de la salida, por lo que puede agregar algunas opciones de creación útiles, como (para un archivo tif) BIGTIFF = YES, TILED = YES, COMPRESS = LZW, PREDICTOR = 3
fuente
Lo intentaría al revés. Si está utilizando el polígono de NZ, convierta los bordes del polígono en una línea. Después de eso, cree un búfer en el límite por cada 25 metros de distancia del límite (tal vez centorid podría ayudar a determinar cuándo detenerse). Luego corte los búferes con un polígono y luego convierta esos polígonos en ráster. No estoy seguro de que esto funcione, pero definitivamente necesitarás menos RAM. Y PostGiS es excelente cuando tienes problemas de rendimiento.
Espero que pueda ayudar al menos un poco :)
fuente
Originalmente no iba a responder mi propia pregunta, pero un colega mío (que no usa este sitio) me escribió un montón de código de Python para hacer lo que busco; incluyendo limitar las células para que tengan la distancia a la costa solo para las células terrestres y dejar las células basadas en el mar como NA. El siguiente código debería poder ejecutarse desde cualquier consola de Python, siendo las únicas cosas que necesitan modificación:
1) Coloque el archivo de script en la misma carpeta que el archivo de forma de interés;
2) cambie el nombre del shapefile en el script de python a cualquiera que sea el nombre de su shapefile;
3) establecer la resolución deseada, y;
4) cambie la extensión para que coincida con otros rásteres.
Los archivos de forma más grandes que los que estoy usando requerirán grandes cantidades de RAM, pero de lo contrario el script se ejecuta rápidamente (aproximadamente tres minutos para producir un ráster de resolución de 50m y diez minutos para un ráster de resolución de 25m).
fuente