Как заполнить неориентированный граф из PostGIS?

9

Этот вопрос больше относится к ресурсам, которые я, возможно, еще не определил, хотя я некоторое время искал в Интернете.

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

Для уровня презентации я подумал об использовании сценариев Python с MapServer, но теперь я больше думаю о том, как построить график из (шейп-файлов, преобразованных в) базы данных postGIS, сгенерированной из OpenEV, чтобы можно было легко добавлять и удалять ребра или вес или информация о баллах впоследствии.

Для Python есть модуль под названием networkX, который имеет дело с графами, и хотя эта проблема была поднята здесь в stackexchange , граф, который я пытаюсь построить, является не орграфом , а однонаправленным .

Обновление: 5 дней назад служебная сеть Бена Рейли была добавлена ​​в проект networkX. Utilitynetwork строит ориентированный граф из функций шейп-файлов.
Вопросы остаются открытыми для аналогичного подхода к чтению функций из базы данных postGIS.

user39901230
источник
Вы не хотите использовать pgRouting?
Подземье
Я бы использовал pgRouting, однако алгоритм, который я пытаюсь реализовать, является двунаправленным, а не готовым вариантом.
user39901230

Ответы:

5

В NetworkX есть метод для преобразования ориентированных графов в неориентированные .

Кроме того, код для чтения шейп-файла (или каталога шейп-файлов) на самом деле не должен выводить ориентированный граф, это как раз то, что мне было нужно в то время. Я не пробовал, но заменил одну строку:

net = nx.DiGraph()

... может просто сделать трюк.

Похоже, что NetworkX будет поддерживать чтение шейп-файлов из коробки (с OGR) в версии 1.4 ( функция ).

bwreilly
источник
извините за путаницу. На самом деле я пытаюсь преобразовать шейп-файлы в базу данных postGIS, используя shp2pgsql, а затем из базы данных postGIS, чтобы импортировать ее в график networkX.
user39901230
спасибо Бен Просто заметил, что 5 дней назад они закрыли тикет, и ваш код был добавлен в проект networkX. Было бы интересно посмотреть, можно ли сделать то же самое с функциями из базы данных postGIS, но я посмотрю на это в рождественские праздники.
user39901230
Так как networkx включил модуль, но еще не выпустил v1.4, можно привести некоторые примеры использования утилиты network. До сих пор я обезжиренное через testnetworkload и через ваши образцы здесь: gis.stackexchange.com/questions/210/alternatives-to-pgrouting/...
user39901230
Над этим еще предстоит поработать, поэтому я не включил его в pypi. Теперь я опубликовал вики, она должна содержать лучшие рабочие образцы: bitbucket.org/gallipoli/utilitynetwork/wiki/Home
bwreilly
так как я планирую включить это в мой последний проект бакалавриата, я смогу также внести свой вклад?
user39901230
2

Не уверен, насколько вы заинтересованы в использовании других платформ, или если вы уже решили эту проблему, но проект Geodjango добавляет действительно хорошие функции ORM в модели данных ГИС для различных баз данных с поддержкой ГИС, включая postgres с установленными привязками PostGIS. ,

Ссылка на Геоджанго находится здесь: http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#overview

Обратите внимание, что Django - это веб-фреймворк для Python. Geodjango начал редактировать и отображать ГИС-данные для веб-разработки бэкенда, но он также предоставляет гораздо более интуитивный и мощный набор классов, чем прямые привязки Python OGR (гораздо более «питонические», чем непосредственно «преобразован из синтаксиса C», например, вы можете создать класс django.contrib.gis.geos.linestring.LineString напрямую, а не создавать класс ogr.Geometry с константой wkbLineString в конструкторе).

В учебном пособии по геоджанго расположено: http://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/

Шаги, необходимые для настройки чтения / записи из вашей базы данных Postgres, так же просты, как и использование других моделей Python django, головной болью является настройка вашей геопространственной базы данных. Итак, чтобы загрузить данные в базу данных postgres, см. Ссылку на привязку #layermapping в руководстве выше; это отображение поля между доступными данными в файле формы и столбцами базы данных, которые настроены для вашей модели данных.

По крайней мере, я бы потратил 2-3 часа на изучение учебника и настройку привязок PostGIS и выяснил, нужен ли вам этот ГИС-инструмент.

Также обратите внимание, что когда у вас есть база данных с поддержкой ГИС (например, привязки PostGIS для pgsql), вы можете «содержать» «внутри» непосредственно в данных геометрии базы данных (линии / полигоны), используя хранимые функции базы данных (например ST_Contains(...): см. Пример SQL для PostGIS / PgSQL здесь: http://postgis.refractions.net/docs/ch04.html#id2639062 ... и лучшая часть о GeoDjango, является то , что она оптимизирована , чтобы сделать эту пространственную Lookups для вас! .

tmarthal
источник