2 votos

Función PostGIS que actualiza las geometrías WKT al tipo de geometría con st_geomfromtext

Vengo del mundo Python pero necesito crear una función PostgreSQLl que proporcionando una tabla se:

  1. Buscar columnas que tengan "_wkt", es decir, "geom_wkt" o "geom2_wkt".
  2. Realiza una sentencia de actualización y transforma dichas columnas WKT a Tipo Geometría con ST_GeomFromText.

Esto sería muy sencillo de hacer en Python pero realmente no tengo confianza con las funciones SQL.

1voto

mathieu Puntos 53

Antes de la actualización:

Ejecutar

SELECT
  pa.attrelid::REGCLASS, pa.attname
FROM
  pg_attribute AS pa
WHERE
  pa.attrelid = '<schema>.<table>'::REGCLASS
  AND
  pa.attnum > 0
  AND
  pa.attname LIKE '%_wkt'
;

para encontrar todas las columnas con sufijo _wkt en <schema>.<table> (sustituya la consulta anterior por los nombres reales del esquema y de las tablas; no elimine el carácter ' !).

Asegúrese de que la tabla y las columnas devueltas son exactamente los que quiera actualizar - ¡ni más ni menos!


Si está seguro de que no hay otras relaciones o columnas implicadas, ejecute

DO
$DO$
  DECLARE
    _rnm REGCLASS;
    _cnm TEXT;

  BEGIN
    FOR _rnm, _cnm IN (
      SELECT
        pa.attrelid::REGCLASS, pa.attname
      FROM
        pg_attribute AS pa
      WHERE
        pa.attrelid = '<schema>.<table>'::REGCLASS
        AND
        pa.attnum > 0
        AND
        pa.attname LIKE '%_wkt'
    ) LOOP
      EXECUTE FORMAT(
        $FORMAT$
          ALTER TABLE
            %1$I
            ALTER COLUMN
              %2$s TYPE GEOMETRY(<GEOMETRY_TYPE>, <SRID>) USING %2$s::GEOMETRY(<GEOMETRY_TYPE>, <SRID>)     ;

          -- OPTIONAL: remove suffix '_wkt' from column name
          ALTER TABLE
            %1$I
            RENAME COLUMN
              %2$s TO %3$s
          ;

          -- OPTIONAL: add spatial index
          CREATE INDEX
            ON %1$I
            USING GIST(%3$s)
          ;
        $FORMAT$,
        _rnm, _cnm, REPLACE(_cnm, '_wkt', '') -- remove the REPLACE statement if you do not want any OPTIONAL functionality!
      );
    END LOOP;
  END;
$DO$
;

De este modo

  • actualizar el tipo de datos de la columna a GEOMETRY(<GEOMETRY_TYPE>, <SRID>) y registra correctamente la columna en las tablas del sistema (sustituye <GEOMETRY_TYPE> y <SRID> )
  • OPCIONALMENTE retire el _wkt sufijo del nombre de la columna
  • OPCIONALMENTE crear un índice espacial en el nuevo GEOMETRY columna

Si ha elegido la opción de índice, ejecute

VACUUM ANALYZE <schema>.<table>;

al finalizar.


Tenga en cuenta que debe definir específicamente el <GEOMETRY_TYPE> y <SRID> - se utilizará para todos columnas actualizadas.

Si sus columnas contienen diferentes <GEOMETRY_TYPE> tendrá que optar por utilizar el genérico GEOMETRY(GEOMETRY, <SRID>) o simplemente GEOMETRY sin <SRID> información -lo cual es indeseable- o añadir una declaración más compleja para intentar deducir la <GEOMETRY_TYPE> a partir de los valores de las columnas; añade una nota si ese es el caso y puedo ver si tengo tiempo para añadir la lógica.

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