Como descobrir se uma posição lat / long reside dentro de um polígono?

8

Estou trabalhando em um sistema que armazena informações de latitude / longitude de endereços em uma tabela PostGIS. Para armazenar Lat / Long no tipo de dados de geometria, estou usando a função ST_GeometryFromText.

Por exemplo, a seguinte chamada de função obtém o valor geométrico na posição Long / Lat especificada:

 myPointGeo =  ST_GeometryFromText('POINT(40.758871 -73.985114)');

Da mesma forma, converto um polígono em representação geométrica da seguinte maneira:

myPolygonGeo =  ST_GeometryFromText('POLYGON ((40.7566484549725 -73.9878561496734, 40.7556894646734 -73.9853026866913, 40.7545841705587 -73.9860537052154, 40.7548036054111 -73.9881458282471, 40.7559820394514 -73.9887895584106, 40.7566484549725 -73.9878561496734 ))')

Quero descobrir se a posição lat / long acima reside dentro deste polígono ou não. Para isso, estou usando a função ST_Within. Mas, embora 'myPointGeo' realmente resida no polígono, ST_Within está retornando false. Estou usando ST_Within desta maneira:

 St_Within(myPointGeo,myPolygonGeo)

O que eu estou fazendo errado aqui? Devo usar alguma outra função para esse fim?

Haider
fonte
Hoje eu também acabei na mesma situação; e a descrição presente neste link me ajudou e está funcionando bem postgis.refractions.net/documentation/manual-1.4/… Por coincidência , os exemplos lá e o tipo de dados que você está usando são os mesmos; por isso vai ser simples para replicar
sidd.k
Observe também que os documentos sugerem a utilização ST_MakePoint, em geral, uma vez que é mais rápido - postgis.net/docs/ST_MakePoint.html
chrismarx

Respostas:

18

Eu acho que ST_Intersects funcionaria melhor, retorna um verdadeiro ou falso se duas geometrias se cruzam ou não. Então, você gostaria de fazer algo como:

SELECT ST_Intersects(myPointGeo, myPolygonGeo);

ou você pode fazer:

SELECT a.id, b.id 
FROM pointTableName a, polygonTableName b 
WHERE ST_Intersects(a.myPointGeo, b.myPolygonGeo);
HeyOverThere
fonte
Obrigado pela sua resposta
Md Amiruzzaman