Skip to end of metadata
Go to start of metadata

В грядущем релизе NOC 0.7(3) появилась новая подсистема GIS, которая, в дальнейшем, будет активно использоваться в inventory и fault management'е для аналитики и визуализвации данных.

Географическая подсистема NOC базируется на PostGIS - spatial-расширении для PostgreSQL , для хранения и обработки векторных данных, javascript-библиотеки OpenLayers для визуализации данных и web-сервера NOC, реализующего бизнес-логику.

Карты в NOC состоят из растровых подложек (в любой момент времени может быть активна только одна подложка), поверх которой накладываются векторные слои (например, схемы кабельных трасс, показатели проникновения, и так далее), которые могут быть включены или отключены в любой момент. Выглядит все так, как будто мы взяли реальную топографическую карту или снимок аэрофотосъемки и повер него накладываем прозрачную пленку с дополнительными чертежами.

Важная разница между подложкой и векторными слоями заключается в том что подложка отображает реальную местность, то есть факт, свершившийся вне зависимости от наших деяний, в то время как наполнение наложенных векторных слоев, как правило, следы нашего творчества.

Правильный выбор подложки - один из самых ответственных шагов при начале работы с GIS, и GIS NOC не является исключением. Вся сложность ситуации заключается в том, что карта - плоская, а земля имеет форму не шара и даже не эллипсоида, а капитально побитого и покусанного со всех сторон яблока, примерно как на картинке:

Соответсвенно, существует множество различных упрощенных моделей Земли (в виде сфер и эллипсоидов разных размеров) и огромное количество способов отображения участков на поверхности эллипсоидов на плоскость, называемых проекциями. Для нас, в первую очередь, важен факт, что точка на карте не отображает реального положения на местности, так как любая проекция по определению имеет погрешность, а координаты, полученные с модных GPS и ГЛОНАСС приемников, помимо того, что сами по себе имеют погрешность, так еще и отображают координаты не на реальной поверхности земли, а на некотором виртуальном эллипсоиде. Пока мы работаем с одной подложкой - это практически незаметно, но если мы захотим поменять подложку, то с удивлением можем увидеть, что наши колодцы внезапно попали на крыши домов.

Общая мораль - подложку без особой необходимости лучше не менять.

Где взять данные для подложки? Конечно, можно использовать широко распространенные сервисы вроде Google Maps и OpenStreetmap, но зависимость от внешних сервисов не всегда допустима. Гораздо удобнее хранить карты в векторном формате у себя и работать с ними локально. Существует большое количество организаций, распространяющих векторные карты для отдельных регионов, кроме того, подобные карты ведут и местные БТИ. Вопросы приобретения карт лежат за пределами нашей статьи, поэтому не будем расписывать их подробнее. Вместо этого посмотрим, как open-source проект NOC может использовать данные open-source проекта OpenStreetMap

Нам понадобится: PostGIS 1.5, hstore (дополнительное расширение для PostgreSQL), osm2pgsql и mapnik2

  1. Загружаем в базу стили OpenStreetMap, которые мы будем использовать для отрисовки наших карт. Сначала вытаскиваем xml со стилями из репозитория OSM:

    $ cd tmp
    $ svn co http://svn.openstreetmap.org/applications/rendering/mapnik/

    Нам также понадобятся дополнительные векторные данные с береговыми линиями и границами

    $ cd mapnik
    $ ./get-coastlines.sh 

    Теперь заливаем все в нашу базу

    noc@/opt/noc$ ./noc init-mapnik-map -n "My Map" -p osm ~/tmp/mapnik/osm.xml
    ..... 

    Мы инициализировали стили для нашей растровой подложки "My Map"

  2. Берем векторные данные OpenStreetMap в формате OSM XML. Их можно получить либо экспортом области из web-интерфейса, либо воспользовавшись готовыми выгрузками GIS Lab (нам нужен *.osm.bz2). Распаковываем и сохраняем результат как map.xml. Загружаем векторные данные в базу:

    noc@/opt/noc$ ./noc import-osm-data -f <путь к map.xml> -a "My Area"
  3. Запускаем процесс рендеринга картинок. картинки имеют размер 256x256 и организованы в виде слоев. 0-й уровень содержит изображение земного шара на одной картинке. 1-й уровень содержит 4 (2x2) картинки. Каждый следующий уровень разбивает картинку предыдущего уровня на 4 (увеличивает масштаб вдвое). Используются уровни детализации с 0 по 18. Запускаем процесс рендеринга:

    noc@/opt/noc$ ./noc update-tilecache -a

     и ждем завершения.

  4. Заходим в web-интерфейс NOC, выбираем GIS > Map, смотрим, что у нас получилось и сравниваем с OpenStreetMap

2 Comments

  1. Ubuntu 14.04 x64
    NOC  15.05.1

    На шаге  "./noc init-mapnik-map -n "My Map" -p osm ~/tmp/mapnik/osm.xml"  получаю ошибку:

    Installing layer osm-world
    Traceback (most recent call last):
    File "manage.py", line 45, in <module>
    execute_from_command_line(sys.argv)
    File "/opt/noc/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 443, in execute_from_command_line
    utility.execute()
    File "/opt/noc/local/lib/python2.7/site-packages/django/core/management/__init__.py", line 382, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/opt/noc/local/lib/python2.7/site-packages/django/core/management/base.py", line 196, in run_from_argv
    self.execute(*args, **options.__dict__)
    File "/opt/noc/local/lib/python2.7/site-packages/django/core/management/base.py", line 232, in execute
    output = self.handle(*args, **options)
    File "/opt/noc/gis/management/commands/init-mapnik-map.py", line 50, in handle
    self.init_mapnik_map(options["name"], args[0])
    File "/opt/noc/gis/management/commands/init-mapnik-map.py", line 86, in init_mapnik_map
    self.sync_layer(attrs, children)
    File "/opt/noc/gis/management/commands/init-mapnik-map.py", line 303, in sync_layer
    srs=self.get_SRS(attrs["srs"]),
    File "/opt/noc/gis/management/commands/init-mapnik-map.py", line 103, in get_SRS
    srs = SRS.objects.get(srid=900913) # proj4text=proj)
    NameError: global name 'SRS' is not defined

     

  2. Unknown User (alfku)

    Та же ошибка:

    CentOS 6.7 x64
    NOC 15.05.1