Encontrando pseudo-nós no software GIS gratuito?

16

O software gvSIG OA Digital Edition 2010 possui topologia de ferramentas para encontrar pseudo nós na geometria linear. Defino a tolerância do cluster 0,00002 e o número máximo de erros -10000 para a geometria linear da contagem de 20000 links. Mas resultado sem sucesso.

Existem soluções que encontram pseudo-nós no software GIS gratuito?

Eu preciso colocar os pseudo nós em camadas (uma solução para esse problema - usar a topologia de ferramentas do ArcInfo, mas a prioridade para mim é usar o software livre). A geometria linear criou vários usuários no QGIS 1.8.0 no banco de dados PostGIS (v. 2.0.1).

Adicione uma nova imagem: 12 recursos lineares com três pseudo nós em A (linha 4/5), B (linha 6/7), C (linha 9/10). Os pseudo nós devem ser pontos - duas características lineares com interseção em um ponto (nó) devem ser uma característica linear (linha 4/5 - linha 4, ...).

É possível fazer uma solicitação no PostGIS, o que resultará em uma camada de pseudo nós?

Adicione nova imagem de exemplos pseudo-nós: se eu receber para pseudo-nós da camada linear da camada pontual (rects em azul), corrigi os seguintes erros na camada linear: A - adicione geometria ausente, B - linha quebrada na interseção, C - remova o pseudo nó.

insira a descrição da imagem aqui

insira a descrição da imagem aqui

insira a descrição da imagem aqui

HasT
fonte
2
No GRASS existe o comando rmdangle, mas no resultado shp-file sem pseudo nós. Em resultado deve ser shp-arquivo (ou outro) de nós pseudo (como gvSIG OA Digital Edição 2010)
tens
Você usa o PostGIS 2.0? Se sim, tente as funções Is_Valid e Makevalid.
Giovanni Manghi
Sim, eu uso o PostGIS 2.0. Como devo usar essas funções para pesquisar pseudo nós? É possível encontrá-los com "PgQuery for QGIS"?
tens
Sim, você pode usá-los no QGIS em qualquer ferramenta que permita executar uma consulta PostGIS, como, por exemplo, o DB Manager (que suporta realce de sintaxe e preenchimento automático).
Giovanni Manghi
o ponto vermelho na segunda foto é uma interseção de duas geometrias válidas ... certo?
Vinayan

Respostas:

8

Aqui está uma solução genérica, que você pode implementar com o PostGIS ou qualquer outro software compatível com OGC.

NOTA: como eu disse antes , um conceito-chave no software livre e no SIG é a padronização : as melhores soluções adotam padrões, como os OGC .


Seu problema é "encontrar pseudo-nós" ... Mas acho que é um pouco mais ", encontrar não-pseudo-nós e juntar linhas de pseudo-nós". Minha solução pode ser usada para ambos.

Os padrões OGC oferecem:

  • ST_Boundary (geom) : para detectar os nós das linhas

  • ST_Dump (geom) : para colocar cada nó único em um registro da tabela SQL.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap podem ser usados ​​para tolerância a alterações. Estou usando ST_DWithin.

Podemos supor que seu problema principal possa ser especificado com esses objetos e propriedades,

  • há apenas segmentos de linha (de uma tabela LineSegment ), representado por uma geometria LINESTRING ... Eu não testado com MULTILNE, se você tem GeometryType = multiponto, você pode dividir e multilines elenco com ST_Dump e ST_LineMerge;

  • cada segmento de linha possui um gid (ID da geometria) e um idline (ID da cor) .

Portanto, o primeiro passo é obter os nós resultantes da junção de linhas,

CREATE TABLE cache_bounds AS
  SELECT gid as gid_seg, (ST_Dump(ST_Boundary(the_geom))).geom AS the_geom,
         gid as color 
         -- if you not have something for "color label" of lines, use gid.
  FROM linesegment;
ALTER TABLE cache_bounds ADD column gid serial PRIMARY KEY;

CREATE TABLE cache_joinnodes AS
  -- Use your TOLERANCE instead "1" at ST_DWithin and ST_Buffer.
  SELECT *, array_length(colors,1) as ncolors FROM (
   SELECT gid, array_distinct(array_cat(a_colors,b_colors)) as colors, the_geom FROM (
    SELECT 
      a.gid, array_agg(a.color) as a_colors, array_agg(b.color) as b_colors
      , st_buffer(a.the_geom,1) as the_geom -- any one to represent the join point.
    FROM cache_bounds a, cache_bounds b 
    WHERE a.gid>b.gid AND ST_DWithin(a.the_geom,b.the_geom,1)
    -- use ST_equals(a.the_geom,b.the_geom) if no tolerance.
    GROUP BY a.gid, a.the_geom
   ) as t
  ) as t2;

NOTA: usando caches porque eles são mais rápidos que visualizações. Use "EXPLAIN SELECT ..." para verificar o tempo da CPU, isso pode levar um longo tempo.

Aqui, os ciclos e as linhas contínuas (da mesma cor) são detectados como ncolors=1pontos, e os pseudo nós por ncolors=2pontos; portanto, você tem uma camada com esses pontos.

Sua tabela de "bons nós" está com os "pontos limite" originais e sem "pseudo-nós".

CREATE VIEW vw_joinnodes_full AS
  SELECT b.*, j.ncolors
  FROM cache_joinnodes j INNER JOIN cache_bounds b 
       ON j.gid=b.gid;

CREATE TABLE cache_good_nodes AS
  SELECT *  
  FROM vw_joinnodes_full 
  WHERE ncolors=1 OR ncolors>2;

-- IF NEED ... CREATE VIEW vw_correct_linesegment AS ... 
Peter Krauss
fonte
Obrigado pela solução! Tento executar a consulta (em pgAdmin), mas recebo a exceção: "a função array_distinct (número inteiro []) não existe". O que estou fazendo de errado?
tens
Desculpe, a array_distinctfunção não citada é de uma biblioteca postgres.cz . Quaisquer outros erros, por favor relate, posso adicionar mais explicações aqui.
Peter Krauss
Eu adicionei a função array_distinct. Na camada linear do banco de dados, tenha o nome da coluna de geometria "the_geom" (em vez de "geom" na consulta). Substituo "geom" por "the_geom" por "ST_Boundary (the_geom)". Após executar a consulta, recebo a mensagem "coluna" geom "não existe" em "como cores, geom FROM". Substituo "como cores, geom FROM" para "como cores, the_geom FROM", mas recebo novamente a mensagem "coluna" the_geom "não existe".
tens
Ok, alterado (consulte a resposta editada) geompara the_geom. (ST_Dump (x)) permanece como geom, não é um atributo do banco de dados.
Peter Krauss
Obrigado! Consulta funciona. Substituí ST_DWithin em ST_equals e, por ST_Buffer, forneço tolerância de 0,00002 DD. Como resultado, recebi nós corretos (em que um nó cruza 3 e mais recursos lineares). Eu quero receber resultado em que um nó cruza 2 recursos lineares (FROM vw_joinnodes_full WHERE ncolors = 2;), mas a camada de ponto recebido em que um nó cruza 2 e mais recursos lineares. Como receber resultado em que um nó cruza apenas 2 recursos lineares?
tens
7

A Refractions Research criou uma ferramenta Line Cleaner que parece fazer o que você deseja.

O Line Cleaner limpa redes, simplificando geometrias complexas, cíclicas, muito curtas e de comprimento zero, e removendo pseudo-nós e vértices insignificantes. Mais significativamente, na fase de limpeza, é capaz de garantir que as correspondências de recursos sejam consideradas automaticamente

insira a descrição da imagem aqui

O código fonte pode ser encontrado no GitHub.

RK
fonte
Obrigado pela resposta. Mas, como resultado de erros, o pseudo-nó precisa de uma camada de pontos. Esses erros devem ser corrigidos manualmente pelos usuários, pois há momentos em que um nó cruza três linhas, mas uma delas pulou ou não foi ajustada ao vértice.
tens
Parece que deve funcionar. Tendo dificuldade em entender exatamente o que você está tentando dizer aqui. "como resultado de erros, o pseudo-nó precisa de uma camada de pontos" Eu não entendo o que você quer dizer com isso. Você precisa de uma camada de pontos com pontos encaixados no final de cada linha para que isso funcione?
22412 Rayner
@ Rayner, adicione nova imagem de exemplos pseudo-nós (3): se eu receber para pseudo-nó de camada linear de camada de ponto (rects azuis), eu corrijo manualmente (não automaticamente) os próximos erros na camada linear: A - adicione geometria ausente, B - encaixei linha na interseção, C - remova o pseudo nó. Se eu corrigir pseudo nós automaticamente, deixei erros nos lugares A, B.
tens
Ok, eu entendo B e C. Quando você diz "A - adicione geometria ausente", o que isso significa? Existe um ponto que precisa ser adicionado onde as duas linhas se encontram?
22412 Rayner
@ Rayner, significa que, em 'A', deve ser adicionado um recurso linear (rua / estrada de acordo com as imagens). Em А - nó foi preparado para adicionar nova geometria de acordo com as imagens, mas a geometria não acrescentou (geometria da camada de uso nós pseudo eu não encontrar pintado)
tens
2

Solução não livre: transformador FME + MRF + SmartCleaner

Solução gratuita GRASS v.clean (o QGIS 1.8.0 mais recente com ferramentas GRASS é a maneira mais fácil de usá-lo) e outras ferramentas de limpeza de topologia

simplexio
fonte
QGIS 1.8.0. Instale o plug-in SEXTANTE no diretório C: \ Arquivos de programas \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7). Carregue o arquivo shp linear no projeto QGIS (camada CRS e projeto WGS1984, transformação "on the fly" ativada). Em seguida, aplico 'Definir região GRASS na tela' (comandos GRASS - Ferramentas) e executo o comando v.clean - rmdangle (Thershold = 0, insira dir / name para o vetor de saída / erros). Após a execução do processo, receba o erro 'Não foi possível carregar a camada: D: /error.shp Verifique o log do SEXTANTE para procurar erros'. No sumário adicionado nova camada, camada com erros não carregados.
tens
1
Na grama v.build.polylines comando existe - eu receber uma de duas linhas que cruza em um vértice (nó pseudo excluído), mas este comando não encontrar em SEXTANTE plug-in
tens
@simplexio Você pode por favor sugerir qual opção de v.clean pode ser usado para identificar os pseudo-nós
osmjit
2

Aqui estão as etapas para encontrar seus pseudo nós usando o OpenJump, um GIS gratuito.
O QGIS e o gvSIG possuem o Sextante Plugin; portanto, essas mesmas etapas também devem funcionar,
a junção espacial pode ser um pouco diferente.
Eu usei a versão 1.2 para testar.

- save the Line endpoints
Sextante caixa de ferramentas, Topologia, endpoints Extrato de linhas -> endpt_0

- unsplit suas linhas
Sextante caixa de ferramentas, ferramentas para camadas de linha, participar de linhas adjacentes

- salvar a endpoints linha unsplit
Sextante caixa de ferramentas, topologia, extrato finais pontos de line -> endpt_1

- os pontos finais removidos por "Unir linhas adjacentes" são pseudo nós

Ferramentas, Consultas, Consulta espacial,
Camada de origem "endpt_0"
Relação "Interseção"
A camada de máscara "endpt_1"

ativa ou clica em Resultado do complemento

klewis
fonte
Obrigado pela resposta! Estou tentando fazer essas etapas no QGIS Sextante, mas não encontro os comandos "Extrair pontos finais de linhas" e "Unir linhas adjacentes". É possível adicionar no QGIS Sextante (no gvSIG 1.12 existem comandos) ou no comando v.build.polylines?
HasT
Acabei de instalar o plugin sextante QGIS. Também não vejo todas as funções, muitas estão faltando. Deve ser fácil testar as etapas no gvSIG em um shapefile.
klewis
Acabei de verificar o fluxo de trabalho acima no gvSIG 2.4.0.2834 e funciona bem. Substituí a etapa final por outras duas geoprocessos da caixa de ferramentas: primeiro, o gvSIG "Spatial Join" , depois o "Filter vector layer" usando DIST > 0como expressão. Além disso, todos os geoprocessos podem ser encadeados em um modelo SEXTANTE para criar uma nova ferramenta, por exemplo, "Localizar pseudonodos" .
Antonio Falciano 30/08
1

Com o PostGIS, você pode usar uma versão modificada da consulta para encontrar dangles discutidos neste tópico , pois pseudonodes são nós que interceptam 2 cadeias de linhas e dangles são nós que interceptam 1 cadeia de linhas.

WITH nodes AS 
(SELECT ST_StartPoint(geom) AS pt FROM
linestring_table UNION ALL 
SELECT ST_EndPoint(geom) AS pt FROM
linestring_table) 
SELECT pt FROM nodes
GROUP BY pt HAVING count(*) = 2;
Gauchoguitar10
fonte