2011-12-11 69 views
13

Esta es probablemente una pregunta simple, pero no soy muy bueno en PostGIS y no entiendo completamente todo esto.Distancia entre 2 PUNTOS en Postgis en srid 4326 en metros

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

create index nodes__points on nodes using gist (point) 

La columna fue creado con

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

estoy usando srid 4326 debido a que estoy añadiendo datos que está 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 aproximadamente dentro de un cuadro de 1km centrado en ese punto (así 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. Un bbox de 1 km está bien, un círculo 1 km es bien. no tiene que ser exactamente de 1 km, justo ese orden de magnitud.

el ST_Distance/ST_DWithin/etc. todo el uso de las unidades de la SRID, que para 4326/WGS64 es grados (por lo 1 = 1 grado de LAttitude/longitud). pero quiero usar metros.

probé ST_distance_sphere y st_dwithin que puede utilizar metros, pero si hago eso, el 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.

+0

Tal vez de alguna ayuda: [ST_DWithin toma como parámetro de grado, no metros, ¿por qué?] (Http://stackoverflow.com/questions/8444753/st-dwithin -takes-parameter-as-degree-not-meters-why) – radek

+1

pregunta obligatoria: ¿Qué versión de PostGIS? ¿Qué versión de PostgreSQL? – filiprem

Respuesta

5

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

+1

La geografía debería funcionar. no mencionó el tipo de datos en la pregunta. El problema con Geom es que finalmente es un objeto 2D. La geografía es un objeto 4D que incluye una altitud y una curvatura del parámetro terrestre que se puede traducir en metros ... sin estos dos parámetros, no se pueden estimar "metros" ya que diferentes lat/lons significan diferentes distancias pendientes donde se encuentra en el planeta. Puede parecer trivial cuando escribe, pero incluya una declaración de creación de tabla para saber a qué tipos de datos de columna se está refiriendo – Twelfth

16

Puede usar ST_Transform para usar medidores, también recuerde que no todas las funciones están disponibles con tipos de geografía, pero si realmente necesita velocidad use ST_DWithin, es la manera más rápida. Aquí está 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 | 
Cuestiones relacionadas