[R-sig-Geo] st_distance to replace dist in pipes - help needed
Bannar-Martin, Katherine
K@therine@B@nn@r-M@rtin @ending from dfo-mpo@gc@c@
Thu Aug 16 22:52:31 CEST 2018
Hello!
Problem:
I need to take the following code and replace dist in the "created distance matrix" pipe stream (producing object 'res') with st_distance. I'm stuck on how to play with the geometry section so that it reproduces the same distance matrix as dist.mat. (The numbers will be different because of the calculations employed, I know, but the structure of the matrices should be the same). Any help is greatly appreciated. Thanks! Katherine
Code using stats::dist:
###Dependencies####
require(tidyverse)
require(sf)
####Create sample data in decimal degrees:####
START_LONG<-round(runif(n=10,min=-135.7, max=-123.3),digits=4)
START_LAT<-round(runif(n=10,min=48.26, max=55.80),digits=4)
END_LONG<-round(runif(n=10,min=-135.7, max=-123.3),digits=4)
END_LAT<-round(runif(n=10,min=48.28, max=55.82),digits=4)
df<-as.data.frame(cbind(START_LONG,START_LAT,END_LONG,END_LAT))
###convert to utm with package sf
xy1<-df[,c("START_LONG","START_LAT")] #start locations
colnames(xy1)<-c("X", "Y")
xy2<-df[,c("END_LONG","END_LAT")] #end locations
colnames(xy2)<-c("X", "Y")
xy12 <- rbind(as.matrix(xy1), as.matrix(xy2))
df12 <- data.frame(data.frame(xy12, Attribute = rep(c("start","end"),each=nrow(df)), ID = rep(1:(nrow(df)),2)))
df.SP <- st_as_sf(df12, coords = c("X", "Y"), crs = 4326) #wgs84 long lat
df.SP<-st_transform(x = df.SP, crs = 32609) #convert to wgs84 utm zone 9
df.SP$utm_x<-st_coordinates(df.SP)[,1] # get utm coordinates
df.SP$utm_y<-st_coordinates(df.SP)[,2] # get utm coordinates
df.SP<-st_set_geometry(df.SP, NULL)# coerce back to data.frame
###create distance matrix###
res<- df.SP %>%
dplyr::group_by(Attribute) %>%
mutate(rows = row_number()) %>%
left_join(df.SP, by = c('Attribute')) %>%
rowwise() %>%
mutate(Distance = ifelse(dist(rbind(c(utm_x.x, utm_y.x), c(utm_x.y, utm_y.y))) != 0,
dist(rbind(c(utm_x.x, utm_y.x), c(utm_x.y, utm_y.y))), NA))
dist.mat<-matrix(res$Distance,nrow = 20,ncol = 20)
Data prep for eventually using sf::st_distance:
pts.utm.sf <- df12 %>%
st_as_sf(coords=c('X','Y'), crs=4326) %>% #wgs84 long lat
st_transform(32609) #wgs84 utm zone9
#distance matrix without groups (note using group_by "Attribute" does not get me the matrix I want):
dist.utm<- pts.utm.sf %>% st_distance() #calculate distances on utm in m
[[alternative HTML version deleted]]
More information about the R-sig-Geo
mailing list