R, пытаясь найти данные о широте/долготе для городов в Европе и получать ошибки в геокодировании

Недавно я опубликовал вопрос о планировании походов по городам Европы как точек на карте. Смотрите R, получите данные о долготе/широте для городов и добавьте их в мой фреймворк

Города xlsx файл содержит около 20000 городов в Европе.

У меня появилось сообщение об ошибке при попытке найти данные о широте/долготе с помощью геокода. Я добавил часть кода ниже:

cities <- read.xlsx("EU_city.xlsx",1)

# get frequencies
freq <- as.data.frame(table(cities))
library(plotrix)
freq$Freq <- rescale(freq$Freq, c(1,10)) # c(scale_min, scale_max)

# get cities latitude/longitude - kindly provided by google:
library(ggmap)
lonlat <- geocode(unique(cities)) 
cities <- cbind(freq, lonlat)

error message:

Error: is.character(location) is not TRUE

Я думаю, что данные (города) в моем фреймворке не найдены в вызове геокода. Есть ли способ игнорировать город в dtaframe, если он не сопоставляется в геокодеке

Обновление вопроса после предложения.......

попытался геокод (as.character(города))

Затем мой кадр выглядит следующим образом:

> cities <- cbind(freq, lonlat)
> cities
                       cities  Freq lon lat
1                      ARNHEM  1.00  NA  NA
2                      ATHENS  3.25  NA  NA
3                        BAAR  1.00  NA  NA
4                BAD  VILBEL   1.00  NA  NA
5                   BILTHOVEN  1.00  NA  NA
6                      BOCHUM 10.00  NA  NA
7                       BREDA  3.25  NA  NA
8              CAMBRIDGESHIRE  3.25  NA  NA
9                   DORDRECHT  1.00  NA  NA
10                GAOETERSLOH  1.00  NA  NA
11              GELSENKIRCHEN  1.00  NA  NA
12                       GOES  1.00  NA  NA
13                  GRONINGEN  3.25  NA  NA
14  GUMMERSBACH-DIERINGHAUSEN  1.00  NA  NA
15                  HALSTEREN  1.00  NA  NA
16                   HANNOVER  1.00  NA  NA
17                 HARDERWIJK  1.00  NA  NA
18                    HEERLEN  3.25  NA  NA
19                  HILVERSUM  1.00  NA  NA

У меня нет данных long/lat вообще, только NA

Ответ 1

Вам нужно геокодировать только столбец cities (он немного запутывает, что у вас есть кадр данных с именем cities, а внутри него - столбец с именем cities). Когда вы сомневаетесь, попробуйте разбить вещи на более мелкие куски.

Например, попробуйте их по одному...

cities <- c("ARNHEM","ATHENS","BAAR","CAMBRIDGESHIRE")
library(ggmap)
geocode(cities[1])
##       lon     lat
## 1 5.89873 51.9851
geocode(cities[2])
## just checking ...
geocode("ATHENS GEORGIA")
##         lon   lat
## 1 -83.38333 33.95

Теперь попробуйте вектор сразу:

geocode(cities)
##          lon      lat
## 1  5.8987296 51.98510
## 2 23.7293097 37.98372
## 3  8.5286332 47.19585
## 4  0.0965375 52.27619

Теперь попробуйте с фреймом данных:

mydat <- read.csv(textConnection("
   cities,Freq,lon,lat
   ARNHEM,1.00,NA,NA
   ATHENS,3.25,NA,NA
   BAAR,1.00,NA,NA
   BAD VILBEL,1.00,NA,NA
   BILTHOVEN,1.00,NA,NA
   BOGUS_PLACE,2,NA,NA"))


geocodes <- geocode(as.character(mydat$cities))
mydat <- data.frame(mydat[,1:2],geocodes)

##               cities Freq        lon      lat
## 1             ARNHEM 1.00   5.898730 51.98510
## 2             ATHENS 3.25  23.729310 37.98372
## 3               BAAR 1.00   8.528633 47.19585
## 4         BAD VILBEL 1.00   8.739480 50.18234
## 5          BILTHOVEN 1.00   5.210381 52.13653
## 6        BOGUS_PLACE 2.00 -92.201158 44.49091

Я не знаю , что результат для BOGUS_PLACE означает...!!

Ответ 2

Вот альтернативный способ справиться с этим.

# METHOD 1: Using geocode() from {ggmap}
library(ggmap)
adr <- adr <- "Agra, New Delhi"  # define address
geocode(adr)  # get the latitude and longitude

# Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=Agra,+New+Delhi&sensor=false
#     lon      lat
1 77.3126 28.54637

# METHOD 2: CODE TO GET THE LATITUDE AND LONGITUDE OF A STREET ADDRESS WITH GOOGLE API
addr <- '6th Main Rd, New Thippasandra, Bengaluru, Karnataka'  # set your address here
url = paste('http://maps.google.com/maps/api/geocode/xml?address=', addr,'&sensor=false',sep='')  # construct the URL
doc = xmlTreeParse(url) 
root = xmlRoot(doc) 
lat = xmlValue(root[['result']][['geometry']][['location']][['lat']]) 
long = xmlValue(root[['result']][['geometry']][['location']][['lng']]) 
lat
[1] "12.9725020"
long
[1] "77.6510688"

Ответ 3

Я только что нашел, что это сообщение об ошибке:

Ошибка: is.character(location) не TRUE

может быть связано с тем, что адрес кодируется как число, а не символ. Это может произойти при выборе из фрейма данных, например, в моем случае.

делать:

typeof(address)

и если он окажется числовым, измените его на char

a2 <- as.character(address)
geocode(a2)

Ответ 4

Вы можете использовать приведенный ниже код для извлечения информации из Bing Map API

for(i in 1:length(PinCode)){
var = PinCode[i]
link=paste("http://dev.virtualearth.net/REST/v1/Locations?postalCode=", var, "&o=xml&maxResults=1&key=[YOurKey]",sep = "")
data<- xmlParse(link)
xml_data <- xmlToList(data)
PinCodeLatLongtemp <- data.frame(PinCode = "Temp", Lat = "Lat", Long = "Long")
PinCodeLatLongtemp$PinCode <- var
PinCodeLatLongtemp$Lat <- 
xml_data$ResourceSets$ResourceSet$Resources$Location$Point$Latitude
PinCodeLatLongtemp$Long <- 
xml_data$ResourceSets$ResourceSet$Resources$Location$Point$Longitude

PinCodeLatLong <- rbindlist(list(PinCodeLatLongtemp,PinCodeLatLong), fill = T)
}

Он создаст новый фрейм данных, введя пин-код и два новых столбца с широтой и долготой. Вы можете получить свой ключ от [здесь] (https://www.bingmapsportal.com)

Ответ 5

data1 = data.frame(country=c("Finland","Sweden","Norway","Denmark","Sweden","Finland"))
data1 =cbind.data.frame(data1,lat=c(0,0,0,0,0,0))
data1 =cbind.data.frame(data1,long=c(0,0,0,0,0,0))

data1 = as.data.frame(data1)


data1$lat[data1$country=="Finland"]<-61.92411
data1$long[data1$country=="Finland"]<-25.748151

data1$lat[data1$country=="Sweden"]<-60.128161
data1$long[data1$country=="Sweden"]<-18.643501

data1$lat[data1$country=="Denmark"]<-56.26392
data1$long[data1$country=="Denmark"]<-9.501785

data1$lat[data1$country=="Norway"]<-60.472024
data1$long[data1$country=="Norway"]<-8.468946