¡Puntos GPS de correspondencia de mapas a la red de carreteras!


11

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) ingrese la descripción de la imagen aquí


Es un problema interesante. Supongo que si el siguiente punto dentro del búfer de 20 m también tiene un acimut inaceptable, ¿desea continuar la búsqueda?
John Powell

Sí, John, ¡pero solo para los segmentos de carretera que están dentro del búfer de 20 metros ! En realidad, ¡quiero identificar los segmentos de la carretera que están en el búfer de 20 m, luego encontrar el segmento más cercano que tenga un acimut aceptable!
Nader

"NO TENGO el acimut de los enlaces, y no estoy seguro de cómo puedo calcularlo utilizando la función postgis ST_azimuth. Todo lo que tengo es un archivo de forma de la red de carreteras que contiene las columnas enumeradas anteriormente". Puede (y debe) llevar sus carreteras a Postgres / PostGIS con shp2pgsql . Luego puede usar ST_Azimuth, pero tenga en cuenta que le indicará el acimut con respecto a la dirección de digitalización .
alphabetasoup

Respuestas:


1

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.

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;

De nuevo, no probado, pero espero que sea de alguna ayuda.


0

prueba algo como esto:

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

  2. convierta su red de carreteras en vértices (puntos) de carreteras e importe a PostGIS.

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.