Aligner automatiquement les lignes sur les points?

19

J'ai deux fichiers de formes vectoriels: un fichier est des points représentant des trous d'homme et l'autre est un fichier polyligne représentant des tuyaux menant vers et depuis les trous d'homme. J'ai besoin de couper les lignes à une distance spécifiée du trou d'homme le plus proche.

Existe-t-il un moyen facile d'accomplir cela sans le faire manuellement?

lignes -> points

Mise à jour

Selon Alexandre, j'ai exporté mes fichiers de formes au format spatialite. Je ne sais pas quoi faire ensuite.

entrez la description de l'image ici

Mise à jour # 2 J'ai créé un nouveau fichier db et importé des fichiers de formes dans le nouveau db en utilisant spatialite-gui, j'ai ajusté ma requête SQL mais comme vous pouvez le voir, j'obtiens une erreur "no such column: f.geom"

entrez la description de l'image ici

GreyHippo
la source
Dans une table spatiale (couche) Spatialite, les géométries d'entités sont enregistrées dans un attribut. Les noms peuvent être différents. Dans la table "pipe", cet attribut est appelé Géométrie. Je mettrai à jour ma réponse en supposant que mh est également un attribut Geometry.
Alexandre Neto
J'ai reçu une erreur "aucune fonction de ce type: ST_Snap". J'utilise QGIS 1.8 sur Windows 7 64 bits.
GreyHippo
Quel Spatialite avez-vous? Vous pouvez le vérifier dans QGIS> Aide> À propos
Alexandre Neto
"no such column: f.geom" - essayez avec f.Geometry
vinayan
Ma version Spatialite est 3.0.1
GreyHippo

Réponses:

26

Si vous êtes prêt à mettre vos données dans Postgis (ou Spatialite ), vous pouvez utiliser ST_Snap pour faire ce que vous voulez.

Utilisez simplement le calque de lignes \ table comme entrée, et votre calque de points comme référence, et définissez la tolérance. Quelque chose comme ça:

SELECT
    f.gid as gid,
    ST_Snap(f.Geometry, g.Geometry, 2) as geom
FROM
    pipe as f,
    (SELECT ST_Collect(Geometry) as Geometry
     FROM mh) as g

Le résultat est le suivant:

entrez la description de l'image ici

Vous pouvez ensuite mettre à jour vos géométries à l'aide de l'identifiant d'entité.

Alexandre Neto
la source
Où dois-je mettre le code "Select ... From ..."? Que signifie «utiliser l'identifiant de fonctionnalité»?
GreyHippo
Après avoir importé vos fichiers dans la base de données (postgis ou spatialite), vous pouvez utiliser DB Manager pour voir vos tables de base de données et exécuter la requête SQL (le code) dans SQL Window, puis la charger dans votre canevas. Dites-moi si cela fonctionne pour vous, puis nous ferons la mise à jour.
Alexandre Neto
Alexandre, voir la mise à jour ci-dessus. J'ai exporté le fichier vers deux fichiers spatiallite.
GreyHippo
Vous devez mettre les deux fichiers dans la même base de données Spatialite, faites simplement glisser "pipe" vers la base de données "mh.sqlite". Après cela, mettez à jour le code SQL pour changer les «points» en «mh» et les «lignes» en «pipe». Adaptez également "gid" à votre "pipe" id. Après cela, vous pouvez exécuter et charger les résultats.
Alexandre Neto
3

Je ne sais pas grand-chose sur QGIS ou GRASS, mais une recherche rapide sur Google a donné v.clean dans GRASS devrait faire l'affaire.

Jetez un oeil à ce post et celui-ci .

Alternatives à QGIS et GRASS:

Si je devais le faire dans ArcGIS, je stockerais probablement mes données dans un jeu de données d'entité dans une géodatabase fichier et créerais une topologie pour identifier les zones où la couche de points ne se trouvait pas aux extrémités des lignes. Vous pouvez ensuite corriger les erreurs à l'aide de l' inspecteur d'erreurs .

Mais, probablement la solution la plus rapide et la plus simple serait dans FME. Vous pouvez essayer d'utiliser l' outil Snapper ou mieux encore, l' outil AnchoredSnapper . Si vous utilisez AnchoredSnapper, assurez-vous que votre type de capture est la capture de point final. Bien sûr, vous aurez besoin d'une licence pour FME. Mais vous pouvez télécharger un essai de 14 jours si vous n'en avez pas.

Fezter
la source
J'ai regardé v.clean mais il n'utilise qu'une couche, j'ai besoin de comparer une couche à une autre. De plus, je cherchais davantage une option QGIS / opensource.
GreyHippo
1
@GreyHippo, GRASS est opensource
artwork21
1
Je sais que GRASS est open source mais vos autres options ne le sont pas.
GreyHippo
-1

Manière manuelle

Qgis -> Paramètres -> Options d'accrochage (et je ne suis pas sûr, mais il pourrait avoir besoin de l'extension CadTools) et activer l'édition topologique.

Manière automatique

v.clean qui se trouve dans les outils GRASS dans la boîte à outils SEXTANTE dans QGIS. Si vous avez PostGIS 2.0 alors ST_Snap et ST_SnapToGrid () (Et il n'y a aucune raison pour que vous ne puissiez pas l'utiliser, c'est un très bon outil spatial)

Voie commerciale

Outil FME et MRF (extension commerciale, j'avais une version d'évaluation. Elle était très bonne).

Je suis également intéressé par la gestion des conduites d'eau / des égouts avec des outils open source, avez-vous des indices?

simplexio
la source
Je pense que c'est ce que GreyHippo entend par "le faire manuellement". En utilisant simplement les options de capture, vous devrez déplacer chaque nœud pendant à la main pour activer la capture. Ou est-ce que je manque quelque chose?
Jake
non. j'étais aveugle.
simplexio
Simplexio, je ne veux PAS le faire manuellement. J'espérais un plugin ou un processus que je ne connais pas.
GreyHippo
Je ne pensais pas que vous pourriez utiliser GRASS v.clean sur deux couches?
GreyHippo
1
si je me souviens bien, cela peut fixer des lignes trop courtes. vous voyez, le problème que vous avez n'est pas que vos regards ne sont pas aux bons endroits, c'est que votre réseau d'égouts n'est pas topologiquement correct. Et cela ne nécessite qu'une couche de tuyaux. Chaque système de réseau public que j'ai vu suppose qu'il y a un trou d'homme à chaque intersection d'égout. Ce parcours suppose que vous souhaitez avoir une topologie correcte.
simplexio