¿Cómo averiguar si una posición lat / long reside dentro de un polígono?

8

Estoy trabajando en un sistema que almacena información de latitud / longitud de direcciones en una tabla PostGIS. Para almacenar Lat / Long en el tipo de datos de geometría, estoy usando la función ST_GeometryFromText.

Por ejemplo, la siguiente llamada de función obtiene el valor geométrico contra la posición Long / Lat especificada:

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

Del mismo modo, convierto un polígono en representación geométrica de la siguiente manera:

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 ))')

Quiero saber si la posición anterior / lateral anterior reside en este Polígono o no. Para esto estoy usando la función ST_Within. Pero aunque 'myPointGeo' realmente reside dentro del Polígono, ST_Within está devolviendo falso. Estoy usando ST_Within de esta manera:

 St_Within(myPointGeo,myPolygonGeo)

¿Qué estoy haciendo mal aquí? ¿Debo usar alguna otra función para este propósito?

Haider
fuente
Hoy también aterricé en la misma situación; y la descripción presente en este enlace me ayudó y está funcionando bien postgis.refractions.net/documentation/manual-1.4/… Coincidentemente , los ejemplos allí y el tipo de datos que usa es el mismo; será fácil de replicar
sidd.k
También tenga en cuenta que los documentos sugieren usar ST_MakePoint, en general, ya que es más rápido - postgis.net/docs/ST_MakePoint.html
chrismarx

Respuestas:

18

Creo que ST_Intersects funcionaría mejor, devuelve un verdadero o falso sobre si dos geometrías se cruzan o no. Entonces querrás hacer algo como:

SELECT ST_Intersects(myPointGeo, myPolygonGeo);

o puedes hacer:

SELECT a.id, b.id 
FROM pointTableName a, polygonTableName b 
WHERE ST_Intersects(a.myPointGeo, b.myPolygonGeo);
HeyOverThere
fuente
Gracias por su respuesta
Md Amiruzzaman