Исходный файл этого документа mapdemo2-geocoding-xls.Rmd в проекте https://github.com/bivni/map-demo1

Результат (HTML): http://rpubs.com/ikochergin/169669

Краткое содержание:

Берем список нужных учреждений из таблицы Excel. Используем geocode() и mutate_geocode() из библиотеки ggmap для получения координат по адресам и рисуем карту при помощи библиотеки leaflet

Адреса нужных нам учереждений достаем из таблицы Excel и наносим на карту

Формулировка задачи

Я недавно столкнулся с такой задачей:

Мне нужно получить электронную подпись для отправки документов в налоговою инспекцию через сайт Госуслуги. С сайта http://www.nalog.ru/files/docs/uc/udost_centr.xls я скачал таблицу excel с адресами уполномоченных фирм – удостоверяющих центров. И хочу по карте посмотреть, какие из них находятся рядом с метро Университет

Подключение библиотек

library(leaflet) # рисование карт
library(dplyr)   # оператор %>% (pipe) и функции манипуляций с данными
library(xtable)  # вывод таблиц в документах LaTeX и Web
library(htmltools) # вспомогательные функции при генерации web content'а
library(ggmap) # библиотека рисования карт на основе улучшенной графической библиотеки ggplot2
library(stringi) # продвинутые операции с со строками, связанные с интернационализацией 
library(readxl) # Импорт данных из Excel 

Импорт данных из файла Excel

all_auth_centers <-  read_excel("data/udost_centr.xls") 
colnames(all_auth_centers)  <- c("name","address","url")

Покажем данные 6 строк из загруженных данных

all_auth_centers %>% head() %>% 
  xtable(auto=T) %>% print("html")          
name address url
1 ЗАО «Калуга-Астрал» 248023, г. Калуга, пер. Теренинский, д.6 http://www.astralnalog.ru/
2 ООО «Арго-Технолоджи» 101000, Москва, Покровский бульвар, д.1/20 http://www.compusec.ru/
3 ОАО «Инфотекс Интернет Траст» 127287, Москва, Старый Петровско-Разумовский проезд, д. 1/23, стр.1 http://www.iitrust.ru/
4 ОАО «Сеть делового обслуживания» 170026, г. Тверь, Комсомольский проспект, д. 11, корп.1 http://www.sdo.ru/
5 ООО «Тверские КРИПТО-графические системы» 170000, г. Тверь, ул. Новоторжская д.3 http://www.tvercrypto.ru/
6 АНО «УНЦИБ ПФО» №1 424032, г. Йошкар-Ола, ул.Машиностроителей, д.8г, офис 310 http://uncib-ufa.ru/

Нам сейчас нужна только Москва

moscow_auth_centers <- filter(all_auth_centers,grepl("Москва",address))
nrow(moscow_auth_centers)
## [1] 27
str(moscow_auth_centers)
## Classes 'tbl_df', 'tbl' and 'data.frame':    27 obs. of  3 variables:
##  $ name   : chr  "ООО «Арго-Технолоджи» " "ОАО «Инфотекс Интернет Траст»" "ЗАО \"Национальный Удостоверяющий Центр\"" "ООО «Такском»" ...
##  $ address: chr  "101000, Москва, Покровский бульвар, д.1/20" "127287, Москва, Старый Петровско-Разумовский проезд, д. 1/23, стр.1" "111024, Москва, ул. Авиамоторная, д.8А, стр. 5 " "127051, Москва, ул. Садовая-Самотечная, д.12" ...
##  $ url    : chr  "http://www.compusec.ru/" "http://www.iitrust.ru/" "http://www.nucrf.ru/" "http://www.taxcom.ru/" ...

Используем геокодирование

Мы будет при помощи функции mutate_geocode() из библиотеки ggmap к существующему фрейму данных добавлять столбцы с координатами lon и lat.

Примечание. Функция mutate_geocode() оказалась капризной и выдает ошибку при применении к локальным data.frame (имеющим дополнительный атрибут класса tbl_df помимо data.frame – посмотрите вывод str(moscow_auth_centers) ). Приходится перед дальнейшим применением “очистить” фрейм данных функцией as.data.frame()

map_data <-  as.data.frame(moscow_auth_centers)   %>% 
               mutate_geocode(address)
## Warning: geocode failed with status ZERO_RESULTS, location = "123298, г.
## Москва, ул. 3-ая Хорошовская, д.13 "
## Warning: geocode failed with status ZERO_RESULTS, location = "117997,
## Москва, Нахимовский пр-кт, д.32, (ИДН РАН, 13 этаж)"
## Warning: geocode failed with status ZERO_RESULTS, location = "127434 г.Москва, Дмитровское ш., д.9
##  2 Центра сертификации"
## Warning: geocode failed with status ZERO_RESULTS, location = "115035,
## Москва, Кадашевская наб., д. 30 - адрес расположения серверного
## оборудования, обеспечивающего функции УЦ. 127015, Москва, Вятская ул., д.
## 27 - адрес предоставления услуг (адрес расположения АРМов для генерации
## ключей и выпуска сертификатов)"

Покажем данные

map_data %>% 
  xtable(auto=T) %>% print("html")          
name address url lon lat
1 ООО «Арго-Технолоджи» 101000, Москва, Покровский бульвар, д.1/20 http://www.compusec.ru/ 37.6469990 55.7581965
2 ОАО «Инфотекс Интернет Траст» 127287, Москва, Старый Петровско-Разумовский проезд, д. 1/23, стр.1 http://www.iitrust.ru/ 37.5654370 55.8003120
3 ЗАО “Национальный Удостоверяющий Центр” 111024, Москва, ул. Авиамоторная, д.8А, стр. 5 http://www.nucrf.ru/ 37.7134270 55.7547500
4 ООО «Такском» 127051, Москва, ул. Садовая-Самотечная, д.12 http://www.taxcom.ru/ 37.6126610 55.7730140
5 ЗАО “Московское отделение Пензенского научно-исследовательского электротехнического института” (ЗАО “МО ПНИЭИ”) 127018, Москва, ул.Сущевский Вал, д.16, стр. 5, 2 этаж http://www.security.ru/ 37.6024246 55.7923862
6 ООО “Межрегиональный Удостоверяющий Центр” 105066, Москва, ул. Ольховская, д.45, стр.1 http://www.mruc.ru/ 37.6724756 55.7779033
7 Некоммерческое партнерство “МосГорУслуга” 111397, Москва, Зеленый просп., д.20 http://www.uc-mgr.ru/list_certificates.html 37.7871200 55.7504690
8 ОАО “Электронная Москва” 119333, Москва, Ленинский проспект, д.55/1, стр. 2 Дополнительная площадка -121248 , Москва, Кутузовский проспект, д.12 http://www.uc-em.ru/ 37.5639619 55.6971010
9 ЗАО “Удостоверяющий центр”(ekey.ru) 101990,Москва, Армянский переулок, д. 9/1/1, стр. 1 http://ekey.ru/ 37.6372790 55.7596272
10 ООО “Электронный экспресс” 119991, Москва, Ленинские горы, д.1, стр.77 http://www.garantexpress.ru/#menu3-19 37.5218580 55.7086080
11 ЗАО РЦ “Практик” 111401, Москва, ул. 2-я Владимирская, д. 26а http://www.a-practic.ru/ 37.7816090 55.7540300
12 ООО “ТехноКад” 115114, Москва, Павелецкая наб., д.8, стр.6 http://www.technokad.ru/ 37.6457605 55.7086558
13 Фонд “Центр инноваций” (Некоммерческая организация Фонд “Центр инноваций и информационных технологий”) 119071, Москва, ул.Малая Калужская, д.15, стр.1 www.fciit.ru 37.6011650 55.7170600
14 ЗАО “НУЦ ЭЦП” (Закрытое акционерное общество “Национальный Удостоверяющий Центр подтверждения подлинности Электронной Цифровой Подписи”) 125212, Москва, Головинское шоссе, д.8, корп. 2 www.eldokument.ru 37.4926990 55.8381190
15 ООО “ГСЦ” (Общество с ограниченной ответственностью “Главный Сертифицирующий Центр”) 123298, г. Москва, ул. 3-ая Хорошовская, д.13 www.ibpost.ru
16 ООО «Коммерсантъ КАРТОТЕКА» 117997, Москва, Нахимовский пр-кт, д.32, (ИДН РАН, 13 этаж) www.kartoteka.ru
17 ЗАО “Сигнал-КОМ” 115088, Москва, ул. Угрешская, д. 2., стр.15 www.signal-com.ru 37.6868539 55.7118220
18 ГВЦ ОАО “РЖД” (Главный вычислительный центр - филиал открытого акционерного общества “Российские железные дороги”) 3107174, Москва, ул. Каланчевская, д.2/1 http://ocsp.rzd.ru 37.6525760 55.7706250
19 ООО “НПЦ”1С" (Общество с ограниченной ответственностью “Научно-производственный центр”1С“) 127434 г.Москва, Дмитровское ш., д.9 2 Центра сертификации http://ca.1c.ru
20 ООО “Сберключ” ( Общество с ограниченной ответственностью “Сберключ”) 115184, Москва, ул. Большая Татарская, д.9 http://sberkey.ru 37.6325576 55.7411425
21 МскФ ФГУП “ЦентрИнформ” (Московский филиал федерального государственного унитарного предприятия “ЦентрИнформ”) 117105, Москва, Варшавское ш., д.37А, стр.8 www.r77.center-inform.ru 37.6270140 55.6890000
22 ООО “Аксиком” (Общество с ограниченной ответственностью “Аксиком”) 115114, Москва, ул. Летниковская, д.10, стр.4 www.aksicom.ru 37.6425770 55.7248700
23 ООО “БСС-Безопасность” (Общество с ограниченной ответственностью “БСС-Безопасность”) 117105, Москва г, Нагорный проезд, 5 www.bss-s.ru 37.6160790 55.6873470
24 ОАО “МегаФон” (Открытое акционерное общество “МегаФон”) 115035, Москва, Кадашевская наб., д. 30 - адрес расположения серверного оборудования, обеспечивающего функции УЦ. 127015, Москва, Вятская ул., д. 27 - адрес предоставления услуг (адрес расположения АРМов для генерации ключей и выпуска сертификатов) http://moscow.megafon.ru
25 ОАО “НИИАС” (Открытое акционерное общество “Научно-исследовательский и проектно-конструкторский институт информатизации, автоматизации и связи на железнодорожном транспорте”) 109029, Москва, ул. Нижегородская, д.27, стр. 1 vniias.ru, pkitrans.ru 37.6957530 55.7372420
26 ООО “Альфа-сервис” (Общество с ограниченной ответственностью “Альфа-сервис”) 125375, Москва, ул.Тверская, д.7 http://www.4etp.ru http://www.4trust.ru 37.6117616 55.7588308
27 ОАО “ЕЭТП” (Открытое акционерное общество “Единая электронная торговая площадка”) 117312, Москва, пр-т 60-летия Октября, д. 9. кабинет №7 http://etp.roseltorg.ru 37.5792790 55.6987670

Удалим адреса без координат. Функция na.omit() не выдает строку фрейма данных, если хотя бы одно из полей имеет значение NA (Not Available).

map_data <- na.omit(map_data)
nrow(map_data)
## [1] 23

Выведем на карту

leaflet(data=map_data) %>% addTiles() %>% 
  clearBounds() %>% 
  addMarkers(lng=~lon, lat=~lat,popup=paste(sep = "<br>",htmlEscape(map_data$name),
                                     htmlEscape(map_data$address),
                                   map_data$url))

Находим наши координаты (Метро университет).

Примечание. Под Windows функция geocode() видимо отправляет запрос к Google не в той кодировке. Можно выполнить обходной маневр (workaround, англ.) – транслитерировать адрес латинскими буквами. Чем латинские буквы хороши? Они имеют одинаковые коды символов во всех русских кодировках

 ourAddress <- "Moskva, metro Universitet" 
 # In Mac OS X following line works fine:
 # ourAddress <- "Москва, станция метро Университет" 

ourCoord <- geocode(ourAddress)
## Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=Moskva,%20metro%20Universitet&sensor=false
ourCoord
##        lon      lat
## 1 37.53688 55.69268

Выводим адреса удостоверяющих центров рядом с метро Университет

leaflet(data=map_data) %>% addTiles() %>% 
  setView(lat=ourCoord$lat, lng=ourCoord$lon,zoom=12) %>% 
  addMarkers(lng=~lon, lat=~lat,popup=paste(sep = "<br>",htmlEscape(map_data$name),
                                     htmlEscape(map_data$address),
                                   map_data$url)) %>% 
  addCircleMarkers(fillColor = "red",lng=ourCoord$lon, lat=ourCoord$lat,popup = "метро Университет")


А можно ли было не записывать нам вручную адрес латинскими буквами? Конечно можно:

  1. Воспользоваться функцией для перевода в латиницу. См. рецепт
stri_trans_general("Москва, метро Университет", "cyrillic-latin; nfd; [:nonspacing mark:] remove; nfc")
## [1] "Moskva, metro Universitet"
  1. Воспользоваться функцией iconv() для перевода из одной русской в другую русскую кодировку
geocode(iconv("метро Университет",from = "1251",to="UTF-8"))