#1 Sun 11 February 2018 02:40
- zang
- Participant actif
- Date d'inscription: 4 Oct 2005
- Messages: 55
Corrections topologiques
Bonjour,
Sous PostgreSQL 9.5, j'ai une couche de points qui doivent se superposer à des lignes et qui ont la même projection.
Comme ce n'était pas le cas et qu'il y en avait beaucoup, je me suis inspiré de l'excellent article de Paul Ramsey :
http://blog.cleverelephant.ca/2008/04/s … stgis.html
Visuellement c'est nickel, même au zoom max, mais topologiquement l'outil de QGis me trouve toujours autant d'erreurs (ouais enfin une de moins), et la sélection spatiale prouve également ces erreurs.
Qu'est ce qui pourrait expliquer qu'une commande SQL permettant de localiser les points sur les lignes les plus proches ne génère pas une couche topologiquement parfaite?
Je joints un backup de la base test contenant lignes et points, et la couche pt_move qui est le résultat de la commande suivante :
Code:
CREATE TABLE pt_move AS SELECT DISTINCT ON (pt_id) pt_id, ln_id, ST_LineInterpolatePoint( ln_geom, ST_LineLocatePoint(ln_geom, pt_geom) ) as geom FROM ( SELECT ln.geom AS ln_geom, pt.geom AS pt_geom, ln.gid AS ln_id, pt.gid AS pt_id, ST_Distance(ln.geom, pt.geom) AS d FROM pt, ln WHERE ST_DWithin(pt.geom, ln.geom, 10.0) ORDER BY pt_id, d ) AS subquery;
D'ailleurs au passage, pourquoi dans ma base de données j'ai une couche résultat avec géométrie et l'autre identique sans géométrie?
Merci par avance,
Cdt
Franck
Dernière modification par zang (Sun 11 February 2018 18:01)
Hors ligne
#2 Sun 11 February 2018 19:43
- zang
- Participant actif
- Date d'inscription: 4 Oct 2005
- Messages: 55
Re: Corrections topologiques
Désolé j'avais pas envoyé la PJ...
Hors ligne
#3 Sun 11 February 2018 23:50
- zang
- Participant actif
- Date d'inscription: 4 Oct 2005
- Messages: 55
Re: Corrections topologiques
Bon j'ai pas mal fait de test sans succès.
J'ai réglé le problème du doublon dans les tables, certainement une table temporaire qui n'est pas effacée.
J'ai essayé de travailler directement avec du wkt, mais la couche n'est toujours pas parfaite.
Voici l'état d'avancement de la commande :
Code:
CREATE TABLE pt_move AS SELECT DISTINCT ON (pt_id) pt_id, ln_id, ST_AsEWKT(ST_LineInterpolatePoint( ln_geom, ST_LineLocatePoint(ln_geom, pt_geom) ) ) FROM ( SELECT ln.geom AS ln_geom, pt.geom AS pt_geom, ln.gid AS ln_id, pt.gid AS pt_id FROM pt, ln WHERE ST_DWithin(pt.geom, ln.geom, 10.00) ORDER BY pt_id ) AS subquery; ALTER TABLE pt_move ADD geom geometry(point,32719); UPDATE pt_move SET geom=st_asewkt; ALTER TABLE pt_move DROP st_asewkt;
Merci pour votre aide,
Franck
Hors ligne
#4 Mon 12 February 2018 10:12
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Corrections topologiques
Bonjour,
Qu'appelez-vous problèmes ?
Le WKT est moins précis que la geom (coord arrondies),
Attention: ca, ca ne marche pas: UPDATE pt_move SET geom=st_asewkt;
st_asEwkt est une fonction qui prend des paramétres (la geom)
geom est de type geometry: vous ne pouvez pas y stocker du texte.
Nicolas
Hors ligne
#5 Mon 12 February 2018 11:25
- tumasgiu
- Membre
- Lieu: Ajaccio
- Date d'inscription: 5 Jul 2010
- Messages: 1159
Re: Corrections topologiques
Salut,
les calculs d'interpolation étant effectuées avec des nombres
à virgule flottante, il se peut que des erreurs d'arrondi surviennent,
car elles sont inhérente à l'arithmétique les concernant.
Selon la précision que vous utilisez pour valider la topologie de vos données,
il y aura probablement des erreurs, même si elles ne sont pas visibles "à l'oeil nu".
Les coordonnées générées par les fonctions d'interpolation de postgis ne sont elles-même non
"consistentes" avec ses propres prédicats topologiques, par exemple :
Code:
WITH foo as (SELECT 'LINESTRING(0 0 , 10 99)'::geometry g) SELECT st_intersects(ST_LineInterpolatePoint(g,0.15) ,g) FROM foo
renvoie faux.
Pour la partie postgis, il est apparemment prévu d'ajouter dans les prochaines versions
la possibilité de choisir une tolérance pour les prédicats.
Pour le moment, on peut s'en sortir en snappant au préalable les géomètres à une grille .
Pour QGIS, si c'est le plugin de vérification topologique que vous utilisez, vous pouvez
dans la fenêtre principale régler la tolérance à appliquer .
Dernière modification par tumasgiu (Mon 12 February 2018 17:08)
Hors ligne
#6 Mon 12 February 2018 14:07
- zang
- Participant actif
- Date d'inscription: 4 Oct 2005
- Messages: 55
Re: Corrections topologiques
Quand je dis problème, c'est que mes points ne sont pas localisés sur mes lignes, topologiquement parlant ce n'est pas parfait. Je veux des couches vraiment parfaites, pour pouvoir ensuite utiliser des fonctions récursives.
Et en faisant un SELECT avec ST_Intersects sous Postgresql, il ne me trouve que peu de résultats, les points ne sont donc pas sur les lignes.
Ça vient peut-être de l'origine des lignes, récupérées d'AutoCad, je vais peut être creuser par là, essayer de lisser ou autres. Car sous QGis quand je veux ajouter un point en activant le snapping, il me le sort comme une erreur également!!?
Si vous avez d'autres pistes...
Merci
@+
Dernière modification par zang (Mon 12 February 2018 14:07)
Hors ligne
#7 Mon 12 February 2018 16:15
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: Corrections topologiques
La façon classique de travailler avec ces données est d'utiliser st_dwithin(geom1, geom2, dist), plutot que les prédicats OGC st_touches, st_intersects, etc.
Pas de souci particuliers avec du récursif.
St_dwithin permet de simuler cette précision à laquelle on veut travailler (précision des données géo).
Sinon, vous pouvez construire une topologie Postgis, où là les relations entre objets seront explicites.
Comme le disait tumasgiu, "vraiment parfaite" ca n'existe pas en informatique lorsque les réels sont représentés en double précision: il y a tjs des arrondis. (Par ex un point se trouvant a 1/3 de la longueur d'une ligne).
La question est plutot: "vraiment parfaite à la précision près".
Nicolas
Dernière modification par Nicolas Ribot (Mon 12 February 2018 16:21)
Hors ligne
#8 Tue 13 February 2018 02:13
- zang
- Participant actif
- Date d'inscription: 4 Oct 2005
- Messages: 55
Re: Corrections topologiques
Bonjour,
Effectivement QGis est très sensible au niveau topologie. Sous ArcGis, une couche topologiquement "parfaite" ne l'est pas sous QGis. Peut-être ArcGis est plus tolérant...
Avec un st_dwithin et une tolérance de 0.01, ça me sélectionne tous les points. J'en prends note pour les fonctions à venir.
Au passage, la tolérance de l'outil de vérification de QGis ne fonctionne pas bien chez moi (v2.18.12), mais ce n'est pas grave je ferai avec le st_dwithin.
Je vais donc travailler ma tolérance à l'imperfection...
Merci pour vos réponses.
Cdt
Franck
Dernière modification par zang (Tue 13 February 2018 02:14)
Hors ligne