st_transform st_makepoint st_distance longitude lon latitude lat postgresql geospatial postgis gis

postgresql - st_distance - st_makepoint



Distancia entre 2 PUNTOS en Postgis en srid 4326 en metros (3)

Probablemente esta es una pregunta simple, pero no soy muy bueno en PostGIS y no estoy completamente de acuerdo con todo esto.

Básicamente tengo una tabla ( nodes ) con una columna de PUNTO ( point ). He creado un índice en esta columna.

create index nodes__points on nodes using gist (point)

La columna fue creada con

select addgeometrycolumn(''nodes'', ''points'', ''POINT'', 4326, 2)

Estoy usando srid 4326 porque estoy agregando datos que están en la forma (latitud, longitud). (es decir, el sistema de coordenadas donde la posición de Dublín, Irlanda es lat = 53.353 lon = -6.264 (que he agregado con GeomFromText(''POINT(-6.264 53.535)'') )).

Para cada punto, quiero encontrar todos los puntos que están más o menos dentro de un cuadro de 1 km centrado en ese punto (por selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id; tanto, selcet a.id, count(*) from nodes as a, nodes as b where SOME_DISTANCE_FUNCTION_HERE(a.point, b.point, 1000) group by a.id; No tiene que ser exacto, solo una figura huerística aproximada. Una casilla de 1 km está bien, un círculo de 1 km está bien. No tiene que ser exactamente 1 km, solo esa orden de magnitud.

El ST_Distance / ST_DWithin / etc. todos utilizan las unidades del SRID, que para 4326 / WGS64 son grados (entonces 1 = 1 grado de latitud / longitud). Pero quiero usar metros.

Intenté ST_distance_sphere y st_dwithin que pueden usar medidores, pero si lo hago, la explain muestra que el índice no se está utilizando.

¿Cómo puedo obtener aproximadamente lo que quiero y usar el índice geográfico?

ACTUALIZACIÓN : Esto está en PostgreSQL 9.1 y PostGIS 2.0 svn build.


Desde que escribí esto, he descubierto el tipo "geográfico" en lugar del tipo "geometría" en PostGIS, que podría hacer exactamente lo que quiero.


Podría usar ST_Transform para usar medidores, y recuerde que no todas las funciones están disponibles con tipos de geografía, pero si realmente necesita velocidad, use ST_DWithin, es la forma más rápida. Aquí hay una aproximación de las conversiones entre grados y metros:

| places | degrees | distance | | ------ | ---------- | -------- | | 0 | 1.0 | 111 km | | 1 | 0.1 | 11.1 km | | 2 | 0.01 | 1.11 km | | 3 | 0.001 | 111 m | | 4 | 0.0001 | 11.1 m | | 5 | 0.00001 | 1.11 m | | 6 | 0.000001 | 0.111 m | | 7 | 0.0000001 | 1.11 cm | | 8 | 0.00000001 | 1.11 mm |


Pregunta antigua, pero solo tienes que emitir así: ST_Distance(p.geom::geography, u.geom::geography) donde p y u son alias para dos tablas