Im trying to calculate the nearest distance to a point. Therefore I create two df's
Create list 1
long <- c(52.070498, 52.370216, 52.632381, 53.201233, 51.813298, 51.92442, 52.266075, 53.219383, 52.960561, 52.367027, 51.571915, 52.516775, 51.441642, 52.221537, 52.090737, 51.985103, 51.560596)
lat <- c(4.3007, 4.895168,4.753375, 5.799913, 4.690093, 4.477733, 6.155217, 6.566502, 5.920522, 6.668492, 4.768323, 6.083022, 5.469722, 6.893662, 5.12142, 5.89873, 5.091914)
stad <- c("Den Haag", "Amsterdam", "Alkmaar", "Leeuwarden", "Dordrecht", "Rotterdam", "Deventer", "Groningen", "Heerenveen", "Almelo", "Breda", "Zwolle", "Eindhoven", "Enschede", "Utrecht", "Arnhem", "Tilburg")
list1 <- data.frame(longitude=long, latitude=lat, stad)
Create list 2
long <- c("51.476364", "52.12379", "52.456954", "51.543197", "52.307687", "53.250184", "52.640436", "53.397875", "52.491691", "52.109272", "52.121092", "52.882946", "52.518537", "53.201233", "52.711559", "52.066719", "53.405366", "52.433881", "53.128855", "51.641078", "53.189226", "52.716927", "51.453667", "51.233528", "51.529207", "51.980632", "51.429248", "51.92442", "51.441642", "50.851368")
lat <- c("6.180948", "4.438598", "4.606014", "6.087664", "4.767424", "4.951427", "4.998517", "5.346679", "4.593325", "5.180968", "5.285347", "5.360707", "5.471422", "5.799913", "5.864559", "5.894033", "6.212048", "6.232888", "6.587567", "5.619458", "7.162511", "5.737644", "3.570912", "3.830322", "3.89688", "4.134185", "4.304708", "4.477733", "5.469722", "5.690973")
stad <- c("Valkenburg", "Voorschoten", "Ijmuiden", "De kooy", "Schiphol", "Vlieland", "Berkhout", "Hoorn (terschelling)", "Wijk aan zee", "De Bilt", "Soesterberg", "Stavoren", "Lelystad", "Leeuwarden", "Marknesse", "Deelen", "Lauwersoog", "Heino", "Eelde", "Hupsel", "Nieuwe beerta", "Twente", "Vlissingen", "Westdorpe", "Wilhelminadorp", "Hoek van Holland", "Woensdrecht", "Rotterdam", "Eindhoven", "Maastricht")
list2 <- data.frame(longitude=long, latitude=lat , stad)
But then when I do:
library(geosphere)
mat <- distm(list1[,c('longitude','latitude')], list2[,c('longitude','latitude')], fun=distVincentyEllipsoid)
I get:
Error in .pointsToMatrix(x) : longitude > 360
list1$locality <- list2$stad[apply(mat, 1, which.min)]
Apparently, the problem is that list2
contains factors instead of floats in longitude
and latitude
columns.
It seems to work once you convert factor values to numerical values specified by labels:
list2$longitude.fix <- as.numeric(levels(list2$longitude))[list2$longitude]
list2$latitude.fix <- as.numeric(levels(list2$latitude))[list2$latitude]
distm(list1[,c('longitude','latitude')], list2[,c('longitude.fix','latitude.fix')], fun=distVincentyEllipsoid)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] …
[1,] 218106.26 16356.00 54584.86 206073.80 57935.42 149371.56 99767.31 187239.60 …
[2,] 173280.56 57416.26 33391.75 160587.51 15737.20 97796.65 32074.61 124403.87 …
[3,] 203303.45 66306.56 25384.63 190634.04 36054.40 71943.23 27123.09 107285.19 …
[4,] 195563.08 192179.83 155688.71 186323.20 151151.41 93985.73 108243.57 54651.40 …
[5,] 169040.53 44278.35 72020.04 157421.51 55511.66 161989.79 97883.85 190131.21 …
…
In your second list you have Strings.
long <- as.numeric(c("51.476364", "52.12379", "52.456954", "51.543197", "52.307687", "53.250184", "52.640436", "53.397875", "52.491691", "52.109272", "52.121092", "52.882946", "52.518537", "53.201233", "52.711559", "52.066719", "53.405366", "52.433881", "53.128855", "51.641078", "53.189226", "52.716927", "51.453667", "51.233528", "51.529207", "51.980632", "51.429248", "51.92442", "51.441642", "50.851368"))
lat <- as.numeric(c("6.180948", "4.438598", "4.606014", "6.087664", "4.767424", "4.951427", "4.998517", "5.346679", "4.593325", "5.180968", "5.285347", "5.360707", "5.471422", "5.799913", "5.864559", "5.894033", "6.212048", "6.232888", "6.587567", "5.619458", "7.162511", "5.737644", "3.570912", "3.830322", "3.89688", "4.134185", "4.304708", "4.477733", "5.469722", "5.690973"))
stad <- c("Valkenburg", "Voorschoten", "Ijmuiden", "De kooy", "Schiphol", "Vlieland", "Berkhout", "Hoorn (terschelling)", "Wijk aan zee", "De Bilt", "Soesterberg", "Stavoren", "Lelystad", "Leeuwarden", "Marknesse", "Deelen", "Lauwersoog", "Heino", "Eelde", "Hupsel", "Nieuwe beerta", "Twente", "Vlissingen", "Westdorpe", "Wilhelminadorp", "Hoek van Holland", "Woensdrecht", "Rotterdam", "Eindhoven", "Maastricht")
list2 <- data.frame(longitude=long, latitude=lat , star)
or you just remove the quotes
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.