Soy bastante nuevo en Postgres y PostGIS.
Estoy tratando de hacer una simple correspondencia de mapas (o inferencia de ruta si lo desea) de algunos puntos GPS. Estoy usando postgres (postgis) .
Tengo una tabla en mi base de datos que contiene mis puntos GPS: puntos gps (Lat, Long, tiempo, velocidad, acimut, geometría, ...)
También he importado un archivo shape de la red de carreteras a mi base de datos: rutas (gid, idrte, version, nomrte, norte, clsrte, geom, ...) - NO TENGO el acimut de los enlaces, y estoy No estoy seguro de cómo puedo calcularlo usando la función postgis ST_azimuth. Todo lo que tengo es un archivo de forma de la red de carreteras que contiene columnas enumeradas anteriormente.
Quiero asociar cada punto GPS al enlace más cercano (en un búfer de 20 metros alrededor del punto) solo si la dirección del enlace coincide con el acimut del punto GPS (+ o -15 grados) y recuperar la posición proyectada. De lo contrario, quiero que busque el SIGUIENTE enlace más cercano, dentro del búfer de 20 metros, ¡que tiene un acimut aceptable! (¡Al igual que la imagen!)
Quiero que las nuevas coordenadas de los puntos GPS proyectados se agreguen en la tabla "gpspoints" como "projectedLat" y "projectedLong".
(En la imagen a continuación, los puntos reales se demuestran usando una dirección mientras que los puntos proyectados no tienen ninguna marca de dirección)
fuente
ST_Azimuth
, pero tenga en cuenta que le indicará el acimut con respecto a la dirección de digitalización .Respuestas:
No tengo una respuesta completamente resuelta, pero tal vez lo suficiente como para comenzar. Estas funciones pueden ayudar:
ST_Line_Locate_Point () da la distancia como una porción de la longitud total de la línea de un punto a lo largo de una línea. ST_Line_Interpolate_Point () devuelve una geometría de punto para un punto a una distancia dada (nuevamente como una porción de la longitud total) a lo largo de una línea.
Lo que sugiero es que obtenga la geometría de punto de una ubicación 'new_pts' en su línea que esté más cerca de sus puntos gps (en una subconsulta a continuación, formulada como una cláusula WITH). Luego, use ese punto para encontrar el punto más cercano en la línea, pero a una distancia ligeramente más pequeña, de modo que esté más cerca del principio. Luego use este punto encontrado, junto con el 'nuevo_pto' para obtener el acimut entre ellos. Esto representaría más o menos la tangente a la línea en ese punto.
Luego puede comparar este ángulo con el acimut de sus puntos gps para determinar si agregar el punto gps o no.
De nuevo, no probado, pero espero que sea de alguna ayuda.
fuente
prueba algo como esto:
calcule la orientación de sus polilíneas en grados, por ejemplo: por ejemplo, en la calculadora de campo ArcGIS: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)
convierta su red de carreteras en vértices (puntos) de carreteras e importe a PostGIS.
aplicar algoritmo de coincidencia:
INSERTAR en coincidencia (gid, ID_de_vector, ID_de_ segmento, fecha, hora, the_geom)
SELECCIONE 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) como the_geom FROM
segmento_vertices_geom a unión interna vehicle_geom b ON ST_Dwithin (ST_Transform (a.the_geom, 32632),
ST_Transform (b.the_geom, 32632), 20) WHERE ((CAST (a.azimuth AS float8) - CAST (b.direction AS float8)) <180 OR (CAST (a.azimuth AS float8) - CAST (b.direction 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);
fuente