Le GPS correspondant à la carte pointe vers le réseau routier!

11

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) entrez la description de l'image ici

Nader
la source
C'est un problème intéressant. Je suppose que si le point suivant dans le tampon de 20 m a également un azimut inacceptable, alors vous voulez continuer la recherche?
John Powell
Oui John, mais juste pour les tronçons de route qui portent le tampon de 20 mètres ! En fait, je veux identifier les segments de route qui se trouvent dans la zone tampon de 20 m, puis trouver le segment le plus proche qui a un azimut acceptable!
Nader
"JE N'AI PAS l'azimut des liens, et 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." Vous pouvez (et devez) importer vos routes dans Postgres / PostGIS avec shp2pgsql . Ensuite, vous pouvez utiliser ST_Azimuth, mais gardez à l'esprit qu'il vous indiquera l'azimut par rapport au sens de la numérisation .
alphabetasoup

Réponses:

1

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.

with new_pts AS (
    SELECT ST_ClosestPoint(geom, gpspoints) AS geompt
    FROM routes JOIN gpspoints ON ST_Distance(routes.geom, gpspoints.geom)<20
    )


SELECT ST_Azimuth(new_pts.geompt, 
    ST_Line_Interpolate_Point(routes.geom, 
        ST_Line_Locate_Point(routes.geom, new_pts.geompt)*0.999))

FROM routes JOIN new_pts ON ST_Distance(routes.geom,new_pts.geompt)<20;

Encore une fois, non testé, mais j'espère que ce sera de l'aide.

Micha
la source
0

essayez quelque chose comme ceci:

  1. 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)

  2. convertissez votre réseau routier en sommets de route (points) et importez-les dans PostGIS.

  3. 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);

Dimo
la source