Come popolare un grafico non indirizzato da PostGIS?


9

Questa domanda è più legata alle risorse che potrei non aver ancora identificato, anche se ho cercato nel web per un po '.

Nel progetto al momento sto lavorando per eseguire un algoritmo a percorso più breve su un grafico che rappresenta uffici, corridoi, scale, ascensori e percorsi tra gli edifici.

Per il livello di presentazione ho pensato di usare lo scripting Python con MapServer, ma ora sto riflettendo su come costruire il grafico dal (shapefile convocato in un) db postGIS generato da OpenEV in modo che sia facile aggiungere e rimuovere bordi o pesi o informazioni sui punti in seguito.

Per Python esiste un modulo chiamato networkX che si occupa di grafici, e sebbene questo problema sia stato sollevato in stackexchange qui , il grafico che sto provando a costruire non è un digraph ma uno non direzionale.

Aggiornamento: 5 giorni fa la rete di servizi di Ben Reilly è stata aggiunta al progetto networkX. Utilitynetwork crea un grafico diretto dalle funzionalità dello shapefile.
Le domande rimangono aperte per un approccio simile di lettura delle funzionalità dal database postGIS.


Non vuoi usare pgRouting?
underdark

Vorrei usare pgRouting, tuttavia l'algoritmo che sto cercando di implementare è una stella bidirezionale e non un'opzione standard.
user39901230

Risposte:


5

NetworkX ha un metodo per convertire i grafici diretti in quelli non indirizzati .

Inoltre, il codice per leggere uno shapefile (o una directory di shapefile) non ha davvero bisogno di generare un grafico diretto, è proprio quello di cui avevo bisogno in quel momento. Non ho provato, ma sostituendo la riga singola:

net = nx.DiGraph()

... potrebbe semplicemente fare il trucco.

NetworkX sembra supporterà la lettura di shapefile pronti all'uso (con OGR) in 1.4 ( funzione ).


dispiace per la confusione. Quello che sto effettivamente cercando di fare è convertire gli shapefile in un database postGIS usando shp2pgsql e quindi dal database postGIS per importarlo nel grafico networkX.
user39901230

grazie Ben. Ho appena notato che 5 giorni fa hanno chiuso il ticket e il tuo codice è stato aggiunto al progetto networkX. Sarebbe stato interessante vedere se fosse possibile fare la stessa cosa con le funzionalità del database postGIS, ma lo guarderò durante le vacanze di Natale.
user39901230,

dal momento che networkx ha incluso il modulo ma non ancora rilasciato la versione 1.4 sarebbe possibile fornire alcuni esempi dell'uso di utilitynetwork. Finora ho sfogliato il testnetworkload e attraverso i tuoi campioni trovati qui: gis.stackexchange.com/questions/210/alternatives-to-pgrouting/…
user39901230

C'è ancora un po 'di lavoro da fare su questo, motivo per cui non l'ho messo su Pypi. Ho reso pubblico il wiki ora, dovrebbe contenere i migliori esempi di lavoro: bitbucket.org/gallipoli/utilitynetwork/wiki/Home
bwreilly,

dal momento che ho intenzione di includerlo nel mio ultimo anno di laurea, sarebbe anche possibile che io contribuissi?
user39901230


2

Non sei sicuro di quanto ti interessi utilizzare altri framework o se hai già risolto questo problema, ma il progetto Geodjango aggiunge funzioni ORM davvero interessanti ai modelli di dati GIS, per una varietà di database abilitati GIS, inclusi postgres con i collegamenti PostGIS installati .

Il link Geodjango è qui: http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#overview

Si noti che Django è un framework Web per Python, geodjango è nato per modificare e visualizzare i dati GIS per lo sviluppo web back-end, ma offre anche un set di classi molto più intuitivo e potente rispetto ai binding Python OGR diretti (molto più 'pythonic' piuttosto che direttamente "convertito dalla sintassi C", ad esempio è possibile creare direttamente una classe django.contrib.gis.geos.linestring.LineString anziché creare una classe ogr.Geometry con costante wkbLineString nel costruttore).

Nel tutorial geodjango che si trova: http://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/

I passaggi necessari per configurare la lettura / scrittura dal tuo database Postgres sono semplici come usare altri modelli di django python, il mal di testa sta configurando il tuo database geospaziale. Quindi, per caricare i dati nel database postgres, vedere il link anchor #layermapping nel tutorial sopra; è una mappatura dei campi tra i dati disponibili nel file di forma alle colonne del database che sono impostate per il modello di dati.

Per lo meno, impiegherei 2-3 ore per seguire il tutorial e impostare i collegamenti PostGIS e vedere se questo strumento GIS è quello che stai cercando.

Si noti inoltre che quando si dispone di un database abilitato GIS (ad es. Collegamenti PostGIS per pgsql) è possibile eseguire "contiene" "direttamente" sui dati della geometria del database (linee / poligoni) utilizzando le funzioni memorizzate del database (ad esempio ST_Contains(...): vedere l'esempio SQL per PostGIS / pgsql qui: http://postgis.refractions.net/docs/ch04.html#id2639062 ... e la parte migliore di Geodjango, è che è ottimizzato per fare queste ricerche spaziali per te! .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.