Подтвердить что ты не робот

R: Как GeoCode простой адрес с помощью Data Science Toolbox

Я питаюсь геокодированием Google и решил попробовать альтернативу. Инструмент Data Science Toolkit (http://www.datasciencetoolkit.org) позволяет вам использовать Geocode неограниченное количество адресов. R имеет превосходный пакет, который служит в качестве оболочки для своих функций (CRAN: RDSTK). Пакет имеет функцию под названием street2coordinates(), которая взаимодействует с утилитой геокодирования Data Science Toolkit.

Однако функция RDSTK street2coordinates() не работает, если вы пытаетесь геокодировать что-то простое, например City, Country. В следующем примере я попытаюсь использовать эту функцию, чтобы получить широту и долготу для города Феникс:

> require("RDSTK")
> street2coordinates("Phoenix+Arizona+United+States")
[1] full.address
<0 rows> (or 0-length row.names)

Утилита из набора инструментов для научных исследований работает отлично. Это запрос URL, который дает ответ: http://www.datasciencetoolkit.org/maps/api/geocode/json?sensor=false&address=Phoenix+Arizona+United+States

Меня интересует геокодирование нескольких адресов (которые заполняют адреса и названия городов). Я знаю, что URL-адрес набора Data Science Toolkit будет работать хорошо. Как я могу взаимодействовать с URL-адресом и получать несколько широт и долгот в кадре данных с адресами?

Вот пример набора данных:

dff <- data.frame(address=c(
  "Birmingham, Alabama, United States",
  "Mobile, Alabama, United States",
  "Phoenix, Arizona, United States",
  "Tucson, Arizona, United States",
  "Little Rock, Arkansas, United States",
  "Berkeley, California, United States",
  "Duarte, California, United States",
  "Encinitas, California, United States",
  "La Jolla, California, United States",
  "Los Angeles, California, United States",
  "Orange, California, United States",
  "Redwood City, California, United States",
  "Sacramento, California, United States",
  "San Francisco, California, United States",
  "Stanford, California, United States",
  "Hartford, Connecticut, United States",
  "New Haven, Connecticut, United States"
  ))
4b9b3361

Ответ 1

Как это?

library(httr)
library(rjson)

data <- paste0("[",paste(paste0("\"",dff$address,"\""),collapse=","),"]")
url  <- "http://www.datasciencetoolkit.org/street2coordinates"
response <- POST(url,body=data)
json     <- fromJSON(content(response,type="text"))
geocode  <- do.call(rbind,sapply(json,
                                 function(x) c(long=x$longitude,lat=x$latitude)))
geocode
#                                                long      lat
# San Francisco, California, United States -117.88536 35.18713
# Mobile, Alabama, United States            -88.10318 30.70114
# La Jolla, California, United States      -117.87645 33.85751
# Duarte, California, United States        -118.29866 33.78659
# Little Rock, Arkansas, United States      -91.20736 33.60892
# Tucson, Arizona, United States           -110.97087 32.21798
# Redwood City, California, United States  -117.88536 35.18713
# New Haven, Connecticut, United States     -72.92751 41.36571
# Berkeley, California, United States      -122.29673 37.86058
# Hartford, Connecticut, United States      -72.76356 41.78516
# Sacramento, California, United States    -121.55541 38.38046
# Encinitas, California, United States     -116.84605 33.01693
# Birmingham, Alabama, United States        -86.80190 33.45641
# Stanford, California, United States      -122.16750 37.42509
# Orange, California, United States        -117.85311 33.78780
# Los Angeles, California, United States   -117.88536 35.18713

Это использует интерфейс POST для API-интерфейса street2coordinates (описанный здесь), который возвращает все результаты в 1 запросе, а не использует несколько запросов GET.

РЕДАКТИРОВАТЬ (Ответ на комментарий OP)

Отсутствие Phoenix кажется ошибкой в ​​API-интерфейсе street2coordinates. Если вы запустите демонстрационную страницу и попробуйте "Phoenix, Arizona, United States", вы получите нулевой ответ. Однако, как показывает ваш пример, использование своего "Геокодера" в стиле Google дает результат для Phoenix. Итак, вот решение, использующее повторяющиеся запросы GET. Обратите внимание, что это выполняется намного медленнее.

geo.dsk <- function(addr){ # single address geocode with data sciences toolkit
  require(httr)
  require(rjson)
  url      <- "http://www.datasciencetoolkit.org/maps/api/geocode/json"
  response <- GET(url,query=list(sensor="FALSE",address=addr))
  json <- fromJSON(content(response,type="text"))
  loc  <- json['results'][[1]][[1]]$geometry$location
  return(c(address=addr,long=loc$lng, lat= loc$lat))
}
result <- do.call(rbind,lapply(as.character(dff$address),geo.dsk))
result <- data.frame(result)
result
#                                     address         long        lat
# 1        Birmingham, Alabama, United States   -86.801904  33.456412
# 2            Mobile, Alabama, United States   -88.103184  30.701142
# 3           Phoenix, Arizona, United States -112.0733333 33.4483333
# 4            Tucson, Arizona, United States  -110.970869  32.217975
# 5      Little Rock, Arkansas, United States   -91.207356  33.608922
# 6       Berkeley, California, United States   -122.29673  37.860576
# 7         Duarte, California, United States  -118.298662  33.786594
# 8      Encinitas, California, United States  -116.846046  33.016928
# 9       La Jolla, California, United States  -117.876447  33.857515
# 10   Los Angeles, California, United States  -117.885359  35.187133
# 11        Orange, California, United States  -117.853112  33.787795
# 12  Redwood City, California, United States  -117.885359  35.187133
# 13    Sacramento, California, United States  -121.555406  38.380456
# 14 San Francisco, California, United States  -117.885359  35.187133
# 15      Stanford, California, United States    -122.1675   37.42509
# 16     Hartford, Connecticut, United States   -72.763564   41.78516
# 17    New Haven, Connecticut, United States   -72.927507  41.365709

Ответ 2

пакет ggmap включает поддержку геокодирования с использованием Google или Data Science Toolkit, последний с их геокодером в стиле Google. Это довольно медленно для нескольких адресов, как указано в более раннем ответе.

library(ggmap)
result <- geocode(as.character(dff[[1]]), source = "dsk")
print(cbind(dff, result))
#                                     address        lon      lat
# 1        Birmingham, Alabama, United States  -86.80190 33.45641
# 2            Mobile, Alabama, United States  -88.10318 30.70114
# 3           Phoenix, Arizona, United States -112.07404 33.44838
# 4            Tucson, Arizona, United States -110.97087 32.21798
# 5      Little Rock, Arkansas, United States  -91.20736 33.60892
# 6       Berkeley, California, United States -122.29673 37.86058
# 7         Duarte, California, United States -118.29866 33.78659
# 8      Encinitas, California, United States -116.84605 33.01693
# 9       La Jolla, California, United States -117.87645 33.85751
# 10   Los Angeles, California, United States -117.88536 35.18713
# 11        Orange, California, United States -117.85311 33.78780
# 12  Redwood City, California, United States -117.88536 35.18713
# 13    Sacramento, California, United States -121.55541 38.38046
# 14 San Francisco, California, United States -117.88536 35.18713
# 15      Stanford, California, United States -122.16750 37.42509
# 16     Hartford, Connecticut, United States  -72.76356 41.78516
# 17    New Haven, Connecticut, United States  -72.92751 41.36571

Ответ 3

Быстрый и, вероятно, наивный вопрос: если я посмотрю на длину и широту Phoenix AZ, я получу 33,4484 ° с.ш., 112,0740 ° з.д., что довольно сильно отличается от приведенного выше -112.07404 33,44838. Здесь происходит какое-то "кодирование"? Спасибо