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)
fonte
ST_Azimuth
, mas lembre-se de que ele indicará o azimute com relação à direção da digitalização .Respostas:
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.
Novamente, não testado, mas espero que ajude.
fonte
tente algo como isto:
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)
converta sua rede viária em vértices (pontos) e importe para o PostGIS.
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);
fonte