【问题标题】:reading address and lat,long from xml_node in R (mapsapi package)从 R(mapsapi 包)中的 xml_node 读取地址和 lat,long
【发布时间】:2018-06-14 21:28:21
【问题描述】:

我正在尝试通过 R 中的 mapsapi 包从地址获取信息。 所以我的代码如下所示:

library(mapsapi)
library(XML)
library(RCurl)

string <- "Pariser Platz 1, 10117 Berlin"
test <- mp_geocode(string)
xml <- xml_child(test[[string]],2)
xml

现在我得到了这种 xml 文件:

{xml_node}
<result>
 [1] <type>street_address</type>
 [2] <formatted_address>Pariser Platz 1, 10117 Berlin, Germany</formatted_address>
 [3] <address_component>\n  <long_name>1</long_name>\n  <short_name>1</short_name>\n  <type>street_number</type>\n</address_component>
 [4] <address_component>\n  <long_name>Pariser Platz</long_name>\n  <short_name>Pariser Platz</short_name>\n  <type>route</type>\n</address_component>
 [5] <address_component>\n  <long_name>Mitte</long_name>\n  <short_name>Mitte</short_name>\n  <type>political</type>\n  <type>sublocality</type>\n  <type>sublocality_level_1</type>\n</address_component>
 [6] <address_component>\n  <long_name>Berlin</long_name>\n  <short_name>Berlin</short_name>\n  <type>locality</type>\n  <type>political</type>\n</address_component>
 [7] <address_component>\n  <long_name>Berlin</long_name>\n  <short_name>Berlin</short_name>\n  <type>administrative_area_level_1</type>\n  <type>political</type>\n</address_component>
 [8] <address_component>\n  <long_name>Germany</long_name>\n  <short_name>DE</short_name>\n  <type>country</type>\n  <type>political</type>\n</address_component>
 [9] <address_component>\n  <long_name>10117</long_name>\n  <short_name>10117</short_name>\n  <type>postal_code</type>\n</address_component>
[10] <geometry>\n  <location>\n    <lat>52.5160964</lat>\n    <lng>13.3779369</lng>\n  </location>\n  <location_type>ROOFTOP</location_type>\n  <viewport>\n    <southwest>\n      <lat>52.5147474</lat>\n      <lng>13.37658 ...
[11] <place_id>ChIJnYvtVcZRqEcRl6Kftq66b6Y</place_id>

那么我怎样才能将门牌号、地址、城市、邮编、纬度和经度从这个 xml 中导出到合适的变量中呢? 谢谢你的帮助! 问候

【问题讨论】:

    标签: r xml google-maps-api-3


    【解决方案1】:

    我已经在我的googleway 包中轻松访问此类信息

    library(googleway)
    
    ## you're using Google's API, and they require you to have an API key
    ## so you'll need to get one 
    set_key("GOOGLE_API_KEY")
    
    ## perform query
    res <- google_geocode("Pariser Platz 1, 10117 Berlin")
    

    使用res 结果,您可以使用geocode_coordinates() 提取坐标,并使用geocode_address_components() 获取街道号码

    ## coordinates
    geocode_coordinates(res)
    #       lat      lng
    # 1 52.5161 13.37794
    
    geocode_address_components(res)
    #       long_name    short_name                                       types
    # 1             1             1                               street_number
    # 2 Pariser Platz Pariser Platz                                       route
    # 3         Mitte         Mitte political, sublocality, sublocality_level_1
    # 4        Berlin        Berlin                         locality, political
    # 5        Berlin        Berlin      administrative_area_level_1, political
    # 6       Germany            DE                          country, political
    # 7         10117         10117                                 postal_code
    

    您可以查看str(res) 以查看从 Google 的 API 返回的项目的完整列表

    【讨论】:

    • 谢谢这工作得很好!是否有限制在谷歌地图 api 上搜索的选项?例如当只有街道名称时 - 将位置搜索减少到特定城市?所以如果我使用功能 google_geocode("Pariser Platz 1") - 限制搜索城市“柏林”?
    • @Leon 如果您找到了其他解决方案,请随时将其添加为答案,它可能对其他人有所帮助
    • 我的方法非常简单。我使用 if 语句来确认邮政编码是否在 pausibel 范围内 - 如果不是,我将使用静态替换。
    【解决方案2】:

    或者,你也可以使用ggmap::geocode()

    > library(ggmap)
    > geocode(location = "Pariser Platz 1, 10117 Berlin", output = 'latlon' )
    Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=Pariser%20Platz%201,%2010117%20Berlin&sensor=false
           lon     lat
    1 13.37794 52.5161
    

    更改output 参数可以为您提供非常详细的列表输出(如果需要):

    > geocode(location = "Pariser Platz 1, 10117 Berlin", output = 'all' )
    Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=Pariser%20Platz%201,%2010117%20Berlin&sensor=false
    $results
    $results[[1]]
    $results[[1]]$address_components
    $results[[1]]$address_components[[1]]
    $results[[1]]$address_components[[1]]$long_name
    [1] "1"
    
    $results[[1]]$address_components[[1]]$short_name
    [1] "1"
    
    $results[[1]]$address_components[[1]]$types
    [1] "street_number"
    
    
    $results[[1]]$address_components[[2]]
    $results[[1]]$address_components[[2]]$long_name
    [1] "Pariser Platz"
    
    $results[[1]]$address_components[[2]]$short_name
    [1] "Pariser Platz"
    
    $results[[1]]$address_components[[2]]$types
    [1] "route"
    
    
    $results[[1]]$address_components[[3]]
    $results[[1]]$address_components[[3]]$long_name
    [1] "Mitte"
    
    $results[[1]]$address_components[[3]]$short_name
    [1] "Mitte"
    
    $results[[1]]$address_components[[3]]$types
    [1] "political"           "sublocality"         "sublocality_level_1"
    
    
    $results[[1]]$address_components[[4]]
    $results[[1]]$address_components[[4]]$long_name
    [1] "Berlin"
    
    $results[[1]]$address_components[[4]]$short_name
    [1] "Berlin"
    
    $results[[1]]$address_components[[4]]$types
    [1] "locality"  "political"
    
    
    $results[[1]]$address_components[[5]]
    $results[[1]]$address_components[[5]]$long_name
    [1] "Berlin"
    
    $results[[1]]$address_components[[5]]$short_name
    [1] "Berlin"
    
    $results[[1]]$address_components[[5]]$types
    [1] "administrative_area_level_1" "political"                  
    
    
    $results[[1]]$address_components[[6]]
    $results[[1]]$address_components[[6]]$long_name
    [1] "Germany"
    
    $results[[1]]$address_components[[6]]$short_name
    [1] "DE"
    
    $results[[1]]$address_components[[6]]$types
    [1] "country"   "political"
    
    
    $results[[1]]$address_components[[7]]
    $results[[1]]$address_components[[7]]$long_name
    [1] "10117"
    
    $results[[1]]$address_components[[7]]$short_name
    [1] "10117"
    
    $results[[1]]$address_components[[7]]$types
    [1] "postal_code"
    
    
    
    $results[[1]]$formatted_address
    [1] "Pariser Platz 1, 10117 Berlin, Germany"
    
    $results[[1]]$geometry
    $results[[1]]$geometry$location
    $results[[1]]$geometry$location$lat
    [1] 52.5161
    
    $results[[1]]$geometry$location$lng
    [1] 13.37794
    
    
    $results[[1]]$geometry$location_type
    [1] "ROOFTOP"
    
    $results[[1]]$geometry$viewport
    $results[[1]]$geometry$viewport$northeast
    $results[[1]]$geometry$viewport$northeast$lat
    [1] 52.51745
    
    $results[[1]]$geometry$viewport$northeast$lng
    [1] 13.37929
    
    
    $results[[1]]$geometry$viewport$southwest
    $results[[1]]$geometry$viewport$southwest$lat
    [1] 52.51475
    
    $results[[1]]$geometry$viewport$southwest$lng
    [1] 13.37659
    
    
    
    
    $results[[1]]$place_id
    [1] "ChIJnYvtVcZRqEcRl6Kftq66b6Y"
    
    $results[[1]]$types
    [1] "street_address"
    
    
    
    $status
    [1] "OK"
    

    您可以在功能帮助部分找到更多信息。

    有时调用可能会失败并显示以下消息:

    Warning message:
    geocode failed with status OVER_QUERY_LIMIT, location = "Pariser Platz 1, 10117 Berlin"
    

    通常,如果您在几秒钟后尝试,它会正常工作。您可以随时使用geocodeQueryCheck检查配额中剩余的查询:

    > geocodeQueryCheck()
    2490 geocoding queries remaining.
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      相关资源
      最近更新 更多