Administración de datos espaciales con la extensión PostGIS
PostGIS es una extensión de PostgreSQL para almacenar y administrar información espacial. Para obtener más información sobre PostGIS, consulte PostGIS.net
A partir de la versión 10.5, PostgreSQL admite la biblioteca libprotobuf 1.3.0 utilizada por PostGIS para trabajar con datos de teselas vectoriales de Mapbox.
La configuración de la extensión PostGIS requiere privilegios de rds_superuser
. Le recomendamos que cree un usuario (rol) para administrar instalar la extensión PostGIS y los datos espaciales. La extensión PostGIS y sus componentes relacionados añaden miles de funciones a PostgreSQL. Considere la posibilidad de crear la extensión PostGIS en su propio esquema si eso tiene sentido para su caso de uso. En el ejemplo siguiente, se muestra cómo instalar la extensión en su propia base de datos, pero esto no es obligatorio.
Temas
- Paso 1: cree un usuario (rol) para administrar la extensión PostGIS
- Paso 2: cargue las extensiones PostGIS
- Paso 3: transferir la propiedad de los esquemas de extensión
- Paso 4: transferir la propiedad de las tablas de PostGIS
- Paso 5: pruebe las extensiones
- Paso 6: Actualice la extensión de PostGIS
- Versiones de extensión de PostGIS
- Actualización de PostGIS 2 a PostGIS 3
Paso 1: cree un usuario (rol) para administrar la extensión PostGIS
En primer lugar, conéctese a una instancia de base de datos de RDS para PostgreSQL como usuario con privilegios rds_superuser
. Si mantuvo el nombre predeterminado al configurar la instancia, conéctese como postgres
.
psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=postgres --password
Cree un rol independiente (usuario) para administrar la extensión PostGIS.
postgres=>
CREATE ROLE
gis_admin
LOGIN PASSWORD 'change_me
';CREATE ROLE
Conceda los privilegios rds_superuser
de este rol para permitir que el rol instale la extensión.
postgres=>
GRANT rds_superuser TO
gis_admin
;GRANT
Cree una base de datos para utilizarla para sus artefactos de PostGIS. Este paso es opcional. O puede crear un esquema en la base de datos de usuarios para las extensiones de PostGIS, pero esto tampoco es obligatorio.
postgres=>
CREATE DATABASE
lab_gis
;CREATE DATABASE
Conceda todos los privilegios gis_admin
en la base de datos lab_gis
.
postgres=>
GRANT ALL PRIVILEGES ON DATABASE lab_gis TO gis_admin;
GRANT
Salga de la sesión y vuelva a conectarse a una instancia de base de datos de RDS para PostgreSQL como gis_admin
.
postgres=>
psql --host=
111122223333
.aws-region
.rds.amazonaws.com --port=5432 --username=gis_admin
--password --dbname=lab_gis
Password for user gis_admin:...
lab_gis=>
Continúe configurando la extensión tal y como se detalla en los pasos siguientes.
Paso 2: cargue las extensiones PostGIS
La extensión de PostGIS incluye varias extensiones relacionadas que funcionan juntas para proporcionar funcionalidad geoespacial. Dependiendo de su caso de uso, es posible que no necesite todas las extensiones creadas en este paso.
Utilice instrucciones CREATE EXTENSION
para cargar las extensiones de PostGIS.
CREATE EXTENSION postgis;
CREATE EXTENSION
CREATE EXTENSION postgis_raster;
CREATE EXTENSION
CREATE EXTENSION fuzzystrmatch;
CREATE EXTENSION
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION
CREATE EXTENSION postgis_topology;
CREATE EXTENSION
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION
Para verificar los resultados, puede ejecutar la consulta SQL que se muestra en el siguiente ejemplo, que enumera las extensiones y sus propietarios.
SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1;
List of schemas Name | Owner --------------+----------- public | postgres tiger | rdsadmin tiger_data | rdsadmin topology | rdsadmin (4 rows)
Paso 3: transferir la propiedad de los esquemas de extensión
Use las declaraciones de ALTER SCHEMA para transferir la propiedad de los esquemas al rol gis_admin
.
ALTER SCHEMA tiger OWNER TO gis_admin;
ALTER SCHEMA
ALTER SCHEMA tiger_data OWNER TO gis_admin;
ALTER SCHEMA
ALTER SCHEMA topology OWNER TO gis_admin;
ALTER SCHEMA
Si desea confirmar el cambio de propiedad, ejecute la siguiente consulta SQL. O bien, puede utilizar el metacomando \dn
de la línea de comandos psql.
SELECT n.nspname AS "Name", pg_catalog.pg_get_userbyid(n.nspowner) AS "Owner" FROM pg_catalog.pg_namespace n WHERE n.nspname !~ '^pg_' AND n.nspname <> 'information_schema' ORDER BY 1;
List of schemas Name | Owner --------------+--------------- public | postgres tiger | gis_admin tiger_data | gis_admin topology | gis_admin (4 rows)
Paso 4: transferir la propiedad de las tablas de PostGIS
nota
No cambie la propiedad de las funciones de PostGIS. Para que PostGIS funcione correctamente y reciba actualizaciones, estas funciones deben retener la propiedad original. Para obtener más información sobre los permisos de PostGIS, consulte PostgreSQL Security
Use la siguiente función para transferir la propiedad de las tablas de PostGIS al rol gis_admin
. Ejecute la siguiente declaración desde el símbolo del sistema psql para crear la función.
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;
CREATE FUNCTION
A continuación, ejecute la siguiente consulta para ejecutar la función exec
que, a su vez, ejecuta las instrucciones y altera los permisos.
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO gis_admin;') FROM ( SELECT nspname, relname FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid) WHERE nspname in ('tiger','topology') AND relkind IN ('r','S','v') ORDER BY relkind = 'S') s;
Paso 5: pruebe las extensiones
Para evitar tener que especificar el nombre del esquema, añada el esquema tiger
a la ruta de búsqueda usando el siguiente comando.
SET search_path=public,tiger;
SET
Pruebe el esquema tiger
usando la siguiente instrucción SELECT.
SELECT address, streetname, streettypeabbrev, zip FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;
address | streetname | streettypeabbrev | zip ---------+------------+------------------+------- 1 | Devonshire | Pl | 02109 (1 row)
Para obtener más información sobre esta extensión, consulte Tiger Geocoder
Pruebe el acceso al esquema topology
usando la siguiente instrucción SELECT
. Esto llama a la función createtopology
para registrar un nuevo objeto de topología (my_new_topo) con el identificador de referencia espacial especificado (26986) y la tolerancia predeterminada (0,5). Para obtener más información, visite CreateTopology
SELECT topology.createtopology('my_new_topo',26986,0.5);
createtopology ---------------- 1 (1 row)
Paso 6: Actualice la extensión de PostGIS
Cada nueva versión de PostgreSQL admite una o más versiones de la extensión de PostGIS compatibles con esa versión. La actualización del motor de PostgreSQL a una nueva versión no actualiza automáticamente la extensión de PostGIS. Antes de actualizar el motor de PostgreSQL, normalmente se actualiza PostGIS a la versión más reciente disponible para la versión actual de PostgreSQL. Para obtener más información, consulte Versiones de extensión PostGIS.
Después de actualizar el motor de PostgreSQL, vuelva a actualizar la extensión de PostGIS a la versión compatible con la versión del motor de PostgreSQL recién actualizada. Para obtener más información sobre la actualización del motor PostgreSQL, consulte Realización de una actualización de la versión principal de RDS para PostgreSQL.
Puede comprobar si hay disponibles actualizaciones de la versión de la extensión PostGIS en su instancia de base de datos de RDS para PostgreSQL en cualquier momento. Para ello, ejecute el siguiente comando. Esta función está disponible con PostGIS 2.5.0 y versiones posteriores.
SELECT postGIS_extensions_upgrade();
Si su aplicación no es compatible con la última versión de PostGIS, puede instalar una versión anterior de PostGIS que esté disponible en su versión principal de la siguiente manera.
CREATE EXTENSION postgis VERSION "2.5.5";
Si desea actualizar a una versión específica de PostGIS desde una versión anterior, también puede utilizar el siguiente comando.
ALTER EXTENSION postgis UPDATE TO "2.5.5";
Dependiendo de la versión desde la que se actualice, es posible que tenga que volver a utilizar esta función. El resultado de la primera ejecución de la función determina si se necesita una función de actualización adicional. Por ejemplo, eso es lo que ocurre para la actualización de PostGIS 2 a PostGIS 3. Para obtener más información, consulte Actualización de PostGIS 2 a PostGIS 3.
Si actualizó esta extensión para prepararse para una actualización de la versión principal del motor de PostgreSQL, puede continuar con otras tareas preliminares. Para obtener más información, consulte Realización de una actualización de la versión principal de RDS para PostgreSQL.
Versiones de extensión PostGIS
Le recomendamos que instale las versiones de todas las extensiones, como PostGIS, como se indica en Versiones de extensión para Amazon RDS para PostgreSQL en las Notas de la versión de Amazon RDS para PostgreSQL Para obtener una lista de las versiones que están disponibles en su versión, utilice el siguiente comando.
SELECT * FROM pg_available_extension_versions WHERE name='postgis';
Puede encontrar información sobre la versión en las siguientes secciones de las Notas de la versión de Amazon RDS para PostgreSQL:
Actualización de PostGIS 2 a PostGIS 3
A partir de la versión 3.0, la funcionalidad de trama de PostGIS es una extensión separada, postgis_raster
. Esta extensión tiene su propia ruta de instalación y actualización. Esto elimina del núcleo docenas de funciones, tipos de datos y otros artefactos necesarios para el procesamiento de imágenes de trama desde la extensión postgis
principal. Esto significa que si su caso de uso no requiere procesamiento de tramas, no es necesario que instale la extensión postgis_raster
.
En el siguiente ejemplo de actualización, el primer comando de actualización extrae la funcionalidad de trama en la extensión postgis_raster
. Luego, se requiere un segundo comando de actualización para actualizar postgis_raster
a la nueva versión.
Para actualizar de PostGIS 2 a PostGIS 3
-
Identifique la versión predeterminada de PostGIS que está disponible para la versión de PostgreSQL en su Instancia de base de datos RDS para PostgreSQL. Para ello, ejecute la siguiente consulta.
SELECT * FROM pg_available_extensions WHERE default_version > installed_version;
name | default_version | installed_version | comment ---------+-----------------+-------------------+------------------------------------------------------------ postgis | 3.1.4 | 2.3.7 | PostGIS geometry and geography spatial types and functions (1 row)
-
Identifique las versiones de PostGIS instaladas en cada base de datos en la instancia de base de datos de RDS para PostgreSQL. En otras palabras, consulte la base de datos de cada usuario de la siguiente manera.
SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description" FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass WHERE e.extname LIKE '%postgis%' ORDER BY 1;
Name | Version | Schema | Description ---------+---------+--------+--------------------------------------------------------------------- postgis | 2.3.7 | public | PostGIS geometry, geography, and raster spatial types and functions (1 row)
Esta falta de correspondencia entre la versión predeterminada (PostGIS 3.1.4) y la versión instalada (PostGIS 2.3.7) significa que debe actualizar la extensión de PostGIS.
ALTER EXTENSION postgis UPDATE;
ALTER EXTENSION WARNING: unpackaging raster WARNING: PostGIS Raster functionality has been unpackaged
-
Ejecute la siguiente consulta para comprobar que la funcionalidad ráster ahora está en su propio paquete.
SELECT probin, count(*) FROM pg_proc WHERE probin LIKE '%postgis%' GROUP BY probin;
probin | count --------------------------+------- $libdir/rtpostgis-2.3 | 107 $libdir/postgis-3 | 487 (2 rows)
El resultado muestra que aún hay una diferencia entre las versiones. Las funciones de PostGIS son de la versión 3 (postgis-3), mientras que las funciones ráster (rtpostgis) son de la versión 2 (rtpostgis-2.3). Para completar la actualización, vuelva a ejecutar el comando de actualización, como se indica a continuación.
postgres=>
SELECT postgis_extensions_upgrade();Puede ignorar los mensajes de advertencia sin problemas. Vuelva a ejecutar la siguiente consulta para comprobar que la actualización se ha completado. La actualización se completa cuando en PostGIS y en todas las extensiones relacionadas deja de aparecer una marca que indica que deben actualizarse.
SELECT postgis_full_version();
-
Utilice la siguiente consulta para ver el proceso de actualización completado y las extensiones empaquetadas por separado, y compruebe que las versiones coinciden.
SELECT e.extname AS "Name", e.extversion AS "Version", n.nspname AS "Schema", c.description AS "Description" FROM pg_catalog.pg_extension e LEFT JOIN pg_catalog.pg_namespace n ON n.oid = e.extnamespace LEFT JOIN pg_catalog.pg_description c ON c.objoid = e.oid AND c.classoid = 'pg_catalog.pg_extension'::pg_catalog.regclass WHERE e.extname LIKE '%postgis%' ORDER BY 1;
Name | Version | Schema | Description ----------------+---------+--------+--------------------------------------------------------------------- postgis | 3.1.5 | public | PostGIS geometry, geography, and raster spatial types and functions postgis_raster | 3.1.5 | public | PostGIS raster types and functions (2 rows)
El resultado muestra que la extensión de PostGIS 2 se ha actualizado a PostGIS 3 y que ambas,
postgis
y la extensiónpostgis_raster
ya separada, son de la versión 3.1.5.
Una vez completada esta actualización, si no tiene pensado usar la funcionalidad de trama, puede eliminar la extensión de la siguiente manera.
DROP EXTENSION postgis_raster;