Mais

PostGIS não encontra interseção entre linha e polígono

PostGIS não encontra interseção entre linha e polígono


Eu tenho uma linha e um polígono:

Eu gostaria de descobrir programaticamente se eles se cruzam ou não. Então eu faço:

selecione ST_Intersects ((selecione ST_SetSRID (ST_Buffer (ST_Transform (ST_SetSRID ((p.geom), 4326), 26986), 50), 4326) do ponto p onde p.id = 25785), (selecione ST_SetSRID (ST_MakeLine (ST_SetSRID (p) .geom, 4326)), 4326) FROM ponto p onde p.trajectory_id = 1455));

Mas quando eu executo a consulta, PostGIS diz que eles não se cruzam !! Mas na imagem acima, definitivamente vemos que eles se cruzam (ou a linha cruza o polígono).

Qual é o problema?

Eu também tenteiST_Crossesfunção, mas também dá falso.


Aqui está uma proposta de código limpo. Supondo que você precise inserir o tamanho do buffer na unidade local de "EPSG: 26986".

Para simplificar um pouco, proponho cruzar a geometria diretamente no SRID local. Isso torna a consulta mais genérica porque funcionará independentemente do SRID de entrada da geometria (se estiver definido corretamente!).

E se o SRID (4326) já estiver configurado nos metadados da tabela de pontos, você provavelmente pode descartar todas as funções ST_SetSRID () porque elas não estão fazendo nada e apenas tornam a função menos reutilizável.

selecione ST_Intersects ((selecione ST_Buffer (ST_Transform (ST_SetSRID (p.geom, 4326), 26986), 50)) do ponto p onde p.id = 25785), (selecione ST_MakeLine (ST_Transform (ST_SetSRID (p.geom, 4326), 26986)) FROM ponto p onde p.trajectory_id = 1455 ORDER BY id));

Observe também que você deve adicionar um ORDENAR POR cláusula à sua segunda consulta para fazer um objeto de caminho limpo. Em seu instantâneo, podemos ver claramente que há uma linha reta falsa. Portanto, isso pode causar falsos positivos posteriormente em seu algoritmo. Eu reutilizei o campo eu ia mas talvez haja um mais apropriado dependendo dos seus dados.


Esse primeiro ST_SetSRID em seu subquerry deve ser ST_Transform.

Com ST_SetSRID, você apenas atribui um novo SRID à geometria sem realmente transformar seus dados no novo SRID.