В статье не рассматриваются вопросы правомерности использования данных - т.е., есть ли у вас на основании новой лицензии разрешение на использование данных сообщества OpenStreetMap - вопрос к вам. Применять на свой страх и риск. Мое мнение - так как движок CyberFleet M2M Gis выводит информацию о лицензии на карту, то использование адресной базы правомерное, при использовании карты OSM.
Статья будет полезна для пользователей, адресная база которых по требуемым им в работе территориям отсутствует во флите (кросспоинте), или же не полная. Посмотреть регион на карте Google Earth, что хранится в адресной базе можно при помощи вот этого скрипта.
В работе использован сервер SQL Server 2008 R2 Standart (и думаю что заработает и под 2012 Standart как минимум), потому как скрипты опираются на использование типов данных geometry и geography. Однако, после загрузки данных во флит данные типы данных уже не используются. Для работы подойдет бесплатная версия SQL 2012 Express. Возможность работы скрипта под Express версию была проверена m2jest1c (за что ему отдельное спасибо). Так же обращаю внимание, что до версии 2008 в SQL вообще не было типов данных geometry и geography (версия 2005 и меньше не подойдет).
Для работы вам потребуется доступ к SQL Server, Management Studio для запуска скриптов (в статье использован именно он, но тут на ваше усмотрение), работой с БД.
Встала зада: загрузить адресную базу с OpenStreetMap в CyberFleet (CrossPoint).
Задачу разбиваем на несколько этапов:
1. Получить файл с osm с адресной базой в формате xml-файла.
2. Загрузить osm файл в созданную базу данных сервера (на основе примерно вот этой инструкции
3. Произвести дополнительные обработки в плане поиска центра дома, выделения адреса, переформатирования адреса.
4. Загрузить данные в базы данных BN_ADSRESS.
Выполнение работы:1. Для загрузки данных с OSM воспользуемся сервисом
где введем запрос: <has-kv k="building" modv="" v=""/> <bbox-query s="52.5" w="39.4" n="52.7" e="39.8" /> <recurse type="way-node" /> <recurse type="node-way" />
это соответствует выборке всех полигонов, отмеченных как здание (building), в прямоугольной области, ограниченной снизу-слева 52.5,39.4, а справа вверху 52.7, 39.8, т.е. городу Липецк.
Вносим указанный запрос в первое поле ввода, и жмем кнопку Quary, находящуюся рядом.
Браузер предложит Вам сохранить файл, назовите его как вам угодно (в примере это будет Lipeck.xml).
Можно просмотреть файл в блокноте или еще каком-нить редакторе - типичный xml файл.
Файл содержит больше линий (way) и точек, чем будет загружено в CyberFleet, так как при загрузке будут отфильтрованы в скриптах линии (здания) не имеющие теги улиц и номеров домов (addr:street, addr:housenumber). В принципе, возможно, можно сразу получать только данные с нужными тегами (не принимая данных об остальных), но я не очень знаком с языком запросов, посему пока так.
2. Загружаем данные в базу данных.Сначала нужно разместить полученный файл в месте, доступном для SQL сервера. Закачайте туда ваш файл - вам нужно будет в скрипте указать путь до файла относительно сервера SQL (например, если файл вы разметите в каталоге сервера c:\1\Lipeck.xml, то в скрипте вам нужно будет указать этот же путь) Подключаемся к серверу SQL.
Запускаем Management Studio, соединяемся с сервером SQL.
Сначала, создадим новую базу данных OSM_LOAD - выбрать в Обозревателе объектов Группу Базы данных, щелчком правой кнопки мышки выбираем Создать базу данных...
В качестве имени указываем OSM_LOAD, расположение нас не очень волнует.
Далее, Создаем запрос, указав в качестве текста Листинг 1.
В тексте запроса меняем строку с путем до файла на тот, где у вас размещен файл Lipeck.xml (BULK 'd:\1\Lipeck.xml' - вот тут надо изменить путь.)
Жмем выполнить. Скрипт создает 4-е таблицы, первично заполняет их, подготавливает их к дальнейшей обработке. Таблицы: [dbo].[nodes] - точки (из которых состоят линии) [dbo].[waynodes] - связь точек и линий [dbo].[ways] - линии (через waynodes связаны с точками) [dbo].[waytags] - метки линий (тут записаны адреса)
3. Дополнительно обработаем данные.Так как в OSM дома хранятся как полигоны, а в адресной базе указывается положение точки, то для каждого полигона потребуется найти его центр. Для этого воспользуемся Листингом 2.
Так же нам потребуется преобразовать из тегов адрес в строку, удобоваримую для загрузки, для этого запустим скрипт из Листинга 3.
Теперь в таблице ways содержится вся необходимая информация, готовая к загрузке.
Что бы посмотреть сколько и что мы загружаем воспользуемся простым запросом: FROM [OSM_LOAD].[dbo].[ways] where lat is not null and street is not null
В моем случае получается более 7000 точек годных для загрузки адресов.
4. Загрузка данных в адресную базу.
4.1. Определимся с названием новой таблицы в BN_ADDRESS. В моем случае я решил что это будет "City_Lipeck001" Правим строку в скрипте
select @TabName='City_Lipeck001' -- название таблицы города!!! Править ТУТ!!!
Так же нужно исправить запись описание города
values ('values (''Липецк-ОСМ'',''Липецк'',''Список адресов г. Липецк'', -- строка описания города')
Запускам скрипт - на выходе получится таблица, содержащая строки нового скрипта, запустив который на сервере SQL КиберФлита вы получите (в описанном случае для Липецка) Новую таблицу в адресной базе (см. файл со скриптом).
Статья приведена для выполнения работ сотрудниками, с минимальными знаниями. Если вы оными не обладаете или не хотите разбираться:
Принимаются заказы на подготовку готового скрипта с требуемой вам областью для загрузки в вашу адресную базу. Стоимость одной области-таблицы 1 руб за 1 адрес, но не более 500 рублей. С вас координаты области (левый-нижний, правый-верхний углы). Формы оплата - электронные деньги. Для отправки сообщения можно использовать либо личку для пользователя LogOff (ссылка ниже), либо воспользоваться этой формой.
PS: Всех с наступающим новым годом! PPS: В данный момент не реализована проверка наложения областей действия адресов для городов (таблица bn_address.dbo.citys)! Будьте внимательный при добавлении!!!
Источник: CyberFleet,OSM, загрузка данных, SQL. geometry, geography |