6 votos

Waypoints con coordenadas en R

Tengo un SpatialLineDataFrame con 20 observaciones de 4 variables (en WGS84). Quiero crear waypoints cada 10 metros. Cada waypoint tiene las coordenadas xy. Intenté hacerlo manualmente como:

 point_first=SpatialPoints(cbind(x,y)) 
 

Para el primer punto, pero hay muchos puntos que quiero hacer, por lo que no es posible hacerlo de esa manera. Creo que necesito un bucle pero no sé cómo hacerlo para tener las coordenadas de cada waypoint.

¿Hay alguna orden que deba usar?

7voto

Tilo Wiklund Puntos 741

Hay un buen tutorial en la segmentación de líneas espaciales que se puede encontrar aquí, y usted podría hacer uso de CreateSegment para lograr su objetivo. Pero primero de todo, vamos a crear algunos datos de la muestra.

## german borders
library(rgdal)
library(rworldmap)

data(countriesCoarse)
spy_germany <- subset(countriesCoarse, GEOUNIT == "Germany")

## polygons to lines
sln_germany <- as(spy_germany, "SpatialLinesDataFrame")

Ya le gustaría trabajar con metros, en lugar de grados, reproyectar los datos (por ejemplo, a UTM) y extraer las coordenadas que vamos a requerir más tarde como entrada para CreateSegment.

## reprojection (utm-32n) and extraction of coordinates
sln_germany_utm <- spTransform(sln_germany, CRS("+init=epsg:32632"))
mat_germany_crd <- coordinates(sln_germany_utm)[[1]][[1]]

A continuación, vamos a crear una secuencia que representa el deseado de segmentación. rgeos::gLength es muy útil para eso. Elegí segmentos de 100 km de longitud.

## border length and sequence of segments (100,000 m = 100 km)
library(rgeos)
num_len <- gLength(sln_germany_utm)

int_len_seq <- seq(0, num_len, 100000)

Ahora puedes recorrer esta secuencia y extraer el inicio y el final de coordenadas de cada segmento.

## loop over segments of 100 km
source("CreateSegment.R")

ls_crd_seg <- lapply(2:length(int_len_seq), function(i) {

  # extract coordinates of current line segment
  mat_segment <- CreateSegment(mat_germany_crd, 
                               from = int_len_seq[i-1], to = int_len_seq[i])

  # end coordinate
  crd_out <- matrix(mat_segment[nrow(mat_segment), ], ncol = 2)

  # during the first iteration, also return the start coordinate
  if (i == 2) {
    crd_start <- matrix(mat_segment[1, ], ncol = 2)
    crd_out <- rbind(crd_start, crd_out)
  } 

  return(crd_out)
})

Finalmente, rbind las coordenadas y asignar la proyección de nuestros inicial shapefile. Eso es todo!

## coordinates to SpatialPoints
crd_seg <- do.call("rbind", ls_crd_seg)
spt_seg <- SpatialPoints(crd_seg)
proj4string(spt_seg) <- proj4string(sln_germany_utm)

## visualize
plot(sln_germany_utm, lwd = 1.5)
points(spt_seg)

segmented_borders

6voto

Dan Puntos 16

Esta función creará una muestra puntual sistemática de un SpatialLinesDataFrame. La columna LID de los resultados corresponde a los nombres de la línea de origen y puede utilizarse para relacionar los puntos con las líneas.

    # Function for creating a systematic point sample of a SpatialLinesDataFrame
   #   x        SpatialLinesDataFrame
   #   sdist    Distance of sample spacing 
   #   offset   offset for start of line
   #   longlat  TRUE/FALSE, is data in geographic units. If TRUE distance is 
   #              great circle with units (sdist argument) in kilometers.    
    systematic.lineSample <- function(x, sdist=100, offset = 0.5, longlat = FALSE)
       {
        if (!require(sp)) stop("sp PACKAGE MISSING")
         if (!inherits(x, "SpatialLinesDataFrame")) stop("MUST BE SP SpatialLinesDataFrame OBJECT")
        lids <- rownames(x@data)    
        lsub <- x[rownames(x@data) == lids[1] ,]
         LLength <- SpatialLinesLengths(lsub, longlat = longlat)
          ns <- round( (LLength[1] / sdist), digits=0)
          lsamp <- spsample(lsub, n=ns, type="regular", offset=c(offset, offset))
          results <- SpatialPointsDataFrame(lsamp, data=data.frame(LID=rep(as.numeric(lids[1]), ns))) 
        if( length(lids) > 1) { 
          for (i in 2:length(lids) ) 
            {    
             lsub <- x[rownames(x@data) == lids[i] ,]
              LLength <- SpatialLinesLengths(lsub, longlat = longlat)
               ns <- round( (LLength[1] / sdist), digits=0)
               lsamp <- spsample(lsub, n=ns, type="regular")
             lsamp <- SpatialPointsDataFrame(lsamp, data=data.frame(LID=rep(as.numeric(lids[i]), ns)))
             results <- rbind(results, lsamp)     
           }
        }
      ( results )
    }
 

Aquí está un ejemplo del uso de las funciones

 # Create example data
require(sp)
sp.lines <- SpatialLines(list(Lines(list(Line(cbind(c(1,2,3),c(3,2,2)))), ID="1"),
                         Lines(list(Line(cbind(c(1,2,3),c(1,1.5,1)))), ID="2")))
sp.lines <- SpatialLinesDataFrame( sp.lines, data.frame(ID=1:2, row.names=c(1,2)) )

# Systematic line sample
lsample <- systematic.lineSample(sp.lines, sdist = 20, offset = 0, longlat = TRUE) 

# Plot results
plot(sp.lines)
  plot(lsample, pch = 20, add = TRUE)
 

2voto

El paquete SpatStat tiene una función para crear puntos a lo largo de líneas a intervalos especificados.

 # maptools to read shapefile
require(maptools)
require(spatstat)

# Load a line shapefile
myLine <- readShapeLines("~/workspace/TEMP/myLine.shp")
plot(myLine)
 

Introduzca aquí la descripción de la imagen

 # create a PSP object to use with spatstat
myPSP <- as.psp(myLine)

# Create points at 10 km intervals
myPoints <- pointsOnLines(myPSP, 10000)
plot(myPoints, add = T)
 

Introduzca aquí la descripción de la imagen

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X