ST_ClosestPoint (linha, ponto) não cruza a linha

11

No meu banco de dados PostGIS (PostGIS 1.5 no Postgres 8.4.1), tenho duas tabelas: estradas (compostas por cadeias de linhas) e travamentos (compostos por pontos). Estou tentando correlacionar cada acidente a uma estrada, mas estou tendo problemas para que o seguinte funcione:

SELECT ST_ClosestPoint(road.the_geom, crash.the_geom),
    ST_Intersects(ST_ClosestPoint(road.the_geom, crash.the_geom), road.the_geom)
    ST_Distance(ST_ClosestPoint(road.the_geom, crash.the_geom), crash.the_geom) AS distance
    FROM
        --Table crashes is already in SRID 4326
        (SELECT the_geom FROM crashes WHERE gid = 360) as crash,
        (SELECT ST_SetSrid(the_geom, 4326) as the_geom from roads) as road
    ORDER BY distance;

Essa fila deve retornar o ponto mais próximo do acidente com o gid 360 em cada estrada, mas a função ST_Intersects retorna false para o primeiro resultado (o verdadeiro ponto mais próximo de todas as estradas). Estou fazendo algo errado? Existe outra maneira de vincular o acidente à estrada mais próxima?

Joshua Galecki
fonte

Respostas:

9

Esse é um problema que ST_Intersects não tem tolerância. Mesmo que as coordenadas duplas de precisão contenham muitas casas decimais, elas formam uma grade onde os únicos lugares para os pontos estão nos cruzamentos. Freqüentemente a linha não se cruza com nenhuma dessas cruzes e não há como nenhum ponto cruzar a linha exatamente. A solução alternativa é usar st_dwithin em vez disso com uma pequena tolerância.

/ Nicklas

Nicklas Avén
fonte