9 votos

Crear un rectángulo alrededor de un punto en PostGIS

Acabo de empezar a trabajar en PostGIS. Tengo una tabla en PostgreSQL que almacena Latitud, Longitud. Quiero crear un rectángulo de 500*500 pies alrededor de cada punto. Por lo tanto, utilizó la secuencia de comandos a continuación.

INSERT INTO GridData(latitude,longitude,geom)

SELECT 
  latitude,longitude,
  ST_Buffer(ST_SetSRID(ST_MakePoint(longitude,latitude),4326),152.40)
from public.PointData

Estoy utilizando el tipo de datos Geometry en la tabla GridData y PointData. El script anterior se ha escrito para crear una forma rectangular en la tabla GridData. ¿Cuál es la forma correcta de hacerlo?

6voto

Luke Puntos 2163

El ST_Buffer amortiguará la distancia especificada en las unidades del sistema de referencia espacial de la geometría. En tu caso, estás pidiendo que se amortigüe una distancia de 152,40 grados, que no es realmente lo que quieres hacer.

Además, al amortiguar alrededor de un punto se creará un círculo y no un rectángulo. Para obtener el rectángulo, puede utilizar la función ST_MakeEnvelope que requiere que especifique sus extensiones x e y mínimas que puede determinar a partir de sus coordenadas de punto.

Si quiere trabajar en unidades de pies o metros tendrá que proyectar sus puntos a un sistema de coordenadas proyectado que utilice pies o metros. Este sistema de coordenadas dependerá de la extensión de sus datos; si cubre los EE.UU. contiguos podría utilizar el sistema Atlas nacional de Estados Unidos EPSG:2163 o, si es más regional, debería buscar en el Proyecciones de planos de Estados Unidos y Zonas UTM . Por supuesto, también hay que tener en cuenta la precisión que se espera conseguir.

El siguiente ejemplo de SQL construye una geometría de puntos en WGS84 antes de transformarla a la proyección del Atlas Nacional de Estados Unidos y determinar las extensiones x e y mínimas. Como el punto va a ser el centro del rectángulo, estas extensiones se calculan utilizando la mitad de la longitud/anchura prevista. Además, como la proyección del Atlas Nacional de los Estados Unidos utiliza metros, he convertido los 250 pies a la distancia correspondiente en metros.

SELECT 
ST_MakeEnvelope(
    (ST_X(ST_Transform(ST_SetSRID(ST_MakePoint(longitude,latitude),4326),2163))-(250/3.28)), --Min X
    (ST_Y(ST_Transform(ST_SetSRID(ST_MakePoint(longitude,latitude),4326),2163))-(250/3.28)), -- Min Y
    (ST_X(ST_Transform(ST_SetSRID(ST_MakePoint(longitude,latitude),4326),2163))+(250/3.28)), -- Max X
    (ST_Y(ST_Transform(ST_SetSRID(ST_MakePoint(longitude,latitude),4326),2163))+(250/3.28)),  --Max Y
    2163
    )

Sin duda hay una manera mucho más eficiente de construir el SQL, pero esperamos que esto ilustre los puntos anteriores.

4voto

obchardon Puntos 126

Para generar un cuadrado para cada punto podemos utilizar el combo ST_ENVELOPE(ST_BUFFER()) :

Por ejemplo, si queremos una plaza de 500 unidades (por lo que necesitamos un buffer de 250 unidades):

SELECT ST_Envelope(ST_Buffer(MyGeom,250))

Lo cual no es realmente eficiente ya que necesitamos computar algunos buffers, pero es corto y legible.

1voto

les Puntos 363

Para mis necesidades (no es un cuadrado exacto de 500 pies, el 10% es lo suficientemente cercano, así que ajusta la división para que se adapte a ti), esta es otra forma de crear la envoltura cuadrada alrededor de un LINESTRING que va desde abajo a la izquierda hasta arriba a la derecha.

Tenga en cuenta que en esta latitud hay aproximadamente 100.000 metros por grado (111,3 km en el ecuador).

WITH myconstants (Longitude, Latitude) as (
   values (28.0, -26.0)
)
select ST_Envelope(ST_GeomFromText(CONCAT('LINESTRING(', 
                                          Longitude - 250.0/3.28/100000.0, ' ', 
                                          Latitude - 250.0/3.28/100000.0, ',', 
                                          Longitude + 250.0/3.28/100000.0, ' ', 
                                          Latitude + 250.0/3.28/100000.0, ')'), 4326)  ) FROM myconstants

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