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)