Como preencher um gráfico não direcionado do PostGIS?

9

Esta pergunta está mais relacionada aos recursos que eu talvez ainda não tenha identificado, embora eu esteja pesquisando na web há algum tempo.

No projeto em que estou trabalhando no momento, preciso executar um algoritmo de caminho mais curto em um gráfico que represente salas de escritório, corredores, escadas, elevadores e rotas entre edifícios.

Para a camada de apresentação, pensei em usar scripts Python com o MapServer, mas agora estou pensando mais em como criar o gráfico a partir dos (shapefiles convocados para um) postGIS db gerado a partir do OpenEV, para facilitar a adição e remoção de bordas ou pesos ou informações sobre os pontos posteriormente.

Para o Python, existe um módulo chamado networkX que lida com gráficos e, embora esse problema tenha sido mencionado na troca de pilha aqui , o gráfico que estou tentando criar não é um dígrafo, mas um não-direcional.

Atualização: 5 dias atrás A rede de serviços públicos de Ben Reilly foi adicionada ao projeto networkX. A Utilitynetwork cria um gráfico direcionado a partir dos recursos shapefile.
As questões permanecem abertas para uma abordagem semelhante dos recursos de leitura do banco de dados postGIS.

user39901230
fonte
Você não quer usar o pgRouting?
Underdark
Eu usaria pgRouting, no entanto, o algoritmo que estou tentando implementar é uma estrela bidirecional e não uma opção pronta para uso.
user39901230

Respostas:

5

O NetworkX possui um método para converter gráficos direcionados em não direcionados .

Além disso, o código para ler um shapefile (ou diretório de shapefiles) não precisa realmente gerar um gráfico direcionado, é exatamente o que eu precisava no momento. Eu não tentei, mas substituindo a única linha:

net = nx.DiGraph()

... pode apenas fazer o truque.

Parece que o NetworkX suporta leitura de shapefiles imediatamente (com OGR) na versão 1.4 ( recurso ).

bwreilly
fonte
Desculpe pela confusão. Na verdade, estou tentando converter os shapefiles em um banco de dados postGIS usando shp2pgsql e depois no banco de dados postGIS para importá-lo no gráfico networkX.
user39901230
obrigado Ben. Só notei que há 5 dias eles fecharam o ticket e seu código foi adicionado ao projeto networkX. Teria sido interessante ver se seria possível fazer a mesma coisa com os recursos do banco de dados postGIS, mas vou dar uma olhada nisso durante o feriado de Natal.
user39901230
como a redex incluiu o módulo, mas ainda não lançou a versão 1.4, seria possível fornecer alguns exemplos de uso da rede de serviços públicos. Até agora, eu passei pela testnetworkload e pelas suas amostras encontradas aqui: gis.stackexchange.com/questions/210/alternatives-to-pgrouting/…
user39901230
Ainda há um pouco de trabalho a fazer sobre isso, e é por isso que não o coloquei no pypi. Eu fiz o público wiki agora, ele deve conter as melhores amostras de trabalho: bitbucket.org/gallipoli/utilitynetwork/wiki/Home
bwreilly
como planejo incluir isso no meu projeto final de graduação, seria possível também contribuir?
precisa saber é o seguinte
2

Não tenho certeza do quanto você está interessado em usar outras estruturas, ou se já conseguiu resolver isso, mas o projeto Geodjango adiciona recursos ORM agradáveis ​​aos modelos de dados GIS, para uma variedade de bancos de dados habilitados para GIS, incluindo postgres com as ligações PostGIS instaladas .

O link Geodjango está aqui: http://docs.djangoproject.com/en/dev/ref/contrib/gis/install/#overview

Observe que o Django é uma estrutura da web para python, o geodjango surgiu para editar e exibir dados GIS para o desenvolvimento da web de back-end, mas também fornece um conjunto de classes muito mais intuitivo e poderoso do que as ligações diretas do OGR em python (muito mais 'pythonic' do que diretamente 'convertido da sintaxe C', por exemplo, você pode criar uma classe django.contrib.gis.geos.linestring.LineString diretamente, em vez de criar uma classe ogr.Geometry com a constante wkbLineString no construtor).

No tutorial geodjango localizado: http://docs.djangoproject.com/en/dev/ref/contrib/gis/tutorial/

As etapas necessárias para configurar a leitura / gravação do banco de dados do Postgres são tão simples quanto usar outros modelos de django python, a dor de cabeça é configurar o banco de dados geoespacial. Portanto, para carregar dados no banco de dados do postgres, consulte o link âncora #layermapping no tutorial acima; é um mapeamento de campo entre os dados disponíveis no arquivo de formas e as colunas do banco de dados configuradas para o seu modelo de dados.

No mínimo, levaria de duas a três horas para percorrer o tutorial e configurar as ligações do PostGIS e ver se essa ferramenta GIS é o que você está procurando.

Observe também que, quando você possui um banco de dados habilitado para GIS (por exemplo, ligações PostGIS para pgsql), pode 'contém' 'dentro' diretamente nos dados de geometria do banco de dados (linhas / polígonos) usando as funções armazenadas no banco de dados (por exemplo ST_Contains(...): consulte a amostra SQL para PostGIS / pgsql aqui: http://postgis.refractions.net/docs/ch04.html#id2639062 ... ea melhor parte sobre Geodjango, é que ele é otimizado para fazer essas pesquisas espaciais para você! .

tmarthal
fonte