Pontos de GPS correspondentes à rede rodoviária!

11

Eu sou bastante novo no Postgres e no PostGIS.

Estou tentando fazer uma correspondência simples de mapa (ou inferência de caminho, se você desejar) de alguns pontos de GPS. Estou usando o postgres (postgis) .

Eu tenho uma tabela no meu banco de dados contendo meus pontos de GPS: gpspoints (Lat, Long, tempo, velocidade, azimute, geometria, ...)

Também importei um shapefile da rede rodoviária para o meu banco de dados: rotas (gid, idrte, versão, nomrte, norte, clsrte, geom, ...) - EU NÃO TENHO o azimute dos links e sou não tenho certeza como posso calculá-lo usando a função post_is ST_azimuth. Tudo o que tenho é um arquivo de forma da rede de estradas que contém as colunas enumeradas acima.

Eu quero associar cada ponto GPS ao link mais próximo (em um buffer de 20 metros ao redor do ponto) somente se a direção do link concordar com o azimute do ponto GPS (+ ou -15 graus) e recuperar a posição projetada. Caso contrário, quero que ele procure o próximo link mais próximo, dentro do buffer de 20 metros, que possui um azimute aceitável! (Assim como a imagem!)

Quero que as novas coordenadas dos pontos GPS projetados sejam adicionadas na tabela "gpspoints" como "projectedLat" e "projectedLong".

(Na figura abaixo, os pontos reais são demonstrados usando uma direção, enquanto os pontos projetados não têm nenhuma marca de direção) insira a descrição da imagem aqui

Nader
fonte
É um problema interessante. Presumo que, se o próximo ponto no buffer de 20m também tiver um azimute inaceitável, você deseja continuar a pesquisa?
John John Powell
Sim John, mas apenas para os segmentos de estrada que estão dentro do buffer de 20 metros ! Na verdade, quero identificar os segmentos de estrada que estão no buffer de 20 m e, em seguida, encontrar o segmento mais próximo que tenha um azimute aceitável!
27415 Nader
"Eu não tenho o azimute dos links e não sei como calculá-lo usando a função postgis ST_azimuth. Tudo o que tenho é um arquivo de forma da rede de estradas contendo as colunas enumeradas acima." Você pode (e deve) trazer suas estradas para o Postgres / PostGIS com shp2pgsql . Então você pode usar ST_Azimuth, mas lembre-se de que ele indicará o azimute com relação à direção da digitalização .
alphabetasoup

Respostas:

1

Não tenho uma resposta totalmente elaborada, mas talvez o suficiente para você começar. Essas funções podem ajudar:

ST_Line_Locate_Point () fornece a distância como uma parte do comprimento total da linha de um ponto ao longo de uma linha. ST_Line_Interpolate_Point () retorna uma geometria de ponto para um ponto a uma determinada distância (novamente como uma parte do comprimento total) ao longo de uma linha.

O que eu sugiro para obter a geometria do ponto de um local 'new_pts' na sua linha que seja o mais próximo dos seus pontos de gps (em uma subconsulta abaixo, formulada como uma cláusula WITH). Em seguida, use esse ponto para encontrar o ponto mais próximo realmente na linha, mas a uma distância muito menor, para que fique mais próximo do início. Em seguida, use esse ponto encontrado, junto com o 'new_pt' para obter o azimute entre eles. Isso representaria mais ou menos a tangente à linha naquele ponto.

Em seguida, você pode comparar esse ângulo com o azimute dos seus pontos de GPS para determinar se deseja adicionar o ponto de GPS ou não.

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;

Novamente, não testado, mas espero que ajude.

Micha
fonte
0

tente algo como isto:

  1. calcule a orientação de suas polilinhas em graus, por exemplo: na Calculadora de campo do ArcGIS: 180 + math.atan2 ((! Shape.firstpoint.X! -! Shape.lastpoint.X!), (! Shape.firstpoint.Y! -! Shape.lastpoint.Y!)) * (180 / math.pi)

  2. converta sua rede viária em vértices (pontos) e importe para o PostGIS.

  3. aplique o algoritmo de correspondência:

    INSERIR na correspondência (gid, identificação do veículo, identificação do segmento, data, hora, 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) como o_geom FROM

    segment_vertices_geom uma junção 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);

Dimo
fonte