Trouver des pseudo-nœuds dans un logiciel SIG gratuit?

16

Le logiciel gvSIG OA Digital Edition 2010 possède des outils de topologie pour trouver des pseudo-nœuds en géométrie linéaire. J'ai défini la tolérance de cluster 0,00002 et le nombre maximum d'erreurs -10000 pour la géométrie linéaire de 20000 comptes de liaisons. Mais résultat infructueux.

Existe-t-il des solutions qui trouvent des pseudo-nœuds dans un logiciel SIG gratuit?

J'ai besoin de superposer des pseudo-nœuds (une solution à ce problème - pour utiliser la topologie des outils d'ArcInfo, mais la priorité pour moi est d'utiliser des logiciels libres). La géométrie linéaire a créé plusieurs utilisateurs dans QGIS 1.8.0 dans la base de données PostGIS (v. 2.0.1).

Ajouter une nouvelle image: 12 entités linéaires avec trois pseudo-nœuds en A (ligne 4/5), B (ligne 6/7), C (ligne 9/10). Les pseudo-nœuds doivent plutôt être des points - deux entités linéaires avec intersection en un point (nœud) doivent être une entité linéaire (ligne 4/5 - ligne 4, ...).

Est-il possible de faire une demande dans PostGIS, ce qui se traduira par une couche de pseudo-nœuds?

Ajouter une nouvelle image d'exemples de pseudo-nœuds: si je reçois pour une couche linéaire point pseudo-nœuds de couche (rects bleus) j'ai corrigé les erreurs suivantes dans la couche linéaire: A - ajouter la géométrie manquante, B - ligne coupée dans l'intersection, C - supprimer le pseudo-nœud

entrez la description de l'image ici

entrez la description de l'image ici

entrez la description de l'image ici

HasT
la source
2
Dans GRASS existe la commande rmdangle, mais en résultat le fichier shp sans pseudo noeuds. Le résultat devrait être un fichier shp (ou un autre) de pseudo-nœuds (comme gvSIG OA Digital Edition 2010)
HasT
Utilisez-vous PostGIS 2.0? Si oui, essayez les fonctions Is_Valid et Makevalid.
Giovanni Manghi
Oui, j'utilise PostGIS 2.0. Comment dois-je utiliser ces fonctions pour rechercher des pseudo-nœuds? Est-il possible de les trouver avec "PgQuery for QGIS"?
HasT
oui, vous pouvez les utiliser dans QGIS dans n'importe quel outil qui vous permet d'exécuter une requête PostGIS, comme par exemple DB Manager (qui prend en charge la coloration syntaxique et la saisie semi-automatique).
Giovanni Manghi
le point rouge dans la deuxième image est une intersection de deux géométries valides .. à droite?
vinayan

Réponses:

8

Voici une solution générique, que vous pouvez mettre en œuvre avec PostGIS ou tout autre logiciel compatible OGC.

REMARQUE: ce que je dis avant , un concept clé dans les logiciels libres et SIG est la standardisation : les meilleures solutions à adopter des normes, comme l' OGC les.


Votre problème est de "trouver des pseudo-noeuds" ... Mais je pense que c'est un peu plus, "trouver des non-pseudo-noeuds et joindre des lignes de pseudo-noeuds". Ma solution peut être utilisée pour les deux.

Les normes OGC offrent:

  • ST_Boundary (geom) : pour détecter les nœuds des lignes

  • ST_Dump (geom) : pour placer chaque nœud unique dans un enregistrement de table SQL.

  • ST_DWithin, ST_Equals, ST_SnapToGrid, ST_Snap peuvent être utilisés pour la tolérance de changement. J'utilise ST_DWithin.

Nous pouvons supposer que votre problème principal peut être spécifié avec ces objets et propriétés,

  • il n'y a que des segments de ligne (d'un segment de table ), représentés par une géométrie LINESTRING ... Je n'ai pas testé avec MULTILNE, si vous avez geometrytype = MULTIPOINT, vous pouvez diviser et caster MULTILINEs avec ST_Dump et ST_LineMerge;

  • chaque segment de ligne possède une (géométrie ID) GID et une (couleur ID) idline .

Donc, la première étape consiste à obtenir les nœuds qui proviennent de la jonction des lignes,

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;

REMARQUE: utiliser des caches car ils sont plus rapides que les vues. Utilisez "EXPLAIN SELECT ..." pour vérifier le temps CPU, cela peut prendre du temps.

Ici, les cycles et les lignes continues (de même couleur) sont détectés en tant que ncolors=1points, et les pseudo-nœuds par ncolors=2points, vous avez donc un calque avec ces points.

Votre tableau de "bons nœuds" est avec les "points limites" d'origine et sans "pseudo-nœuds".

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
la source
Merci pour la solution! J'essaie d'exécuter la requête (dans pgAdmin) mais je reçois une exception: "la fonction array_distinct (entier []) n'existe pas". Qu'est-ce que je fais mal?
HasT
Désolé, la array_distinctfonction non citée provient d'une bibliothèque postgres.cz . Pour toute autre erreur, veuillez signaler, je peux ajouter plus d'explications ici.
Peter Krauss
J'ai ajouté la fonction array_distinct. Dans la base de données, la couche linéaire a le nom de la colonne de géométrie "the_geom" (à la place "geom" dans la requête). Je remplace "geom" par "the_geom" pour "ST_Boundary (the_geom)" après l'exécution de la requête Je reçois le message "la colonne" geom "n'existe pas" dans "comme couleurs, geom FROM" place. Je remplace "comme couleurs, geom FROM" par "comme couleurs, the_geom FROM", mais je reçois à nouveau le message "colonne" the_geom "n'existe pas".
HasT
Ok, changé (voir la réponse modifiée) geomen the_geom. (ST_Dump (x)) reste comme geom, n'est pas un attribut de base de données.
Peter Krauss
Merci! La requête fonctionne. J'ai remplacé ST_DWithin sur ST_equals et pour ST_Buffer donne 0,00002 tolérance DD. En conséquence, j'ai reçu des nœuds corrects (où dans un nœud intersecte 3 entités linéaires et plus). Je veux recevoir le résultat là où dans un nœud intersecte 2 entités linéaires (FROM vw_joinnodes_full WHERE ncolors = 2;), mais recevoir la couche ponctuelle où dans un nœud intersecte 2 entités linéaires et plus. Comment recevoir le résultat là où dans un nœud intersecte seulement 2 entités linéaires?
HasT
7

Refractions Research a créé un outil Line Cleaner qui semble faire ce que vous voulez.

Line Cleaner nettoie les réseaux en simplifiant les géométries complexes, cycliques, très courtes et de longueur nulle, et en supprimant les pseudo-nœuds et les sommets insignifiants. Plus important encore, dans la phase de nettoyage, il est en mesure de garantir que les correspondances de fonctionnalités peuvent être prises en compte automatiquement

entrez la description de l'image ici

Le code source peut être trouvé sur GitHub.

RK
la source
Merci pour la réponse. Mais à la suite d'erreurs, le pseudo-nœud a besoin d'une couche de points. Ces erreurs doivent être corrigées manuellement par les utilisateurs, car il y a des moments où un nœud doit intersecter trois lignes, mais l'une des lignes sautée ou non accrochée au sommet.
HasT
Il semble que cela devrait fonctionner. Vous avez de la difficulté à comprendre exactement ce que vous essayez de dire ici. "à la suite d'erreurs, le pseudo-nœud a besoin d'une couche de points" Je ne comprends pas ce que vous entendez par là. Avez-vous besoin d'une couche de points avec des points accrochés à la fin de chaque ligne pour que cela fonctionne?
Rayner
@Rayner, ajouter une nouvelle image d'exemples de pseudo-nœuds (3): si je reçois pour la couche linéaire point pseudo-nœuds de couche (rects bleus) je corrige manuellement (pas automatiquement) les erreurs suivantes dans la couche linéaire: A - ajouter la géométrie manquante, B - cassé ligne dans l'intersection, C - supprimer le pseudo-nœud. Si je corrige automatiquement les pseudo-nœuds, j'ai laissé des erreurs aux endroits A, B.
HasT
D'accord, je comprends B et C. Lorsque vous dites "A - ajouter la géométrie manquante" qu'est-ce que cela signifie? Y a-t-il un point à ajouter là où les 2 lignes se rencontrent?
Rayner
@Rayner, cela signifie que dans 'A' il faut ajouter une fonction linéaire (rue / route selon l'imagerie). Dans А - le nœud a été préparé pour ajouter une nouvelle géométrie en fonction de l'imagerie, mais la géométrie n'a pas été ajoutée (utilisez des pseudo-nœuds de couche que je trouve non peints)
HasT
2

Solution non libre: transformateur FME + MRF + SmartCleaner

Solution gratuite GRASS v.clean (le dernier QGIS 1.8.0 avec les outils GRASS est le moyen le plus simple de l'utiliser) et d'autres outils de nettoyage de topologie

simplexio
la source
QGIS 1.8.0. Installez le plugin SEXTANTE dans le répertoire C: \ Program Files \ Quantum GIS Lisboa \ apps \ qgis \ python \ plugins (1.0.7). Charger un fichier shp linéaire dans le projet QGIS (couche CRS et projet WGS1984, transformation à la volée activée). Ensuite, j'applique «Définir la région GRASS sur le canevas» (commandes GRASS - Outils) et exécute la commande v.clean - rmdangle (Thershold = 0, entrez dir / nom pour le vecteur de sortie / erreurs). Après l'exécution, le processus reçoit l'erreur «Impossible de charger la couche: D: /error.shp Consultez le journal SEXTANTE pour rechercher les erreurs». Dans la table des matières a ajouté une nouvelle couche, couche avec des erreurs non chargée.
HasT
1
Dans GRASS existe la commande v.build.polylines - J'en reçois une de deux lignes qui se croisent dans un sommet (pseudo noeud supprimé), mais cette commande que je ne trouve pas dans le plugin
SEXTANTE
@simplexio Pouvez-vous s'il vous plaît suggérer quelle option de v.clean peut être utilisée pour identifier les pseudo-nœuds
osmjit
2

Voici les étapes pour trouver vos pseudo-nœuds en utilisant OpenJump un SIG gratuit.
QGIS et gvSIG ont le plugin Sextante, donc ces mêmes étapes devraient fonctionner aussi,
la jointure spatiale peut être légèrement différente.
J'ai utilisé la version 1.2 pour les tests.

- enregistrer la
boîte à outils Sextante des extrémités de ligne , Topologie, Extraire les extrémités des lignes -> endpt_0

- dissocier vos lignes
Boîte à outils Sextante, Outils pour les couches de lignes, Joindre des lignes adjacentes

- enregistrer la
boîte à outils Sextante des extrémités de ligne non fractionnée, Topologie, extraire les extrémités de line -> endpt_1

- les points d'extrémité supprimés par "Joindre les lignes adjacentes" sont des pseudo-nœuds. La

Outils, requêtes, requête spatiale,
couche source "endpt_0"
Relation "Intersects"
La couche de masque "endpt_1" active

ou cliquez sur Complémenter le résultat

klewis
la source
Merci d'avoir répondu! Je vais essayer de faire ces étapes dans QGIS Sextante, mais je n'y trouve pas les commandes "Extraire les extrémités des lignes" et "Rejoindre les lignes adjacentes". Il est possible d'ajouter dans QGIS Sextante (dans gvSIG 1.12 ces commandes existent) ou la commande v.build.polylines?
2012
Je viens d'installer le plugin sextante QGIS. Je ne vois pas non plus les fonctions complètes, beaucoup manquent. Il devrait être facile de tester les étapes de gvSIG sur un fichier de formes.
klewis
Je viens de vérifier le flux de travail ci-dessus dans gvSIG 2.4.0.2834 et cela fonctionne bien. J'ai substitué la dernière étape à deux autres géoprocessus de boîte à outils: premièrement, le gvSIG "Spatial Join" , deuxièmement "Filter vector layer" en utilisant DIST > 0comme expression. De plus, tous les géoprocédés peuvent être enchaînés dans un modèle SEXTANTE afin de créer un nouvel outil, par exemple "Rechercher des pseudonodes" .
Antonio Falciano
1

Avec PostGIS, vous pouvez utiliser une version modifiée de la requête pour trouver les bracelets discutés dans cette rubrique , car les pseudonodes sont des nœuds qui interceptent 2 chaînes de lignes et les bracelets sont des nœuds qui interceptent 1 chaîne de lignes.

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
la source