Исходный файл этого документа mapdemo2-geocoding-xls.Rmd
в проекте https://github.com/bivni/map-demo1
Результат (HTML): http://rpubs.com/ikochergin/169669
Берем список нужных учреждений из таблицы Excel. Используем geocode() и mutate_geocode() из библиотеки ggmap для получения координат по адресам и рисуем карту при помощи библиотеки leaflet
Я недавно столкнулся с такой задачей:
Мне нужно получить электронную подпись для отправки документов в налоговою инспекцию через сайт Госуслуги. С сайта 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
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 = "метро Университет")
А можно ли было не записывать нам вручную адрес латинскими буквами? Конечно можно:
stri_trans_general("Москва, метро Университет", "cyrillic-latin; nfd; [:nonspacing mark:] remove; nfc")
## [1] "Moskva, metro Universitet"
iconv()
для перевода из одной русской в другую русскую кодировкуgeocode(iconv("метро Университет",from = "1251",to="UTF-8"))