5 votos

PostGis: Geometría de texto UTM

Tengo datos simples en una tabla de postgresql que se ve así:

 id  index    easting      northing    utm_zone  utm_zone_letter 

  1    1    233410.0000  1024701.0000        38  N               
  1    2    213310.0000  1167201.0000        36  N               
  2    1    213310.0000  1167201.0000        31  B               
  2    2    213310.0000  1167201.0000        31  B               

Nota: Las coordenadas no son reales, sino que fueron ingresadas manualmente

Como puedes ver, estas son coordenadas UTM pero almacenadas en campos de tipo db comunes.
Quiero convertir esas últimas 4 columnas a uno de tipo Geometry para PostGis.
A algo como esto:

 id        Geometry       

  1  02347237427342342347 
  2  27584872345646325863 

Usé una consulta similar a esta:

--crea un polígono con un SRID equivocado :(
SELECT z.id, ST_Polygon(z.geom, 3395) geom FROM ( 
    --agrega el primer punto de la línea al final para cerrarla (requerido por ST_Polygon)
    SELECT l.id id, ST_AddPoint(g.geom, ST_StartPoint(g.geom)) geom FROM (
        -- agrupa puntos por ID y crea geometría de línea abierta desde cada grupo
        SELECT t.id id, ST_MakeLine(t.strPoints) geom FROM (
            --crea texto POINT(x,y) de las coordenadas
            SELECT 
                g.id id, 
                g.index idx, 
                'POINT(' || g.easting || ' ' || g.northing || ')' strPoints
            FROM data g
            ORDER BY g.index
        ) t
        GROUP BY t.id
        HAVING count(t.strPoints) > 2
    ) g

) z
where ST_IsValid(z.geom)

Pero esto no usa utm_zone y utm_zone_letter y los puntos y líneas se crean sin un valor SRID. Crear un polígono a partir de tales valores y especificar algún SRID da malos resultados. Al mismo tiempo, como los puntos y líneas no tienen el SRID establecido, no puedo usar la función DB utmzone(geometry) porque requiere que la geometría tenga un SRID.

Investigué en ST_Transform, ST_FromText y otras funciones pero no pude encontrar una donde pueda especificar el número y la letra de la zona UTM para crear un valor de tipo Geometry.
Crear un punto sin especificar el SRID me da malos resultados: los puntos caen en pingüinos en la Antártida, lo cual es incorrecto.

¿Me puedes decir cómo convertir esos datos a valores de Geometría correctos con el SRID especificado correctamente?

2voto

Adam Ernst Puntos 6939

Creo que deberías poder utilizar esta función (de aquí):

 -- Función: utmzone(geometry)
 -- DROP FUNCTION utmzone(geometry);
 -- Uso: SELECT ST_Transform(the_geom, utmzone(ST_Centroid(the_geom)) )
    FROM sometable;

 CREATE OR REPLACE FUNCTION utmzone(geometry)
   RETURNS integer AS
 $BODY$
 DECLARE
     geomgeog geometry;
     zone int;
     pref int;

 BEGIN
     geomgeog:= ST_Transform($1,4326);

     IF (ST_Y(geomgeog))>0 THEN
        pref:=32600;
     ELSE
        pref:=32700;
     END IF;

     zone:=floor((ST_X(geomgeog)+180)/6)+1;

     RETURN zone+pref;
 END;
 $BODY$ LANGUAGE 'plpgsql' IMMUTABLE
   COST 100;

0 votos

Sí, conozco esa función, pero hay un problema: requiere que la geometría pasada a ella tenga un SRID establecido. select utmzone(ST_PointFromText('POINT(' || g.easting || ' ' || northing || ')')) from gis g Esto falla con: ERROR: Input geometry has unknown (0) SRID En mi caso supongo que el SRID está definido por las columnas utm_zone y utm_zone_letter? Entonces necesito usarlos de alguna manera para determinar el SRID correcto para cada registro. Filtrar la tabla spatial_ref_sys usando esos dos valores de columna a veces resulta en dos registros de SRID. Eso no es bueno supongo... necesito alguna otra manera.

1voto

Jeff Puntos 38

Necesitarás traducir la zona UTM a un código EPSG, usar ST_FromText para crear un objeto de geometría en esa proyección, y luego usar ST_Transform para transformar tu objeto de geometría en el SRID que estés utilizando para toda la tabla.

No lo he intentado, pero este enlace proporciona una descripción de cómo convertir de forma programática de latitud/longitud a zona UTM; espero que no sea demasiado difícil revertir el cálculo.

1voto

Adam Ernst Puntos 6939

Puedes usar la información aquí para generar un SRID - básicamente agregando el número de zona a 32600 (en el norte) y 32700 en el sur. Esto funciona si puedes usar WGS84 como sistema de referencia de coordenadas geográficas.

La letra de la zona UTM identifica la banda de latitud. Si los datos siempre están en el hemisferio norte, entonces puedes ignorarla y usar 32600 + zona UTM como el ID bien conocido. Si los datos están en ambos hemisferios, tendrás que verificar las letras para determinar en qué hemisferio se encuentran. 'CDEFGHJKLM' están en el hemisferio sur, y 'NPQRSTUVWX' están en el hemisferio norte. A y B están por debajo de 80 Sur y Y y Z están por encima de 84 Norte.

0 votos

Amplía tu respuesta--revertir/reescribir si lo deseas!

0 votos

Gracias @iant. El enlace y tu comentario anterior me ayudaron a resolver el problema.

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