20.10.2017
Эффективная Навигация М2М
Меню сайта
Категории раздела
CyberFleet Скрипты для работы [10]
Приводятся разлинчые скрипты для работы с данной программой.
CyberFleet Работа с программой [24]
Методика работы, принципы, описание
Анализитор CF [13]
Скрипты анализа CyberFleet на наличие ошибок
Форма входа
Вход через Google
Вход через Вконтакте
Вход через Facebook
Партнеры
Реклама

CyberFleet: загрузка адресной базы с OSM методика
В статье не рассматриваются вопросы правомерности использования данных - т.е., есть ли у вас на основании новой лицензии разрешение на использование данных сообщества 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 воспользуемся сервисом 


где введем запрос:
<osm-script>
   <query type="way">
    <has-kv k="building" modv="" v=""/>
    <bbox-query s="52.5" w="39.4" n="52.7" e="39.8" />
  </query>
  <recurse type="way-node" />
  <union>
    <item />
    <recurse type="node-way" />
  </union>
  <print />
</osm-script>

это соответствует выборке всех полигонов, отмеченных как здание  (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 содержится вся необходимая информация, готовая к загрузке.

Что бы посмотреть сколько и что мы загружаем воспользуемся простым запросом:
SELECT 
*
 FROM [OSM_LOAD].[dbo].[ways]
 where lat is not null and street is not null

В моем случае получается более 7000 точек годных для загрузки адресов.

4. Загрузка данных в адресную базу.


Открываем Листинг 4 и
4.1. Определимся с названием новой таблицы в BN_ADDRESS. В моем случае я решил что это будет "City_Lipeck001"
Правим строку в скрипте

select @TabName='City_Lipeck001' -- название таблицы города!!! Править ТУТ!!!

Так же нужно исправить запись описание города

values ('values (''Липецк-ОСМ'',''Липецк'',''Список адресов г. Липецк'', -- строка описания города')

Запускам скрипт - на выходе получится таблица, содержащая строки нового скрипта, запустив который на сервере SQL КиберФлита вы получите (в описанном случае для Липецка) Новую таблицу в адресной базе (см. файл со скриптом).


Запустив его на сервере СyberFleet вы занесете в адресную базу информацию о вашем городе (Липецк в моем случае). Данный скрипт можно, например, передать через BNComplex на рабочее место клиента удаленно, используя механизм по удаленному обновлению CyberFleet.


Статья приведена для выполнения работ сотрудниками, с минимальными знаниями. Если вы оными не обладаете или не хотите разбираться:

Принимаются заказы на подготовку готового скрипта с требуемой вам областью для загрузки в вашу адресную базу. Стоимость одной области-таблицы 1 руб за 1 адрес, но не более 500 рублей. С вас координаты области (левый-нижний, правый-верхний углы). Формы оплата - электронные деньги. Для отправки сообщения можно использовать либо личку для пользователя LogOff (ссылка ниже), либо воспользоваться этой формой.

PS: Всех с наступающим новым годом!
PPS: В данный момент не реализована проверка наложения областей действия адресов для городов (таблица bn_address.dbo.citys)! Будьте внимательный при добавлении!!!




Источник: CyberFleet,OSM, загрузка данных, SQL. geometry, geography
Похожие материалы
Категория: CyberFleet Скрипты для работы | Добавил: logoff (24.12.2012) | Автор: Бондарь Михаил
Просмотров: 3472 | Комментарии: 14 | Теги: OSM, CyberFleet | Рейтинг: 0.0/0
Всего комментариев: 131 2 »
13  
Листинги исправил, теперь проблема найденная пользователем Oleg исправлена.

12  
Приветствую на 2 шаге появляется ошибка: "Сообщение 248, уровень 16, состояние 1, строка 62
Преобразование значения "2282188539" типа nvarchar привело к переполнению столбца типа int."
как с ней быть?
Ответ: Будет исправление к скриптам - заменится в них тип данных int на bigint для разных ID. Пришлите файл OSM для теста нового набора скриптов.

11  
так что именно говорит и на какой скрипт?

10  
Да, только дальше дело не пошло, ругается на фреймворк, может из за того что sql 2008 r2 я ставил на W7 ultimate

9  
Ты про nodeid,wayid колонки?

8  
Приветствую, Михаил.
Процесс до конца ещё не довёл, но упёрся в то, что int не хватает, число там ужо больше, соответственно сменил на bigint...

7  
Все, увидел, где ошибка! Имена индексов в процедуре в базе данных адресной строго предопределены - не увидел этого когда писал. Исправлю листинг 4. Спасибо большое!

6  

Код
QueryGO Exception: Индекс "IX_City_Shadrinsk001Main" таблицы "City_Shadrinsk001" (заданный в предложении FROM) не существует
QueryGO TEXT: EXEC BN_ADDRESS..GetNearestAdress 56.096311,63.680214,5,3

Пришлось ручками сменить на IX_City_Shadrinsk001Main и заработало

5  
Для чего? Имя индекса должно быть просто уникальным в пределах базы данных. Если у вас не выполняется первая строка, то значит такой индекс с указанным названием уже есть... 
Это может быть, если скрипт которым индекс создается выполняется повторно не на пустой базе данных.

4  
По-моему в 4 листинге нужно изменить

Код
CREATE CLUSTERED INDEX [IX_'+@TabName+'] ON [dbo].['+@TabName+']
 на

Код
CREATE CLUSTERED INDEX [IX_'+@TabName+'Main] ON [dbo].['+@TabName+']

1-10 11-13
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Поиск
TOP 10 Популярное
1 Оборудование> Гранит-Навигатор 4.14
2 Оборудование> Абонентский терминал M2M Cyber GLX
3 Оборудование> Гранит-Навигатор 4.14: Настройка терминала
4 Прочее> "Красные" против "Синих" - статистка космических запусков России (СССР) и США
5 CyberFleet, CrossPoint> CyberFleet: Переустановка CyberFleet
6 CyberFleet, CrossPoint> КиберФлит: Учет топлива при помощи датчиков
7 Оборудование> M2M Cyber GLX: отправка команд
8 Прочее> SQL: CyberFleet: Занятие №3 Объединение таблиц Часть 1/2 (теория, inner join)
9 CyberFleet, CrossPoint> КиберФлит: Причины расхождения пробега по данным одометра и карте
10 CyberFleet, CrossPoint> КиберФлит: Подключаем карту Google
Наш опрос
Какой картографией вы пользуетесь в КиберФлите?
Всего ответов: 59
LogOff © 2017
Сайт создан в системе uCoz Рейтинг GPS Клуба. GPS навигаторы. GPS мониториг. GPS трекеры. ГЛОНАСС