Понадобилось мне как-то вывести всех клиентов на карту. Но проблема — в ERP есть их адреса, а вот координат нету. Но такую задачу отлично решают сервисы геокодирования, большинство из которых предоставляют к себе доступ через API.
Мой выбор пал на Яндекс.Геокодирование
Пришлось написать совсем небольшую функцию, которая на вход принимает строку адреса, а на выходе у нее — dataframe с широтой и долготой.
Вот такая функция:
library(rjson)
library(plyr)
library(XML)
geoYandex<-function(location)
{
stopifnot(is.character(location))
loc <- location
location <- gsub(",", "", location)
location <- gsub(" ", "+", location)
posturl <- paste(location)
url_string <- paste("http://geocode-maps.yandex.ru/1.x/?geocode=",
posturl, sep = "")
url_string <- URLencode(url_string)
xmlText <- paste(readLines(url_string), "\n", collapse="")
data<-xmlParse(xmlText, asText=TRUE)
xml_data <- xmlToList(data)
pos<-xml_data$GeoObjectCollection$featureMember$GeoObject$Point$pos
lon<-as.numeric(substr(pos,1,9))
lat<-as.numeric(substr(pos,11,19))
return (data.frame(lon,lat))
}
Использовать ее очень просто:
geoYandex('Ижевск,улица Свободы, 42А')
.
А уж имея такую функцию — было совсем не сложно прогнать ее по всей базе клиентов (помним о бесплатном количестве запросов в сутки в 25 000) и дополнить имеющиеся данные по клиентам их географическими координатами.
Обращение к Яндекс-геокод из R: 9 комментариев
https://github.com/andriy-gazin/yandex-geocodeR
Задачи у всех одинаковые 🙂
Почему Яндекс? Насколько помню из их лиц. соглашения, использовать в сторонних местах нельзя, и много прочих ограничений.
Я пользуюсь гугловым, притом он уже реализован в R, и нет таких ограничений в лицензионной политике.
Что-то я пытался пользоваться гугловым, но там что-то не пошло… То-ли Российские адреса хуже читал, то-ли там ограничение по частоте запросов было. Уж и не вспомню. Это давним опытом я тут поделился…
Спасибо за материал! Сижу и удивляюсь — вижу родной город )
Спасибо Вам, я начинающий пользователь R, мне ваш скрипт очень помог! (даже не представляете, как я сейчас радуюсь)
Я рад, что количество пользователей R растёт!
Вот тут ошибка.
«lon<-as.numeric(substr(pos,1,9))
lat<-as.numeric(substr(pos,11,19))»
Нельзя координаты делить просто по количеству символов, оно в ответах Яндекса не постоянно.
Например, на адресе «Москва электролитный проезд 1» будет ошибка в широте. Программа выдаст «5.67389», а на самом деле, она — «55.67389».
В ответе Яндекса нужно искать пробел и делить координаты на широту и долготу по его местоположению.
Например, это можно сделать так:
1. В начале кода добавить еще одну библиотеку, т.е. вместо этих строк :
«library(rjson)
library(plyr)
library(XML)»
можно написать так:
«library(rjson)
library(plyr)
library(XML)
library(stringr)»
разделить координаты по словам, т.е. вместо этих строк :
«lon<-as.numeric(substr(pos,1,9))
lat<-as.numeric(substr(pos,11,19))»
можно написать так:
«lon<-c(word(pos,1))
lat<-as.numeric(word(pos,2))»
Спасибо большое, очень правильный комментарий!