2010-03-26 7 views
31

Estoy tratando de cargar un grupo de pares de latitud/longitud en un tipo de geografía PostGIS para poder consultar por ubicación.¿Cómo convierto un par de latitud/longitud en un tipo de geografía PostGIS?

En particular, tengo una tabla con columnas de latitud y longitud de flotador y una columna geography(Point, 4326). Me gustaría hacer

update mytable set geography = ??? 

La documentación parece sugerir que el siguiente debería funcionar:

update mytable set geography = ST_GeogFromText('POINT(' || latitude || ' ' || 
                  longitude || ')'); 

No lo hace. No sé lo que está interpretando este punto como significado, pero solo permite que la longitud se encuentre entre -90 y 90, por lo que claramente no es una longitud.

Entonces, ¿qué debo hacer?

+1

envíe la lista por correo electrónico o vaya a irc.freenode.net #postgis – dassouki

+0

Estoy en #postgis. Está en silencio. Mailing la lista es mi próximo puerto de escala. – DRMacIver

Respuesta

36

... suspiro. Estupidez de mi parte Aparentemente, el orden correcto es longitud, latitud. Me engañaron y pensé que ambas coordenadas tenían el mismo rango (-180 a 180), así que pensé que algo más sutil estaba ocurriendo.

+7

longitud, orden de latitud que introduce una gran cantidad de errores. – kbrock

+0

Esta sigue siendo una respuesta horrible, y debería haber aceptado el consejo de @MikeT con ST_MakePoint en lugar de la concatenación de cadenas que presenta errores de redondeo. –

+2

¿Te refieres a los que pasaron tres y cuatro años después de que yo envié la pregunta y mucho después de que ya no tuve el problema? – DRMacIver

5

Para realizar el intercambio entre lat y lng puede usar:

update mytable set geography = ST_GeographyFromText('SRID=4326;POINT(' || st_x(geom) || ' ' || st_y(geom) || ')'); 

con o sin srid.

+0

Este método tendrá algunos errores de redondeo con pérdidas (es decir, 'float8' →' text' → 'float8'). Además, 'ST_X' solo funciona en tipos de geometría' POINT'. –

7

Estas son algunas maneras de hacer tipos de geografía:

  1. Convertir numéricos long y lat columnas a un tipo geog geografía:

    UPDATE mytable SET geog = ST_SetSRID(ST_MakePoint(long, lat), 4326)::geography 
    
  2. Convierte una columna geom geometría (SRID=4326) a una geog tipo de geografía usando un elenco simple:

    UPDATE mytable SET geog = geom::geography 
    
  3. transformar una columna geom geometría proyectada a un tipo geog geografía:

    UPDATE mytable SET geog = ST_Transform(geom, 4326)::geography 
    

Tenga en cuenta que los dos últimos ejemplos funcionan en cualquier tipo de geometría. Además, la conversión de la geometría a la geografía es a menudo implícita, y estos ejemplos funcionan sin ::geography, sin embargo, los moldes explícitos suelen ser una buena práctica para estas cosas.

Cuestiones relacionadas