寻找欧洲城市的纬度/经度数据时,遇到地理编码错误信息。

12

我最近发布了一个问题,关于如何将欧洲城市的位置绘制为地图上的点。参见 R, get longitude/latitude data for cities and add it to my dataframe

cities xlsx 文件包含大约20000个欧洲城市。

尝试使用geocode查找纬度/经度数据时,我收到了一个错误消息。以下是部分代码:

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

我猜测我的数据框中的数据(城市)在地理编码调用中没有找到。 如果在地理编码中无法匹配该城市,有没有一种方法可以忽略数据框中的城市。

根据建议更新问题......

尝试使用 geocode(as.character(cities))

然后我的数据框看起来是这样的:

> 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

我完全没有经纬度数据,只有NA


如果城市名称是唯一的,那么 geocode(as.character(cities)) 怎么样? - Ben Bolker
尝试使用geocode(as.character(cities)),但是经度/纬度只得到了NA值...我已经更新了问题并提供了输出。 - jonas
4个回答

19

你需要对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的结果意味着什么......!!


太好了,非常感谢。我是R的新手,但我已经让它工作了!! - jonas
尝试使用上述示例进行相同操作,仍然得到NA。mycities <- c(“Hyderabad”,“Chennai”,“Bangalore”,“Cochin”,“ARNHEM”)
geocode(mycities [5]) 来自URL的信息:http://maps.googleapis.com/maps/api/geocode/json?address=ARNHEM&sensor=false lon lat 1 NA NA
- Balaji N

2

我刚刚发现这个错误信息:

Error: is.character(location) is not TRUE

可能是由于地址被编码为数字而不是字符造成的。这可能会在您从数据框中进行选择时发生,例如我的情况。

解决方法:

typeof(address)

如果它被证明是数字,请将其更改为字符

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

1
这里是你可以处理此事的另一种方法。
# 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"

0
您可以使用以下代码从Bing地图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)
}

它将创建一个新的数据框,其中包含您输入的“Pincode”和两个新列Lat和Long。 您可以从[这里](https://www.bingmapsportal.com)获取您的密钥。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接