Tengo un archivo de forma de línea que representa una red de carreteras. Deseo rasterizar estos datos, con los valores resultantes en el ráster que muestran la longitud total de las líneas que se encuentran dentro de la celda ráster.
Los datos se encuentran en la proyección de la National National Grid, por lo que las unidades serán metros.
Idealmente, me gustaría realizar esta operación utilizando R
, y supongo que la rasterize
función del raster
paquete jugaría un papel en lograr esto, simplemente no puedo determinar cuál debería ser la función aplicada.
raster
r
line
rasterization
JPD
fuente
fuente
vignette('over', package = 'sp')
pueda ayudar.Respuestas:
Después de una pregunta reciente , es posible que desee utilizar las funcionalidades que ofrece el paquete rgeos para resolver su problema. Por razones de reproducibilidad, descargué un archivo shape de carreteras de Tanzania desde DIVA-GIS y lo puse en mi directorio de trabajo actual. Para las próximas tareas, necesitará tres paquetes:
En consecuencia, sus primeras líneas de podría debería verse así:
Después de eso, debe importar los datos del archivo de forma. Tenga en cuenta que los archivos de forma DIVA-GIS se distribuyen en EPSG: 4326, por lo que proyectaré el archivo de forma a EPSG: 21037 (UTM 37S) para tratar metros en lugar de grados.
Para la posterior rasterización, necesitará una plantilla de trama que cubra la extensión espacial de su shapefile. La plantilla ráster consta de 10 filas y 10 columnas de forma predeterminada, lo que evita tiempos de cálculo demasiado extensos.
Ahora que la plantilla está configurada, recorra todas las celdas del ráster (que actualmente consta solo de valores de NA). Al asignar un valor de '1' a la celda actual y luego ejecutarlo
rasterToPolygons
, el archivo de forma resultante 'tmp_shp' mantiene automáticamente la extensión del píxel procesado actualmente.gIntersects
detecta si esta extensión se superpone con las carreteras. Si no, la función devolverá un valor de '0'. De lo contrario, la celda actual recorta el archivo de forma de la carretera y se calcula usando la longitud total de 'SpatialLines' dentro de esa celdagLength
.Finalmente, puede insertar las longitudes calculadas (que se convierten en kilómetros) en la plantilla ráster y verificar visualmente sus resultados.
fuente
sapply()
apbsapply()
y se utiliza el argumento de clústercl = detectCores()-1
. ¡Ahora puedo ejecutar este ejemplo en paralelo!Lo siguiente está modificado de la solución de Jeffrey Evans. Esta solución es mucho más rápida ya que no utiliza rasterizar
fuente
raster::intersect()
antes, me gusta que combine los atributos de las características intersectadas, a diferenciargeos::gIntersection()
.No necesita un bucle for. Simplemente intersecte todo de una vez y luego agregue longitudes de línea a los nuevos segmentos de línea utilizando la función "SpatialLinesLengths" en sp. Luego, utilizando la función rasterizar paquete de ráster con el argumento fun = sum, puede crear un ráster con la suma de las longitudes de línea que intersecan cada celda. El uso de la respuesta anterior y los datos asociados aquí es un código que generará los mismos resultados.
fuente
SpatialLinesLengths
. Supongo que nunca es demasiado tarde para aprender, gracias (:rasterize
lleva bastante tiempo, aunque (7 veces más que el enfoque superior en mi máquina).rasterize()
función incluye todas las líneas que tocan una celda determinada. Esto da como resultado que las longitudes de segmento de línea se cuenten dos veces en algunos casos: una vez en la celda que se supone que deben hacer y una vez en la celda adyacente que el punto final de la línea solo toca.Aquí hay otro enfoque. Se desvía de los que ya se proporcionan al usar el
spatstat
paquete. Por lo que puedo decir, este paquete tiene su propia versión de objetos espaciales (por ejemplo,im
contraraster
objetos), pero elmaptools
paquete permite la conversión de ida y vuelta entrespatstat
objetos y objetos espaciales estándar.Este enfoque se toma de esta publicación R-sig-Geo .
El bit más lento es convertir las carreteras de
SpatialLines
a un patrón de segmento de línea (es decirspatstat::psp
). Una vez hecho esto, las partes del cálculo de la longitud real son bastante rápidas, incluso para resoluciones mucho más altas. Por ejemplo, en mi vieja MacBook 2009:fuente
Permítame presentarle la veta del paquete con varias funciones para trabajar líneas espaciales e importar sf y data.table
fuente
Esto puede sonar un poco ingenuo, pero si se trata de un sistema de carreteras, seleccione las carreteras y guárdelas en un portapapeles, luego busque una herramienta que le permita agregar un búfer al portapapeles, ajústelo al ancho legal de la carretera, es decir, 3 metros +/- recuerde que el buffer es desde la línea central hasta el borde * 2 i para cada lado, por lo que un buffer de 3 metros es en realidad una carretera de 6 metros de lado a lado.
fuente