Геокодирование в R с Google Maps

Я попытался выполнить код для геокодирования местоположений в R через Google Maps и XML пакет от этого сообщения в блоге: http://www.r-chart.com/2010/07/maps-geocoding-and-r-user-conference.html

Вот его функции:

getDocNodeVal=function(doc, path){
  sapply(getNodeSet(doc, path), function(el) xmlValue(el))
}

gGeoCode=function(str){
  library(XML)
  u=paste('http://maps.google.com/maps/api/geocode/xml?sensor=false&address=',str)
  doc = xmlTreeParse(u, useInternal=TRUE)
  str=gsub(' ','%20',str)
  lng=getDocNodeVal(doc, "/GeocodeResponse/result/geometry/location/lat")
  lat=getDocNodeVal(doc, "/GeocodeResponse/result/geometry/location/lng")
  c(lat,lng)
}

Когда я работаю gGeoCode(), Я получаю следующую ошибку:

> gGeoCode("Philadelphia, PA")
failed to load external entity "http%3A//maps.google.com/maps/api/geocode/xml%3Fsensor=false&address=%20Philadelphia,%20PA"
Error: 1: failed to load external entity "http%3A//maps.google.com/maps/api/geocode/xml%3Fsensor=false&address=%20Philadelphia,%20PA"

Если я просто вставляю в браузер URL API с Philadelphia, PA добавленный в конец, как строка передал xmlParseTree, Я получаю результат, который похож на законный xml, когда я загружаю его.

Действительно ли это - проблема с кодом, или мне не удалось настроить что-то или другого?

25
задан JoFrhwld 15 July 2010 в 15:59
поделиться

2 ответа

Вы не думали о том, чтобы использовать вместо этого вызов json? Глядя на ваш код, вы могли бы добиться того же, сделав следующее (вам нужно будет установить пакеты RCurl и RJSONIO с сайта omegahat.com).

Скопируйте и вставьте это в R:

library(RCurl)
library(RJSONIO)

construct.geocode.url <- function(address, return.call = "json", sensor = "false") {
  root <- "http://maps.google.com/maps/api/geocode/"
  u <- paste(root, return.call, "?address=", address, "&sensor=", sensor, sep = "")
  return(URLencode(u))
}

gGeoCode <- function(address,verbose=FALSE) {
  if(verbose) cat(address,"\n")
  u <- construct.geocode.url(address)
  doc <- getURL(u)
  x <- fromJSON(doc,simplify = FALSE)
  if(x$status=="OK") {
    lat <- x$results[[1]]$geometry$location$lat
    lng <- x$results[[1]]$geometry$location$lng
    return(c(lat, lng))
  } else {
    return(c(NA,NA))
  }
}

Вот как вы используете вышеуказанные функции:

x <- gGeoCode("Philadelphia, PA")

Вот результат, который вы получите. Я думаю, что в оригинальном коде lat и lng перепутаны? Но, надеюсь, это то, что вы хотите:

> x
[1]  39.95233 -75.16379

Надеюсь, это немного поможет,

Tony Breyal

23
ответ дан 28 November 2019 в 21:30
поделиться

Вот еще один вариант геокодирования - возможно, его будет проще разобрать:

https://webgis.usc.edu/Services/Geocode/Default.aspx

3
ответ дан 28 November 2019 в 21:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: