Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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)


Fichier(s) joint(s) :
Pour accéder aux fichiers vous devez vous inscrire.

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

 

Pied de page des forums

Powered by FluxBB