Je suis assez nouveau sur Postgres et PostGIS.
J'essaie de faire une simple correspondance de carte (ou inférence de chemin si vous le souhaitez) de certains points GPS. J'utilise des postgres (postgis) .
J'ai un tableau dans ma base de données contenant mes points GPS: gpspoints (Lat, Long, temps, vitesse, azimut, géométrie, ...)
J'ai également importé un shapefile du réseau routier dans ma base de données: itinéraires (gid, idrte, version, nomrte, norte, clsrte, geom, ...) - JE N'AI PAS L'azimut des liens, et je suis Je ne sais pas comment le calculer en utilisant la fonction postgis ST_azimuth. Tout ce que j'ai, c'est un fichier de formes du réseau routier contenant les colonnes énumérées ci-dessus.
Je veux associer chaque point GPS au lien le plus proche (dans un tampon de 20 mètres autour du point) uniquement si la direction du lien correspond à l'azimut du point GPS (+ ou -15 degrés) et récupérer la position projetée. Sinon, je veux qu'il recherche le lien NEXT le plus proche, dans le tampon de 20 mètres, qui a un azimut acceptable! (Tout comme l'image!)
Je veux que les nouvelles coordonnées des points GPS projetés soient ajoutées dans le tableau "gpspoints" comme "projectionLat" et "projectionLong".
(Dans l'image ci-dessous, les points réels sont illustrés à l'aide d'une direction tandis que les points projetés n'ont pas de repère de direction)
la source
ST_Azimuth
, mais gardez à l'esprit qu'il vous indiquera l'azimut par rapport au sens de la numérisation .Réponses:
Je n'ai pas de réponse complète, mais peut-être assez pour vous aider à démarrer. Ces fonctions pourraient aider:
ST_Line_Locate_Point () donne la distance en tant que partie de la longueur de ligne totale d'un point le long d'une ligne. ST_Line_Interpolate_Point () renvoie une géométrie de point pour un point à une distance donnée (à nouveau en tant que partie de la longueur totale) le long d'une ligne.
Ce que je lui suggère pour obtenir la géométrie du point d'un emplacement 'new_pts' sur votre ligne qui est le plus proche de vos gpspoints (dans une sous-requête ci-dessous, formulée comme une clause WITH). Utilisez ensuite ce point pour trouver le point le plus proche sur la ligne, mais à une distance très légèrement inférieure, il sera donc plus proche du début. Ensuite, utilisez ce point trouvé, avec le 'new_pt' pour obtenir l'azimut entre eux. Cela représenterait plus ou moins la tangente à la ligne à ce point.
Ensuite, vous pouvez comparer cet angle à l'azimut de vos gpspoints pour déterminer s'il faut ajouter le gpspoint ou non.
Encore une fois, non testé, mais j'espère que ce sera de l'aide.
la source
essayez quelque chose comme ceci:
calculer l'orientation de vos polylignes en degrés, par exemple: par exemple dans la calculatrice de champ ArcGIS: 180 + math.atan2 ((!! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)
convertissez votre réseau routier en sommets de route (points) et importez-les dans PostGIS.
appliquer l'algorithme de correspondance:
INSÉRER dans la correspondance (gid, id_véhicule, id_segment, date, heure, the_geom)
SELECT DISTINCT ON (b.gid) b.gid, b.vehicle_id, a.segment_id, b.date, b.time, ST_Closestpoint (ST_Collect (a.the_geom), b.the_geom) comme the_geom FROM
segment_vertices_geom a jointure interne Vehicle_geom b ON ST_Dwithin (ST_Transform (a.the_geom, 32632),
ST_Transform (b.the_geom, 32632), 20) OERE ((CAST (a.azimuth AS float8) - CAST (b.direction AS float8)) <180 OR (CAST (a.azimuth AS float8) - CAST (b.irection AS float8))> -180) GROUP BY b.gid, b.vehicle_id, a.segment_id, b.date, b.time, a.the_geom, b.the_geom ORDER BY b.gid, ST_Distance (a.the_geom, b .the_geom);
la source