Obteniendo KML de PostGIS en el SRS correcto


Hace poco que hemos empezado a hacer unas cuantas cosas con PostGIS en la oficina, y una de las que me ha llamado la atención es la posibilidad de generar KMLs directamente empleando la función askml().

Cuando manejas una base de datos geolocalizados, la posibilidad de exportar con facilidad la información a un formato como KML se agradece… ahora bien que se pueda hacer como Dios manda es la leche, me explico.

La culpa, claro, es mía porque he consentido en que sigamos usando un SRS obsoleto como el EPSG:23030 cuando deberíamos usar EPSG:25830, pero el caso es que nuestras coordenadas están en el viejuno ED50 UTM30N y la función askml() realiza una transformación estandar a EPSG:4326, que como todos los que nos hemos visto en la tesitura de transformar datos sabrán, no garantiza precisión en el ámbito de la península ibérica. De hecho las “cosas” salían desplazadas nuestros conocidos 200m. (palmo arriba, palmo abajo).

Lo primero que se me ha ocurrido es que seguro que PostGIS, que utiliza proj4, puede hacer una transformación por parámetros. De hecho, si miramos la definición de la función askml() te conduce a la función st_askml() que te conduce a la función _st_askml() en la que utilizan la función transform() para transformar automáticamente a EPSG:4326, pero en este “estudio” preliminar no he visto dónde meterle parámetros a la transformación.

Cuando he ido a consultar la función transform() he visto a su prima de zumosol la función transform_geometry() cuyos parámetros (geometry, text, text, integer) me han parecido muy prometedores, y googleando un poco he llegado hasta un correo donde daban una idea de cual es su uso y hasta otro donde se han confirmado mis sospechas, se puede usar proj4 para hacer transformaciones al vuelo dentro de PostGIS…

Ahora solo quedaba pegarse un poco con las cadenas de configuración de proj4, cuidando de no dejarse ningún parámetro, hasta conseguir hacer la mágia de la transformación, palmo arriba palmo abajo, correcta.

La solución os la pongo a continuación:

select gid,
       _ST_AsKML(2,
                 transform_geometry(geom,
                                    ' +proj=utm
                                      +ellps=intl
                                      +zone=30
                                      +units=m
                                      +towgs84=-131,-100.3,-163.4,-1.244,-0.02,-1.144,9.39
                                      +no_defs
                                    '::text,
                                    ' +proj=longlat
                                      +ellps=WGS84
                                      +datum=WGS84
                                      +no_defs
                                    '::text,
                                    4326),
                 15)
from tabla;

Espero que os sirva de ayuda si alguna vez os véis en la misma tesitura.

Un saludo.

About these ads

5 pensamientos en “Obteniendo KML de PostGIS en el SRS correcto

  1. xurxo

    Fiiino fino,me parece que a más de uno le va a venir bien esa consulta.

    Recuérdame que hagamos una clasecita CSS para que ese código salga un poco más vistoso a la próxima por cierto.

    Siempre a su servicio!

    --
    XuRxO
    
  2. Anónimo
    • Llorando hola amigo yo tengo un problema. help me.!!!  tengo geometryas en postgis con el Srid 32613 correspondiente a la zona 13 wgs84 para mexico. y tengo por ejemplo el punto "POINT(18.8595087006938 -97.0677924156189)" cuando quiero comvertir a kml me arroja esto
    • "<Point><coordinates>-109.488574922933,-0.000875491102832163,0</coordinates></Point>" dame un empujoncito de lo que debo de hacer para que me genere bien el kml please….
    • gracias de antemano..
  3. vehrka

    Hola visitante.

    PostGIS no te va a formar un KML completo, solo te va a
    devolver la geometría en formato KML (de ahí lo de
    <point> y <coordinates>).

    Eres tú el que tiene que formar el resto del archivo KML e
    insertar la geometría que devuelve PostGIS en el lugar indicado.

    Fíjate en el ejemplo 1 que puedes encontrar en el tutorial
    de KML de Google
    y verás a que me refiero.

    Un saludo.


    Pedro-Juan Ferrer Matoses (vehrka)

  4. Anónimo

    Hola de nuevo.. si ya e creado un factory en mi codigo java que me permite armar bien acualquier tipo de KML generado, desde postgis. mi problema no es xml creado si no los datos, como podras ver no se como hacer que al generar el kml no me cambien los valores. para mi es sencillo crear un kml de un punto pero tengo poligos y multilineas demacio grandes. de antemano muchas gracias.

    POINT(18.8595087006938 -97.0677924156189)" cuando quiero comvertir a kml me arroja esto "<Point><coordinates>-109.488574922933,-0.000875491102832163,0</coordinates></Point>"

    email: developercircle@gmail.com

  5. Anónimo

    aqui estoy yo otra ves bueno espero me puedan ayudar con lo anterior y
    tambien con esto otro resulta que estoy utilizando hibernate spatial
    para crear persistencia de datos espaciales y mediante clases de JTS de
    vividsolution realizo algunas operaciones, estoy utilizando la
    proyeccion EPSG:26712 como le hago para crear un buffer un objeto
    geometrico pero basado en metros. algo asi.   objgeom.buffer(1000) // 1 Km en lugar de decir objgeom.buffer(0.05)// que no se cuanta distancia hay con este buffer.. porfavor se que ya son dos preguntas pero ya google demaciado u no encuenro nada. bye

     

Los comentarios están cerrados.