es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Postgis: crear columna con srid en procedimiento

Hola,

Me pregunto cómo podría crear una columna espacializada con un srid obtenido de la base de datos.

— OK —
ALTER TABLE POI ADD COORDS GEOMETRY(POINT, 26916);

— KO (sintaxis de entrada no válida para el tipo entero: "sridval") —
DO $$
DECLARE
sridval int;
BEGIN
sridval := (select srid FROM project_options);
ALTER TABLE POI ADD COORDS GEOMETRY(POINT, sridval);
END$$;

— OK pero verboso —
DO $$
DECLARE
sridval int;
BEGIN
ALTER TABLE POI ADD COORDS GEOMETRY(POINT);
sridval := (select srid FROM project_options);
PERFORM updategeometrysrid(‘POI’, ‘coords’, sridval);
END $$;

La última solución no funciona con columnas generadas. Por ejemplo:

ALTER TABLE POI ADD COORDS GEOMETRY(POINT, /¿colocar el srid aquí?/) generated always as (ST_MakePoint(longitude, latitude)) stored;
CREATE INDEX COORDS_IDX ON POI USING GIST (COORDS);

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para crear una columna espacializada con un SRID obtenido de la base de datos, se puede utilizar el siguiente código:

    DO $$
    DECLARE
        sridval int;
    BEGIN
        sridval := (select srid FROM project_options);
        EXECUTE 'ALTER TABLE POI ADD COORDS GEOMETRY(POINT, ' || sridval || ')';
    END$$;
    

    Este código utiliza SQL dinámico concatenando el valor SRID en la sentencia ALTER TABLE. Esto permite obtener el SRID de la base de datos y utilizarlo en la creación de la columna espacializada.

    Alternativamente, si se necesita una columna generada, se puede crear sin un SRID y luego utilizar la función PERFORM updategeometrysrid para establecer el SRID:

    ALTER TABLE POI ADD COORDS GEOMETRY(POINT) GENERATED ALWAYS AS (ST_MakePoint(longitude, latitude)) STORED;
    DO $$
    DECLARE
        sridval int;
    BEGIN
        sridval := (select srid FROM project_options);
        PERFORM updategeometrysrid('POI', 'coords', sridval);
    END$$;
    CREATE INDEX COORDS_IDX ON POI USING GIST (COORDS);
    

    Este código primero crea la columna generada sin un SRID, luego utiliza la función PERFORM updategeometrysrid para establecer el SRID al valor obtenido de la base de datos. Finalmente, se crea un índice en la columna COORDS utilizando GIST.

Comments are closed.