API Census Batch Geocoding с исходными адресами во фрейме данных (не CSV) в R
Я пытаюсь использовать пакетный геокодер Бюро переписи ( http://geocoding.geo.census.gov/geocoder/Geocoding_Services_API.pdf) с R. Входные адреса находятся в фрейме данных, а не в CSV. Поскольку адреса являются промежуточным этапом, я не хочу записывать их в CSV.
Я прочитал несколько сообщений на stackru. Решение Hadley ( публикация и получение данных из API с использованием httr в R) иллюстрирует, как загрузить существующий файл CSV. Решение MrFlick (загрузка CSV в API в R) кажется близким к тому, что я хочу, но использует строку, а не фрейм данных.
Вот что я имею в виду кода:
#generate data frame of test addresses for this example
a = c(1, 2, 3)
b = c("125 Worth Street", "258 Broadway", "8 Centre Street")
c = rep("New York", 3)
d = rep("NY", 3)
e = c("10013","10007","10007")
addresses = data.frame(a,b,c,d,e)
#names specified by API documentation
colnames(addresses) <- c("Unique ID","Street address","City","State","ZIP")
apiurl <- "http://geocoding.geo.census.gov/geocoder/geographies/addressbatch"
req <- POST(apiurl, body=list(
addressFile = RCurl::fileUpload(
filename = "test.csv",
contents = addresses
),
benchmark = "Public_AR_Census2010",
vintage = "Census2010_Census2010"
),
encode="multipart"
)
stop_for_status(req)
Заранее спасибо.
2 ответа
Если вы хотите записать данные во временный файл...
library("httr")
a = c(1, 2, 3)
b = c("125 Worth Street", "258 Broadway", "8 Centre Street")
c = rep("New York", 3)
d = rep("NY", 3)
e = c("10013","10007","10007")
addresses = data.frame(a,b,c,d,e)
colnames(addresses) <- c("Unique_ID","Street address","City","State","ZIP")
apiurl <- "http://geocoding.geo.census.gov/geocoder/geographies/addressbatch"
file <- tempfile(fileext = ".csv")
write.csv(addresses, file, row.names = FALSE)
req <- POST(apiurl, body=list(
addressFile = upload_file(file),
benchmark = "Public_AR_Census2010",
vintage = "Census2010_Census2010"
),
encode="multipart"
)
content(req, "text", encoding = "UTF-8")
#> [1] "\"3\",\"8 Centre Street, New York, NY, 10007\",\"Match\",\"Non_Exact\",\"8 Centre St, NEW YORK, NY, 10013\",\"-74.00442,40.712765\",\"59660429\",\"R\",\"36\",\"061\",\"002900\",\"4019\"\n\"2\",\"258 Broadway, New York, NY, 10007\",\"No_Match\"\n\"1\",\"125 Worth Street, New York, NY, 10013\",\"Match\",\"Exact\",\"125 Worth St, NEW YORK, NY, 10013\",\"-74.0027,40.715446\",\"59660405\",\"L\",\"36\",\"061\",\"003100\",\"1012\"\n\"Unique_ID\",\"Street address, City, State, ZIP\",\"No_Match\"\n"
Если кто-то получает ошибку при попытке использовать любой из этих фрагментов кода, это связано с тем, что Census API переключился с http на https. Настроитьapiurl
быть основанным на https, и он должен работать.
library("httr")
a = c(1, 2, 3)
b = c("125 Worth Street", "258 Broadway", "8 Centre Street")
c = rep("New York", 3)
d = rep("NY", 3)
e = c("10013","10007","10007")
addresses = data.frame(a,b,c,d,e)
colnames(addresses) <- c("Unique_ID","Street address","City","State","ZIP")
apiurl <- "https://geocoding.geo.census.gov/geocoder/geographies/addressbatch"
file <- tempfile(fileext = ".csv")
write.csv(addresses, file, row.names = FALSE)
req <- POST(apiurl, body=list(
addressFile = upload_file(file),
benchmark = "Public_AR_Census2010",
vintage = "Census2010_Census2010"
),
encode="multipart"
)
content(req, "text", encoding = "UTF-8")