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

#1 ven. 20 janvier 2012 10:28

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

calibrer une route avec PostGIS, résultat incohérent

Bonjour,

Je n'obtiens pas le résultat escompté à savoir la mesure (ou KP, PK) de la projection de points sur une polyligne:

Code:

SELECT (ST_Line_Locate_Point(foo.the_line, foo_2.points))* foo3.total_length as kp
FROM
(SELECT "the_geom" AS points FROM "s17_pt" ) as foo_2,
(SELECT ST_LineMerge(

    ST_Union( "Geometry" )
    )
    
    as the_line FROM "PathLines" ) as foo,
(SELECT sum(ST_Length(
  ST_GeographyFromText(AsText("Geometry"))))/1000 As total_length FROM "PathLines") as foo3;

Il y a une erreur de 240m pour les premiers points à 7km pour les derniers points.

Pouvez-vous m'aider?

Merci

Squid

Hors ligne

 

#2 ven. 20 janvier 2012 10:55

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 734

Re: calibrer une route avec PostGIS, résultat incohérent

Squid a écrit:

Bonjour,

Je n'obtiens pas le résultat escompté à savoir la mesure (ou KP, PK) de la projection de points sur une polyligne:

Code:

SELECT (ST_Line_Locate_Point(foo.the_line, foo_2.points))* foo3.total_length as kp
FROM
(SELECT "the_geom" AS points FROM "s17_pt" ) as foo_2,
(SELECT ST_LineMerge(

    ST_Union( "Geometry" )
    )
    
    as the_line FROM "PathLines" ) as foo,
(SELECT sum(ST_Length(
  ST_GeographyFromText(AsText("Geometry"))))/1000 As total_length FROM "PathLines") as foo3;

Il y a une erreur de 240m pour les premiers points à 7km pour les derniers points.

Pouvez-vous m'aider?

Merci

Squid

Bonjour,

Pourriez-vous decrire un peu plus ce que vous souhaitez obtenir et quelles sont les données ?
Je vois un geographyFromText. Les données sont-elles en lat-long ? auquel cas il faudrait les reprojeter dans un systeme cartésien.

Nicolas

Hors ligne

 

#3 ven. 20 janvier 2012 11:28

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

Re: calibrer une route avec PostGIS, résultat incohérent

Bonjour,

Je souhaite retourner le point d'une polyligne en entrée ("PathLines"/Multilinestring) le plus proche d'un point en entrée ("s17_pt") et obtenir la mesure en kilomètre de ce point en sortie par rapport à l'origine de la polyligne.

Pour cela :
J'utilise ST_Line_Locate_Point avec comme entrée les alias foo.the line et foo2.points des requêtes

Code:

(SELECT "the_geom" AS points FROM "s17_pt" ) as foo_2,


(SELECT ST_LineMerge(

    ST_Union( "Geometry" )
    )
    
    as the_line FROM "PathLines" ) as foo

ST_Union est utilisé pour que l'ensemble de la géométrie de la polyligne soit dans un enregistrement. Ceci afin que le calcul de ST_Line_Locate_Point s'opère non pas sur chaque segment de la polyligne mais sur l'ensemble.

ST_LineMerge quant à elle convertit la géométrie de multi à simple linestring.
En effet, bien qu'ayant la version 1.5.3 de Postgis et L'info "Availability: 1.5.1 - support for MULTILINESTRINGS was introduced." dans ST_Line_Locate_Point, il me faut une linestring pour que cela marche...

Code:

(SELECT sum(ST_Length(
  ST_GeographyFromText(AsText("Geometry"))))/1000 As total_length FROM "PathLines") as foo3

Retourne la longueur totale de la polyligne ou de l'ensemble des segments.

Code:

SELECT (ST_Line_Locate_Point(foo.the_line, foo_2.points))* foo3.total_length as kp

Multipliée à la fraction entre 0 et 1 retournée par ST_Line_Locate_Point, j'obtiens la mesure kilométrique de chaque point projeté sur la polyligne.

Mais les valeurs sont trop importantes et l'écart entre la valeur souhaitée et celle obtenue s'accroit plus on s'éloigne de l'origine de la polyligne.

geographyFromText semble fonctionner car la valeur de sum(ST_Length(...)) est correcte.

Je pense qu'il y a peut être une erreur de projection.

Les points s'affichent bien dans QGIS après avoir été importés dans pgsql. Pour la route (polyligne) je ne sais pas car c'est du multilinestring et QGIS ne les lit pas.

La projection est Mercator srid 4326

Merci

Dernière modification par Squid (ven. 20 janvier 2012 11:33)

Hors ligne

 

#4 ven. 20 janvier 2012 11:44

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 734

Re: calibrer une route avec PostGIS, résultat incohérent

Le SRID 4326 n'est pas la projection Mercator, mais le systeme geocentrique, spherique (non projeté) en latitute/longitude WGS84
Les fonctions de referencement lineaires fonctionnent avec des données cartésiennes (métriques ou autre).
Sinon, les distances, etc. sont calculées en degré, ce qui n'a pas de sens. (exception faite de st_length, qui reconnait les données sphériques et calcule la distance réelle sur le sphéroid.).

Il faut donc, en amont, que vous projetiez vos données dans un systeme métrique (style lambert 93 si les données sont en france)

Nicolas

Dernière modification par Nicolas Ribot (ven. 20 janvier 2012 11:57)

Hors ligne

 

#5 ven. 20 janvier 2012 12:06

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

Re: calibrer une route avec PostGIS, résultat incohérent

Merci Nicolas,

Mes données sont mondiales, avez-vous une suggestion pour la reprojection?

Dois-je utiliser ST_Transform()?

Merci

Hors ligne

 

#6 ven. 20 janvier 2012 12:19

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 734

Re: calibrer une route avec PostGIS, résultat incohérent

Squid a écrit:

Merci Nicolas,

Mes données sont mondiales, avez-vous une suggestion pour la reprojection?

Dois-je utiliser ST_Transform()?

Merci

Hmm alors la, le probleme se complique smile : il n'existe pas de projection globale satisfaisante.

Postgis supporte le type geography, qui represente bien ces données mondiales, mais n'a pas encore toutes les fonctions disponibles pour traiter ce type de données.

Le conseil serait peut etre de decouper les données en zones UTM, qui sont des projections metriques couvrant le monde entier (sauf les poles).
Ou alors de realiser le traitement dans une fonction pl/pgsql qui utiliserait une fonction de postgis (il faut que je retrouve son nom) qui trouve la projection adequate en fonction de la donnée traitée, puis reprojeter dans cette projection locale, effectuer le calcul, puis repasser en WGS84.

(les données de travail sont confidentielles, ou on peut y jeter un coup d'oeil ?)

Nicolas

Hors ligne

 

#7 ven. 20 janvier 2012 13:17

vincentp
Membre
Lieu: Paris
Date d'inscription: 18 juil. 2006
Messages: 111

Re: calibrer une route avec PostGIS, résultat incohérent

Nicolas Ribot a écrit:

Le conseil serait peut etre de decouper les données en zones UTM, qui sont des projections metriques couvrant le monde entier (sauf les poles).
Ou alors de realiser le traitement dans une fonction pl/pgsql qui utiliserait une fonction de postgis (il faut que je retrouve son nom) qui trouve la projection adequate en fonction de la donnée traitée

_ST_BestSRID(geography)

Elle n'est cependant pas vraiment faite pour être utilisée en dehors des "bidouilles" interne de traitement des types geography. Mais ça marche.

Vincent

Hors ligne

 

#8 ven. 20 janvier 2012 14:06

Nicolas Ribot
Moderateur
Lieu: Toulouse
Date d'inscription: 9 sept. 2005
Messages: 734

Re: calibrer une route avec PostGIS, résultat incohérent

vincentp a écrit:

Nicolas Ribot a écrit:

Le conseil serait peut etre de decouper les données en zones UTM, qui sont des projections metriques couvrant le monde entier (sauf les poles).
Ou alors de realiser le traitement dans une fonction pl/pgsql qui utiliserait une fonction de postgis (il faut que je retrouve son nom) qui trouve la projection adequate en fonction de la donnée traitée

_ST_BestSRID(geography)

Elle n'est cependant pas vraiment faite pour être utilisée en dehors des "bidouilles" interne de traitement des types geography. Mais ça marche.

Vincent

Oui c'est elle
merci Vincent smile

Nico

Hors ligne

 

#9 ven. 20 janvier 2012 14:47

haubourg
Membre
Lieu: Toulouse
Date d'inscription: 7 sept. 2005
Messages: 105
Site web

Re: calibrer une route avec PostGIS, résultat incohérent

Bonjour,
concernant le rendu en multilinestring de st_linemerge, j'ai récemment trouvé la solution. Il faut ordonner les objets selon le code de route et le pk en entrée, puis faire un ST_collect et pas un st_union avant de lancer un linemerge..
Si les objets sont bien connexes, on obtient alors bien des LINESTRING, puis des LINESTRING M avec le Add_mesure..

Voili voilou.. ça mériterait une fonction toute faite dans postgis du type make_route('monschema', 'matable', 'monid_route', 'monchamppk', 'multilineOutputYesNo').. et qui envoie des sets d'erreurs pour les objets renvoyant des multilinestring  , ou un bon blog pour documenter ça..

Régis

Hors ligne

 

#10 ven. 20 janvier 2012 16:09

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

Re: calibrer une route avec PostGIS, résultat incohérent

Merci à vous.

J'ai 2m de différence pour le premier point mais 110m à l'arrivée, ce qui n'est pas viable.

Il faudrait que je travaille hors projection.

Hors ligne

 

#11 ven. 20 janvier 2012 17:57

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

Re: calibrer une route avec PostGIS, résultat incohérent

Finalement ça marche si je sélectionne le tronçon proche des points (3.5% de la route totale) et que j'utilise la zone UTM qui va bien. smile

Merci à vous.

J'ai plus qu' à développer une fonction qui découpe ma route en tronçons suivant les zones UTM en pensant aux extrémités...

Je mettrai mon code lorsque j'aurai terminé

Squid

Hors ligne

 

#12 ven. 20 janvier 2012 18:02

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

Re: calibrer une route avec PostGIS, résultat incohérent

.

Dernière modification par Squid (mar. 24 janvier 2012 10:38)

Hors ligne

 

#13 mar. 24 janvier 2012 10:49

Squid
Membre
Date d'inscription: 2 avril 2010
Messages: 109

Re: calibrer une route avec PostGIS, résultat incohérent

Une version provisoire de calculer des KP. Elle n'est valable que si l'on reste dans la zone couverte par le SRID.

Code:

CREATE OR REPLACE FUNCTION calib2(table_name_line text,table_name_point text,column_line_geometry text,column_point_geometry text, srid integer) RETURNS SETOF double precision AS $$
DECLARE
    rec record;
    ma_var double precision;
BEGIN

FOR rec IN EXECUTE ('SELECT (ST_Line_Locate_Point(foo.the_line, foo_2.points))* foo3.total_length as kp
FROM
(SELECT ST_Transform(' ||column_point_geometry|| ', '||srid||') AS points FROM ' || table_name_point || ' ) as foo_2,
(SELECT 
ST_LineMerge(
    ST_collect( ST_Transform( foo4.geom , '||srid||' ) ) )as the_line FROM (SELECT ' ||column_line_geometry|| ' as geom FROM ' || table_name_line || '  )as foo4)as foo  ,
(SELECT sum(ST_Length(
  ST_GeographyFromText(AsText(' ||column_line_geometry|| '))))/1000 As total_length FROM ' || table_name_line || ' ) as foo3;') LOOP
    ma_var:=rec.kp;
    RETURN NEXT ma_var;
  END LOOP;

END;
$$ LANGUAGE plpgsql;

BEGIN;
SELECT calib2(quote_ident('votre_nom_de_relation_route') ,quote_ident('votre_nom_de_relation_point'),quote_ident('votre_nom_de_colonne_geometrie_route'),quote_ident('votre_nom_de_colonne_geometrie_point'), votre_SRID_integer );

Merci de m'indiquer si vous voyez des améliorations possibles.

D'autre part je réfléchis sur la possibilité d'utiliser cette base de script avec plusieurs SRID suivant la zone UTM où l'on se trouve. (_ST_BestSRID(geography))

Merci.

Dernière modification par Squid (mar. 24 janvier 2012 11:55)

Hors ligne

 

#14 mar. 30 avril 2013 11:40

thom_sig
Membre
Date d'inscription: 15 avril 2013
Messages: 1

Re: calibrer une route avec PostGIS, résultat incohérent

Bonjour;

Je me permets de poster mes questions dans cette discussion car vous semblez maîtriser le sujet du calcul de PK.

Je vous expose mon problème:

Je cherche actuellement a effectuer des calculs de PK/PR sur des tronçons de routes et de cours d'eau sous Postgis.

J'ai bien compris qu'il fallait prendre en compte l'abscisse curviligne des tronçons .
Mais malgré de nombreuses recherches je ne parviens pas à savoir s'il faut que je prenne en compte la pente de ces tronçons ou non ...
Le calcul de PK/PR se fait il seulement en prenant en compte des coordonnées X, Y ?

Merci d'avance

Hors ligne

 

Pied de page des forums

Powered by FluxBB

Partagez  |