4 votos

PostGIS, conseguir los puntos que son x metros cerca de otro punto, en metros

Estoy tratando de encontrar los puntos dentro de una cierta distancia, en metros, desde otro punto.

Estoy usando la función ST_Buffer, pero no entiendo cómo expresar la distancia en metros.

Estoy tratando con algo como esto:

select
1 as cartodb_id,
ST_Buffer(
  ST_Transform(
    ST_GeomFromText(
      POINT(-58.38145 -34.60368)'
      , 4326
    )
    , 3857
  )
  , 500
) as the_geom_webmercator

Tengo las coordenadas de google maps (en wgs84, 4326) entonces me transformar a webmercator (3857) y luego me pase de 500 como parámetro, y me sale algo que se parece a la zona deseada, pero después de comparar con lo que google maps dice que se queda corta para no neglectable distancia.

Es este el camino correcto para lograrlo?

nota: usted puede probar la consulta sql en cartodb

--

A partir de esta pregunta: http://gis.stackexchange.com/a/44481/19461 me vino con el siguiente código (yo uso SRID 31997 para calcular el buffer, y luego volver a webmercator)

select
1 as cartodb_id,
ST_Transform(
  ST_Buffer(
    ST_Transform(
      ST_GeomFromText(
        'POINT(-58.427185 -34.624592)'
        , 4326
      )
      , 31997
    )
    , 2000
  ), 3857
) as the_geom_webmercator

Ahora bien, si se queda corto de no más de 20 metros. Pensé mercator (EPSG 3857) fue en unidades métricas.

8voto

Si desea comprobar si algunos de los puntos (o formas, etc.) que entran dentro de una distancia dada de un lugar determinado, utilice la geográfica versión de ST_DWithin(). De http://www.postgis.org/docs/ST_DWithin.html:

boolean ST_DWithin
  (geography gg1, geography gg2, double precision distance_meters, boolean use_spheroid);

Por lo tanto,

SELECT
  ST_DWithin(
      ST_GeomFromText(
        'POINT(-58.7 -34.2)' -- given point
        , 4326
      )::geography
      , 
      ST_GeomFromText(
        'POINT(-59.1 -33.6)' -- another point
        , 4326
      )::geography
      , 20000 -- given distance (m)
      , true -- for greater accuracy (false for greater speed)
    )

devuelve false pero

SELECT
  ST_DWithin(
      ST_GeomFromText(
        'POINT(-58.7 -34.2)' -- given point
        , 4326
      )::geography
      , 
      ST_GeomFromText(
        'POINT(-59.1 -33.6)' -- another point
        , 4326
      )::geography
      , 80000 -- given distance (m)
      , true -- for greater accuracy (false for greater speed)
    )

devuelve true (El segundo ejemplo tiene una mayor distancia de prueba.)

2voto

Rob H Puntos 101

Mejor manera es utilizar el tipo geográfico.

Geografía ST_Buffer (geografía g1, flotador radius_of_buffer_in_meters);

Echando a la geografía de la st_buffer trabajo en metros, como se puede ver en la firma de la función.

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