#1 Fri 20 January 2012 10:28
- Squid
- Participant actif
- Date d'inscription: 2 Apr 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 Fri 20 January 2012 10:55
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: 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
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 Fri 20 January 2012 11:28
- Squid
- Participant actif
- Date d'inscription: 2 Apr 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 (Fri 20 January 2012 11:33)
Hors ligne
#4 Fri 20 January 2012 11:44
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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 (Fri 20 January 2012 11:57)
Hors ligne
#5 Fri 20 January 2012 12:06
- Squid
- Participant actif
- Date d'inscription: 2 Apr 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 Fri 20 January 2012 12:19
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
Hmm alors la, le probleme se complique : 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 Fri 20 January 2012 13:17
Re: calibrer une route avec PostGIS, résultat incohérent
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 Fri 20 January 2012 14:06
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
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
Oui c'est elle
merci Vincent
Nico
Hors ligne
#9 Fri 20 January 2012 14:47
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 Fri 20 January 2012 16:09
- Squid
- Participant actif
- Date d'inscription: 2 Apr 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 Fri 20 January 2012 17:57
- Squid
- Participant actif
- Date d'inscription: 2 Apr 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.
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 Fri 20 January 2012 18:02
- Squid
- Participant actif
- Date d'inscription: 2 Apr 2010
- Messages: 109
Re: calibrer une route avec PostGIS, résultat incohérent
.
Dernière modification par Squid (Tue 24 January 2012 10:38)
Hors ligne
#13 Tue 24 January 2012 10:49
- Squid
- Participant actif
- Date d'inscription: 2 Apr 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 (Tue 24 January 2012 11:55)
Hors ligne
#14 Tue 30 April 2013 11:40
- thom_sig
- Juste Inscrit !
- Date d'inscription: 15 Apr 2013
- Messages: 2
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