1 votos

Seleccionar los puntos de una tabla que existen en un polígono personalizado

Tenemos un sitio de búsqueda de propiedades donde el usuario dibuja un polígono en un mapa y luego la aplicación muestra todas las propiedades que caen dentro del polígono.

Tenemos propiedades almacenadas dentro de una tabla Postgres que incluía los valores de longitud y latitud para cada propiedad individual (es decir: Property.Id , Property.Longitude , Property.Latitude )

Ejemplo de los puntos del polígono dibujado por el usuario:

-83.39258193445859 42.5188864690573, -83.3550447440939 42.51981388191728, -83.34222679201048 42.50184518501131, -83.38033561769407 42.49526380665137, -83.41707115236205 42.505135614429214, -83.39155196619687 42.51896997517796, -83.39258193445859 42.5188864690573

¿Cómo puedo escribir una consulta Postgres/PostGIS que encuentre todos los registros de mi tabla de propiedades en los que la longitud/latitud estén dentro de las coordenadas del polígono que se muestra arriba?

4voto

Nobby Puntos 101

No parece que esté almacenando estos datos en una base de datos con capacidad espacial. Podría beneficiarse enormemente de ello.

En lugar de almacenar la latitud y la longitud por separado, podría almacenarlas en una columna de geometría. A continuación, puede utilizar la función st_within para que haga la consulta por ti.

0voto

Jeremy M Puntos 671

Solución encontrada.

Siguiendo la recomendación anterior, añadí una columna basada en la "Geometría" a la tabla y la rellené utilizando la función ST_MakePoint como se muestra a continuación:

UPDATE "Property"
Set "Geom" = ST_SetSRID(
    ST_MakePoint("Property"."Longitude", "Property"."Latitude"), 
    3078);

A continuación, utilicé el ST_Within para ver si los puntos basados en la geometría caen dentro de mi polígono personalizado usando la función ST_GeomFromText y mis puntos de polígono cerrado.

SELECT 
    "Property"."MLSNumber", 
    "Property"."Longitude", 
    "Property"."Latitude"
FROM "Property"
WHERE ST_Within("Property"."Geom", 
    ST_GeomFromText(
        'POLYGON(-83.39258193445859 42.5188864690573, 
        -83.3550447440939 42.51981388191728, 
        -83.34222679201048 42.50184518501131, 
        -83.38033561769407 42.49526380665137,
        -83.39258193445859 42.5188864690573)'
    )
)

El resultado "parece" correcto pero todavía no he trazado el polígono y los puntos devueltos en un mapa para confirmarlo.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X