Jak wypełnić wykres bezkierunkowy z PostGIS?

9

To pytanie jest bardziej związane z zasobami, których mógłbym jeszcze nie zidentyfikować, chociaż przeszukiwałem internet od jakiegoś czasu.

W projekcie pracuję w tej chwili, muszę uruchomić algorytm najkrótszej ścieżki na wykresie przedstawiającym pokoje biurowe, korytarze, schody, windy i trasy między budynkami.

W przypadku warstwy prezentacji pomyślałem o użyciu skryptów Python z MapServer, ale teraz zastanawiam się, jak zbudować wykres z (plików kształtów przekonwertowanych na) db wygenerowanych z OpenEV bazy danych postGIS, aby łatwo było dodawać i usuwać krawędzie lub wagi lub informacje o punktach później.

Dla Pythona istnieje moduł o nazwie NetworkX że zajmuje się wykresami i chociaż kwestia ta została wychowana w Stack Exchange Network tutaj , wykres Staram się budować nie jest digraph ale undirectional jeden.

Aktualizacja: 5 dni temu sieć projektowa Ben Reilly została dodana do projektu networkX. Program Utilitynetwork tworzy ukierunkowany wykres na podstawie funkcji pliku kształtu.
Pytania pozostają otwarte dla podobnego podejścia do czytania funkcji z bazy danych postGIS.

użytkownik39901230
źródło
Nie chcesz używać pgRouting?
podmrok
Użyłbym pgRouting, jednak algorytm, który próbuję zaimplementować, jest dwukierunkową gwiazdką, a nie gotową opcją.
user39901230,

Odpowiedzi:

5

NetworkX ma metodę konwersji ukierunkowanych wykresów na niekierowane .

Dodatkowo kod do odczytu pliku shapefile (lub katalogu plików shapefile) tak naprawdę nie musi generować ukierunkowanego wykresu, właśnie tego potrzebowałem w tym czasie. Nie próbowałem, ale zastępuję pojedynczą linię:

net = nx.DiGraph()

... może po prostu załatwić sprawę.

NetworkX wygląda na to, że będzie obsługiwał odczyt plików kształtów po wyjęciu z pudełka (z OGR) w wersji 1.4 ( funkcja ).

bwreilly
źródło
przepraszam za zamieszanie. W rzeczywistości próbuję przekonwertować pliki shapefile na bazę danych postGIS za pomocą shp2pgsql, a następnie z bazy danych postGIS, aby zaimportować go na wykresie networkX.
user39901230,
dzięki Ben. Właśnie zauważyłem, że 5 dni temu zamknęli bilet i twój kod został dodany do projektu networkX. Byłoby ciekawie zobaczyć, czy można by zrobić to samo z funkcjami z bazy danych postGIS, ale przyjrzę się temu podczas świąt Bożego Narodzenia.
user39901230,
skoro networkx zawarł moduł, ale jeszcze nie wydał wersji 1.4, można by podać przykłady użycia sieci narzędziowej. Do tej pory przejrzałem sieć testową i twoje próbki znalezione tutaj: gis.stackexchange.com/questions/210/alternatives-to-pgrouting/…
user39901230
Jest jeszcze trochę do zrobienia, dlatego nie umieściłem go na pypi. Zrobiłem społeczeństwu wiki teraz, powinna ona zawierać najlepsze próbki pracy: bitbucket.org/gallipoli/utilitynetwork/wiki/Home
bwreilly
skoro planuję uwzględnić to w moim ostatnim roku studiów licencjackich, czy byłbym w stanie wnieść swój wkład?
user39901230
2

Nie jestem pewien, czy jesteś zainteresowany korzystaniem z innych frameworków lub czy już to rozwiązałeś, ale projekt Geodjango dodaje naprawdę ładne funkcje ORM do modeli danych GIS dla różnych baz danych obsługujących GIS, w tym postgres z zainstalowanymi powiązaniami PostGIS .

Link do Geodjango znajduje się tutaj: http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#overview

Zauważ, że Django jest strukturą internetową dla Pythona, geodjango zaczął edytować i wyświetlać dane GIS na potrzeby programowania stron WWW, ale daje także znacznie bardziej intuicyjny i potężny zestaw klas niż bezpośrednie wiązania pythonowe OGR (znacznie bardziej „pythoniczne” niż bezpośrednio „przekonwertowane ze składni C”, np. możesz bezpośrednio utworzyć klasę django.contrib.gis.geos.linestring.LineString zamiast tworzyć klasę ogr.Geometry ze stałą wkbLineString w konstruktorze).

W samouczku geodjango znajduje się: http://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/

Kroki potrzebne do skonfigurowania odczytu / zapisu z bazy danych Postgres są tak proste, jak użycie innych modeli python django, ból głowy polega na skonfigurowaniu geoprzestrzennej bazy danych. Aby załadować dane do bazy danych Postgres, zobacz odnośnik #layermapping w powyższym samouczku; jest to odwzorowanie pola między dostępnymi danymi w pliku kształtu na kolumny bazy danych, które są ustawione dla twojego modelu danych.

Zajmę co najmniej 2-3 godziny, aby przejrzeć samouczek i skonfigurować powiązania PostGIS i sprawdzić, czy to narzędzie GIS jest tym, czego szukasz.

Zauważ również, że jeśli masz bazę danych obsługującą GIS (np. Powiązania PostGIS dla pgsql), możesz wykonać „zawiera” „bezpośrednio” na danych geometrii bazy danych (linie / wielokąty) za pomocą funkcji przechowywanych w bazie danych (np . ST_Contains(...): zobacz przykładowy SQL dla postgis / pgsql tutaj: http://postgis.refractions.net/docs/ch04.html#id2639062 ... i najlepsza część o Geodjango, jest to, że jest on zoptymalizowany do zrobienia tych wyszukiwań przestrzennych dla ciebie! .

tmarthal
źródło