首页 文章

R试图找到欧洲城市的纬度/经度数据并获得地理编码错误消息

提问于
浏览
11

我最近发布了一个关于在欧洲城市绘制位置作为 Map 上的点的问题 . 见R, get longitude/latitude data for cities and add it to my dataframe

城市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))

然后我的框架看起来像这样:

> 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

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
    

    我不知道 what BOGUS_PLACE 的结果意味着...... !!

  • 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"
    
  • -3

    我刚刚发现此错误消息:

    错误:is.character(位置)不为TRUE

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

    做:

    typeof(address)
    

    如果结果是数字,则将其更改为char

    a2 <- as.character(address)
    geocode(a2)
    
  • 1
    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
    

相关问题