Manual PostGIS 2.5.0dev

SVN Revision ()

The PostGIS Development Group

Abstract

PostGIS es una extension del sistema de base de datos relacional PostgreSQL que permite almacenar objetos SIG (Sistemas de Información Geografica) en la base de datos. PostGIS incluye soporte de indices de tipos basados en GiST R-Tree, y funciones de análisis y procesado de objetos SIG.

Este es el manual de la version 2.5.0dev

This work is licensed under a Creative Commons Attribution-Share Alike 3.0 License. Feel free to use this material any way you like, but we ask that you attribute credit to the PostGIS Project and wherever possible, a link back to http://postgis.net.


Table of Contents

1. Introducción
1.1. Comité de Dirección del Proyecto (Project Steering Committee)
1.2. Core Contributors Present
1.3. Core Contributors Past
1.4. Other Contributors
1.5. Mas información
2. PostGIS Installation
2.1. Versión corta
2.2. Install Requirements
2.3. Obteniendo el código fuente
2.4. Compiling and Install from Source: Detailed
2.4.1. Configuración
2.4.2. Compilando
2.4.3. Compilando e Instalando Extensiones de PostGIS
2.4.4. Tests
2.4.5. Instalación
2.5. Crear una base de datos espacial utilizando EXTENSIONS
2.6. Crear una base de datos espacial desde una plantilla
2.7. Installing and Using the address standardizer
2.7.1. Installing Regex::Assemble
2.8. Instalar o actualizar el geocodificador Tiger y cargar datos
2.8.1. Tiger Geocoder Enabling your PostGIS database: Using Extension
2.8.2. Tiger Geocoder Enabling your PostGIS database: Not Using Extensions
2.8.3. Using Address Standardizer Extension with Tiger geocoder
2.8.4. Cargando datos Tiger
2.8.5. Actualizando la instalación del geocodificador Tiger
2.9. Crear una base de datos espacial desde una plantilla
2.10. Actualizando
2.10.1. Actualizacion Ligera
2.10.2. Actualizacion pesada o HARD UPDATE
2.11. Common Problems during installation
2.12. Cargador/Dumper
3. Preguntas frecuentes sobre PostGIS
4. Utilizando PostGIS: Gestión de Datos y Consultas
4.1. Objetos SIG
4.1.1. OpenGIS WKB y WKT
4.1.2. En PostGIS EWKB, EWKT y foma Canonica
4.1.3. SQL-MM Parte 3
4.2. Tipo Geography en PostGIS
4.2.1. Bases del tipo "Geography"
4.2.2. ¿Cuando utilizar el tipo Geografico en vez de Geometrico?
4.2.3. Preguntas frecuentes Avanzadas de Geography
4.3. Utilizando estandares OpenGIS
4.3.1. La tabla SPATIAL_REF_SYS y los Sistemas de Referencia Espacial
4.3.2. La VISTA GEOMETRY_COLUMNS
4.3.3. Crear una tabla espacial
4.3.4. Registrando la columna de geometrias de forma manual en la tabla geometry_columns
4.3.5. Asegurando la compatibilidad de geometrias con OpenGIS
4.3.6. Modelo de intersección 9 dimensionalmente extendido(DE-9IM)
4.4. Cargando Datos SIG
4.4.1. Cargando Datos SIG
4.4.2. shp2pgsql: Using the ESRI Shapefile Loader
4.5. Recuperando datos SIG
4.5.1. Using SQL to Retrieve Data
4.5.2. Uso del Dumper
4.6. Contruir Indices
4.6.1. Indices GiST
4.6.2. Indices GiST
4.6.3. Utilizando Indices
4.7. Consultas Complejas
4.7.1. Aprovechando los Indices
4.7.2. Ejemplos de consultas espaciales SQL
5. Gestión, Consulta y Aplicaciones de Datos Raster
5.1. Cargando y Creando Rasters
5.1.1. Utilizar el paquete raster2pgsql para cargar rasters
5.1.2. Crear rastrees utilizando las funciones raster de PostGIS
5.2. Catalogos raster
5.2.1. Catalogo de columnas raster
5.2.2. Previsualizaciones raster
5.3. Contruyendo aplicaciones personalizadas con PostGIS Raster
5.3.1. Ejemplo de salida utilizando ST_AsPNG junto con otras opciones raster en PHP
5.3.2. Ejemplo de salida utilizando ST_AsPNG junto con otras opciones raster en ASP.NET C#
5.3.3. Aplicación de consola Java que extrae un raster como un fichero de imagen
5.3.4. Utilizar PLPython para extraer imágenes vía SQL
5.3.5. Extraer un raster con PSQL
6. Usando PostGIS Geometry: Construyendo Aplicaciones
6.1. Usando Mapserver
6.1.1. Uso Básico
6.1.2. Preguntas frecuentes
6.1.3. Uso avanzado
6.1.4. Ejemplos
6.2. Clientes Java (JDBC)
6.3. Clientes C (libpq)
6.3.1. Cursores de Texto
6.3.2. Cursores Binarios
7. Consejos de rendimiento
7.1. Tablas pequeñas de geometrías grandes
7.1.1. Descripcion del problema
7.1.2. Soluciones provisionales
7.2. CLUSTERing o indices geométricos
7.3. Evitar la conversión de dimensión
7.4. Ajusta tu configuración
7.4.1. Puesta en marcha
7.4.2. Runtime
8. Manual de Referencia PostGIS
8.1. Tipos Geometry/Geography/Box en PostgreSQL PostGIS
8.2. PostGIS Grand Unified Custom Variables (GUCs)
8.3. Funciones de Gestión
8.4. Contructores Geométricos
8.5. Métodos de Acceso a Geometrías
8.6. Geometry Editors
8.7. Geometry Outputs
8.8. Operadores
8.9. Spatial Relationships and Measurements
8.10. SFCGAL Functions
8.11. Geometry Processing
8.12. Linear Referencing
8.13. Soporte Temporal
8.14. Soporte para transacciones grandes
8.15. Miscellaneous Functions
8.16. Funciones Excepcionales
9. Raster Reference
9.1. Raster Support Data types
9.2. Raster Management
9.3. Raster Constructors
9.4. Raster Accessors
9.5. Raster Band Accessors
9.6. Raster Pixel Accessors and Setters
9.7. Raster Editors
9.8. Raster Band Editors
9.9. Raster Band Statistics and Analytics
9.10. Raster Outputs
9.11. Raster Processing
9.11.1. Map Algebra
9.11.2. Built-in Map Algebra Callback Functions
9.11.3. DEM (Elevation)
9.11.4. Raster to Geometry
9.12. Raster Operators
9.13. Raster and Raster Band Spatial Relationships
10. Preguntas frecuentes sobre PostGIS Raster
11. Topology
11.1. Tipos en Topology
11.2. Dominios de Topology
11.3. Topology and TopoGeometry Management
11.4. Constructores de Topología
11.5. Editores de Topología
11.6. Topology Accessors
11.7. Topology Processing
11.8. Constructores de Geometría Topográfica
11.9. Editores TopoGeometry
11.10. Descriptores de Geometría Topográfica
11.11. Salidas de Geometría Topográfica
11.12. Topology Spatial Relationships
12. Normalizador de Direcciones
12.1. Cómo funciona el analizador
12.2. Tipos de Address Standardizer
12.3. Address Standardizer Tables
12.4. Funciones de Address Standardizer
13. Extras de PostGIS
13.1. Geocodificador Tiger
14. PostGIS Special Functions Index
14.1. PostGIS Aggregate Functions
14.2. PostGIS Window Functions
14.3. PostGIS SQL-MM Compliant Functions
14.4. PostGIS Geography Support Functions
14.5. PostGIS Raster Support Functions
14.6. PostGIS Geometry / Geography / Raster Dump Functions
14.7. PostGIS Box Functions
14.8. PostGIS Functions that support 3D
14.9. PostGIS Curved Geometry Support Functions
14.10. PostGIS Polyhedral Surface Support Functions
14.11. PostGIS Function Support Matrix
14.12. New, Enhanced or changed PostGIS Functions
14.12.1. PostGIS Functions new or enhanced in 2.4
14.12.2. PostGIS Functions new or enhanced in 2.3
14.12.3. PostGIS Functions new or enhanced in 2.2
14.12.4. PostGIS functions breaking changes in 2.2
14.12.5. PostGIS Functions new or enhanced in 2.1
14.12.6. PostGIS functions breaking changes in 2.1
14.12.7. PostGIS Functions new, behavior changed, or enhanced in 2.0
14.12.8. PostGIS Functions changed behavior in 2.0
14.12.9. PostGIS Functions new, behavior changed, or enhanced in 1.5
14.12.10. PostGIS Functions new, behavior changed, or enhanced in 1.4
14.12.11. PostGIS Functions new in 1.3
15. Informar de problemas
15.1. Informar sobre errores de software
15.2. Informando sobre problemas de documentación
A. Apéndice
A.1. Versión 2.2.0
A.2. Versión 2.2.0
A.3. Versión 2.2.0
A.4. Versión 2.2.0
A.5. Versión 2.2.0
A.6. Versión 2.2.0
A.7. Versión 2.2.0
A.8. Versión 2.2.0
A.9. Versión 2.1.4
A.10. Versión 2.1.4
A.11. Versión 2.1.4
A.12. Release 2.1.5
A.13. Versión 2.1.4
A.14. Release 2.1.3
A.15. Release 2.1.2
A.16. Release 2.1.1
A.17. Release 2.1.0
A.18. Release 2.0.5
A.19. Release 2.0.4
A.20. Release 2.0.3
A.21. Release 2.0.2
A.22. Release 2.0.1
A.23. Release 2.0.0
A.24. Release 1.5.4
A.25. Release 1.5.3
A.26. Release 1.5.2
A.27. Release 1.5.1
A.28. Release 1.5.0
A.29. Release 1.4.0
A.30. Release 1.3.6
A.31. Release 1.3.5
A.32. Release 1.3.4
A.33. Release 1.3.3
A.34. Release 1.3.2
A.35. Release 1.3.1
A.36. Release 1.3.0
A.37. Release 1.2.1
A.38. Release 1.2.0
A.39. Release 1.1.6
A.40. Release 1.1.5
A.41. Release 1.1.4
A.42. Release 1.1.3
A.43. Release 1.1.2
A.44. Release 1.1.1
A.45. Release 1.1.0
A.46. Release 1.0.6
A.47. Release 1.0.5
A.48. Release 1.0.4
A.49. Release 1.0.3
A.50. Release 1.0.2
A.51. Release 1.0.1
A.52. Release 1.0.0
A.53. Release 1.0.0RC6
A.54. Release 1.0.0RC5
A.55. Release 1.0.0RC4
A.56. Release 1.0.0RC3
A.57. Release 1.0.0RC2
A.58. Release 1.0.0RC1

Chapter 1. Introducción

PostGIS fue desarrollado por Refraction Research Inc, como un proyecto de investigación en tecnología de bases de datos espaciales. Refractions es una compañía de consultoría en SIG y Bases de Datos ubicada en Victoria, Columbia Británica, Canada, especializada integración de datos y desarrollo personalizado de Software. Planeamos seguir dando soporte y desarrollando PostGIS para dar soporte a una gran variedad de funcionalidad SIG, incluido soporte completo a OpenGIS, constructores de topología avanzados(coberturas, superficies, redes), herramientas de escritorio para visualizar y editar datos SIG, y herramientas de acceso web.

PostGIS es un proyecto en incubación de la fundación OSGeo. PostGIS esta siendo mejorado y financiado constantemente por muchos desarrolladores de FOSS4G, así como por compañías de todo el mundo que hacen beneficios gracias a sus funcionalidad y versatilidad.

1.1. Comité de Dirección del Proyecto (Project Steering Committee)

El Comité de Dirección del Proyecto PostGIS (PSC por sus siglas en Ingles, Project Steering Committee) coordina la dirección general, ciclos de publicación,documentación, y el alcance de los esfuerzos para el proyecto PostGIS. Ademas el PSC da soporte general a usuarios, acepta y aprueba los parches de la comunidad general de PostGIS y vota sobre diversos asuntos relacionados con PostGIS como el acceso de nuevos desarrolladores, los nuevos miembros del PSC o cambios importantes en el API.

Mark Cave-Ayland

Coordina la corrección de errores y esfuerzo de mantenimiento, el alineamiento de PostGIS con liberación de versiones de PostgreSQL, selecciona y obliga a cumplir con indices espaciales, carga/dumper, y la GUI de carga de Shapefiles, integración de nuevas funciones y sus mejoras.

Regina Obe

Mantenimiento Buildbot, paquetes Windows de producción y experimentales, documentación, apoyo a los usuarios en general y al grupo de noticias PostGIS, soporte X3D,soporte de Tiger Geocoder, funciones de gestión, y el testado de una nueva funcionalidad o grandes cambios en el código.

Bborie Park

Raster development, integration with GDAL, raster loader, user support, general bug fixing, testing on various OS (Slackware, Mac, Windows, and more)

Paul Ramsey (Chair)

Co-founder of PostGIS project. General bug fixing, geography support, geography and geometry index support (2D, 3D, nD index and anything spatial index), underlying geometry internal structures, PointCloud (in development), GEOS functionality integration and alignment with GEOS releases, loader/dumper, and Shapefile GUI loader.

Sandro Santilli

Correccion de errores y mantenimiento e integración de nuevas funcionalidad GEOS y alineamiento con nuevas versiones GEOS, soporte del modulo Topology, y el framework Raster y funciones API de bajo nivel

1.2. Core Contributors Present

Jorge Arévalo

Desarrollo raster, soporte del driver GDAL, cargador

Nicklas Avén

Distance function enhancements (including 3D distance and relationship functions) and additions, Tiny WKB output format (TWKB) (in development) and general user support

Dan Baston

Geometry clustering function additions, other geometry algorithm enhancements, and general user support

Olivier Courtin

Entrada y salida XML (KML,GML)/Funciones GeoJSON, soporte 3D y corrección de errores.

Björn Harrtell

MapBox Vector Tile and GeoBuf functions. Gogs testing.

Mateusz Loskot

CMake support for PostGIS, built original raster loader in python and low level raster api functions

Pierre Racine

Arquitectura, prototipo y soporte en la programación Raster.

1.3. Core Contributors Past

Chris Hodgson

Anterior miembro del PSC. Desarrollo en general, mantenimiento del sitio web y buildbot, gestor de la incubación en el OSGeo

Kevin Neufeld

Prior PSC Member. Documentation and documentation support tools, buildbot maintenance, advanced user support on PostGIS newsgroup, and PostGIS maintenance function enhancements.

Dave Blasby

El desarrollado/Cofundador de PostGIS original. Dave escribió el código de los objetos del lado del servidor, enlaces de los indices y muchas otras funciones analíticas del lado del servidor.

Jeff Lounsbury

Desarrollo original del cargador/descargador de ficheros Shape. Es el propietario representativo actual del proyecto PostGIS.

Mark Leslie

Mantenimiento y desarrollo de funciones básicas. Soporte de la curva de mejora. Cargador de Shapefiles.

David Zwarg

Raster development (mostly map algebra analytic functions)

1.4. Other Contributors

Individual Contributors

In alphabetical order: Alex Bodnaru, Alex Mayrhofer, Andrea Peri, Andreas Forø Tollefsen, Andreas Neumann, Anne Ghisla, Barbara Phillipot, Ben Jubb, Bernhard Reiter, Brian Hamlin, Bruce Rindahl, Bruno Wolff III, Bryce L. Nordgren, Carl Anderson, Charlie Savage, Dane Springmeyer, David Skea, David Techer, Eduin Carrillo, Even Rouault, Frank Warmerdam, George Silva, Gerald Fenoy, Gino Lucrezi, Guillaume Lelarge, IIDA Tetsushi, Ingvild Nystuen, Jason Smith, Jeff Adams, Jose Carlos Martinez Llari, Julien Rouhaud, Kashif Rasul, Klaus Foerster, Kris Jurka, Leo Hsu, Loic Dachary, Luca S. Percich, Maria Arias de Reyna, Mark Sondheim, Markus Schaber, Maxime Guillaud, Maxime van Noppen, Michael Fuhr, Mike Toews, Nathan Wagner, Nathaniel Clay, Nikita Shulga, Norman Vine, Rafal Magda, Ralph Mason, Rémi Cura, Richard Greenwood, Silvio Grosso, Steffen Macke, Stephen Frost, Tom van Tilburg, Vincent Mora, Vincent Picavet

Corporate Sponsors

Estas son compañías que han contribuido con tiempo de desarrollo, alojamiento o con aportes de capital económico al proyecto PostGIS

In alphabetical order: Arrival 3D, Associazione Italiana per l'Informazione Geografica Libera (GFOSS.it), AusVet, Avencia, Azavea, Cadcorp, CampToCamp, CartoDB, City of Boston (DND), Clever Elephant Solutions, Cooperativa Alveo, Deimos Space, Faunalia, Geographic Data BC, Hunter Systems Group, Lidwala Consulting Engineers, LisaSoft, Logical Tracking & Tracing International AG, Maponics, Michigan Tech Research Institute, Natural Resources Canada, Norwegian Forest and Landscape Institute, Boundless (former OpenGeo), OSGeo, Oslandia, Palantir Technologies, Paragon Corporation, R3 GIS, Refractions Research, Regione Toscana - SITA, Safe Software, Sirius Corporation plc, Stadt Uster, UC Davis Center for Vectorborne Diseases, University of Laval, U.S Department of State (HIU), Zonar Systems

Campañas de Crowd Funding

Crowd funding campaigns are campaigns we run to get badly wanted features funded that can service a large number of people. Each campaign is specifically focused on a particular feature or set of features. Each sponsor chips in a small fraction of the needed funding and with enough people/organizations contributing, we have the funds to pay for the work that will help many. If you have an idea for a feature you think many others would be willing to co-fund, please post to the PostGIS newsgroup your thoughts and together we can make it happen.

PostGIS 2.0.0 fue la primer version en la que utilizamos esta estrategia. Utilizamos PledgeBank y hemos tenido dos campañas con éxito para realizarlas.

postgistopology - 10 patrocinadores contribuyeron con $ 250 USD cada uno para construir la función toTopoGeometry y con este apoyo, topología 2.0.0. Sucedió.

postgis64windows - 20 someodd sponsors each contributed $100 USD to pay for the work needed to work out PostGIS 64-bit issues on windows. It happened. We now have a 64-bit release for PostGIS 2.0.1 available on PostgreSQL stack builder.

Librerías de soporte importantes

La libreria de operaciones geométricas GEOS, y el trabajo en los algoritmos de Martin Davis haciendo que funcione, mantenimiento y soporte continuos de Mateusz Loskot, Sandro Santilli (strk), Paul Ramsey y otros.

La libreria Geospatial Data Abstraction GDAL, de Frank Warmerdam y otros, se usa para las funcionalidades raster introducidas en la version PostGIS 2.0.0. De este modo, las mejoras necesarias en GDAL para dar soporte a PostGIS son introducidas en el proyecto GDAL.

La libreria de proyecciones cartográficas Proj4, y el trabajo de Gerald Evenden y Frank Warmerdam en la creación y mantenimiento de la misma.

Por ultimo pero no menos importante, PostgreSQL DBMS, El Gigante sobre el que se apoya PostGIS. Gran parte de la velocidad y la flexibilidad de PostGIS no sería viable sin la extensibilidad, gran planeador de consultas, el índice de GIST, y gran cantidad de funciones SQL que ofrece PostgreSQL.

1.5. Mas información

Chapter 2. PostGIS Installation

En este capítulo se detallan los pasos necesarios para instalar PostGIS .

2.1. Versión corta

To compile assuming you have all the dependencies in your search path:

tar xvfz postgis-2.5.0dev.tar.gz
cd postgis-2.5.0dev
./configure
make
make install

Once postgis is installed, it needs to be enabled in each individual database you want to use it in.

[Note]

The raster support is currently optional, but installed by default. For enabling using the PostgreSQL 9.1+ extensions model raster is required. Using the extension enable process is preferred and more user-friendly. To spatially enable your database:

psql -d yourdatabase -c "CREATE EXTENSION postgis;"
psql -d yourdatabase -c "CREATE EXTENSION postgis_topology;"
-- if you built with sfcgal support --
psql -d yourdatabase -c "CREATE EXTENSION postgis_sfcgal;"

-- if you want to install tiger geocoder --
psql -d yourdatabase -c "CREATE EXTENSION fuzzystrmatch"
psql -d yourdatabase -c "CREATE EXTENSION postgis_tiger_geocoder;"

-- if you installed with pcre
-- you should have address standardizer extension as well
psql -d yourdatabase -c "CREATE EXTENSION address_standardizer;"

Please refer to Section 2.4.3, “Compilando e Instalando Extensiones de PostGIS” for more details about querying installed/available extensions and upgrading extensions, or switching from a non-extension install to an extension install.

For those running who decided for some reason not to compile with raster support, or just are old-fashioned, here are longer more painful instructions for you:

All the .sql files once installed will be installed in share/contrib/postgis-2.3 folder of your PostgreSQL install

createdb yourdatabase
createlang plpgsql yourdatabase
psql -d yourdatabase -f postgis.sql
psql -d yourdatabase -f postgis_comments.sql
psql -d yourdatabase -f spatial_ref_sys.sql
psql -d yourdatabase -f topology.sql
psql -d yourdatabase -f topology_comments.sql

-- only if you compiled with raster (GDAL)
psql -d yourdatabase -f rtpostgis.sql
psql -d yourdatabase -f raster_comments.sql

--if you built with sfcgal support --
psql -d yourdatabase -f sfcgal.sql
psql -d yourdatabase -f sfcgal_comments.sql

El resto del capitulo entra en los detalles de cada uno de los pasos de instalación anteriores.

As of PostGIS 2.1.3, out-of-db rasters and all raster drivers are disabled by default. In order to re-enable these, you need to set the following environment variables POSTGIS_GDAL_ENABLED_DRIVERS and POSTGIS_ENABLE_OUTDB_RASTERS in the server environment. For PostGIS 2.2, you can use the more cross-platform approach of setting the corresponding Section 8.2, “PostGIS Grand Unified Custom Variables (GUCs)”.

If you want to enable offline raster:

POSTGIS_ENABLE_OUTDB_RASTERS=1

Any other setting or no setting at all will disable out of db rasters.

In order to enable all GDAL drivers available in your GDAL install, set this environment variable as follows

POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL

If you want to only enable specific drivers, set your environment variable as follows:

POSTGIS_GDAL_ENABLED_DRIVERS="GTiff PNG JPEG GIF XYZ"
[Note]

If you are on windows, do not quote the driver list

Setting environment variables varies depending on OS. For PostgreSQL installed on Ubuntu or Debian via apt-postgresql, the preferred way is to edit /etc/postgresql/9.3/main/environment where 9.3 refers to version of PostgreSQL and main refers to the cluster.

On windows, if you are running as a service, you can set via System variables which for Windows 7 you can get to by right-clicking on Computer->Properties Advanced System Settings or in explorer navigating to Control Panel\All Control Panel Items\System. Then clicking Advanced System Settings ->Advanced->Environment Variables and adding new system variables.

After you set the environment variables, you'll need to restart your PostgreSQL service for the changes to take effect.

2.2. Install Requirements

PostGIS tiene los siguientes requisitos para compilarlo y usarlo:

Requerido

  • PostgreSQL 9.3 o superior. Una instalación completa de PostgreSQL (incluyendo las cabeceras del servidor) es necesaria. PostgreSQL esta disponible en http://www.postgresql.org .

    Para conocer las compatibilidades entre versiones de PostgreSQL/PostGIS y PostGIS/GEOS puede ver una matriz de compatibilidades en http://trac.osgeo.org/postgis/wiki/UsersWikiPostgreSQLPostGIS

  • compilador GNU C (gcc). Otros compiladores ANSI C pueden utilizarse para compilar PostGIS, pero encontraremos menos problemas al compilar con gcc.

  • GNU Make (gmake or make). Para muchos sistemas , GNU make es la versión por defecto de make. Para verificar la versión de make podemos ejecutar el siguiente comando make -v. Otras versiones de make pueden no procesar el fichero PostGIS Makefile de forma correcta.

  • La librería de reproyección Proj4 , en su versión versión 4.6.0 o superior. La librería Proj4 es utilizada para dar soporte a la reproyección de coordenadas en PostGIS. Proj4 esta disponible para descargar en http://trac.osgeo.org/proj/ .

  • GEOS geometry library, version 3.4 or greater, but GEOS 3.7+ is recommended to take full advantage of all the new functions and features. You should have at least GEOS 3.5, without which you will be missing some major enhancements such as ST_ClipByBox2D and ST_Subdivide. GEOS is available for download from http://trac.osgeo.org/geos/ and 3.5+ is backward-compatible with older versions so fairly safe to upgrade.

  • LibXML2, versión 2.5.x o superior. LibXML2 se usa actualmente en alguna funciones para importar (ST_GeomFromGML y ST_GeomFromKML). LibXML2 esta disponible para su descarga en http://xmlsoft.org/downloads.html.

  • JSON-C, version 0.9 or higher. JSON-C is currently used to import GeoJSON via the function ST_GeomFromGeoJson. JSON-C is available for download from https://github.com/json-c/json-c/releases/.

  • GDAL, version 1.8 or higher (1.9 or higher is strongly recommended since some things will not work well or behavior differently with lower versions). This is required for raster support and to be able to install with CREATE EXTENSION postgis so highly recommended for those running 9.1+. http://trac.osgeo.org/gdal/wiki/DownloadSource.

Opcional

  • GDAL (pseudo optional) only if you don't want raster and don't care about installing with CREATE EXTENSION postgis can you leave it out. Keep in mind other extensions may have a requires postgis extension which will prevent you from installing them unless you install postgis as an extension. So it is highly recommended you compile with GDAL support.

    Also make sure to enable the drivers you want to use as described in Section 2.1, “Versión corta”.

  • GTK (GTK+2.0, 2.8+ requerida) para compilar el cargador de shapefiles shp2pgsql-gui. http://www.gtk.org/ .

  • SFCGAL, version 1.1 (or higher) could be used to provide additional 2D and 3D advanced analysis functions to PostGIS cf Section 8.10, “SFCGAL Functions”. And also allow to use SFCGAL rather than GEOS for some 2D functions provided by both backends (like ST_Intersection or ST_Area, for instance). A PostgreSQL configuration variable postgis.backend allow end user to control which backend he want to use if SFCGAL is installed (GEOS by default). Nota: SFCGAL 1.2 require at least CGAL 4.3 and Boost 1.54 (cf: http://oslandia.github.io/SFCGAL/installation.html) https://github.com/Oslandia/SFCGAL.

  • In order to build the Chapter 12, Normalizador de Direcciones you will also need PCRE http://www.pcre.org (which generally is already installed on nix systems). Regex::Assemble perl CPAN package is only needed if you want to rebuild the data encoded in parseaddress-stcities.h. Chapter 12, Normalizador de Direcciones will automatically be built if it detects a PCRE library, or you pass in a valid --with-pcre-dir=/path/to/pcre during configure.

  • To enable ST_AsMVT protobuf-c library (for usage) and the protoc-c compiler (for building) are required. Also, pkg-config is required to verify the correct minimum version of protobuf-c. See protobuf-c.

  • CUnit (CUnit). Se necesita para hacer test de regresión. http://cunit.sourceforge.net/

  • DocBook (xsltproc) es necesario para compilar la documentación. Docbook esta disponible en http://www.docbook.org/ .

  • DBLatex (dblatex) necesario para construir la documentación en formato PDF. DBLatex esta disponible en http://dblatex.sourceforge.net/ .

  • ImageMagick (convert) es necesario para generar las imágenes empleadas en la documentación. ImageMagick esta disponible en http://www.imagemagick.org/ .

2.3. Obteniendo el código fuente

Retrieve the PostGIS source archive from the downloads website http://postgis.net/stuff/postgis-2.5.0dev.tar.gz

wget http://postgis.net/stuff/postgis-2.5.0dev.tar.gz
tar -xvzf postgis-2.5.0dev.tar.gz

Esto creara un directorio llamado postgis-2.5.0dev en el directorio de trabajo actual.

De forma alternativa se puede obtener el código fuente del repositorio svn http://svn.osgeo.org/postgis/trunk/ .

svn checkout http://svn.osgeo.org/postgis/trunk/ postgis-2.5.0dev

Vaya al nuevo directorio postgis-2.5.0dev creado para continuar con la instalación.

2.4. Compiling and Install from Source: Detailed

[Note]

Muchos Sistemas Operativos incluyen ya paquetes precompilados PostgreSQL/PostGIS. En la mayoría de casos no es necesario compilar salvo si quieres las ultimas versiones o eres alguien que hace mantenimiento de paquetes.

Esta sección incluye las instrucciones generales de compilado, si estas compilando en Windows o otro Sistema Operativo, puedes encontrar información adicional detallada en PostGIS User contributed compile guides y PostGIS Dev Wiki.

Algunos paquetes precompilados para varios Sistemas Operativos están en PostGIS Pre-built Packages

Si eres usuario de Windows, puedes obtener versiones estables compiladas via Stackbuilder o sitio de descragas de PostGIS para Windows También tenemos versiones experimentales para Windows que son publicadas normalmente una o dos veces por semana o cuando algo interesante ocurre. Puedes utilizar estas para experimentar con las versiones de desarrollo de PostGIS

El modulo PostGIS es una extensión del servidor PostgreSQL. Como tal, PostGIS 2.5.0dev requiere PostgreSQL con acceso completo cabeceras del servidor con el fin de compilar. Puede ser compilado en PostgreSQL versiones 9.3, o superior. Las versiones anteriores de PostgreSQL no son compatibles.

Si todavía no tienes instalado PostgreSQL puedes ir a la guía de instalación de PostgreSQL en http://www.postgresql.org .

[Note]

Para tener compatibilidad con las funcionalidades GEOS, cuando instales PostgreSQL necesitar hacer un enlace explícito de PostgreSQL con la librería estándar C++:

LDFLAGS=-lstdc++ ./configure [PON TUS OPCIONES AQUI]

Esta es una falsa solución para excepciones de interacción de C++ con herramientas de desarrollo antiguas. Si experimentas problemas extraños (backend cerrado inesperadamente o cosas similares) prueba este truco. Para ello será necesario volver a compilar PostgreSQL desde cero, por supuesto.

Los siguientes pasos describen la configuración y compilación del código fuente de PostGIS. Están escritas para usuarios Linux y no funcionaran con Windows o Mac.

2.4.1. Configuración

Como en la gran mayoría de instalaciones Linux, el primer paso es generar el Makefile que se utilizara para compilar el código fuente. Esto se hace ejecutando el script de shell.

./configure

Sin parámetros adicionales, este comando intentara localizar los componentes y librerías necesarios para construir el código fuente PostGIS de forma automática en tu sistema. Aunque este es el uso mas común de ./configure, el script acepta varios parámetros para aquellos que han instalado las librerías y programas en lugares no standard.

La siguiente lista muestra los parámetros utilizados mas comunes. Para obtener una lista completa, puedes utilizar los parámetros --help o --help=short.

--prefix=PREFIX

Esta es la localización donde se instalaran las librerías PostGIS y los scripts SQL. Por defecto, esta localización es la misma que la detectada para la instalación PostgreSQL.

[Caution]

Este parámetro está roto actualmente, ya que el paquete sólo se instalará en el directorio de instalación de PostgreSQL. Para seguir avence de este bug visita http://trac.osgeo.org/postgis/ticket/635

--with-pgconfig=FILE

PostgreSQL tiene una herramienta llamada pg_config para activar extensiones como PostGIS o para localizar el directorio de instalación de PostgreSQL. Utiliza este parámetro (--with-pgconfig=/path/to/pg_config) para especificar una instalación personalizada de PostgreSQL de forma manual que PostGIS utilizara para compilar.

--with-gdalconfig=FILE

GDAL, una biblioteca necesaria, proporciona la funcionalidad necesaria para el soporte de raster gdal-config para activar la instalación de software para localizar el directorio de instalación de GDAL. Utilice este parámetro ( - with-gdalconfig = / ruta /a/ gdal config-) para especificar manualmente una instalación de GDAL personalizada que PostGIS utilizara para compilar.

--with-geosconfig=FILE

GEOS, libreria de geometrías requerida, tiene una utilidad llamada geos-config para activar la localización del directorio de instalación del software GEOS. Utiliza este parametro (--with-geosconfig=/path/to/geos-config) para especificar de forma manual una instalación personalizada de GEOS que PostGIS puede utilizar para compilar.

--with-xml2config=FILE

LibXML es una libreria necesaria para procesar GeomFromKML/GML. Normalmente encontrara si tienes instalada la libreria libxml, pero si no esta instalada, o quieres usar una versión especifica, necesitaras que PostGIS apunte a un fichero de configuración particular xml2-config para localizar un directorio de instalación LibXML para activar la instalación del Software. Utiliza el siguiente parámetro ( >--with-xml2config=/path/to/xml2-config) para especificar de forma manual una instalación personalizada de LibXML con la que compilar PostGIS.

--with-projdir=DIR

Proj4 es una libreria de reproyecciones necesaria de PostGIS. Utiliza el siguiente parametro (--with-projdir=/path/to/projdir) para definir manualmente una instalación personalizada de Proj4 para compilar PostGIS.

--with-libiconv=DIR

Directorio donde iconv esta instalado.

--with-jsondir=DIR

JSON-Ces una libreria con licencia MIT-licensed JSON necesaria para dar soporte a PostGIS ST_GeomFromJSON. Utiliza este parametro (--with-jsondir=/path/to/jsondir) para especificar de forma manual el directorio de instalación personalizado de instalación de JSON-C que PostGIS utilizara para compilar.

--with-pcredir=DIR

PCRE is an BSD-licensed Perl Compatible Regular Expression library required by address_standardizer extension. Use this parameter (--with-pcredir=/path/to/pcredir) to manually specify a particular PCRE installation directory that PostGIS will build against.

--with-gui

Compilar la GUI de importar datos (necesita GTK+2.0). Esto creara una interfaz gráfica shp2pgsql-gui para el comando shp2pgsql.

--with-raster

Compilar con soporte para raster. Esto compilara la libreria rtpostgis-2.5.0dev y el fichero rtpostgis.sql. Esto puede no ser necesario en la versión final ya que el plan es dar soporte raster de forma predeterminada.

--without-topology

Compilar con soporte de topología. Esto creara el fichero topology.sql. No hay librerías dependientes ya que toda la lógica necesaria esta contenida en la librería postgis-2.5.0dev.

--with-gettext=no

PostGIS intentara detectar soporte gettext y compilar con el por defecto, de todas formas si existen incompatibilidades que causan errores de carga, se puede desactivar por completo con este comando. Para ver un ejemplo de resolución de problemas configurando en gettext puedes ver el siguiente enlace http://trac.osgeo.org/postgis/ticket/748. NOTA: No te pierdes mucho si desactivas esta opción. Se utiliza principalmente para soporte de ayuda/etiquetas internacionales en la GUI de carga, que actualmente no esta documentada y sigue siendo experimental.

--with-sfcgal=PATH

By default PostGIS will not install with sfcgal support without this switch. PATH is an optional argument that allows to specify an alternate PATH to sfcgal-config.

[Note]

Si has obtenido PostGIS desde el repositorio SVN, el primer paso es ejecutar el script

./autogen.sh

Este Script generara el script configure que a su vez se utiliza para personalizar la instalación de PostGIS.

Si, por el contrario, as obtenido PostGIS como tarball, ejecutar ./autogen.sh no es necesario ya que ya se ha generado configure.

2.4.2. Compilando

Una vez generado el Makefile, compilar PostGIS es tan simple como ejecutar

make

La ultima linea de salida del terminal debe ser "PostGIS copilado con éxito. Listo para instalar."

Como en PostGIS v1.4.0, todas las funciones tienen comentarios generados a partir de la documentación. Si quieres instalar estos comentarios en tu base de datos espacial luego, ejecuta el comando que requiere docbook. Los ficheros de comentarios postgis_comments.sql, raster_comments.sql, topology_comments.sql también están incluidos en la distribución tar.gz en la carpeta doc, así que si instalas desde el fichero tar no necesitas compilar los comentarios

make comments

Introducido en la version PostGIS 2.0. Esto genera hojas de referencia html para una referencia rápida o para los folletos. Esto requiere xsltproc para compilar y generará 4 ficheros en la carpeta doc topology_cheatsheet.html, tiger_geocoder_cheatsheet.html, raster_cheatsheet.html, postgis_cheatsheet.html

Puedes descargar algunos ya compilados en formato html o pdf en Guias de Estudio PostGIS / PostgreSQL

make cheatsheets

2.4.3. Compilando e Instalando Extensiones de PostGIS

Las extensiones de PosGIS son compiladas e instaladas de forma automatica si estas utilizando la version 9.1+ de PostgreSQL

Si estas compilando desde el repositorio de código fuente, necesitas compilar primero la función descriptions. Si tienes instaldo docbook ya esta compilado. También puedes compilarla manualmente con la sentencia:

make comments

Compilar los comentarios no es necesario si estas compilando desde un tar ya que están en el paquete pre-compilados con el tar.

Si estas compilando para PostgreSQL 9.1, la extension debería compilarse de forma automática como parte del proceso del comando make install. Si lo necesitas, puedes compilar la extensión desde las carpetas de la extensión o copiar los ficheros en un servidor diferente.

cd extensions
cd postgis
make clean
make
make install
cd ..
cd postgis_topology
make clean
make
make install
cd ..
cd postgis_sfcgal
make clean
make
make install

cd ..
cd address_standardizer
make clean
make
make install
make installcheck

cd ..
cd postgis_tiger_geocoder
make clean
make
make install
make installcheck
          

Los ficheros de la extension serán siempre los mismos para la misma versión de PostgreSQL independientemente del Sistema Operativo, así que se pueden copiar los ficheros de la extensión de un Sistema Operativo a otro si ya tienes los binarios de PostGIS ya instalados en tus servidores.

Si quieres instalar la extensión de forma manual en un servidor separado de tu servidor de desarrollo, necesitas copiar los siguientes archivos de la carpeta de la extensión en la carpeta PostgreSQL / share / extension de la instalación de PostgreSQL y los binarios normales para PostGIS si no los tienes instalados en el servidor.

  • Estos son los ficheros de control que contienen información como la versión de la extensión a instalar si no lo has especificado. postgis.control, postgis_topology.control.

  • Todos los ficheros en la carpeta /sql de la extension. Estos ficheros deben ser copiados en la raiz de PostgreSQL en la carpeta share/extension extensions/postgis/sql/*.sql, extensions/postgis_topology/sql/*.sql

Una vez hecho esto deberías ver postgis, postgis_topology como extensiones disponibles en PgAdmin -> extensiones.

Si estas utilizando psql, puedes verificar que las extensiones están instaladas ejecutando la siguiente sentencia:

SELECT name, default_version,installed_version
FROM pg_available_extensions WHERE name LIKE 'postgis%' or name LIKE 'address%';

             name             | default_version | installed_version
------------------------------+-----------------+-------------------
 address_standardizer         | 2.5.0dev         | 2.5.0dev
 address_standardizer_data_us | 2.5.0dev         | 2.5.0dev
 postgis                      | 2.5.0dev         | 2.5.0dev
 postgis_sfcgal               | 2.5.0dev         |
 postgis_tiger_geocoder       | 2.5.0dev         | 2.5.0dev
 postgis_topology             | 2.5.0dev         |
(6 rows)

Si tienes instalada una extension en la base de datos que estas consultando, deberías verla mencionada la columna installed_version. Si la consulta no devuelve ningún registro, significa que no tienes la extension PostGIS instalada en el servidor. PgAdmin III 1.14+ muestra esta información en la sección extensiones en el navegador de bases de datos y permite actualizar o instalar haciendo click derecho.

Si la extension esta disponible, puedes instalar la extension postgis en la base de datos de tu elección utilizando la interfaz de extensiones de pgAdmin o ejecutando la siguiente sentencia:

CREATE EXTENSION postgis;
CREATE EXTENSION postgis_sfcgal;
CREATE EXTENSION fuzzystrmatch; --needed for postgis_tiger_geocoder
--optional used by postgis_tiger_geocoder, or can be used standalone
CREATE EXTENSION address_standardizer;
CREATE EXTENSION address_standardizer_data_us;
CREATE EXTENSION postgis_tiger_geocoder;
CREATE EXTENSION postgis_topology;

In psql you can use to see what versions you have installed and also what schema they are installed.

\connect mygisdb
\x
\dx postgis*
List of installed extensions
-[ RECORD 1 ]-------------------------------------------------
-
Name        | postgis
Version     | 2.5.0dev
Schema      | public
Description | PostGIS geometry, geography, and raster spat..
-[ RECORD 2 ]-------------------------------------------------
-
Name        | postgis_tiger_geocoder
Version     | 2.5.0dev
Schema      | tiger
Description | PostGIS tiger geocoder and reverse geocoder
-[ RECORD 3 ]-------------------------------------------------
-
Name        | postgis_topology
Version     | 2.5.0dev
Schema      | topology
Description | PostGIS topology spatial types and functions
[Warning]

No se pueden hacer copias de seguridad explicitas de las tablas de las extensiones spatial_ref_sys, layer, topology. Solo se pueden hacer copias de seguridad explicitas cuando cuando se hacen copias de seguridad de sus respectivas extensiones postgis or postgis_topology, lo que al parecer ocurre cuando haces una copia de seguridad de la base de datos completa. Con PostGIS 2.0.1, solo los srid no incluidos en PostGIS son guardados cuando se hace una copia de seguridad de la base de datos, así que no esperes que al cambiar alguno de los srid que incluye PostGIS este en tu copia de seguridad. Envia un ticket si encuentras algún problema. La estructura de las tabals de extensiones no se guardan en copias de seguridad si son creadas con CREATE EXTENSION y son la misma estructura para una version dada de una extension. Estos comportamientos están incorporados en el modelo de extensiones PostgreSQL actual, así que nada podemos hacer al respecto.

If you installed 2.5.0dev, without using our wonderful extension system, you can change it to be extension based by first upgrading to the latest micro version running the upgrade scripts: postgis_upgrade_22_minor.sql,raster_upgrade_22_minor.sql,topology_upgrade_22_minor.sql.

Si ha instalado postgis sin el soporte raster, necesitara instalarlo primero (usando el archivo rtpostgis.sql

Entonces podrá ejecutar los siguientes comandos para empaquetar las funciones en sus extensiones respectivas.

CREATE EXTENSION postgis FROM unpackaged;
CREATE EXTENSION postgis_topology FROM unpackaged;
CREATE EXTENSION postgis_tiger_geocoder FROM unpackaged;

2.4.4. Tests

Si quieres hacer un test en la compilación de PostGIS, ejecuta

make check

El comando anterior ejecutará varias comprobaciones y tests de regresión utilizando la librería generada para la version de base de datos PostgreSQL actual.

[Note]

Si has configurado PostGIS con instalaciones de PostgreSQL, GEOS, o Proj4 en directorios personalizados, necesitaras añadir las localizaciones de las librerías personalizadas en la variable de entorno LD_LIBRARY_PATH.

[Caution]

Actualmente, el comando make check une las variables de entorno PATH y PGPORT cundo ejecuta las comprobaciones - no utiliza la version de PostgreSQL especificada utilizando el parametro de configuración --with-pgconfig. Así que hay que estar seguros de modificar la variable de entorno PATH para que apunte a la instalación de PostgreSQL detectada durante la configuración o estar preparado para tener algún que otro dolor de cabeza.

Si todo ha ido bien, la salida del comando de test debería ser similar a la siguiente:

CUnit - A unit testing framework for C - Version 2.1-2
     http://cunit.sourceforge.net/


Suite: computational_geometry
  Test: test_lw_segment_side ...passed
  Test: test_lw_segment_intersects ...passed
  Test: test_lwline_crossing_short_lines ...passed
  Test: test_lwline_crossing_long_lines ...passed
  Test: test_lwline_crossing_bugs ...passed
  Test: test_lwpoint_set_ordinate ...passed
  Test: test_lwpoint_get_ordinate ...passed
  Test: test_point_interpolate ...passed
  Test: test_lwline_clip ...passed
  Test: test_lwline_clip_big ...passed
  Test: test_lwmline_clip ...passed
  Test: test_geohash_point ...passed
  Test: test_geohash_precision ...passed
  Test: test_geohash ...passed
  Test: test_geohash_point_as_int ...passed
  Test: test_isclosed ...passed
  Test: test_lwgeom_simplify ...passed
Suite: buildarea
  Test: buildarea1 ...passed
  Test: buildarea2 ...passed
  Test: buildarea3 ...passed
  Test: buildarea4 ...passed
  Test: buildarea4b ...passed
  Test: buildarea5 ...passed
  Test: buildarea6 ...passed
  Test: buildarea7 ...passed
Suite: geometry_clean
  Test: test_lwgeom_make_valid ...passed
Suite: clip_by_rectangle
  Test: test_lwgeom_clip_by_rect ...passed
Suite: force_sfs
  Test: test_sfs_11 ...passed
  Test: test_sfs_12 ...passed
  Test: test_sqlmm ...passed
Suite: geodetic
  Test: test_sphere_direction ...passed
  Test: test_sphere_project ...passed
  Test: test_lwgeom_area_sphere ...passed
  Test: test_signum ...passed
  Test: test_gbox_from_spherical_coordinates ...passed
  Test: test_gserialized_get_gbox_geocentric ...passed
  Test: test_clairaut ...passed
  Test: test_edge_intersection ...passed
  Test: test_edge_intersects ...passed
  Test: test_edge_distance_to_point ...passed
  Test: test_edge_distance_to_edge ...passed
  Test: test_lwgeom_distance_sphere ...passed
  Test: test_lwgeom_check_geodetic ...passed
  Test: test_gserialized_from_lwgeom ...passed
  Test: test_spheroid_distance ...passed
  Test: test_spheroid_area ...passed
  Test: test_lwpoly_covers_point2d ...passed
  Test: test_gbox_utils ...passed
  Test: test_vector_angle ...passed
  Test: test_vector_rotate ...passed
  Test: test_lwgeom_segmentize_sphere ...passed
  Test: test_ptarray_contains_point_sphere ...passed
  Test: test_ptarray_contains_point_sphere_iowa ...passed
Suite: GEOS
  Test: test_geos_noop ...passed
  Test: test_geos_subdivide ...passed
  Test: test_geos_linemerge ...passed
Suite: Clustering
  Test: basic_test ...passed
  Test: nonsequential_test ...passed
  Test: basic_distance_test ...passed
  Test: single_input_test ...passed
  Test: empty_inputs_test ...passed
Suite: Clustering Union-Find
  Test: test_unionfind_create ...passed
  Test: test_unionfind_union ...passed
  Test: test_unionfind_ordered_by_cluster ...passed
Suite: homogenize
  Test: test_coll_point ...passed
  Test: test_coll_line ...passed
  Test: test_coll_poly ...passed
  Test: test_coll_coll ...passed
  Test: test_geom ...passed
  Test: test_coll_curve ...passed
Suite: encoded_polyline_input
  Test: in_encoded_polyline_test_geoms ...passed
  Test: in_encoded_polyline_test_precision ...passed
Suite: geojson_input
  Test: in_geojson_test_srid ...passed
  Test: in_geojson_test_bbox ...passed
  Test: in_geojson_test_geoms ...passed
Suite: twkb_input
  Test: test_twkb_in_point ...passed
  Test: test_twkb_in_linestring ...passed
  Test: test_twkb_in_polygon ...passed
  Test: test_twkb_in_multipoint ...passed
  Test: test_twkb_in_multilinestring ...passed
  Test: test_twkb_in_multipolygon ...passed
  Test: test_twkb_in_collection ...passed
  Test: test_twkb_in_precision ...passed
Suite: serialization/deserialization
  Test: test_typmod_macros ...passed
  Test: test_flags_macros ...passed
  Test: test_serialized_srid ...passed
  Test: test_gserialized_from_lwgeom_size ...passed
  Test: test_gbox_serialized_size ...passed
  Test: test_lwgeom_from_gserialized ...passed
  Test: test_lwgeom_count_vertices ...passed
  Test: test_on_gser_lwgeom_count_vertices ...passed
  Test: test_geometry_type_from_string ...passed
  Test: test_lwcollection_extract ...passed
  Test: test_lwgeom_free ...passed
  Test: test_lwgeom_flip_coordinates ...passed
  Test: test_f2d ...passed
  Test: test_lwgeom_clone ...passed
  Test: test_lwgeom_force_clockwise ...passed
  Test: test_lwgeom_calculate_gbox ...passed
  Test: test_lwgeom_is_empty ...passed
  Test: test_lwgeom_same ...passed
  Test: test_lwline_from_lwmpoint ...passed
  Test: test_lwgeom_as_curve ...passed
  Test: test_lwgeom_scale ...passed
  Test: test_gserialized_is_empty ...passed
  Test: test_gbox_same_2d ...passed
Suite: measures
  Test: test_mindistance2d_tolerance ...passed
  Test: test_rect_tree_contains_point ...passed
  Test: test_rect_tree_intersects_tree ...passed
  Test: test_lwgeom_segmentize2d ...passed
  Test: test_lwgeom_locate_along ...passed
  Test: test_lw_dist2d_pt_arc ...passed
  Test: test_lw_dist2d_seg_arc ...passed
  Test: test_lw_dist2d_arc_arc ...passed
  Test: test_lw_arc_length ...passed
  Test: test_lw_dist2d_pt_ptarrayarc ...passed
  Test: test_lw_dist2d_ptarray_ptarrayarc ...passed
  Test: test_lwgeom_tcpa ...passed
  Test: test_lwgeom_is_trajectory ...passed
Suite: effectivearea
  Test: do_test_lwgeom_effectivearea_lines ...passed
  Test: do_test_lwgeom_effectivearea_polys ...passed
Suite: miscellaneous
  Test: test_misc_force_2d ...passed
  Test: test_misc_simplify ...passed
  Test: test_misc_count_vertices ...passed
  Test: test_misc_area ...passed
  Test: test_misc_wkb ...passed
  Test: test_grid ...passed
Suite: noding
  Test: test_lwgeom_node ...passed
Suite: encoded_polyline_output
  Test: out_encoded_polyline_test_geoms ...passed
  Test: out_encoded_polyline_test_srid ...passed
  Test: out_encoded_polyline_test_precision ...passed
Suite: geojson_output
  Test: out_geojson_test_precision ...passed
  Test: out_geojson_test_dims ...passed
  Test: out_geojson_test_srid ...passed
  Test: out_geojson_test_bbox ...passed
  Test: out_geojson_test_geoms ...passed
Suite: gml_output
  Test: out_gml_test_precision ...passed
  Test: out_gml_test_srid ...passed
  Test: out_gml_test_dims ...passed
  Test: out_gml_test_geodetic ...passed
  Test: out_gml_test_geoms ...passed
  Test: out_gml_test_geoms_prefix ...passed
  Test: out_gml_test_geoms_nodims ...passed
  Test: out_gml2_extent ...passed
  Test: out_gml3_extent ...passed
Suite: kml_output
  Test: out_kml_test_precision ...passed
  Test: out_kml_test_dims ...passed
  Test: out_kml_test_geoms ...passed
  Test: out_kml_test_prefix ...passed
Suite: svg_output
  Test: out_svg_test_precision ...passed
  Test: out_svg_test_dims ...passed
  Test: out_svg_test_relative ...passed
  Test: out_svg_test_geoms ...passed
  Test: out_svg_test_srid ...passed
Suite: x3d_output
  Test: out_x3d3_test_precision ...passed
  Test: out_x3d3_test_geoms ...passed
  Test: out_x3d3_test_option ...passed
Suite: ptarray
  Test: test_ptarray_append_point ...passed
  Test: test_ptarray_append_ptarray ...passed
  Test: test_ptarray_locate_point ...passed
  Test: test_ptarray_isccw ...passed
  Test: test_ptarray_signed_area ...passed
  Test: test_ptarray_unstroke ...passed
  Test: test_ptarray_insert_point ...passed
  Test: test_ptarray_contains_point ...passed
  Test: test_ptarrayarc_contains_point ...passed
  Test: test_ptarray_scale ...passed
Suite: printing
  Test: test_lwprint_default_format ...passed
  Test: test_lwprint_format_orders ...passed
  Test: test_lwprint_optional_format ...passed
  Test: test_lwprint_oddball_formats ...passed
  Test: test_lwprint_bad_formats ...passed
Suite: SFCGAL
  Test: test_sfcgal_noop ...passed
Suite: split
  Test: test_lwline_split_by_point_to ...passed
  Test: test_lwgeom_split ...passed
Suite: stringbuffer
  Test: test_stringbuffer_append ...passed
  Test: test_stringbuffer_aprintf ...passed
Suite: surface
  Test: triangle_parse ...passed
  Test: tin_parse ...passed
  Test: polyhedralsurface_parse ...passed
  Test: surface_dimension ...passed
Suite: Internal Spatial Trees
  Test: test_tree_circ_create ...passed
  Test: test_tree_circ_pip ...passed
  Test: test_tree_circ_pip2 ...passed
  Test: test_tree_circ_distance ...passed
  Test: test_tree_circ_distance_threshold ...passed
Suite: triangulate
  Test: test_lwgeom_delaunay_triangulation ...passed
Suite: twkb_output
  Test: test_twkb_out_point ...passed
  Test: test_twkb_out_linestring ...passed
  Test: test_twkb_out_polygon ...passed
  Test: test_twkb_out_multipoint ...passed
  Test: test_twkb_out_multilinestring ...passed
  Test: test_twkb_out_multipolygon ...passed
  Test: test_twkb_out_collection ...passed
  Test: test_twkb_out_idlist ...passed
Suite: varint
  Test: test_zigzag ...passed
  Test: test_varint ...passed
  Test: test_varint_roundtrip ...passed
Suite: wkb_input
  Test: test_wkb_in_point ...passed
  Test: test_wkb_in_linestring ...passed
  Test: test_wkb_in_polygon ...passed
  Test: test_wkb_in_multipoint ...passed
  Test: test_wkb_in_multilinestring ...passed
  Test: test_wkb_in_multipolygon ...passed
  Test: test_wkb_in_collection ...passed
  Test: test_wkb_in_circularstring ...passed
  Test: test_wkb_in_compoundcurve ...passed
  Test: test_wkb_in_curvpolygon ...passed
  Test: test_wkb_in_multicurve ...passed
  Test: test_wkb_in_multisurface ...passed
  Test: test_wkb_in_malformed ...passed
Suite: wkb_output
  Test: test_wkb_out_point ...passed
  Test: test_wkb_out_linestring ...passed
  Test: test_wkb_out_polygon ...passed
  Test: test_wkb_out_multipoint ...passed
  Test: test_wkb_out_multilinestring ...passed
  Test: test_wkb_out_multipolygon ...passed
  Test: test_wkb_out_collection ...passed
  Test: test_wkb_out_circularstring ...passed
  Test: test_wkb_out_compoundcurve ...passed
  Test: test_wkb_out_curvpolygon ...passed
  Test: test_wkb_out_multicurve ...passed
  Test: test_wkb_out_multisurface ...passed
  Test: test_wkb_out_polyhedralsurface ...passed
Suite: wkt_input
  Test: test_wkt_in_point ...passed
  Test: test_wkt_in_linestring ...passed
  Test: test_wkt_in_polygon ...passed
  Test: test_wkt_in_multipoint ...passed
  Test: test_wkt_in_multilinestring ...passed
  Test: test_wkt_in_multipolygon ...passed
  Test: test_wkt_in_collection ...passed
  Test: test_wkt_in_circularstring ...passed
  Test: test_wkt_in_compoundcurve ...passed
  Test: test_wkt_in_curvpolygon ...passed
  Test: test_wkt_in_multicurve ...passed
  Test: test_wkt_in_multisurface ...passed
  Test: test_wkt_in_tin ...passed
  Test: test_wkt_in_polyhedralsurface ...passed
  Test: test_wkt_in_errlocation ...passed
Suite: wkt_output
  Test: test_wkt_out_point ...passed
  Test: test_wkt_out_linestring ...passed
  Test: test_wkt_out_polygon ...passed
  Test: test_wkt_out_multipoint ...passed
  Test: test_wkt_out_multilinestring ...passed
  Test: test_wkt_out_multipolygon ...passed
  Test: test_wkt_out_collection ...passed
  Test: test_wkt_out_circularstring ...passed
  Test: test_wkt_out_compoundcurve ...passed
  Test: test_wkt_out_curvpolygon ...passed
  Test: test_wkt_out_multicurve ...passed
  Test: test_wkt_out_multisurface ...passed

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites     38     38    n/a      0        0
               tests    251    251    251      0        0
             asserts   2468   2468   2468      0      n/a

Elapsed time =    0.298 seconds

Creating database 'postgis_reg'
Loading PostGIS into 'postgis_reg'
  /projects/postgis/branches/2.2/regress/00-regress-install/share/contrib/postgis/postgis.sql
  /projects/postgis/branches/2.2/regress/00-regress-install/share/contrib/postgis/postgis_comments.sql
Loading SFCGAL into 'postgis_reg'
  /projects/postgis/branches/2.2/regress/00-regress-install/share/contrib/postgis/sfcgal.sql
  /projects/postgis/branches/2.2/regress/00-regress-install/share/contrib/postgis/sfcgal_comments.sql
PostgreSQL 9.4.4, compiled by Visual C++ build 1800, 32-bit
  Postgis 2.2.0dev - r13980 - 2015-08-23 06:13:07
  scripts 2.2.0dev r13980
  GEOS: 3.5.0-CAPI-1.9.0 r4088
  PROJ: Rel. 4.9.1, 04 March 2015
  SFCGAL: 1.1.0

Running tests

 loader/Point .............. ok
 loader/PointM .............. ok
 loader/PointZ .............. ok
 loader/MultiPoint .............. ok
 loader/MultiPointM .............. ok
 loader/MultiPointZ .............. ok
 loader/Arc .............. ok
 loader/ArcM .............. ok
 loader/ArcZ .............. ok
 loader/Polygon .............. ok
 loader/PolygonM .............. ok
 loader/PolygonZ .............. ok
 loader/TSTPolygon ......... ok
 loader/TSIPolygon ......... ok
 loader/TSTIPolygon ......... ok
 loader/PointWithSchema ..... ok
 loader/NoTransPoint ......... ok
 loader/NotReallyMultiPoint ......... ok
 loader/MultiToSinglePoint ......... ok
 loader/ReprojectPts ........ ok
 loader/ReprojectPtsGeog ........ ok
 loader/Latin1 .... ok
 loader/Latin1-implicit .... ok
 loader/mfile .... ok
 dumper/literalsrid ....... ok
 dumper/realtable ....... ok
 affine .. ok
 bestsrid .. ok
 binary .. ok
 boundary .. ok
 cluster .. ok
 concave_hull .. ok
 ctors .. ok
 dump .. ok
 dumppoints .. ok
 empty .. ok
 forcecurve .. ok
 geography .. ok
 in_geohash .. ok
 in_gml .. ok
 in_kml .. ok
 in_encodedpolyline .. ok
 iscollection .. ok
 legacy .. ok
 long_xact .. ok
 lwgeom_regress .. ok
 measures .. ok
 operators .. ok
 out_geometry .. ok
 out_geography .. ok
 polygonize .. ok
 polyhedralsurface .. ok
 postgis_type_name .. ok
 regress .. ok
 regress_bdpoly .. ok
 regress_index .. ok
 regress_index_nulls .. ok
 regress_management .. ok
 regress_selectivity .. ok
 regress_lrs .. ok
 regress_ogc .. ok
 regress_ogc_cover .. ok
 regress_ogc_prep .. ok
 regress_proj .. ok
 relate .. ok
 remove_repeated_points .. ok
 removepoint .. ok
 setpoint .. ok
 simplify .. ok
 simplifyvw .. ok
 size .. ok
 snaptogrid .. ok
 split .. ok
 sql-mm-serialize .. ok
 sql-mm-circularstring .. ok
 sql-mm-compoundcurve .. ok
 sql-mm-curvepoly .. ok
 sql-mm-general .. ok
 sql-mm-multicurve .. ok
 sql-mm-multisurface .. ok
 swapordinates .. ok
 summary .. ok
 temporal .. ok
 tickets .. ok
 twkb .. ok
 typmod .. ok
 wkb .. ok
 wkt .. ok
 wmsservers .. ok
 knn .. ok
 hausdorff .. ok
 regress_buffer_params .. ok
 offsetcurve .. ok
 relatematch .. ok
 isvaliddetail .. ok
 sharedpaths .. ok
 snap .. ok
 node .. ok
 unaryunion .. ok
 clean .. ok
 relate_bnr .. ok
 delaunaytriangles .. ok
 clipbybox2d .. ok
 subdivide .. ok
 in_geojson .. ok
 regress_sfcgal .. ok
 sfcgal/empty .. ok
 sfcgal/geography .. ok
 sfcgal/legacy .. ok
 sfcgal/measures .. ok
 sfcgal/regress_ogc_prep .. ok
 sfcgal/regress_ogc .. ok
 sfcgal/regress .. ok
 sfcgal/tickets .. ok
 sfcgal/concave_hull .. ok
 sfcgal/wmsservers .. ok
 sfcgal/approximatemedialaxis .. ok
 uninstall .  /projects/postgis/branches/2.2/regress/00-regress-install/share/contrib/postgis/uninstall_sfcgal.sql
  /projects/postgis/branches/2.2/regress/00-regress-install/share/contrib/postgis/uninstall_postgis.sql
. ok (4336)

Run tests: 118
Failed: 0

-- if you built --with-gui, you should see this too

     CUnit - A unit testing framework for C - Version 2.1-2
     http://cunit.sourceforge.net/


Suite: Shapefile Loader File shp2pgsql Test
  Test: test_ShpLoaderCreate() ...passed
  Test: test_ShpLoaderDestroy() ...passed
Suite: Shapefile Loader File pgsql2shp Test
  Test: test_ShpDumperCreate() ...passed
  Test: test_ShpDumperDestroy() ...passed

Run Summary:    Type  Total    Ran Passed Failed Inactive
              suites      2      2    n/a      0        0
               tests      4      4      4      0        0
             asserts      4      4      4      0      n/a

The postgis_tiger_geocoder and address_standardizer extensions, currenlty only support the standard PostgreSQL installcheck. To test these use the below. Note: the make install is not necessary if you already did make install at root of PostGIS code folder.

For address_standardizer:

cd extensions/address_standardizer
make install
make installcheck
          

Output should look like:

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== running regression test queries        ==============
test test-init-extensions     ... ok
test test-parseaddress        ... ok
test test-standardize_address_1 ... ok
test test-standardize_address_2 ... ok

=====================
 All 4 tests passed.
=====================

For tiger geocoder, make sure you have postgis and fuzzystrmatch extensions available in your PostgreSQL instance. The address_standardizer tests will also kick in if you built postgis with address_standardizer support:

cd extensions/postgis_tiger_geocoder
make install
make installcheck
          

output should look like:

============== dropping database "contrib_regression" ==============
DROP DATABASE
============== creating database "contrib_regression" ==============
CREATE DATABASE
ALTER DATABASE
============== installing fuzzystrmatch               ==============
CREATE EXTENSION
============== installing postgis                     ==============
CREATE EXTENSION
============== installing postgis_tiger_geocoder      ==============
CREATE EXTENSION
============== installing address_standardizer        ==============
CREATE EXTENSION
============== running regression test queries        ==============
test test-normalize_address   ... ok
test test-pagc_normalize_address ... ok

=====================
All 2 tests passed.
=====================

2.4.5. Instalación

Para instalar PostGIS entre

make install

Esto copiará los ficheros de instalación de PostGIS en el subdirectorio especificado por el parámetro de configuración --prefix del comando . En particular:

  • Los archivos binarios de carga y dumper estarán instalados en [prefix]/bin.

  • Los archivos SQL, tal como postgis.sql, están instalados en [prefix]/share/contrib.

  • Las librerías de PostGIS estarán instaladas en [prefix]/lib.

Si has ejecutado el comando make comments previamente para generar los ficheros postgis_comments.sql, raster_comments.sql, instala los ficheros sql ejecutando:

make comments-install

[Note]

postgis_comments.sql, raster_comments.sql, topology_comments.sql han sido separados de la compilación y de la instalación típicos ya que tienen una dependencia extra de la librería xsltproc.

2.5. Crear una base de datos espacial utilizando EXTENSIONS

Si estas utilizando PostgreSQL 9.1+ y has compilado e instalado los módulos/extensión PostGIS, puedes crear una base de datos espacial de otra manera.

createdb [subasededatos]

El núcleo de la extensión postgis, instala geometry, geography, raster, spatial_ref_sys y todos los comentarios de las funciones PostGIS con un simple comando:

CREATE EXTENSION postgis;

.

psql -d [yourdatabase] -c "CREATE EXTENSION postgis;"

Topology esta compilado como una extensión separada y se puede instalar con el comando:

psql -d [yourdatabase] -c "CREATE EXTENSION postgis_topology;"

Si estas pensando en restaurar una copia de seguridad de una vieja base de datos desde una versión anterior en la nueva base de datos, ejecuta:

psql -d [yourdatabase] -f legacy.sql

Después podrás ejecutar uninstall_legacy.sql para obtener el rid de las funciones obsoletas después de haber restaurado y limpiado.

2.6. Crear una base de datos espacial desde una plantilla

[Note]

This is generally only needed if you built-PostGIS without raster support. Since raster functions are part of the postgis extension, extension support is not enabled if PostGIS is built without raster.

El primer paso en la creación de una base de datos PostGIS es crear una simple base de datos PostgreSQL.

createdb [subasededatos]

Varias de la funciones PostGIS están escritas en el lenguaje de procedimientos PL/pgSQL. Como tal, el siguiente paso para crear una base de datos PostGIS es habilitar el lenguaje PL/pgSQL en nuestra nueva base de datos. Eso se hace con el comando siguiente. Para PostgreSQL 8.4+ está normalmente ya instalado.

createlang plpgsql [subasededatos]

Ahora carga los objetos y la definición de funciones en tu base de datos cargando el fichero de definiciones postgis.sql (este fichero se encuentra en [prefix]/share/contrib como se especificó durante la etapa de configuración).

psql -d [yourdatabase] -f postgis.sql

Para tener un juego completo de definiciones de sistemas de coordinas EPSG, también se puede cargar el fichero de definiciones spatial_ref_sys.sql y rellenar tabla spatial_ref_sys. Esto te permitida hacer operaciones de transformación ST_Transform() en las geometrías.

psql -d [yourdatabase] -f spatial_ref_sys.sql

Si quieres añadir los comentarios de las funciones PostGIS, el paso final es cargar el fichero postgis_comments.sql en la base de datos. Para ver los comentarios, simplemente ejecuta el comando \dd [function_name] en un terminal psql.

psql -d [yourdatabase] -f postgis_comments.sql

Instalar el soporte raster

psql -d [yourdatabase] -f rtpostgis.sql

Instala los comentarios de soporte raster. Esto te dará información de ayuda de forma rápida para cada función raster utilizando psql, pgAdmin o cualquier otra herramienta PostgreSQL que permita ver los comentarios de las funciones.

psql -d [yourdatabase] -f raster_comments.sql

Instalar el soporte de topología

psql -d [yourdatabase] -f topology/topology.sql

Instala los comentarios de soporte de topología. Esto te dará información de ayuda de forma rápida para cada función red topología utilizando psql, pgAdmin o cualquier otra herramienta PostgreSQL que permita ver los comentarios de las funciones.

psql -d [yourdatabase] -f topology/topology_comments.sql

Si estas pensando en restaurar una copia de seguridad de una vieja base de datos desde una versión anterior en la nueva base de datos, ejecuta:

psql -d [yourdatabase] -f legacy.sql

[Note]

Hay una alternativa, se puede ejecutar el fichero legacy_minimal.sql que instalará los elementos necesarios para reemplazar tablas y que permitida trabajar con aplicaciones como MapServer y GeoServer. Si tienes vistas que utilizan funciones tipo distancia/longitud etc, necesitaras ejecutar el fichero legacy.sql completo.

Después podrás ejecutar uninstall_legacy.sql para obtener el rid de las funciones obsoletas después de haber restaurado y limpiado.

2.7. Installing and Using the address standardizer

The address_standardizer extension used to be a separate package that required separate download. From PostGIS 2.2 on, it is now bundled in. For more information about the address_standardize, what it does, and how to configure it for your needs, refer to Chapter 12, Normalizador de Direcciones.

This standardizer can be used in conjunction with the PostGIS packaged tiger geocoder extension as a replacement for the Normalize_Address discussed. To use as replacement refer to Section 2.8.3, “Using Address Standardizer Extension with Tiger geocoder”. You can also use it as a building block for your own geocoder or use it to standardize your addresses for easier compare of addresses.

The address standardizer relies on PCRE which is usually already installed on many Nix systems, but you can download the latest at: http://www.pcre.org. If during Section 2.4.1, “Configuración”, PCRE is found, then the address standardizer extension will automatically be built. If you have a custom pcre install you want to use instead, pass to configure --with-pcredir=/path/to/pcre where /path/to/pcre is the root folder for your pcre include and lib directories.

For Windows users, the PostGIS 2.1+ bundle is packaged with the address_standardizer already so no need to compile and can move straight to CREATE EXTENSION step.

Once you have installed, you can connect to your database and run the SQL:

CREATE EXTENSION address_standardizer;

The following test requires no rules, gaz, or lex tables

SELECT num, street, city, state, zip
 FROM parse_address('1 Devonshire Place PH301, Boston, MA 02109');

Output should be

num |         street         |  city  | state |  zip
-----+------------------------+--------+-------+-------
 1   | Devonshire Place PH301 | Boston | MA    | 02109

2.7.1. Installing Regex::Assemble

Perl Regex:Assemble is no longer needed for compiling address_standardizer extension since the files it generates are part of the source tree. However if you need to edit the usps-st-city-orig.txt or usps-st-city-orig.txt usps-st-city-adds.tx, you need to rebuild parseaddress-stcities.h which does require Regex:Assemble.

cpan Regexp::Assemble

or if you are on Ubuntu / Debian you might need to do

sudo perl -MCPAN -e "install Regexp::Assemble"

2.8. Instalar o actualizar el geocodificador Tiger y cargar datos

Extras like Tiger geocoder may not be packaged in your PostGIS distribution. If you are missing the tiger geocoder extension or want a newer version than what your install comes with, then use the share/extension/postgis_tiger_geocoder.* files from the packages in Windows Unreleased Versions section for your version of PostgreSQL. Although these packages are for windows, the postgis_tiger_geocoder extension files will work on any OS since the extension is an SQL/plpgsql only extension.

2.8.1. Tiger Geocoder Enabling your PostGIS database: Using Extension

If you are using PostgreSQL 9.1+ and PostGIS 2.1+, you can take advantage of the new extension model for installing tiger geocoder. To do so:

  1. First get binaries for PostGIS 2.1+ or compile and install as usual. This should install the necessary extension files as well for tiger geocoder.

  2. Connect to your database via psql or pgAdmin or some other tool and run the following SQL commands. Note that if you are installing in a database that already has postgis, you don't need to do the first step. If you have fuzzystrmatch extension already installed, you don't need to do the second step either.

    CREATE EXTENSION postgis;
    CREATE EXTENSION fuzzystrmatch;
    --this one is optional if you want to use the rules based standardizer (pagc_normalize_address)
    CREATE EXTENSION address_standardizer;
    CREATE EXTENSION postgis_tiger_geocoder;

    If you already have postgis_tiger_geocoder extension installed, and just want to update to the latest run:

    ALTER EXTENSION postgis UPDATE TO "2.5.0dev";
    ALTER EXTENSION postgis_topology UPDATE TO "2.5.0dev";

    If you made custom entries or changes to tiger.loader_platform and tiger.loader_variables you may need to update these.

  3. To confirm your install is working correctly, run this sql in your database:

    SELECT na.address, na.streetname,na.streettypeabbrev, na.zip
            FROM normalize_address('1 Devonshire Place, Boston, MA 02109') AS na;

    Which should output

    address | streetname | streettypeabbrev |  zip
    ---------+------------+------------------+-------
               1 | Devonshire | Pl               | 02109
  4. Create a new record in tiger.loader_platform table with the paths of your executables and server.

    So for example to create a profile called debbie that follows sh convention. You would do:

    INSERT INTO tiger.loader_platform(os, declare_sect, pgbin, wget, unzip_command, psql, path_sep,
                       loader, environ_set_command, county_process_command)
    SELECT 'debbie', declare_sect, pgbin, wget, unzip_command, psql, path_sep,
               loader, environ_set_command, county_process_command
      FROM tiger.loader_platform
      WHERE os = 'sh';

    And then edit the paths in the declare_sect column to those that fit Debbie's pg, unzip,shp2pgsql, psql, etc path locations.

    If you don't edit this loader_platform table, it will just contain common case locations of items and you'll have to edit the generated script after the script is generated.

  5. Create a folder called gisdata on root of server or your local pc if you have a fast network connection to the server. This folder is where the tiger files will be downloaded to and processed. If you are not happy with having the folder on the root of the server, or simply want to change to a different folder for staging, then edit the field staging_fold in the tiger.loader_variables table.

  6. Create a folder called temp in the gisdata folder or whereever you designated the staging_fold to be. This will be the folder where the loader extracts the downloaded tiger data.

  7. Then run the Loader_Generate_Nation_Script SQL function make sure to use the name of your custom profile and copy the script to a .sh or .bat file. So for example to build the nation load:

    psql -c "SELECT Loader_Generate_Nation_Script('debbie')" -d geocoder -tA > /gisdata/nation_script_load.sh
  8. Ejecuta la sentencia SQL drop

    cd /gisdata
    sh nation_script_load.sh
  9. After you are done running the nation script, you should have three tables in your tiger_data schema and they should be filled with data. Confirm you do by doing the following queries from psql or pgAdmin

    SELECT count(*) FROM tiger_data.county_all;
    count
    -------
      3233
    (1 row)
    SELECT count(*) FROM tiger_data.state_all;
    count
    -------
        56
    (1 row)
    
  10. By default the tables corresponding to bg, tract, tabblock are not loaded. These tables are not used by the geocoder but are used by folks for population statistics. If you wish to load them as part of your state loads, run the following statement to enable them.

    UPDATE tiger.loader_lookuptables SET load = true WHERE load = false AND lookup_name IN('tract', 'bg', 'tabblock');

    Genera un script de carga de naciones con esta sentencia SELECT como se detalla en Loader_Generate_Nation_Script

  11. Genera un script de carga de naciones con esta sentencia SELECT como se detalla en Loader_Generate_Nation_Script

    [Warning]

    DO NOT Generate the state script until you have already loaded the nation data, because the state script utilizes county list loaded by nation script.

  12. psql -c "SELECT Loader_Generate_Script(ARRAY['MA'], 'debbie')" -d geocoder -tA > /gisdata/ma_load.sh
  13. Ejecuta la sentencia SQL drop

    cd /gisdata
    sh ma_load.sh
  14. After you are done loading all data or at a stopping point, it's a good idea to analyze all the tiger tables to update the stats (include inherited stats)

    SELECT install_missing_indexes();
    vacuum analyze verbose tiger.addr;
    vacuum analyze verbose tiger.edges;
    vacuum analyze verbose tiger.faces;
    vacuum analyze verbose tiger.featnames;
    vacuum analyze verbose tiger.place;
    vacuum analyze verbose tiger.cousub;
    vacuum analyze verbose tiger.county;
    vacuum analyze verbose tiger.state;
    vacuum analyze verbose tiger.zip_lookup_base;
    vacuum analyze verbose tiger.zip_state;
    vacuum analyze verbose tiger.zip_state_loc;

2.8.1.1. Converting a Tiger Geocoder Regular Install to Extension Model

If you installed the tiger geocoder without using the extension model, you can convert to the extension model as follows:

  1. Follow instructions in Section 2.8.5, “Actualizando la instalación del geocodificador Tiger” for the non-extension model upgrade.

  2. Connect to your database with psql or pgAdmin and run the following command:

    CREATE EXTENSION postgis_tiger_geocoder FROM unpackaged;

2.8.2. Tiger Geocoder Enabling your PostGIS database: Not Using Extensions

Primero debes instalar PostGIS con las instrucciones anteriores.

If you don't have an extras folder, download http://postgis.net/stuff/postgis-2.5.0dev.tar.gz

tar xvfz postgis-2.5.0dev.tar.gz

cd postgis-2.5.0dev/extras/tiger_geocoder

Edit the tiger_loader_2015.sql (or latest loader file you find, unless you want to load different year) to the paths of your executables server etc or alternatively you can update the loader_platform table once installed. If you don't edit this file or the loader_platform table, it will just contain common case locations of items and you'll have to edit the generated script after the fact when you run the Loader_Generate_Nation_Script and Loader_Generate_Script SQL functions.

If you are installing Tiger geocoder for the first time edit either the create_geocode.bat script If you are on windows or the create_geocode.sh if you are on Linux/Unix/Mac OSX with your PostgreSQL specific settings and run the corresponding script from the commandline.

Verifica que ahora tienes el esquema tiger en tu base de datos y este forma parte de tu variable search_path en la base de datos. Si no, añádelo con un comando parecido al siguiente:

ALTER DATABASE geocoder SET search_path=public, tiger;

La funcionalidad de normalización de direcciones funciona sin datos mas o menos, excepto para direcciones complejas. Ejecuta el siguiente test y verifica si se parece a esto:

SELECT pprint_addy(normalize_address('202 East Fremont Street, Las Vegas, Nevada 89101')) As pretty_address;
pretty_address
---------------------------------------
202 E Fremont St, Las Vegas, NV 89101
                        

2.8.3. Using Address Standardizer Extension with Tiger geocoder

One of the many complaints of folks is the address normalizer function Normalize_Address function that normalizes an address for prepping before geocoding. The normalizer is far from perfect and trying to patch its imperfectness takes a vast amount of resources. As such we have integrated with another project that has a much better address standardizer engine. To use this new address_standardizer, you compile the extension as described in Section 2.7, “Installing and Using the address standardizer” and install as an extension in your database.

Once you install this extension in the same database as you have installed postgis_tiger_geocoder, then the Pagc_Normalize_Address can be used instead of Normalize_Address. This extension is tiger agnostic, so can be used with other data sources such as international addresses. The tiger geocoder extension does come packaged with its own custom versions of rules table ( tiger.pagc_rules) , gaz table (tiger.pagc_gaz), and lex table (tiger.pagc_lex). These you can add and update to improve your standardizing experience for your own needs.

2.8.4. Cargando datos Tiger

Las instrucciones de carga de datos están disponibles de forma mas detallada en extras/tiger_geocoder/tiger_2011/README. Esto solo describe los pasos generales.

El proceso de carga, descarga datos desde el sitio web del censo de las respectivas naciones de los estados pedidos, extrae los ficheros, y carga cada estado en un conjunto separado por estados en su propia tabla. Cada tabla de estado hereda el esquema de tablas definido en tiger así que basta con hacer una consulta a estas tablas para acceder a todos los datos de la tabla de estados en cualquier momento utilizando Drop_State_Tables_Generate_Script si necesita volver a cargar un estado o si ya no lo necesitas mas.

Para poder cargar los datos necesitarás las siguientes herramientas:

  • Una herramienta para descomprimir ficheros zip de la pagina web del censo.

    Para sistemas Unix: el ejecutable unzip que normalmente esta instalado en la mayoría de sistemas Unix.

    Para windows, 7-zip es una herramienta libre de compresión/descompresión que puedes descargar en http://www.7-zip.org/

  • El comando shp2pgsql que se instala por defecto cuando instalas PostGIS.

  • wget que es una herramienta de captura web, normalmente instalado en los sistemas Unix/Linux.

    Si estas en windows, puedes obtener ejecutables precompilados en http://gnuwin32.sourceforge.net/packages/wget.htm

If you are upgrading from tiger_2010, you'll need to first generate and run Drop_Nation_Tables_Generate_Script. Before you load any state data, you need to load the nation wide data which you do with Loader_Generate_Nation_Script. Which will generate a loader script for you. Loader_Generate_Nation_Script is a one-time step that should be done for upgrading (from 2010) and for new installs.

To load state data refer to Loader_Generate_Script to generate a data load script for your platform for the states you desire. Note that you can install these piecemeal. You don't have to load all the states you want all at once. You can load them as you need them.

Una vez que los estados que quieres han sido cargados, asegurare de ejecutar:

SELECT install_missing_indexes();

como se explica en Install_Missing_Indexes.

Para probar que las cosas han funcionado como deberían, intenta ejecutar una geocodificacion en una dirección del estado descargado utilizando Geocode

2.8.5. Actualizando la instalación del geocodificador Tiger

If you have Tiger Geocoder packaged with 2.0+ already installed, you can upgrade the functions at any time even from an interim tar ball if there are fixes you badly need. This will only work for Tiger geocoder not installed with extensions.

If you don't have an extras folder, download http://postgis.net/stuff/postgis-2.5.0dev.tar.gz

tar xvfz postgis-2.5.0dev.tar.gz

cd postgis-2.5.0dev/extras/tiger_geocoder/tiger_2011

Locate the upgrade_geocoder.bat script If you are on windows or the upgrade_geocoder.sh if you are on Linux/Unix/Mac OSX. Edit the file to have your postgis database credentials.

If you are upgrading from 2010 or 2011, make sure to unremark out the loader script line so you get the latest script for loading 2012 data.

Then run th corresponding script from the commandline.

Después, elimina todas las tabals de naciones y carga las nuevas. Genera un script drop con esta sentencia SQL como se detalla en Drop_Nation_Tables_Generate_Script

SELECT drop_nation_tables_generate_script();

Ejecuta la sentencia SQL drop

Genera un script de carga de naciones con esta sentencia SELECT como se detalla en Loader_Generate_Nation_Script

Para windows

SELECT loader_generate_nation_script('windows'); 

Para unix/linux

SELECT loader_generate_nation_script('sh');

Para mas información sobre como ejecutar los scripts generados visita Section 2.8.4, “Cargando datos Tiger”. Esto solo es necesario hacerlo una vez.

[Note]

Puedes tener una mezcla de tablas de estados de 2010/2011 y puedes actualizar cada estado por separado. Antes de actualizar un estado a la versión de 2011 debes suprimir las tablas de este estado para 2010 utilizando Drop_State_Tables_Generate_Script.

2.9. Crear una base de datos espacial desde una plantilla

Algunas de las distribuciones precompiladas de PostGIS (en particular los instaladores de Postgis >= 1.1.5 para sistemas Win32) carga las funciones de PostGIS en una base de datos plantilla llamada template_postgis. Si la base de datos template_postgis existe ya en nuestra instalación de PostgreSQL, los usuarios y aplicaciones podrán crear bases de datos espaciales con un simple comando. En ambos casos, el usuario de la base de datos debe tener privilegios para crear nuevas bases de datos

En la linea de comandos:

# createdb -T template_postgis my_spatial_db

Desde SQL:

postgres=# CREATE DATABASE my_spatial_db TEMPLATE=template_postgis

2.10. Actualizando

Actualizar una base de datos espacial puede ser complejo ya que requiere reemplazar o introducir nuevas definiciones de objetos PostGIS.

Desafortunadamente, no todas las definiciones pueden reemplazarse fácilmente en una base de datos activa, así que algunas veces lo mejor es un proceso copia de seguridad/recarga.

PostGIS incluye una SOFT UPGRADE (actualización ligera) para actualizaciones menores o corrección de errores, y una HARD UPGRADE (Actualización pesada) para versiones mayores.

Antes de realizar una actualización de PostGIS, es recomendable hacer una copia de seguridad de los datos. Si utilizas la opción -Fc en el comando pg_dump siempre podrás restaurar la copia realizada con un HARD UPDATE.

2.10.1. Actualizacion Ligera

Si instalaste la base de datos utilizando extensiones, necesitaras actualizar utilizando el modelo de extensiones tambien. Si instalaste utilizando el antiguo metodo de script sql, necesitaras actualizar el metodo de script sql. Consulta el metodo adecuado.

2.10.1.1. Actualización ligera anterior a la versión PostgreSQL 9.1+ o sin extensiones

Esta sección describe el método para quienes instalaron PostGIS sin utilizar extensiones solamente. Si tienes extensiones e intentas actualizar con este metodo, tendras mensajes como los siguientes:

no se puede suprimir ... porque la extensión postgis depende de el

After compiling and installing (make install) you should find a postgis_upgrade.sql and rtpostgis_upgrade.sql in the installation folders. For example /usr/share/postgresql/9.3/contrib/postgis_upgrade.sql. Install the postgis_upgrade.sql. If you have raster functionality installed, you will also need to install the /usr/share/postgresql/9.3/contrib/postgis_upgrade.sql. If you are moving from PostGIS 1.* to PostGIS 2.* or from PostGIS 2.* prior to r7409, you need to do a HARD UPGRADE.

psql -f postgis_upgrade.sql -d your_spatial_database

El mimo proceso se emplea para las extensiones raster y topology, con ficheros de actualizacion llamados rtpostgis_upgrade*.sql y topology_upgrade*.sql respectivamente. Si lo necesitas, entoces:

psql -f rtpostgis_upgrade.sql -d your_spatial_database
psql -f topology_upgrade.sql -d your_spatial_database
[Note]

Si no puedes encontrar el fichero postgis_upgrade*.sql especifico para actualizar tu version, estas utilizando una version previa para una actualización ligera y necesitas hacer una actualización completa o HARD UPGRADE.

La función PostGIS_Full_Version debe darte la información sobre la necesidad de ejecutar este tipo de actualización utilizando el mensaje "procs need upgrade".

2.10.1.2. Actualizacion ligera 9.1+ utilizando extensiones

Si has instalado originalmente PostGIS con extensiones, entonces necesitas actualizar utilizando extensiones también. Hacer una actualización menor con extensiones es bastante sencillo.

ALTER EXTENSION postgis UPDATE TO "2.5.0dev";
ALTER EXTENSION postgis_topology UPDATE TO "2.5.0dev";

Si obtienes un error parecido a:

No migration path defined for ... to 2.5.0dev

Then you'll need to backup your database, create a fresh one as described in Section 2.5, “Crear una base de datos espacial utilizando EXTENSIONS” and then restore your backup ontop of this new database.

If you get a notice message like:

Version "2.5.0dev" of extension "postgis" is already installed

Then everything is already up to date and you can safely ignore it. UNLESS you're attempting to upgrade from an SVN version to the next (which doesn't get a new version number); in that case you can append "next" to the version string, and next time you'll need to drop the "next" suffix again:

ALTER EXTENSION postgis UPDATE TO "2.5.0devnext";
ALTER EXTENSION postgis_topology UPDATE TO "2.5.0devnext";
[Note]

If you installed PostGIS originally without a version specified, you can often skip the reinstallation of postgis extension before restoring since the backup just has CREATE EXTENSION postgis and thus picks up the newest latest version during restore.

2.10.2. Actualizacion pesada o HARD UPDATE

Por actualización pesada se entiende una copia de seguridad/recarga completa de datos en la base de datos espacial. Necesitas una actualización pesada cuando los objetos internos de almacenamiento de PostGIS cambian o cuando una actualización ligera no es posible. Las notas Release Notes del apéndice hay informes de cada version y de si necesitas hacer una copia de seguridad/recarga de datos (HARD UPGRADE) para actualizar.

El proceso copia de seguridad/recarga de datos esta asistido por el script postgis_restore.pl te toma en cuenta ignorar en la copia de seguridad todas las definiciones que pertenecen a PostGIS (incluyendo las antiguas), permitiéndote restaurar tus esquemas y datos en una base de datos con PostGIS instalado sin tener que duplicar errores o trayendo objetos rechazados.

Instruciones complementarias para windows están disponibles en Windows Hard upgrade.

El procedimiento es como sigue:

  1. Crea un "formato personalizado" de copia de seguridad de la base de datos que asieres actualizar (llamemosla olddb) incluye binarios bolb (-b) y salida verbose (-v). El usuario puede ser el propietario de la base de datos, no necesitas una cuenta de superusuario postgres.

    pg_dump -h localhost -p 5432 -U postgres -Fc -b -v -f "/somepath/olddb.backup" olddb
  2. Haz una nueva instalación de PsotGIS en una nueva base de datos --la llamaremos newdb en este ejemplo. Puedes obtener información de como hacer esto en Section 2.6, “Crear una base de datos espacial desde una plantilla” y Section 2.5, “Crear una base de datos espacial utilizando EXTENSIONS”

    Las entradas que se encuentren en tu copia de seguridad de la tabla spatial_ref_sys serán restauradas, pero pero no reescribiran las existentes en la nueva tabla spatial_ref_sys. Esto es para asegurar que las soluciones en el conjunto oficial se propagarán correctamente para las bases de datos restauradas. Si por algún motivo, realmente quieres que tus entradas reemplacen las entradas estándar simplemente no cargues el archivo spatial_ref_sys.sql al crear la nueva db.

    Si tu base de datos es muy antigua o sabes que has estado utilizando funciones rechazadas en tus vistas y funciones, necesitaras cargar el fichero legacy.sql para todas tus funciones y vistas para que funcionen correctamente. Haz esto solamente si es indispensable. Considera actualizar tus vistas y funciones antes de hacer una copia de seguridad si es posible. Las funciones rechazadas pueden borrarse cargando el fichero uninstall_legacy.sql después.

  3. Restaura tu copia de seguridad en tu nueva base de datos newdb utilizando el script postgis_restore.pl. Si aparecen errores inesperados, se imprimirán en la consola de psql. Ten un inventario de estos.

    perl utils/postgis_restore.pl "/somepath/olddb.backup" | psql -h localhost -p 5432 -U postgres newdb 2
    > errors.txt

Los errores se producirán en alguno de estos casos:

  1. Alguna de tus vistas o funciones hacen uso de funciones rechazadas de objetos PostGIS. Para corregir estos deberás intentar cargar el script legacy.sql antes de restaurar o deberás restaurar a una version de PsotGIS que todavía contenga estos objetos e intentar hacer la migración otra vez después de migrar tu código. Si el uso del fichero legacy.sql funciona, no olvides corregir tu código para dejar de utilizar funciones rechazadas, y elimina el script legacy.sql ejecutando uninstall_legacy.sql.

  2. Algunos valores personalizados de la copia de la tabla spatial_ref_sys pueden tener un valor no valido de SRID. Los valores validos deben ser mayores que 0 y menores que 999000. Valores en el rango 999000.999999 están reservados para uso interno y valores mayores que 999999 no están permitidos para nada. Todos los valores personalizados con SRIDs inválidos serán conservados, con los valores personalizados > 999999 se moverán en el rango reservado, pero la tabla spatial_ref_sys perderá la restricción check que guarda para esta constante y probablemente también su clave primaria (cuando multiples valores personalizados de SRID se conviertan al mismo valor SRID reservado)

    Para corregir esto deberías copiar tus SRS personalizados en in SRID con un valor (quizás en el rango de valores 910000..910999), convertir todas las tablas al nuevo srid (ver como hacer esto en UpdateGeometrySRID), borrar las entradas invalidas de la tabla spatial_ref_sys y reconstruir la o las restricciones chek con:

    ALTER TABLE spatial_ref_sys ADD CONSTRAINT spatial_ref_sys_srid_check check (srid > 0 AND srid < 999000 );

    ALTER TABLE spatial_ref_sys ADD PRIMARY KEY(srid));

2.11. Common Problems during installation

Hay varias cosas a comprobar cuando la instalación o actualización no han fusionado como se esperaba.

  1. Comprueba que tienes instalado PostgreSQL 9.3 o posterior, y que estas compilando para esta version de PostgreSQL que estas utilizando. Se pueden producir confusiones cuando tu distribución (Linux)ya tiene instalada PostgreSQL, o has instalado antes PostgreSQL y lo has olvidado. PostGIS solo funcionará con PostgreSQL 9.3 o superior, y errores inesperados o extraños pueden ocurrir si utilizas una version mas antigua. Para comprobar la version de PostgreSQL que esta instalada y ejecutándose, conectare a la base de datos utilizando psql y ejecuta la siguiente consulta:

    SELECT version();

    Si estas ejecutando una version basada en una distribución RPM, puedes comprobar si existen paquetes pre-instalados utilizando el comando rpm como sigue: rpm -qa | grep postgresql

  2. Si tienes errores en la actualización, asegúrate de que estas restaurando tu base de datos en una que tenga instalada PostGIS.

    SELECT postgis_full_version();

Comprueba que tu configuración detecta la ubicación y la version correctas de PostgreSQL, la librería Proj4 y la librería GEOS.

  1. La salida de configure se utiliza para generar el fichero postgis_config.h. Comprueba que la variables POSTGIS_PGSQL_VERSION, POSTGIS_PROJ_VERSION y POSTGIS_GEOS_VERSION, han sido bien configuradas.

2.12. Cargador/Dumper

El cargador y dumper de datos se compila e instala de forma automática como parte de la distribución de PostGIS. Para compilar e instalar de forma manual puedes ejecutar:

# cd postgis-2.5.0dev/loader
# make
# make install

El cargador se llama shp2pgsql y convierte ficheros Shape de ESRI en sentencias SQL necesarias para cargarlo en PostGIS/PostgreSQL. El dumper se llama pgsql2shp y convierte tablas PostGIS (o sentencias) en ficheros Shape de ESRI. Para mayor información, puedes ver la información en linea y las pagnas del manual.

Chapter 3. Preguntas frecuentes sobre PostGIS

3.1. Donde puedo encontrar tutoriales, guías y talleres de trabajo con PostGIS
3.2. Mis aplicaciones y herramientas funcionaban con PostGIS 1.5, pero no funcionan con PostGIS 2.0. ¿Como puedo solucionarlo?
3.3. Cuando cargo los datos de OpenStreetMap con osm2pgsql, estoy obteniendo un error fallido: ERROR: la clase de operador "gist_geometry_ops" no existe para el método de acceso "GIST" error ocurrido. Esto funcionó bien en PostGIS 1.5.
3.4. ¿Esto utilizando la version PostgreSQL 9.0 y no puedo leer/escribir geometrías en OpenJump, Safe FME, y otras herramientas?
3.5. He intentado utilizar PgAdmin para ver mis columnas de geometría y esta en blanco, ¿qué ocurre?
3.6. ¿Qué tipo de objetos geométricos puedo almacenar?
3.7. Estoy confundido. ¿Que tipo de datos debo utilizar?¿geométricos o geográficos?
3.8. Tengo preguntas mas complejas sobre el typo geógrafo, como por ejemplo, como de grande es la región que puedo almacenar en una columna geográfica y tener respuestas razonables. ¿Hay limitaciones como por ejemplo los polos, todo el contenido del campo debe estar en un hemisferio (como ocurre con con SQL Server 2008), velocidad etc?
3.9. ¿Como puedo insertar objetos SIG en la base de datos?
3.10. ¿Como puedo construir una consulta espacial?
3.11. ¿Como puedo aumentar la velocidad de las consultas espaciales en tagalas grandes?
3.12. ¿Por que no están soportados los indices R-Tree de PostgreSQL?
3.13. ¿Por que debería utilizar la función AddGeometryColumn() y todas las herramientas OpenGIS?
3.14. ¿Cual es la mejor manera de encontrar objetos en el radio de otro objeto?
3.15. ¿Como puedo realizar una reproyección como parte de una consulta?
3.16. He hecho un ST_AsEWKT y un ST_AsText en una geometría bastante grande y me devuelve un campo en blanco.¿Que a pasado?
3.17. Cuando hago un ST_Intersects, me dice que mis dos geometrías no se intersectan cuando SE QUE SI LO HACEN. ¿Que esta pasando?
3.18. Estoy desarrollando software que utiliza PostGIS, ¿quiere decir esto que mi software debe tener licencia GPL como PostGIS?¿Tengo que liberar todo mi código si utilizo PostGIS?

3.1.

Donde puedo encontrar tutoriales, guías y talleres de trabajo con PostGIS

OpenGeo tiene un tutorial paso a paso taller de guía Introducción a PostGIS. Incluye los datos empaquetados así como introducción al trabajo con OpenGeo Suite. Es probablemente el mejor tutorial sobre PostGIS.

BostonGIS también tiene un PostGIS casi de idiotas guía sobre cómo empezar. Que está más centrado en el usuario de Windows.

3.2.

Mis aplicaciones y herramientas funcionaban con PostGIS 1.5, pero no funcionan con PostGIS 2.0. ¿Como puedo solucionarlo?

Muchas funciones rechazadas se han eliminado del código fuente de PostGIS en PostGIS 2.0. Esto ha afectado a aplicaciones o herramientas de terceros como Geoserver, Mapserver, QuanrumGIS y OpenJump por mencionar algunas. Hay varias formas de resolver esto. Para las aplicaciones de terceros, puedes intentar actualizar a la ultima version de la aplicación que tiene muchos de estos errores resueltos. Para tu propio código, puedes cambiar tu código para que no utilice las funciones eliminadas. Muchas de estas funciones no son ST_aliases de ST_Union, ST_Length etc. y como ultimo recurso instala el fichero legacy.sql completo o solo las partes del fichero legacy.sql que necesites.

El fichero legacy.sql esta ubicado en la misma carpeta que postgis.sql. Puedes instalar este fichero después de haber instalado postgis.sql y spatial_ref_sys.sql para volver a tener disponibles las mas o menos 200 funciones que hemos eliminado.

3.3.

Cuando cargo los datos de OpenStreetMap con osm2pgsql, estoy obteniendo un error fallido: ERROR: la clase de operador "gist_geometry_ops" no existe para el método de acceso "GIST" error ocurrido. Esto funcionó bien en PostGIS 1.5.

En PostGIS 2, la clase de operador de geometría predeterminada gist_geometry_ops fue cambiado a gist_geometry_ops_2d y el gist_geometry_ops fue eliminado por completo. Esto se hizo porque PostGIS 2 también presenta Nd índices espaciales de soporte 3D y el nombre antiguo fue considerada confuso y erróneo.

Algunas aplicaciones antiguas que como parte del proceso crean tablas e índices, se hace referencia explícitamente al nombre de clase del operador. Esto no era necesario si desea el índice predeterminado 2D. Así que si maneja la buena pronunciación, cambie la creación de índices de:

MAL:

CREATE INDEX idx_my_table_geom ON my_table USING gist(geom gist_geometry_ops);

a BIEN:

CREATE INDEX idx_my_table_geom ON my_table USING gist(geom);

El único caso donde usted tendrá que especificar la clase de operador es si usted desea un índice espacial 3D como el siguiente:

CREATE INDEX idx_my_super3d_geom ON my_super3d USING gist(geom gist_geometry_ops_nd);

Si usted es desafortunado para ser atrapado con código compilado que no se puede cambiar que tiene el antiguo gist_geometry_ops de código duro, entonces usted puede crear la antigua clase utilizando el legacy_gist.sql empaquetado en PostGIS 2.0.2 +. Sin embargo, si utiliza esta corrección, se le aconseja que en un punto posterior elimine el índice y lo recree sin la clase de operador. Esto le ahorrará problemas en el futuro cuando necesite actualizar de nuevo.

3.4.

¿Esto utilizando la version PostgreSQL 9.0 y no puedo leer/escribir geometrías en OpenJump, Safe FME, y otras herramientas?

En PostgreSQL 9.0+, la codificación por defecto ha sido cambiada a hex y algunos drivers antiguos de JDBC siguen asumiendo el formato espacio. Esto ha afectado a algunas aplicaciones como aplicaciones Java utilizando viejos drivers JDBC o aplicaciones .NET que utilizan el driver npgsql antiguo que espera el comportamiento de ST_AsBinary antiguo. Hay dos soluciones para corregir esto.

Puedes actualizar el driver JDBC a la ultima version PostgreSQL 9.0 que puedes obtener en http://jdbc.postgresql.org/download.html

Si estas utilizando una aplicación en .NET, puedes utilizar Npgsql 2.0.11 o superior, que puedes descargar desde http://pgfoundry.org/frs/?group_id=1000140 y se describe en Francisco Figueiredo's NpgSQL 2.0.11 released blog entry

Si actualizar tu driver PostgreSQL no es una opción, entonces se puede establecer el valor predeterminado otra vez al viejo comportamiento con el siguiente cambio:

ALTER DATABASE mypostgisdb SET bytea_output='escape';

3.5.

He intentado utilizar PgAdmin para ver mis columnas de geometría y esta en blanco, ¿qué ocurre?

PgAdmin no muestra nada en geometrías muy largas. La mejor forma de verificar tienes datos en tus columnas de geometrías es:

-- Esto debería devolver ningún registro si todos los campos geom están llenos
SELECT somefield FROM mytable WHERE geom IS NULL;
-- Para saber como es de larga tu geometría haz una consulta de forma 
-- que te de el mayor numero de puntos que tienes en cualquier columna de geometrías
SELECT MAX(ST_NPoints(geom)) FROM sometable;

3.6.

¿Qué tipo de objetos geométricos puedo almacenar?

Puede almacenar geometrías Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon y GeometryCollection. En PostGIS 2.0 y superior también se pueden almacenar TINS y superficies poliédricas en el tipo de geometría básica. Éstos se especifican en el Formato de texto bien conocido de GIS abierto (con extensiones Z, M y ZM). Actualmente hay tres tipos de datos soportados. El tipo de datos de geometría OGC estándar que utiliza un sistema de coordenadas planar para la medición, el tipo de datos geográficos que utiliza un sistema de coordenadas geodésicas, con cálculos en una esfera o en esferoide. El más reciente miembro de la familia de tipo espacial en PostGIS es raster para almacenar y analizar los datos raster. Raster tiene su propia FAQ. Refierase a Chapter 10, Preguntas frecuentes sobre PostGIS Raster y Chapter 9, Raster Reference para más detalle.

3.7.

Estoy confundido. ¿Que tipo de datos debo utilizar?¿geométricos o geográficos?

Respuesta corta: geography es un tipo de datos más reciente que admite mediciones de distancias de largo alcance, pero la mayoría de los cálculos en él son más lentos de lo que son en geometry. Si utiliza la geography, no necesita aprender mucho sobre sistemas de coordenadas planas. Geography es generalmente mejor si lo único que le importa es medir distancias y longitudes y tiene datos de todo el mundo. El tipo de datos geometry es un tipo de datos antiguo que tiene muchas más funciones que lo soportan, disfruta de un mayor soporte de herramientas de terceros, y las operaciones en él son generalmente más rápidas --a veces hasta 10 veces más rápidas para geometrías más grandes. Geometry es mejor si se siente cómodo con los sistemas de referencia espacial o si se trata de datos localizados en los que todos sus datos encajan en un solo sistema de referencia espacial (SRID), o si usted necesita hacer un montón de procesamiento espacial. Es bastante fácil de hacer one-off entre los dos tipos de conversiones para obtener los beneficios de cada uno. Consulte Section 14.11, “PostGIS Function Support Matrix” para ver lo que actualmente se soporta y lo que no.

Respuesta larga: Te invitamos a nuestro largo debate en Section 4.2.2, “¿Cuando utilizar el tipo Geografico en vez de Geometrico?” y Matriz funciones tipos.

3.8.

Tengo preguntas mas complejas sobre el typo geógrafo, como por ejemplo, como de grande es la región que puedo almacenar en una columna geográfica y tener respuestas razonables. ¿Hay limitaciones como por ejemplo los polos, todo el contenido del campo debe estar en un hemisferio (como ocurre con con SQL Server 2008), velocidad etc?

Tu pregunta es demasiado compleja y extensa, para obtener una respuesta en esta sección. Puedes ver la respuesta en Section 4.2.3, “Preguntas frecuentes Avanzadas de Geography”.

3.9.

¿Como puedo insertar objetos SIG en la base de datos?

Primero, necesitas crear una tabla con una columna de tipo "geometría" o "geografía" para almacenar tus datos SIG. Almacenar datos de tipo geográfico es un poco diferente que almacenar geometrías. Para obtener detalles de como se almacenan los tipos geográficos ves a Section 4.2.1, “Bases del tipo "Geography"”.

Para geometrías: Conéctate a tu base de datos con psql e intenta ejecutar el siguiente comando SQL:

CREATE TABLE gtest ( gid serial primary key, name varchar(20)
        , geom geometry(LINESTRING) );

Si falla la definición de la columna de geometría, es probable que no haya cargado las funciones y los objetos de PostGIS en esta base de datos o que esté utilizando una versión de PostGIS anterior a la 2.0. Vea el Section 2.4, “Compiling and Install from Source: Detailed”.

Entonces, podrás insertar geometrías en la tabla utilizando la sentencia SQL insert. El objeto SIG tiene el formato OpenGIS Consortium "well-known text":

INSERT INTO gtest (ID, NAME, GEOM)
VALUES (
  1,
  'First Geometry',
  ST_GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)')
);

Para mas información sobre otros objetos SIG, mira en object reference.

Para ver datos SIG en la tabla:

SELECT id, name, ST_AsText(geom) AS geom FROM gtest;

El resultado devuelto debería parecerse a algo así:

id | name           | geom
----+----------------+-----------------------------
  1 | First Geometry | LINESTRING(2 3,4 5,6 5,7 8)
(1 row)

3.10.

¿Como puedo construir una consulta espacial?

De la misma manera que construyes cualquier consulta en la base datos, como una combinación de valores, funciones y test boleanos a devolver en SQL.

Para las consultas espaciales, hay dos problemas importantes que hay que tener en cuenta mientras se construyen las consultas: ¿Hay indices espaciales que puedo utilizar? y ¿Estoy haciendo cálculos pesados en un gran numero de geometrias?

En general, querras utilizar el operador "intersects" (&&) que comprueba que los limites de los objetos geograficos intersectan. La razón por la que el operador && es útil, es por que si un indice espacial esta disponible para aumentar la velocidad de calculo, el operador && lo utilizará. Esto puede hacer las consultas mucho mucho mas rápidas.

También puedes utilizar las funciones espaciales, tales como Distance(), ST_Intersects(), ST_Contains() y ST_Within(), y muchas otras, para obtener los resultados de tu búsqueda. Muchas de las consultas espaciales, incluyen tests de indices y funciones espaciales. El test de indices sirve para limitar el número de tuplas devuelto a las tupas que deben cumplir las condiciones que nos interesan. Las funciones espaciales utilizadas para probar la condición exacta.

SELECT id, the_geom
FROM thetable
WHERE
  ST_Contains(the_geom,'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))');

3.11.

¿Como puedo aumentar la velocidad de las consultas espaciales en tagalas grandes?

Consultas rápidas en tablas grandes es la razón de ser de las bases de datos espaciales (con soporte de transacciones), así que tener buenos indices es importante.

Para construir un indice en una tabla con una columna geometry, utiliza la función "CREATE INDEX" como en este ejemplo:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometrycolumn] );

La opción "USING GIST" le dice al servidor que utilice un indice GiST (Arbol de búsqueda generalizado).

[Note]

Los indices GiST se supone que son "lossy". Los indices "lossy" utilizan un objeto proxy (en el caso espacial, las cajas) para construir el indice.

También debes estar seguro que el planificador de consultas de PostgreSQL tiene suficiente información sobre tus indices para tomar una decisión racional de cuando utilizarlos. Para ello, tienes que "recopilar las estadísticas" de tus tablas geométricas.

Para PostgreSQL 8.0.x o superior, solo tienes que ejecutar el comando VACUUM ANALYZE.

Para PostgreSQL 7.4.x o anteriores, ejecuta el comando SELECT UPDATE_GEOMETRY_STATS().

3.12.

¿Por que no están soportados los indices R-Tree de PostgreSQL?

En las primeras versiones de PostGIS se utilizaban los indices R-Tree de PostgreSQL. Sin embargo, desde la version 0.6 han sido descartados los indices R-Tree de PostgreSQL, y la indexación espacial esta provista de un esquema R-Tree-over-GiST.

Nuestros test han demostrado que la velocidad de búsqueda par indices nativos R-Tree y GiST son comparables. El indice nativo R-Tree de PostgreSQL tiene dos limitaciones no lo hacen apto para su uso con elementos GIS (estas limitaciones son debidas a la implementación nativa actual de R-Tree de PostgreSQL, no del concepto R-Tree en general):

  • Los indices R-Tree en PostgreSQL no pueden manejar elementos mayores de 8K de tamaño. Los indices GiST pueden, utilizando el truco "lossy" para substituir la caja del elemento en si mismo.

  • Los indices r-Tree de PostgreSQL no son seguros con valores nulos, así que construir un indice en una columna de geometrías que contiene valores nulos fallará.

3.13.

¿Por que debería utilizar la función AddGeometryColumn() y todas las herramientas OpenGIS?

Si no quieres utilizar el soporte de funciones OpenGIS, no tienes por que hacerlo. Simplemente crea tablas como en versiones anteriores, definiendo tus columnas de geometrías en el comando CREATE. Todas tus geometrias tendrán un valor de -1 en el SRID, y las tablas de metadatos OpenGIS no se cumplimentaran correctamente. De todas cromas, esto hará que muchas de las aplicaciones basadas en PostGIS fallen, y generalmente se sugiere que debes utilizar AddGeometryColumn() para crear tablas geométricas.

MapServer es una aplicación que hace uso de los metadatos de la tabla geometry_columns. Especificamente, MapServer puede utilizar el SRID de la columna de geometrías para hacer reproyecciones al vuelo de los elementos en la proyección correcta del mapa.

3.14.

¿Cual es la mejor manera de encontrar objetos en el radio de otro objeto?

Para utilizar la base de datos de la forma mas eficiente, lo mejor para hacer consultas por radio es combinar los test de radio y el test de cajas: los test de cajas utilizan los indices espaciales, dando un acceso rápido a los subconjuntos de datos a los cuales se les aplica los test de radio.

La función ST_DWithin(geometry, geometry, distance) es una forma practica de hacer consultas de búsqueda de distancia indexada. Funciona creando un rectángulo de búsqueda lo suficientemente grande para abarcar el radio de distancia, y después haciendo una búsqueda exacta de distancia en el indice del subconjunto de resultados.

Por ejemplo, para encontrar todos los objetos a 100 metros del punto POINT(1000 1000), la siguiente consulta funcionara correctamente:

SELECT * FROM geotable
WHERE ST_DWithin(geocolumn, 'POINT(1000 1000)', 100.0);

3.15.

¿Como puedo realizar una reproyección como parte de una consulta?

Para realizar una reproyección, el sistema de coordenadas de las tablas origen y destino debe estar definido en la tabla SPATIAL_REF_SYS, y las geometrías reproyectadas deben tener definido un sistema de coordenadas SRID en ellas. Una vez hecho esto, una reprojección es tan simple como hacer una referencia al SRID deseado. La consulta siguen reproyecta una geometría a NAD 83 long lat. La consulta siguiente solo funcionará si el srid de la geometría no es -1 (referencia espacial no definida)

SELECT ST_Transform(the_geom,4269) FROM geotable;

3.16.

He hecho un ST_AsEWKT y un ST_AsText en una geometría bastante grande y me devuelve un campo en blanco.¿Que a pasado?

Probablemente estes utilizando PgAdmin o otra herramienta que no es capaz de mostrar texto largo. Si tu geometría es lo suficientemente grande, aparecerá en blanco en estas herramientas. Utiliza PSQL si realmente necesitas ver o extraer la geometría en WKT.

-- Para comprobar el numero de geometrías que están realmente en blanco
                                SELECT count(gid) FROM geotable WHERE the_geom IS NULL;

3.17.

Cuando hago un ST_Intersects, me dice que mis dos geometrías no se intersectan cuando SE QUE SI LO HACEN. ¿Que esta pasando?

Esto ocurre generalmente en dos casos comunes. Tu geometría no es valida -- check ST_IsValid o estas asumiendo que se interceptan por que ST_AsText recorta el numero de decimales y tienes un montón de decimales después que no se muestran.

3.18.

Estoy desarrollando software que utiliza PostGIS, ¿quiere decir esto que mi software debe tener licencia GPL como PostGIS?¿Tengo que liberar todo mi código si utilizo PostGIS?

Seguramente no. Como ejemplo, piensa en una base de datos Oracle ejecutandose en Linux. Linus tiene licencia GPL, Oracle no, ¿Oracle ejecutandose en Linux tiene que distribuirse con licencia GPL? No. Así que tu software puede utilizar bases de datos PostgreSQL/PostGIS tanto como quiera y tener la licencia que tu quieras.

La unica excepción puede ser si realizas cambios en el código fuente de PostGIS, y distribuyes una version modificada de PostGIS. En este caso deberás compartir el código de tu version modificada de PostGIS (pero el código de tu aplicación que se ejecuta sobre el no). Aun así en este caso limitado, solo tendrías que distribuir el código modificado a la gente que distribuyes los binarios. La licencia GPL no requiere que publiques tu código fuente, solo que lo compartas con la gente a la que entregas los binarios.

The above remains true even if you use PostGIS in conjunction with the optional CGAL-enabled functions. Portions of CGAL are GPL, but so is all of PostGIS already: using CGAL does not make PostGIS any more GPL than it was to start with.

Chapter 4. Utilizando PostGIS: Gestión de Datos y Consultas

4.1. Objetos SIG

Los objetos SIG soportados por PostGIS son una colección de "Simple Features" definidas por el OpenGIS Consortium (OGC). A partir de la versión 0.9, PostGIS soporta todos los objetos y funciones de la especificación "Simple Features for SQL" del OGC.

PostGIS extiende el estándar con soporte para coordenadas 3DZ,3DM y 4D.

4.1.1. OpenGIS WKB y WKT

La especificación OpenGIS define dos formas estándar de expresar objetos espaciales: la forma Well-Known Text (WKT) y la forma Well-Known Binary (WKB). Ambas WKT y WKB, incluyen información sobre el tipo de objeto y el sistema de coordenadas del objeto.

Algunos ejemplos de representaciones (WKT) de objetos espaciales de objetos geográficos son de la siguiente manera:

  • POINT(0 0)

  • LINESTRING(0 0,1 1,1 2)

  • POLYGON((0 0,4 0,4 4,0 4,0 0),(1 1, 2 1, 2 2, 1 2,1 1))

  • MULTIPOINT(0 0,1 2)

  • MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))

  • MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0),(1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))

  • GEOMETRYCOLLECTION(POINT(2 3),LINESTRING(2 3,3 4))

La especificación OpenGIS también requiere que el almacenamiento interno de objetos espaciales incluya el sistema de referencia espacial (SRID). El SRID es necesario al crear objetos espaciales para añadirlos a la base de datos.

La Entrada/Salida de estos formatos están disponibles utilizando las interfaces siguientes:

bytea WKB = ST_AsBinary(geometry);
text WKT = ST_AsText(geometry);
geometry = ST_GeomFromWKB(bytea WKB, SRID);
geometry = ST_GeometryFromText(text WKT, SRID);

Por ejemplo un comando valido de inserción para crear e insertar un objeto espacial OGC podría ser:

INSERT INTO geotable ( the_geom, the_name )
  VALUES ( ST_GeomFromText('POINT(-126.4 45.32)', 312), 'A Place');

4.1.2. En PostGIS EWKB, EWKT y foma Canonica

Los formatos OGC solo soportan geometrías 2D, y los SRID asociados nunca son embebidos en las representaciones de entrada/salida.

Los formatos extendidos de PostGIS son un superconjunto de los OGC actualmente (todo WKB/WKT valido es un EWKB/EWKT valido) pero esto puede variar en el futuro, especialmente si el OGC saca un nuevo formato que crea conflictos con nuestras extensiones. ¡Por lo tanto NO DEBERIAS confiar en esta característica!

PostGIS EWKB/EWKT añade soporte a coordenadas 3dm, 3dz y 4d y a información embebida del SRID.

Algunos ejemplos de representaciones (WKT) de objetos espaciales de objetos geográficos son de la siguiente manera:

  • POINT(0 0 0) -- XYZ

  • SRID=32632;POINT(0 0) -- XY with SRID

  • POINTM(0 0 0) -- XYM

  • POINT(0 0 0 0) -- XYZM

  • SRID=4326;MULTIPOINTM(0 0 0,1 2 1) -- XYM with SRID

  • MULTILINESTRING((0 0 0,1 1 0,1 2 1),(2 3 1,3 2 1,5 4 1))

  • POLYGON((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0))

  • MULTIPOLYGON(((0 0 0,4 0 0,4 4 0,0 4 0,0 0 0),(1 1 0,2 1 0,2 2 0,1 2 0,1 1 0)),((-1 -1 0,-1 -2 0,-2 -2 0,-2 -1 0,-1 -1 0)))

  • GEOMETRYCOLLECTIONM( POINTM(2 3 9), LINESTRINGM(2 3 4, 3 4 5) )

  • MULTICURVE( (0 0, 5 5), CIRCULARSTRING(4 0, 4 4, 8 4) )

  • POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )

  • TRIANGLE ((0 0, 0 9, 9 0, 0 0))

  • TIN( ((0 0 0, 0 0 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 0 0 0)) )

La Entrada/Salida de estos formatos están disponibles utilizando las interfaces siguientes:

bytea EWKB = ST_AsEWKB(geometry);
text EWKT = ST_AsEWKT(geometry);
geometry = ST_GeomFromEWKB(bytea EWKB);
geometry = ST_GeomFromEWKT(text EWKT);

Por ejemplo, una consulta "insert" valida para crear e insertas un objeto espacial PostGIS debería ser:

INSERT INTO geotable ( the_geom, the_name )
  VALUES ( ST_GeomFromEWKT('SRID=312;POINTM(-126.4 45.32 15)'), 'A Place' )

Las formas "canónicas" de un tipo PostgreSQL son las representaciones que obtienes con una consulta simple (sin ninguna llamada a funciones) y la única que esta garantizada en ser aceptada con un simple "insert", "update" o "copy". para los tipos 'geómetra' de PostGIS son:

- Output
  - binary: EWKB
        ascii: HEXEWKB (EWKB in hex form)
- Input
  - binary: EWKB
        ascii: HEXEWKB|EWKT 

Por ejemplo, esta consulta lee EWKT y devuelve HEXEWKB en el proceso de entrada/salida ascii canónico.

=# SELECT 'SRID=4;POINT(0 0)'::geometry;

geometry
----------------------------------------------------
01010000200400000000000000000000000000000000000000
(1 row)

4.1.3. SQL-MM Parte 3

La especificación SQL Multimedia Applications Spatial extiende los objetos simples para la especificación SQL definiendo un numero de curvas interpoladas.

Las definiciones SQL-MM incluyen coordenadas 3dm, 3dz y 4d, pero no permiten integrar la información SRID.

Las extensiones de well-know text no están aún completamente soportadas. A continuación se muestran ejemplos de algunas geometrías simples curvadas:

  • CIRCULARSTRING(0 0, 1 1, 1 0)

    CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0)

    CIRCULARSTRING es el tipo básico de curva, similar a LINESTRING en el mundo lineal. Un segmento simple necesita tres puntos, los puntos de inicio y fin (primero y tercero) y cualquier otro punto del arco. La excepción a esto es para un círculo cerrado, donde el punto de inicio y fin son el mismo. En este caso, el segundo punto DEBE ser el centro del arco, esto es el lado opuesto del círculo. Para encadenar arcos juntos, el último punto del arco previo, se convierte en el primero del siguiente, como ocurre con LINESTRING. Esto quiere decir que una cadena circular válida debe tener un número impar de puntos mayor que 1.

  • COMPOUNDCURVE(CIRCULARSTRING(0 0, 1 1, 1 0),(1 0, 0 1))

    Una curva compuesta es una curva simple y continua, que tiene segmentos curvos (circular) y segmentos lineales. Esto significa que ademas de tener componentes bien formados, el punto final de cada componente (excepto el ultimo) debe coincidir con el punto inicial del componente siguiente.

  • CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1))

    Ejemplo de curva compuesta en un polígono curvo: CURVEPOLYGON(COMPOUNDCURVE(CIRCULARSTRING(0 0,2 0, 2 1, 2 3, 4 3),(4 3, 4 5, 1 4, 0 0)), CIRCULARSTRING(1.7 1, 1.4 0.4, 1.6 0.4, 1.6 0.5, 1.7 1) )

    Un CURVEPOLYGON es como un poligono, con un anillo externo y cero o mas anillos internos. La diferencia es que que este anillo puede tomar la forma de una cadena circular, cadena lineal o una cadena de curva compuesta.

    A partir de PostGIS 1.4, PostGIS soporta curvas compuestas en un polígono curvo.

  • MULTICURVE((0 0, 5 5),CIRCULARSTRING(4 0, 4 4, 8 4))

    Una MULTICURVE es una colección de curvas, que puede incluir cadenas lineales, cadenas curvas o curvas compuestas.

  • MULTISURFACE(CURVEPOLYGON(CIRCULARSTRING(0 0, 4 0, 4 4, 0 4, 0 0),(1 1, 3 3, 3 1, 1 1)),((10 10, 14 12, 11 10, 10 10),(11 11, 11.5 11, 11 11.5, 11 11)))

    Esto es una colección de superficies, que pueden ser polígonos (lineales) o polígonos curvos.

[Note]

Versiones anteriores a la 1.4 de PostGIS no soportan curvas compuestas en un polígono curvo, pero PortGIS 1.4 y superiores soportan el uso de Curvas Compuestas en Poligonos Curvos.

[Note]

Todas las comparaciones de coma flotante en la implementación SQL-MM se desarrollan para una tolerancia específica, normalmente 1E-8.

4.2. Tipo Geography en PostGIS

El tipo "geography" proporciona soporte nativo para objetos espaciales representados por coordenadas geográficas ( a veces llamadas coordenadas geodésicas, o "lat/lon", o "lob/lat"). Las coordenadas geográficas son coordenadas esféricas expresadas en unidades angulares (grados).

La base del tipo "geometry" de PostGIS es un plano. El camino mas corto entre dos puntos en un plano es una linea recta. Esto significa que los cálculos en geometrías (áreas, distancias, longitudes, intersecciones, etc) pueden calcularse utilizando matemáticas cartesiana y vectores lineales.

La base del tipo geografico de PostGIS es una esfera. El camino mas corto entre dos puntos en la esfera es el arco de circunferencia mas corto que une los dos puntos. esto significa que los cálculos geográficos (áreas, distancias, longitudes, intersecciones, etc) deben calcularse en la esfera, utilizando matemáticas mas complejas. Para medidas mas precisas, los cálculos deben tomar la forma esferoidal actual del mundo en cuenta, y las matemáticas se vuelven aun mas complejas.

Debido a que las matemáticas subyacentes son mas complejas, hay varias funciones definidas para el tipo geográfico y no para el tipo geométrico. Con el tiempo, conforme se añadan nuevos algoritmos, las capacidades del tipo geográfico se irán expandiendo.

Una restricción es que sólo soporta longitud y latitud en WGS84 (SRID:4326). Utiliza un nuevo tipo llamado "geography". Ninguna de las funciones de GEOS soporta este nuevo tipo. Para solucionar este problema se puede convertir entre los tipos de "geometry" y "geography".

El nuevo tipo "geography" utiliza el formato de definición typmod de PostgreSQL 8.3+ así se puede añadir una tabla con un campo geográfico de forma sencilla. Todos los formatos OGC excepto la curva están soportados.

4.2.1. Bases del tipo "Geography"

El tipo "geography" solo soporta el mas simple de los objetos simples. Datos del tipo de geometría estándar serán moldeados al tipo "geography" si esta en SRID 4326. También puedes emplear las convenciones EWKT y EWKB para añadir datos.

  • PUNTO: Creando una tabla con una geometría puntual 2D:

    CREATE TABLE testgeog(gid serial PRIMARY KEY, the_geog geography(POINT,4326) );

    Creando una tabla con un punto con coordenada z

    CREATE TABLE testgeog(gid serial PRIMARY KEY, the_geog geography(POINTZ,4326) );
  • LINESTRING

  • POLYGON

  • MULTIPOINT

  • MULTILINESTRING

  • MULTIPOLYGON

  • GEOMETRYCOLLECTION

Los nuevos campos geográficos no estarán registrados en geometry_columns. Estarán registrados en una nueva vista llamada geography_columns que es una vista contra los catálogos del sistema, así que siempre actualizara de forma automática sin necesidad de ninguna función de tipo AddGeom...

Ahora, comprueba la vista "geography_columns" y mira si tu tabla está listada

Puedes crear una nueva tabla con una columna GEOGRAPHY usando la sintaxis de CREATE TABLE. A diferencia de GEOMETRY, no hay necesidad de ejecutar un proceso separado de AddGeometryColumns() para registrar la columna en los metadatos.

CREATE TABLE global_points ( 
    id SERIAL PRIMARY KEY,
    name VARCHAR(64),
    location GEOGRAPHY(POINT,4326)
  );

Se puede notar que la columna de localización es de tipo GEOGRAPHY y este tipo geográfico soporta dos modificadores opcionales: un modificador de tipo que restringe la clase de formas y dimensiones permitidas en la columna; y un modificador SRID que restringe el identificador de las coordenadas de referencia a un número particular.

Valores permitdos para el modificador de tipo son: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON. El modificador también acepta restricciones dimensionales a través de sufijos: Z, M Y ZM. Así, por ejemplo, un modificador de 'LINESTRINGM' permitirá sólo líneas con tres dimensiones, y trataría la tercera dimensión como una medida. De forma similar, 'POINTZM' esperará datos de cuatro dimensiones.

El modificador SRID tiene un uso limitado actualmente: solo esta permitido el valor 4326 (WGS84). Si no especificas un SRID, se utilizara el valor 0 (esferoide indefinido), y todos los cálculos se harán utilizando el esferoide WGS84 de todas formas.

En el futuro, SRID diferentes permitirán cálculos en esferoides diferentes al WGS84.

Una vez hayas creado tu tabla, podras verla en en la tabla GEOGRAPHY_COLUMNS:

-- Ver el contenido de la vista de metadatos
SELECT * FROM geography_columns;

Puedes añadir datos en la tabla de la misma forma que si fuera una columna GEOMETRY:

-- Añade algunos datos en la tabla de test
INSERT INTO global_points (name, location) VALUES ('Town', ST_GeographyFromText('SRID=4326;POINT(-110 30)') );
INSERT INTO global_points (name, location) VALUES ('Forest', ST_GeographyFromText('SRID=4326;POINT(-109 29)') );
INSERT INTO global_points (name, location) VALUES ('London', ST_GeographyFromText('SRID=4326;POINT(0 49)') );

Crear un indice es igual que para GEOMETRY. PostGIS detectará que el tipo de columna es GEOGRAPHY y creara un indice basado en una esfera apropiado en vez de el indice usual basado en plano utilizado para columnas GEOMETRY

-- Crea un indice en la tabla de test con un indice esferico
  CREATE INDEX global_points_gix ON global_points USING GIST ( location );

Las consultas y las funciones de medidas utilizan metros cho unidad. Asi que los parámetros de distancia deben estar expresados en metros, y los valores devueltos deben estar expresados en metros (o metros cuadrados para áreas)

-- Muestra una consulta de distancia y observa que , Londres esta fuera de la tolerancia de 1000km
  SELECT name FROM global_points WHERE ST_DWithin(location, ST_GeographyFromText('SRID=4326;POINT(-110 29)'), 1000000);

Puedes observar la potencia de GEOGRAPHY en directo calculando como de próximo, un avión volando de Seattle a Londres (LINESTRING(-122.33 47.606, 0.0 51.5)) viene a Reykjavik (POINT(-21.96 64.15)).

-- Calculo de distancia utilizando GEOGRAPHY (122.2km)
  SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geography, 'POINT(-21.96 64.15)':: geography);

-- Calculo de distancia utilizando GEOMETRY (13.3 "degrees")
  SELECT ST_Distance('LINESTRING(-122.33 47.606, 0.0 51.5)'::geometry, 'POINT(-21.96 64.15)':: geometry);

El tipo GEOGRAPHY calcula la distancia real mas corta sobre la esfera entre Reykjavik y el camino circular mayor de vuelo entre Seattle y London.

Great Circle mapper El tipo GEOMETRY calcula una distancia cartesiana sin sentido entre Reykjavik y el camino recto desde Seattle a Londres dibujado en un mapa plano del mundo. Las unidades nominales del resultado debe llamarse "grados", pero el resultado no corresponde con ninguna diferencia angular entre los puntos, así que incluso llamándolo "grados" es inexacta.

4.2.2. ¿Cuando utilizar el tipo Geografico en vez de Geometrico?

El nuevo tipo GEOGRAPHY te permite almacenar datos en coordenadas longitud/latitud, pero con un coste: hay algunas funciones definidas en GEOGRAPHY que están en GEOMETRY; estas funciones que están definidas toman mas tiempo en la CPU a ejecutarse

El tipo que elijas debe estar condicionado por la extension del área de trabajo de la aplicación que estas construyendo. ¿Tus datos se extienden por el globo o una zona continental grande? ¿O es un estado, región o municipio?

  • Si tus datos están un área pequeña, la mejor solución seria elegir una proyección adecuada y utilizando GEOMETRY, en términos de rendimiento y funcionalidades disponibles.

  • Si tus datos son globales o cubren una región continental, veras que GEOGRAPHY te permite construir un sistema sin tener que preocuparte sobre detalles de proyección. Almacenas tus datos en longitud/latitud, y utilizas las funciones definidas en GEOGRAPHY.

  • Si no entiendes las proyecciones, y no quieres aprender sobre ellas, y estas preparado a aceptar las funcionalidades limitadas disponibles en GEOGRAPHY, entonces sera mas fácil para ti, utilizar GEOGRAPHY en lugar de GEOMETRY. Simplemente carga tus datos como longitud/latitud y continua desde allí.

Para tener una comparación entre lo que esta soportado entre Geography y Geometry ve a Section 14.11, “PostGIS Function Support Matrix”. Para obtener una lista con la descripción de las funciones Geography ve a Section 14.4, “PostGIS Geography Support Functions”

4.2.3. Preguntas frecuentes Avanzadas de Geography

4.2.3.1. ¿Se calcula en la esfera o en el esferoide?
4.2.3.2. ¿Que ocurre con los husos horarios y los polos?
4.2.3.3. ¿Cual es el arco mas largo que se pude procesar?
4.2.3.4. ¿ Por que es tan lento el calculo del area de Europa / Rusia / añade una región geográfica grande aquí?

4.2.3.1.

¿Se calcula en la esfera o en el esferoide?

Por defecto, todos los cálculos de distancia y área están hechos sobre el esferoide. Deberías ver que los resultados de los cálculos en áreas locales deberán coincidir con los resultados en coordenadas locales planas con proyecciones locales correctas. En grandes áreas, los cálculos esferoidales serán mas precisas que cualquier calculo realizado en planas.

Todas las funciones "geography" tienen la opción de utilizar el calculo sobre la esfera, seleccionando el parámetro final boleano a 'FALSE'. Esto puede acelerar los cálculos, particularmente en casos donde las geometrias son muy simples.

4.2.3.2.

¿Que ocurre con los husos horarios y los polos?

Todos los cálculos no tienen nociones de husos horarios o polos, las coordenadas son esféricas(longitud/latitud) así que una forma que atraviesa husos horarios no es, desde un punto de vista de los cálculos, a cualquier otra forma.

4.2.3.3.

¿Cual es el arco mas largo que se pude procesar?

Utilizamos grandes arcos de circulo como la "linea de interpolación" entre dos puntos. Esto significa que actualmente, dos puntos se unen de dos formas, dependiendo de la dirección del viaje sobre el arco. Todo nuestro código asume que los puntos están unidos por el *mas corto* de los dos caminos a traves del arco de circunferencia. Como consecuencia, las formas que tienen arcos mayores de 180 grados no serán modeladas correctamente.

4.2.3.4.

¿ Por que es tan lento el calculo del area de Europa / Rusia / añade una región geográfica grande aquí?

¡Por que el poligono es condenadamente grande! Las grandes áreas son malas por dos razones: Sus limites son grandes, así que el indice tiende a tirar de la función sin importar la consulta que estes ejecutando; el numero de vértices es grande, y los tests (distancia, de contención) tiene que recorrer la lista de vértices al menos una vez y a veces N veces ( con N igual al numero de vértices en el otro objeto candidato).

Como con GEOMETRY, recomendamos que cuando tengas polígonos muy grandes, pero haces consultas en áreas pequeñas, deberías "desnormalizar" tus datos geométricos en trozos pequeños así el indice puede hacer subconsultas eficientes del objeto y las consultas no tienen que utilizar el objeto entero cada vez. Solo por que *puedas* almacenar toda Europa en un polígono no significa que *debas*.

4.3. Utilizando estandares OpenGIS

La especificación "Simple Features Specification for SQL"del OpenGIS, define estándares del tipo de objetos GIS, las funciones necesarias para manipularlos, y un conjunto de tablas de metadatos. Para asegurar que los metadatos permanecen consistentes, operaciones como crear o borrar una columna espacial están llevados a cabo a través de procedimientos especiales definidos por el OpenGIS.

Hay dos tablas de metadatos definidas por el OpenGIS: SPATIAL_REF_SYS y GEOMETRY_COLUMNS. La tabla SPATIAL_REF_SYS almacena los IDs numéricos y las descripciones textuales de los sistemas de coordenadas utilizados en la base de datos espaciales.

4.3.1. La tabla SPATIAL_REF_SYS y los Sistemas de Referencia Espacial

La tabla spatial_ref_sys es una tabla incluida en PostGIS y cumple con el estafar OGC, que contiene una lista de unos 3000 sistemas de referencia espaciales conocidos y los detalles necesarios para transformar/reproyectar entre ellos.

Aunque la tabla spatial_ref_sys de PostGIS contiene unas 3000 definiciones de sistemas de referencia espaciales mas comunes, esto puede ser manejado con la librería proj, no contiene todos los sistemas conocidos y puedes definir tus propias proyecciones si estas familiarizado con el constructor de proj4. Piensa que la mayoría de sistemas de referencia son regionales y no tiene sentido utilizarlos fuera de los limites para los cuales fueron definidos.

Un recurso muy bueno para encontrar sistemas de referencia espaciales no definidos en el núcleo de la librería es http://spatialreference.org/

Algunos de los sistemas de referencia espaciales mas comunes en Estados Unidos son: 4326 - WGS 84 Long Lat , 4269 - NAD 83 Long Lat (en Norte America ), 3395 - WGS 84 World Mercator, 2163 - US National Atlas Equal Area (en Estados Unidos ),Sistemas de referencia espaciales para cada zona, NAD 83, WGS 84 UTM y UTM son de los mas idóneos para medidas, pero solo cubren regiones de 6 grados.

Algunos sistemas de referencia espaciales planos de Estados Unidos (basados en metros o pies) - normalmente existen uno o 2 por Estado de Estados Unidos. La mayoría de los basados en metros están en el núcleo de definiciones, pero algunos de los basados en pies o los creados por ESRI deberás crearlos desde spatialreference.org.

Para saber detalles sobre como determinar la zona UTM a utilizar en tu área de interés, echalé un vistazo a la función de ayuda utmzone PostGIS plpgsql .

La definición de la tabla SPATIAL_REF_SYS es la siguiente:

CREATE TABLE spatial_ref_sys (
  srid       INTEGER NOT NULL PRIMARY KEY,
  auth_name  VARCHAR(256),
  auth_srid  INTEGER,
  srtext     VARCHAR(2048),
  proj4text  VARCHAR(2048)
)

Las columnas SPATIAL_REF_SYS son como sigue:

SRID

Un valor entero único que identifica el Sistema de Referencia Espacial (SRS de sus siglas en ingles) con la base de datos.

AUTH_NAME

El nombre del estándar o estándares que es citado para este sistema de referencia. Por ejemplo, "EPSG" seria un AUTH_NAME valido.

AUTH_SRID

El ID del Sistema de Referencia Espacial definido por el Autor citado en AUTH_NAME. En el caso de EPSG, este es lugar donde deberá ir el código de la proyección EPSG.

SRTEXT

La representación Well-Known Text del Sistema de Referencia Espacial (SRS). Un ejemplo de representación WKT SRS es:

PROJCS["NAD83 / UTM Zone 10N",
  GEOGCS["NAD83",
        DATUM["North_American_Datum_1983",
          SPHEROID["GRS 1980",6378137,298.257222101]
        ],
        PRIMEM["Greenwich",0],
        UNIT["degree",0.0174532925199433]
  ],
  PROJECTION["Transverse_Mercator"],
  PARAMETER["latitude_of_origin",0],
  PARAMETER["central_meridian",-123],
  PARAMETER["scale_factor",0.9996],
  PARAMETER["false_easting",500000],
  PARAMETER["false_northing",0],
  UNIT["metre",1]
]

Para obtener una lista de los códigos EPSG y sus correspondientes representaciones WKT, visita http://www.opengeospatial.org/. Para obtener información general sobre WKT, visita el OpenGIS "Coordinate Transformation Services Implementation Specification" en http://www.opengeospatial.org/standards. Para obtener información del European Petroleum Survey Group (EPSG) y su base de datos de sistemas de referencia espacial, visita http://www.epsg.org.

PROJ4TEXT

PostGIS utiliza la libreria Proj4 para ejecutar transformaciones de coordenadas. La columna PROJ4TEXT contiene la cadena de definición de coordenadas Proj4 para un SRID particular. Por ejemplo:

+proj=utm +zone=10 +ellps=clrk66 +datum=NAD27 +units=m

Para obtener mas información, puedes visitar el sitio web de Proj4 en http://trac.osgeo.org/proj/. El fichero spatial_ref_sys.sql contiene ambas definiciones SRTEXT y PROJ4TEXT para todas las proyecciones EPSG.

4.3.2. La VISTA GEOMETRY_COLUMNS

En versiones anteriores a PostGIS 2.0.0, geometry_column era una tabla que podía ser editada directamente, y a veces no estaba sincronizada con la definición actual de las columnas geométricas. En PostGIS 2.0.0,GEOMETRY_COLUMNS se transforma en una vista con la misma extructura que versiones anteriores, pero leyendo desde el catalogo del sistema de la base de datos, su estructura es la siguiente:

\d geometry_columns
View "public.geometry_columns"
      Column       |          Type          | Modifiers
-------------------+------------------------+-----------
 f_table_catalog   | character varying(256) |
 f_table_schema    | character varying(256) |
 f_table_name      | character varying(256) |
 f_geometry_column | character varying(256) |
 coord_dimension   | integer                |
 srid              | integer                |
 type              | character varying(30)  |

El significado de las columnas no ha cambiado desde versiones anteriores y es:

F_TABLE_CATALOG, F_TABLE_SCHEMA, F_TABLE_NAME

El nombre completo de la tabla de entidad que contiene la columna de geometría. Observa que los términos "catalog" y "schema" son como en Oracle. No hay analogía en PostgreSQL para "catalogo" así que esta columna esta en blanco -- para "schema" se usa el nombre de esquema de PostgreSQL (public es por defecto).

F_GEOMETRY_COLUMN

El nombre de la columna de geometrías de la tabla de objetos espaciales.

COORD_DIMENSION

Dimension espacial (2, 3 o 4 dimensiones) de la columna.

SRID

El ID del sistema de referencia espacial utilizado para las coordenadas de las geometrías en la tabla. Es una clave foránea con referencia a la tabla SPATIAL_REF_SYS.

TYPE

El tipo de objeto espacial. Para restringir la columna espacial a un tipo unico, utiliza uno de: POINT, LINESTRING, POLYGON, MULTIPOINT, MULTILINESTRING, MULTIPOLYGON, GEOMETRYCOLLECTION o su version correspondiente de XYM POINTM, LINESTRINGM, POLYGONM, MULTIPOINTM, MULTILINESTRINGM, MULTIPOLYGONM, GEOMETRYCOLLECTIONM. Para colecciones heterogéneas (tipos mixtos), puedes utilizar "GEOMETRY" como tipo.

[Note]

Este no es (probablemente) parte de la especificación OpenGIS, pero es necesario para asegurar la homogeneidad de tipos.

4.3.3. Crear una tabla espacial

Crear una tabla con datos espaciales se puede hacer en un solo paso. Como se muestra en el siguiente ejemplo que crea una tabla de carreteras con una columna de tipo lineal de 2D en WGS84 long lat.

CREATE TABLE ROADS ( ID int4
                  , ROAD_NAME varchar(25), geom geometry(LINESTRING,4326) );

Podemos añadir columnas adicionales utilizando el comando estándar ALTER TABLE como se muestra en el siguiente ejemplo donde añadimos una columna de lineas en 3D.

ALTER TABLE roads ADD COLUMN geom2 geometry(LINESTRINGZ,4326);

Por compatibilidad con versiones anteriores, puedes crear tablas espaciales en dos pasos utilizando las funciones de gestión.

  • Crear una tabla normal, no espacial.

    Por ejemplo: CREATE TABLE ROADS ( ID int4, ROAD_NAME varchar(25) )

  • Añadir una columna espacial a la tabla utilizando la función "AddGeometryColumn". Para mas detallis ve a AddGeometryColumn

    La sintaxis es:

    AddGeometryColumn(
      <schema_name>,
      <table_name>,
      <column_name>,
      <srid>,
      <type>,
      <dimension>
    )

    O, utilizando el esquema actual:

    AddGeometryColumn(
      <table_name>,
      <column_name>,
      <srid>,
      <type>,
      <dimension>
    )

    Ejemplo 1: SELECT AddGeometryColumn('public', 'roads', 'geom', 423, 'LINESTRING', 2)

    Ejemplo 2: SELECT AddGeometryColumn( 'roads', 'geom', 423, 'LINESTRING', 2)

Aqui tienes un ejemplo del comando SQL utilizado para crear una tabla y añadirle una columna espacial (asumiendo que un SRID de 128 existe ya):

CREATE TABLE parks (
  park_id    INTEGER,
  park_name  VARCHAR,
  park_date  DATE,
  park_type  VARCHAR
);
SELECT AddGeometryColumn('parks', 'park_geom', 128, 'MULTIPOLYGON', 2 );

Aqui tienes otro ejemplo, utilizando el tipo genérico "geometry" y el valor indefinido de SRID 0:

CREATE TABLE roads (
  road_id INTEGER,
  road_name VARCHAR
);
SELECT AddGeometryColumn( 'roads', 'roads_geom', 0, 'GEOMETRY', 3 );

4.3.4. Registrando la columna de geometrias de forma manual en la tabla geometry_columns

El enfoque de AddGeometryColumn() crea una columna de geometria y además registra la nueva columna en la tabla geometry_columns. Si tu software utiliza geometry_columns, entonces cualquier columna de geometrías que necesites interrogar, debe estar registrada en esta vista. Desde la version PostGIS 2.0, geometry_columns no se puede editar y todas las columnas geométricas se registran de forma automática.

If your geometry columns were created as generic in a table or view and no constraints applied, they will not have a dimension, type or srid in geometry_columns views, but will still be listed.

Dos de los casos en lo que esto ocurre, pero no puedes utilizar AddGeometryColumn, es el caso de vistas SQL e inserciones masivas. Para esto casos, puedes corregir el registro en la tabla geometry_columns creando una restricción en la columna. A saber que en PostGIS 2.0+, si tu columna esta basada en typmod, el proceso de creación lo registrará correctamente, así que no necesitas hacer nada.

--Imaginemos que tienes una vista creada de la siguiente manera
CREATE VIEW  public.vwmytablemercator AS
        SELECT gid, ST_Transform(geom,3395) As geom, f_name
        FROM public.mytable;
        
-- Para registrarla de forma correcta en  PostGIS 2.0+ 
-- Necesitas hacer una conversión de tipos cast
--
DROP VIEW public.vwmytablemercator;
CREATE VIEW  public.vwmytablemercator AS
        SELECT gid, ST_Transform(geom,3395)::geometry(Geometry, 3395) As geom, f_name
        FROM public.mytable;
        
-- Si sabes que el tipo de geometria de forma segura es 2D POLYGON entonces puedes hacer
DROP VIEW public.vwmytablemercator;
CREATE VIEW  public.vwmytablemercator AS
        SELECT gid, ST_Transform(geom,3395)::geometry(Polygon, 3395) As geom, f_name
        FROM public.mytable;
--Supongamos que has creado una tabla derivada al hacer una inserción masiva
SELECT poi.gid, poi.geom, citybounds.city_name
INTO myschema.my_special_pois
FROM poi INNER JOIN citybounds ON ST_Intersects(citybounds.geom, poi.geom);

--Creamos un indice 2d en la tabla nueva
CREATE INDEX idx_myschema_myspecialpois_geom_gist
  ON myschema.my_special_pois USING gist(geom);
  
-- Si tus puntos son 3D o 3M, 
-- Entonces querrás crear un indice nd en vez de un indice 2d
-- de la siguiente manera
CREATE INDEX my_special_pois_geom_gist_nd 
        ON my_special_pois USING gist(geom gist_geometry_ops_nd);

--Para registrar de forma manual la columna geometrica de la nueva tabla en tu tabla geometry_columns
-- Fijate que este método funcionara en ambas versiones PostGIS 2.0+ y PostGIS 1.4+
-- Para PostGIS 2.0 también cambiará  la estructura subyacente de la tabla para
-- hacer la columna basada en typmod.
-- Para PostGIS anterior a 2.0, también se puede utilizar para registrar vistas
SELECT populate_geometry_columns('myschema.my_special_pois'::regclass); 

--Si esta utilizando PostGIS 2.0 y por cualquier razón,
-- necesitas la definición basada en las antiguas restricciones 
-- (como el caso de tablas heredadas donde todas las tablas dependientes no tienen el mismo tipo y srid)
-- selecciona el nuevo argumento opcional  use_typmod como false
SELECT populate_geometry_columns('myschema.my_special_pois'::regclass, false); 

Aunque el método antiguo basado en restricciones aún se puede utilizar, una columna geométrica basada en el uso de restricciones utilizada directamente en la vista, no se registrará correctamente en geometry_columns, al igual que una typmod. En este ejemplo se define una columna utilizando typmod y otro mediante restricciones.

CREATE TABLE pois_ny(gid SERIAL PRIMARY KEY
   , poi_name text, cat varchar(20)
   , geom geometry(POINT,4326) );
SELECT AddGeometryColumn('pois_ny', 'geom_2160', 2160, 'POINT', 2, false);

Si ejecutamos en psql

\d pois_ny;

Vemos que están definidas de forma diferente -- una es typmod, la otra por restricciones.

Table "public.pois_ny"
  Column   |         Type          |                       Modifiers

-----------+-----------------------+------------------------------------------------------
 gid       | integer               | not null default nextval('pois_ny_gid_seq'::regclass)
 poi_name  | text                  |
 cat       | character varying(20) |
 geom      | geometry(Point,4326)  |
 geom_2160 | geometry              |
Indexes:
    "pois_ny_pkey" PRIMARY KEY, btree (gid)
Check constraints:
    "enforce_dims_geom_2160" CHECK (st_ndims(geom_2160) = 2)
    "enforce_geotype_geom_2160" CHECK (geometrytype(geom_2160) = 'POINT'::text 
        OR geom_2160 IS NULL)
    "enforce_srid_geom_2160" CHECK (st_srid(geom_2160) = 2160)

En geometry_columns, ambas se registran de forma correcta

SELECT f_table_name, f_geometry_column, srid, type 
        FROM geometry_columns 
        WHERE f_table_name = 'pois_ny';
f_table_name | f_geometry_column | srid | type
-------------+-------------------+------+-------
pois_ny      | geom              | 4326 | POINT
pois_ny      | geom_2160         | 2160 | POINT

De todas formas -- si queremos crear una vista de la siguiente forma

CREATE VIEW vw_pois_ny_parks AS 
SELECT * 
  FROM pois_ny 
  WHERE cat='park';
  
SELECT f_table_name, f_geometry_column, srid, type 
        FROM geometry_columns 
        WHERE f_table_name = 'vw_pois_ny_parks';

La columna de la vista basada en typmos se registra de forma correcta, pero la basada en restricciones no.

f_table_name   | f_geometry_column | srid |   type
------------------+-------------------+------+----------
 vw_pois_ny_parks | geom              | 4326 | POINT
 vw_pois_ny_parks | geom_2160         |    0 | GEOMETRY

Esto puede cambiar en versiones futuras de PostGIS, pero por el momento, para forzar a las vistas basadas en restricciones a registrarse de forma correcta, debemos hacer lo siguiente:

DROP VIEW vw_pois_ny_parks;
CREATE VIEW vw_pois_ny_parks AS 
SELECT gid, poi_name, cat
  , geom
  , geom_2160::geometry(POINT,2160) As geom_2160 
  FROM pois_ny 
  WHERE cat='park';
SELECT f_table_name, f_geometry_column, srid, type 
        FROM geometry_columns 
        WHERE f_table_name = 'vw_pois_ny_parks';
f_table_name   | f_geometry_column | srid | type
------------------+-------------------+------+-------
 vw_pois_ny_parks | geom              | 4326 | POINT
 vw_pois_ny_parks | geom_2160         | 2160 | POINT

4.3.5. Asegurando la compatibilidad de geometrias con OpenGIS

PostGIS es compatible con la especificación Open Geospatial Consortium’s (OGC) OpenGIS Specifications. Como tal, muchos métodos PostGIS requieren, o más exactamente, asume que las geometrías con las que se opera son a la vez simples y válidas. Por ejemplo, no tiene sentido calcular el área de un polígono que tiene un agujero definido fuera del polígono, o para la construcción de un polígono a partir de una línea de límite no simple.

Según las especificaciones OGC, una geometría simple, es aquella que no tiene puntos geométricos anómalos, con autointersección o auto tangencia y principalmente se refiere a geometrías de 0 o 1 dimensiones (i.e. [MULTI]POINT, [MULTI]LINESTRING). La validez de geometrias, por otro lado, se refiere a geometrias de dimension 2 (i.e. [MULTI]POLYGON) y define el conjunto afirmaciones que caracterizan un polígono valido. La descripción de cada clase de geometría incluye condiciones especificas que simplemente detalles de simplicidad y validez geométricas.

Un POINT es hereditariamente simple como un objeto de geometría 0-dimensional.

MULTIPOINTs son simples simple si dos coordenadas (POINTs) no son iguales (tienen valores de coordenadas identicos).

Una LINESTRING es simple si no pasa dos veces por el mismo POINT (excepto para puntos finales, en cuyo caso nos referimos como linear ring y considerado como cerrado).

(a)

(b)

(c)

(d)

(a) y (c)son LINESTRINGs simples, (b) y (d) no lo son.

Una MULTILINESTRING es simple solo si todos sus elementos son simples y las únicas intersecciones entre cualquiera de sus elementos, se produce en POINTs que están en los limites de ambos elementos.

(e)

(f)

(g)

(e) y (f) son MULTILINESTRINGs simples, (g) no lo es.

Por definición, un POLYGON siempre será simple. Es valido si dos anillos del borde (formado por un anillo exterior y los anillos interiores) no se cruzan. El borde de un POLYGON debe intersectarse en un POINT pero solo como tangente (i.e. no en una linea). Un POLYGONno debe tener lineas de corte o picos y los anillos interiores deben estar contenidos por entero por el anillo exterior.

(h)

(i)

(j)

(k)

(l)

(m)

(h) y (i) son POLYGONs validos, (j-m) no se pueden representar como POLYGONs simples, pero (j) y (m) pueden representarse como un MULTIPOLYGON valido.

Un MULTIPOLYGON es válido si y sólo si todos sus elementos son válidos y no se producen intersecciones entre los interiores de ningún par de elementos. Los límietes de cualquiera de los dos elementos pueden tocarse, pero sólo en un número finito de POINTs.

(n)

(o)

(p)

(n) y (o) no son MULTIPOLYGONs validos. (p), sin embargo, es valido.

La mayoría de las funciones implementadas por la biblioteca GEOS dependen de la asunción de que las geometrías son válidad según lo especificado en la OpenGIS Simple Feature Specification. Para comprobar la simplicidad o validez de geometrías se puede usar ST_IsSimple() and ST_IsValid()

--Normalmente, no tiene sentido hacer la comprobación
-- de validez o elementos lineales, ya que siempre devolverá TRUE.
-- Pero en este ejemplo, PostGIS extiende la deficinción del IsValid de OGC
--devolviendo FALSE si una LineString tiene menos de 2 vértices *distintos*.
gisdb=# SELECT
ST_IsValid('LINESTRING(0 0, 1 1)'),
ST_IsValid('LINESTRING(0 0, 0 0, 0 0)');

st_isvalid | st_isvalid
------------+-----------
t | f

Por defecto, PostGIS no comprueba la validez en las geometrías entrantes, porque los test de validez necesitan gran cantidad de tiempo de CPU para geometrías complejas, en especial polígonos. Si no se está seguro de la fuente de datos se puede forzar manualmente a realizar la comprobación de las tablas añadiendo una restricción de comprobación:

ALTER TABLE mytable
ADD CONSTRAINT geometry_valid_check
CHECK (ST_IsValid(the_geom));

Si eincuentras algún mensaje de error extraño como "GEOS Intersection() threw an error!" o "JTS Intersection() threw an error!" al llamar a las funciones de PostGIS con geometrías de entrada válidas, seguramente se deba a algún error bien en PostGIS o en una de las bibliotecas que usa, y deberías contactar con el equipo de desarrollo de PostGIS. Lo mismo es aplicable si una función de PostGIS devuelve una geometría inválida a partir de una entrada válida.

[Note]

Geometrías estrictamente compatibles con OGC no pueden tener valores Z o M.¡La función ST_IsValid() no considerará invalidas las geometrías con mas dimensiones! Llamadas a AddGeometryColumn() añadirá restricciones al comprobar las dimensiones de las geometrías, así que es suficiente con especificar 2.

4.3.6. Modelo de intersección 9 dimensionalmente extendido(DE-9IM)

A veces se da el caso que los predicados espaciales típicos (ST_Contains, ST_Crosses, ST_Intersects, ST_Touches, ...) son insuficientes en si mismos para proveer el filtro espacial deseado.

Por ejemplo, considera un conjunto de datos lineales representando una red de transportes. Es tarea del analista SIG identificar todos los segmentos de carreteras que se intersectan con otros, no en un punto, pero en una linea, quizás invalidando algunas reglas. En este caso, ST_Crosses no nos proporcionara el filtro espacial adecuado ya que , para elementos lineales, devolverá true solo en el caso de intersección en un punto.

Una solución en dos pasos podría ser, primero hacer una consulta de las intersecciones (ST_Intersection) de los pares de vías de comunicación que se intersectan espacialmente (ST_Intersects), y entonces comparar las intersecciones ST_GeometryType con 'LINESTRING' (gestionando correctamente los casos que devuelvan GEOMETRYCOLLECTION de [MULTI]POINTs, [MULTI]LINESTRINGs, etc.).

Una solución mas elegante/rápida de hecho puede ser deseable.

Un [teórico] segundo ejemplo puede ser el de un analista SIG intentando localizar todos los muelles que intersectan los limites de un lago en una linea y donde solo un extremo del muelle este en la orilla. En otras palabras, cuando el muelle este contenido , pero no completamente en el lago, intersectando el borde del lago en una linea, y donde los puntos finales del muelle estén completamente en el borde del lago. El analista necesitará utilizar una combinación de predicados espaciales para aislar el problema:

Así que introducimos el Modelo de Intersección 9 Dimensionalmente Extendido, o DE-9IM para abreviar.

4.3.6.1. Teoria

Según la especificación OpenGIS Simple Features Implementation Specification for SQL, "El enfoque básico para comparar dos geometrías es hacer un test por pares de la intersección entre los interiores, bordes y exteriores de las dos geometrías y clasificar las relaciones entre las dos geometrías basandose en las entradas de la 'matriz de intersección' resultante."

Borde

El borde de una geometría es el conjunto de geometrias de la dimension menor siguiente. Para POINTs, que tienen dimension 0, el borde es un conjunto vacío. El borde para un LINESTRING son los dos puntos de los extremos. Para POLYGONs, el borde son las lineas que delimitan los anillos exteriores e interiores.

Interior

El interior de una geometría son los puntos de la geometría que quedan cuando el borde es eliminado. Para POINTs, el interior es el propio POINT. El interior de una LINESTRING es el conjunto de puntos reales entre los puntos de los extremos. Para POLYGONs, el interior es una superficie real dentro del polígono.

Exterior

El Exterior de una geometría es el universo, una superficie real, que no se encuentra en el interior o en el borde de la geometría.

Dada una geometria a, donde I(a), B(a), y E(a) son el Interior, Borde, y Exterior de a, la representación matemática de la matriz es:

 InteriorBordeExterior
Interiordim( I(a) ∩ I(b) )dim( I(a) ∩ B(b) )dim( I(a) ∩ E(b) )
Bordedim( B(a) ∩ I(b) )dim( B(a) ∩ B(b) )dim( B(a) ∩ E(b) )
Exteriordim( E(a) ∩ I(b) )dim( E(a) ∩ B(b) )dim( E(a) ∩ E(b) )

Donde dim(a) representa la dimensión de a como se especifica en ST_Dimension pero tiene un dominio de {0,1,2,T,F,*}

  • 0 => punto

  • 1 => linea

  • 2 => area

  • T => {0,1,2}

  • F => empty set

  • * => no importa que valor

Visualmente, para dos geometriías que se superponen, debera parecerse a:

 

 InteriorBordeExterior
Interior

dim(...) = 2

dim(...) = 1

dim(...) = 2

Borde

dim(...) = 1

dim(...) = 0

dim(...) = 1

Exterior

dim(...) = 2

dim(...) = 1

dim(...) = 2

Si leemos la matriz de izquierda a derecha y de arriba a bajo, la matriz dimensional esta representada por, '212101212'.

Una matriz que representaría el ejemplo anterior de las dos lineas que se interceptan en una linea seria: '1*1***1**'

-- Identificar los segmentos de lineas que se cruzan en una linea
SELECT a.id
FROM roads a, roads b
WHERE a.id != b.id 
AND a.geom && b.geom
AND ST_Relate(a.geom, b.geom, '1*1***1**');

La matriz que representaría el segundo ejemplo de los muelles en los lagos seria: '102101FF2'

-- Identificar los muelles que están parcialmente en la orilla del lago
SELECT a.lake_id, b.wharf_id
FROM lakes a, wharfs b
WHERE a.geom && b.geom
AND ST_Relate(a.geom, b.geom, '102101FF2');

Para mas información o documentación, visita:

4.4. Cargando Datos SIG

Una vez creada la tabla espacial, estas listo para cargar datos SIG en la base de datos. Actualmente, existen dos formas de poner los datos en una base de datos PostGIS/PostgreSQL: utilizando sentencias SQL formateadas, o utilizando el cargador de ficheros Shape.

4.4.1. Cargando Datos SIG

Si puedes convertir tus datos en una representación de texto, entonces utilizar SQL formateado debería ser la forma mas sencilla de cargar tus datos en PostGIS. Asi como en Oracle o otras bases de datos SQL, los datos pueden ser cargados en masa mediante la canalización de un fichero de texto grande, lleno de sentencias SQL "INSERT" en el terminal SQL.

Un fichero de carga (roads.sql por ejemplo) debería parecerse a esto:

BEGIN;
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (1,ST_GeomFromText('LINESTRING(191232 243118,191108 243242)',-1),'Jeff Rd');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (2,ST_GeomFromText('LINESTRING(189141 244158,189265 244817)',-1),'Geordie Rd');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (3,ST_GeomFromText('LINESTRING(192783 228138,192612 229814)',-1),'Paul St');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (4,ST_GeomFromText('LINESTRING(189412 252431,189631 259122)',-1),'Graeme Ave');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (5,ST_GeomFromText('LINESTRING(190131 224148,190871 228134)',-1),'Phil Tce');
INSERT INTO roads (road_id, roads_geom, road_name)
  VALUES (6,ST_GeomFromText('LINESTRING(198231 263418,198213 268322)',-1),'Dave Cres');
COMMIT;

El fichero de datos puede canalizarse en PostgreSQL de manera sencilla con el terminar de comandos SQL "psql":

psql -d [database] -f roads.sql

4.4.2. shp2pgsql: Using the ESRI Shapefile Loader

El cargador de datos Shape shp2pgsql convierte fichero Shape de ESRI en comandos SQL para la inserción en bases de datos PostGIS/PostgreSQL en formatos geometry o geography. El cargador tiene diferentes modos de operar según las opciones escritas en el comando:

Ademas del cargador por linea de comandos shp2pgsql, existe una interfaz gráfica llamada shp2pgsql-gui, con la mayoría de las opciones del cargador por linea de comandos, pero puede ser mas sencillo de utilizar para aquellas que no estén en scripts o ficheros único o si eres nuevo en PostGIS. También se puede configurara como un plugin de PgAdminIII.

(c|a|d|p) Estas opciones son exclusivas entre ellas:

-c

Crea una nueva tabla y la rellena desde el shapefile. Esta es la opción por defecto.

-a

Añade los datos del shapefile en la tabla de la base de datos. Observa que para utilizar esta opción para cargar varios ficheros, los ficheros deben tener los mismos atributos y los mismos tipos de datos.

-d

Borra la tabla de la base de datos antes de crear una nueva tabla con los datos del shapefile en su interior.

-p

Solo produce el código del comando SQL de creación de la tabla, sin añadir ningún dato. Esto puede utilizarse si necesitas separar completamente los pasos de creación de la tabla y de carga de datos

-?

Muestra la ayuda en pantalla.

-D

Utiliza el formato "dump" de PostgreSQL en la salida de datos. Esto puede combinarse con -a, -c, y -d. Es mucho mas rápido cargar este fichero "dump" que utilizando en comando SQL "INSERT" por defecto. Utiliza esto ara grandes conjuntos de datos.

-s [<FROM_SRID%gt;:]<SRID>

Crea y rellena las tablas geométricas con el SRID especificado. Opcionalmente especifica que el fichero shapefile utiliza el dado en FROM_SRID, en tal caso las geometrías se reproyectarán al SRID destino. FROM_SRID no puede espeficarse con -D

-k

Mantiene las mayúsculas en los identificadores (columnas, esquemas y atributos). Observa que los atributos en los shapefiles están siempre en MAYÚSCULAS.

-i

Fuerza la creación de enteros a enteros estándar de 32-bits, no crea enteros bigint de 64-bits, aunque la firma de la cabecera del DBF parezca que lo garantiza.

-I

Crea un indice GiST de la columna de geometrias.

-c

-m a_file_name Specify a file containing a set of mappings of (long) column names to 10 character DBF column names. The content of the file is one or more lines of two names separated by white space and no trailing or leading space. For example:

COLUMNNAME DBFFIELD1
AVERYLONGCOLUMNNAME DBFFIELD2

-S

Genera geometrías simples en lugar de MULTI geometrías. Solo funcionará si todas las geometrias son actualmente simples (I.E. un MULTIPOLYGON con una única capa, o un MULTIPOINT con un único vértice).

-t <dimensionality>

Fuerza a que la geometría de salida tenga la dimensión especificada. Utiliza las siguientes cadenas para indicar la dimensión: 2D, 3DZ, 3DM, 4D.

Si la entrada tiene menos dimensiones de las especificadas, la salida tendrá estas dimensiones rellenas con ceros. Si la entrada tiene mas dimensiones de las especificadas, las dimensiones no deseadas se eliminarán.

-w

Salida en formato WKT, en vez de WKB. Observa que esto puede introducir derivas en las coordenadas debido a la perdida de precisión.

-e

Ejecuta cada sentencia una por una, sin utilizar una transacción. Esto permite cargar la mayoría de datos correctos cuando existen algunas geometrías no validas que generan errores. Observa que esta opción no se puede utilizar con -D ya que el formato "dump" siempre utiliza transacciones.

-W <encoding>

Especifica la codificación de los datos de entrada (fichero dbf). Cuando se utiliza, todos los atributos del fichero dbf son convertidos desde la codificación especificada a UTF8. La salida SQL resultante contendrá un comando SET CLIENT_ENCODING to UTF8, así que el backend sera capaz de reconvertir desde UTF8 a cualquier codificación que este configurada en la base de datos para uso interno.

-N <policy>

Políticas de gestión de geometrías NULL (insert*, skip, abort)

-n

-n solo importa los ficheros dbf. Si tus datos no tienen shapefiles correspondientes, se cambiara de forma automática a este modo y se cargara únicamente el dbf. Así que esta opción solo se necesita si lo unifico que quieres cargar son los atributos y no las geometrías.

-G

Utiliza el tipo "geography" en lugar del tipo "geometry" (requiere datos en lon/lat) en WGS84 long lat (SRID=4326)

-T <tablespace>

Especifica el "tablespace" para la nueva tabla.Los indices seguirán utilizando el "tablespace" por defecto a menos que el parámetro -X este en uso. La documentación de PostgreSQL tiene una buena descripción de los "tablespaces" personalizados.

-X <tablespace>

Especifica el "tablespace" para los indices de la nueva tabla. Esto se aplica a los indices de clave primaria y a los indices espaciales GiST si se usa también la opción -l.

Un ejemplo de sesión utilizando el cargador para crear un fichero de entrada y cargarlo debe parecerse a esto:

# shp2pgsql -c -D -s 4269 -i -I shaperoads.shp myschema.roadstable > roads.sql
# psql -d roadsdb -f roads.sql

Una conversion y carga puede hacerse en un solo paso utilizando el símbolo tubería en sistemas UNIX:

# shp2pgsql shaperoads.shp myschema.roadstable | psql -d roadsdb

4.5. Recuperando datos SIG

Los datos se pueden extraer de la base de datos utilizando SQL o el cargador/dumper de ficheros Shape. En la sección SQL hablaremos de algunos de los operadores disponibles para hacer comparaciones y consultas en tablas espaciales.

4.5.1. Using SQL to Retrieve Data

El medio más directo para hacer una extracción de datos de la base de datos es utilizar una consulta de selección SQL para reducir el número de registros y columnas devueltas y volcar las columnas resultantes en un archivo de texto analizable:

db=# SELECT road_id, ST_AsText(road_geom) AS geom, road_name FROM roads;

road_id | geom                                    | road_name
--------+-----------------------------------------+-----------
          1 | LINESTRING(191232 243118,191108 243242) | Jeff Rd
          2 | LINESTRING(189141 244158,189265 244817) | Geordie Rd
          3 | LINESTRING(192783 228138,192612 229814) | Paul St
          4 | LINESTRING(189412 252431,189631 259122) | Graeme Ave
          5 | LINESTRING(190131 224148,190871 228134) | Phil Tce
          6 | LINESTRING(198231 263418,198213 268322) | Dave Cres
          7 | LINESTRING(218421 284121,224123 241231) | Chris Way
(6 rows)

Sin embargo, habrá ocasiones que debido a algún tipo de restricción será necesario reducir el número de campos que se devuelven . En el caso de restricciones basadas en los atributos, sólo tienes que utilizar la misma sintaxis SQL de forma normal como con una tabla no espacial. En el caso de restricciones espaciales, están disponibles los siguientes operadores:

&&

Este operador indica si el límite de una geometría forma intersección con el límite de otra.

ST_OrderingEquals

Este test comprueba si dos geometrías son geométricamente idénticas. Por ejemplo, si 'POLYGON((0 0,1 1,1 0,0 0))' es la misma que 'POLYGON((0 0,1 1,1 0,0 0))' (si que lo es).

=

Este operador es un poco mas "inocente", solo comprueba si los límites (bounding boxes) de dos geometrías son los mismos.

A continuación, puedes utilizar estos operadores en las consultas. Ten en cuenta que al especificar geometrías y cajas en la línea de comandos SQL, debes activar de forma explícita las representaciones de cadena en geometrías utilizando la función "ST_GeomFromText ()". El 312 es un sistema de referencia espacial ficticio que coincide con nuestros datos. Así que, por ejemplo:

SELECT road_id, road_name
  FROM roads
  WHERE ST_OrderingEquals(roads_geom , ST_GeomFromText('LINESTRING(191232 243118,191108 243242)',312) ) ;

La consulta anterior deberá devolver el único registro de la tabla "ROADS_GEOM" cuya geometría era igual a este valor.

Cuando utilizamos el operador "&&", puedes especificar ya sea un BOX3D como la función de comparación o una GEOMETRY. Cuando se especifica una geometría, sin embargo, se utiliza para la comparación su cuadro delimitador (bounding box).

SELECT road_id, road_name
FROM roads
WHERE roads_geom && ST_GeomFromText('POLYGON((...))',312);

La consulta anterior utiliza los limites (bounding box) del polígono para la comparación.

La consulta espacial más común probablemente será una consulta "basada en cuadros", utilizada por el software cliente, como navegadores de datos o aplicaciones webmapping, para tomar un valor del "marco del mapa " de los datos para su visualización. La consulta para el uso de un objeto "BOX3D" para el marco, se parece a esto:

SELECT ST_AsText(roads_geom) AS geom
FROM roads
WHERE
  roads_geom && ST_MakeEnvelope(191232, 243117,191232, 243119,312);

Observa el uso del SRID 123, para espeficar la proyección de la envolvente.

4.5.2. Uso del Dumper

El comando dump de las tablas pgsql2shp conecta directamente con la base de datos y convierte la tabla (posiblemente definido por una consulta) en un fichero shape. La sintaxis básica es:

pgsql2shp [<options>] <database> [<schema>.]<table>
pgsql2shp [<options>] <database> <query>

Las opciones del comando son:

-f <filename>

Escribe la salida en un fichero con un nombre particular

-h <host>

Especifica el servidor al que conectarse.

-p <port>

Especifica el puerto del servidor de la base de datos al que conectarse.

-P <password>

La contraseña a utilizar en la conexión de la base de datos.

-u <user>

El nombre del usuario a utilizar en la conexión a la base de datos.

-g <geometry column>

En el caso que las tablas tengan varias columnas de geometrías, la columna de geometrías a utilizar cuando se escriba el fichero shape.

-b

Utiliza un cursor binario. Esto hada las operaciones mas rápido, pero no funcionará si algún atributo NO-geométrico de la tabla carece de conversion a texto.

-r

Modo Raw. No suprime el campo gid, o omite los nombres de las columnas.

-d

Por compatibilidad con versiones anteriores: escribir un archivo shape de 3 dimensiones cuando consultamos desde bases de datos PostGIS antiguas (pre-1.0.0) (el valor por defecto es el de escribir un archivo de formas de 2 dimensiones en ese caso). A partir de postgis-1.0.0 +, dimensiones están completamente codificados.

-m filename

Reasignar los identificadores de diez nombres de los personajes. El contenido del archivo son líneas de dos símbolos separados por un único espacio en blanco y sin espacios al final, o al inicio: VERYLONGSYMBOL SHORTONE ANOTHERVERYLONGSYMBOL SHORTER etc.

4.6. Contruir Indices

Los índices son los que hacen posible el uso de una base de datos espacial para conjuntos de datos muy grandes. Sin indexación, cualquier búsqueda de una característica requeriría un "recorrido secuencial" de cada registro en la base de datos. La Indexación acelera la búsqueda mediante la organización de los datos en un árbol de búsqueda que puede ser recorrido con rapidez para encontrar un registro en particular. PostgreSQL soporta tres tipos de índices por defecto: índices B-Tree, índices R-Tree, e índices GIST.

  • B-Trees se utiliza para datos que pueden ser ordenados a lo largo de un eje, por ejemplo, números, letras, fechas.Los datos SIG no pueden ser racionalmente ordenados a lo largo de un eje (¿cual es mayor? ¿(0,0) o (0,1) o (1,0)?) así que los indices B-Tree no son de ninguna utilidad para nosotros.

  • R-Trees divide los datos en rectángulos y sub-rectángulos, y sub-sub rectángulos, etc R-Tree se utiliza en algunas bases de datos espaciales para indexar datos GIS, pero la implementación PostgreSQL R-Tree no es tan robusta como la de GiST.

  • Los indices GiST (Generalized Search Trees o Arbol de búsquedas generalizado) dividen los datos en "cosas a un lado", "cosas que se solapan", "cosas que están dentro" y se pueden utilizar en una amplia gama de tipos de datos, incluyendo los datos SIG. PostGIS utiliza un índice R-Tree implementado sobre GiST para indexar datos GIS.

4.6.1. Indices GiST

GiST significa "Generalized Search Tree" de sus siglas en inglés o "Arbol de Búsqueda Generalizado" y es una forma genérica de indexación. Además de la indexación de datos SIG, GiST se utiliza para acelerar las búsquedas en todo tipo de estructuras irregulares de datos (arrays de enteros, datos espectrales, etc) que no son susceptibles de indexación por árbol normal.

Una vez que una tabla de datos GIS supera unos pocos miles de filas, tendrás que construir un índice para acelerar las búsquedas espaciales de los datos (a menos que todas las búsquedas se basen en atributos, en cuyo caso querrás construir un índice normal en los campos de atributo).

La sintaxis para la creación de un indice GiST en una columna "geometry" es como sigue:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

La sintaxis anterior siempre construirá un índice 2D. Para obtener el índice de dimensión n soportado en PostGIS 2.0 + para el tipo geometría, puedes crearlo utilizando esta sintaxis

CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);

La construcción de un índice espacial es un ejercicio de cálculo intensivo: en tablas de alrededor de 1 millón de filas, en una máquina de 300 MHz Solaris, hemos encontrado que la construcción de un índice de GiST dura aproximadamente 1 hora. Después de la construcción de un índice, es importante obligar a PostgreSQL recopilar las estadísticas de tabla que se utilizan para optimizar los planes de consulta:

VACUUM ANALYZE [table_name] [(column_name)];
-- This is only needed for PostgreSQL 7.4 installations and below
SELECT UPDATE_GEOMETRY_STATS([table_name], [column_name]);

Los índices GiST tienen dos ventajas respecto a los índices R-Tree en PostgreSQL. En primer lugar, los índices GiST son "null safe", lo que significa que puede indexar columnas que incluyen valores nulos. En segundo lugar, los índices GiST apoyan el concepto de "capacidad de disipación", que es importante cuando se trata de objetos GIS más grandes que el tamaño de página de 8K PostgreSQL. La capacidad de disipación permite a PostgreSQL almacenar sólo la parte "importante" de un objeto en un índice - en el caso de objetos SIG, sólo el cuadro delimitador (bounding box). Los objetos GIS mayores de 8 KB provocaran fallos en los índices R-Tree en el proceso de construcción.

4.6.2. Indices GiST

BRIN stands for "Block Range Index" and is a generic form of indexing that has been introduced in PostgreSQL 9.5. BRIN is a lossy kind of index, and its main usage is to provide a compromise for both read and write performance. Its primary goal is to handle very large tables for which some of the columns have some natural correlation with their physical location within the table. In addition to GIS indexing, BRIN is used to speed up searches on various kinds of regular or irregular data structures (integer, arrays etc).

Una vez que una tabla de datos GIS supera unos pocos miles de filas, tendrás que construir un índice para acelerar las búsquedas espaciales de los datos (a menos que todas las búsquedas se basen en atributos, en cuyo caso querrás construir un índice normal en los campos de atributo).

The idea of a BRIN index is to store only the bouding box englobing all the geometries contained in all the rows in a set of table blocks, called a range. Obviously, this indexing method will only be efficient if the data is physically ordered in a way where the resulting bouding boxes for block ranges will be mutually exclusive. The resulting index will be really small, but will be less efficient than a GiST index in many cases.

Building a BRIN index is way less intensive than building a GiST index. It's quite common to build a BRIN index in more than ten time less than a GiST index would have required. As a BRIN index only store one bouding box for one to many table blocks, it's pretty common to consume up to a thousand time less disk space for this kind of indexes.

You can choose the number of blocks to summarize in a range. If you decrease this number, the index will be bigger but will probably help to get better performance.

La sintaxis para la creación de un indice GiST en una columna "geometry" es como sigue:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

La sintaxis anterior siempre construirá un índice 2D. Para obtener el índice de dimensión n soportado en PostGIS 2.0 + para el tipo geometría, puedes crearlo utilizando esta sintaxis

CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);

You can also get a 4d-dimensional index using the 4d operator class

CREATE INDEX [indexname] ON [tablename] USING GIST ([geometryfield] gist_geometry_ops_nd);

These above syntaxes will use the default number or block in a range, which is 128. To specify the number of blocks you want to summarise in a range, you can create one using this syntax

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

Also, keep in mind that a BRIN index will only store one index value for a large number of rows. If your table stores geometries with a mixed number of dimensions, it's likely that the resulting index will have poor performance. You can avoid this drop of performance by choosing the operator class whith the least number of dimensions of the stored geometries

La sintaxis para la creación de un indice GiST en una columna "geometry" es como sigue:

CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] ); 

La sintaxis anterior siempre construirá un índice 2D. Para obtener el índice de dimensión n soportado en PostGIS 2.0 + para el tipo geometría, puedes crearlo utilizando esta sintaxis

Currently, just the "inclusion support" is considered here, meaning that just &&, ~ and @ operators can be used for the 2D cases (both for "geometry" and for "geography"), and just the &&& operator can be used for the 3D geometries. There is no support for kNN searches at the moment.

VACUUM ANALYZE [table_name] [(column_name)];
-- This is only needed for PostgreSQL 7.4 installations and below
SELECT UPDATE_GEOMETRY_STATS([table_name], [column_name]);

4.6.3. Utilizando Indices

Por lo general, los índices aceleran el acceso de datos de forma invisible: una vez construido el índice, el optimizador de consultas decide de manera transparente cuándo utilizar la información del índice para acelerar un plan de consulta. Por desgracia, el planeador de consultas de PostgreSQL no optimiza el uso de índices GiST bien, así que a veces las búsquedas que deben utilizar un índice espacial en lugar del indice por defecto, explora toda la tabla de forma secuencia.

Si observas que los indices espaciales no se están utilizando (o tus indices de atributos, en su defecto) hay un par de cosas que puedes hacer:

  • En primer lugar, asegurate de que se recopilan estadísticas sobre el número y distribución de los valores de una tabla, para proporcionar al planeador de consultas una mejor información para tomar decisiones en torno a la utilización de índices. Para instalaciones de PostgreSQL 7.4 y menores, esto se hace ejecutando update_geometry_stats ([table_name, column_name]) (distribución de cálculo) y VACUUM ANALYZE [table_name] [column_name] (número de cómputo de valores). A partir de PostgreSQL 8.0, ejecutando el combado VACUUM ANALYZE se ejecutaran ambas operaciones. Debes ejecutar el comando vacuum regularmente en tus bases de datos de todos modos - muchos PostgreSQL DBAs tienen la opción de ejecutar VACUUM como una tarea de cron de menor actividad sobre una base regular.

  • Si ejecutando vacuum no funciona, se puede forzar al planificador para utilizar la información de índice utilizando el comando SET ENABLE_SEQSCAN=OFF. Debes utilizar este comando con moderación y sólo en consultas sobre datos indexados espacialmente: en términos generales, el planificador sabe más que tu acerca de cuándo utilizar los índices de B-Tree normales. Una vez que hayas ejecutado la consulta, debes considerar el restablecimiento de la variable ENABLE_SEQSCAN de nuevo, de manera que las demás consultas utilizarán el planificador de la forma habitual.

    [Note]

    Desde la versión 0.6, no debería ser necesario forzar el planificador a utilizar el índice con ENABLE_SEQSCAN.

  • Si ves que el planificador se equivoca sobre el costo de exploraciones secuenciales vs índices, intenta reducir el valor de random_page_cost en postgresql.conf o usando SET random_page_cost = #. El valor por defecto para el parámetro es de 4, prueba a ajustarlo a 1 o 2. Disminuyendo el valor, haces que el planificador se incline mas por utilizar exploraciones con índice.

4.7. Consultas Complejas

La razón de ser de la funcionalidad de base de datos espaciales es la de realizar consultas dentro de la base de datos que normalmente requieren la funcionalidad GIS de escritorio. Usando PostGIS de forma eficiente requiere saber que funciones espaciales están disponibles, y asegurar que los índices adecuados estén en su lugar para proporcionar un buen rendimiento. El SRID 312 utilizado en estos ejemplos es únicamente para la demostración . Debes estar utilizando un SRID VERDADERO de los enumerados en la tabla spatial_ref_sys y uno que coincida con la proyección de tus datos. Si los datos no tiene ningún sistema de referencia espacial especificado, debes pensar muy cuidadosamente por qué no lo hace y tal vez debería. Si el motivo se debe a que estás modelando algo que no tiene un sistema de referencia espacial geográfico definido, como la parte interna de una molécula o una buena ubicación en Marte para el transporte de la raza humana en caso de un holocausto nuclear, entonces simplemente deja de lado el SRID o inventa uno e insertarlo en la tabla spatial_ref_sys.

If your reason is because you are modeling something that doesn't have a geographic spatial reference system defined such as the internals of a molecule or the floorplan of a not yet built amusement park then that's fine. If the location of the amusement park has been planned however, then it would make sense to use a suitable planar coordinate system for that location if nothing more than to ensure the amusement part is not trespassing on already existing structures.

Even in the case where you are planning a Mars expedition to transport the human race in the event of a nuclear holocaust and you want to map out the Mars planet for rehabitation, you can use a non-earthly coordinate system such as Mars 2000 make one up and insert it in the spatial_ref_sys table. Though this Mars coordinate system is a non-planar one (it's in degrees spheroidal), you can use it with the geography type to have your length and proximity measurements in meters instead of degrees.

4.7.1. Aprovechando los Indices

Conuando construyes una consulta, es importante recordar que solo los operadores basados en cajas (bounding box) como && pueden aprovechar los indices espaciales GiST. funciones como ST_Distance() no pueden utilizar el indice para optimizar las operaciones. Por ejemplo, la consulta siguiente sera algo lenta en una tabla grande:

SELECT the_geom
FROM geom_table
WHERE ST_Distance(the_geom, ST_GeomFromText('POINT(100000 200000)', 312)) < 100

Esta consulta es la selección de todas las geometrías en geom_table que están a menos de 100 unidades del punto (100000, 200000). La consulta será lenta porque está calculando la distancia entre cada punto en la tabla y nuestro punto especificado, es decir, un cálculo ST_Distance() para cada fila de la tabla. Podemos evitar esto mediante el operador && para reducir el número de cálculos de distancia requeridos:

SELECT the_geom
FROM geom_table
WHERE ST_DWithin(the_geom,  ST_MakeEnvelope(90900, 190900, 100100, 200100,312), 100)

Esta consulta selecciona las mismas geometrías, pero lo hace de una manera más eficiente. Suponiendo que hay un índice GiST en the_geom, el planificador de consultas reconocerá que se puede utilizar el índice para reducir el número de filas antes de calcular el resultado de la función ST_Distance(). Fijate como la geometría de ST_MakeEnvelope que se utiliza en la operación &&, es una caja cuadrada de 200 unidades centrada en el punto de origen - esta es nuestra "caja de búsqueda" o "query box". El operador && utiliza el índice para reducir rápidamente el conjunto de resultados a sólo aquellas geometrías que tienen su caja o "bounding box" que se superponen a la "caja de búsqueda". Suponiendo que nuestra caja de consulta es mucho más pequeña que la extensión de toda la tabla de geometría, esto reducirá drásticamente el número de cálculos de distancia que hay que hacer.

[Note]Cambio en el Comportamiento

A partir de PostGIS 1.3.0, la mayoría de las funciones de relaciones entre Geometría, con las notables excepciones de ST_Disjoint y ST_Relate, incluyen operadores de superposición de cajas delimitadoras o "bounding boxes" implícitas.

4.7.2. Ejemplos de consultas espaciales SQL

Los ejemplos en esta sección utilizan dos tablas, una tabla de vías de comunicación lineales, y una tabla de polígonos con limites municipales. La definición de la tabla bc_roads es:

Column      | Type              | Description
------------+-------------------+-------------------
gid         | integer           | Unique ID
name        | character varying | Road Name
the_geom    | geometry          | Location Geometry (Linestring)

La definición de la tabla bc_municipality es:

Column     | Type              | Description
-----------+-------------------+-------------------
gid        | integer           | Unique ID
code       | integer           | Unique ID
name       | character varying | City / Town Name
the_geom   | geometry          | Location Geometry (Polygon)
4.7.2.1. ¿Cual es la longitud total de todas las carreteras expresadas en kilómetros?
4.7.2.2. ¿Cual es la superficie de la ciudad Prince George en hectáreas?
4.7.2.3. ¿Cual es el municipio con mayor superficie de la provincia?
4.7.2.4. ¿Cuál es la longitud de las carreteras contenidas por completo dentro de cada municipio?
4.7.2.5. Crear una tabla con todas las carreteras de la ciudad Prince George.
4.7.2.6. ¿Cual es la longitud en kilómetros de "Douglas St" en Victoria?
4.7.2.7. ¿Cual es el polígono de municipios mas grande que tiene un agujero?

4.7.2.1.

¿Cual es la longitud total de todas las carreteras expresadas en kilómetros?

Puedes contestar a esta pregunta con una consulta SQL muy simple:

SELECT sum(ST_Length(the_geom))/1000 AS km_roads FROM bc_roads;

km_roads
------------------
70842.1243039643
(1 row)

4.7.2.2.

¿Cual es la superficie de la ciudad Prince George en hectáreas?

Esta consulta combina una condición de atributo (en el nombre del municipio) con un calculo espacial (del area):

SELECT
  ST_Area(the_geom)/10000 AS hectares
FROM bc_municipality
WHERE name = 'PRINCE GEORGE';

hectares
------------------
32657.9103824927
(1 row)

4.7.2.3.

¿Cual es el municipio con mayor superficie de la provincia?

Esta consulta incluye un calculo espacial en la condición de la consulta. Hay varias formas de plantear el problema, pero la mas eficiente es la siguiente:

SELECT
  name,
  ST_Area(the_geom)/10000 AS hectares
FROM
  bc_municipality
ORDER BY hectares DESC
LIMIT 1;

name           | hectares
---------------+-----------------
TUMBLER RIDGE  | 155020.02556131
(1 row)

Observa que para responder a esta consulta debemos calcular el area de todos los polígonos. Si estuviéramos haciendo esto mucho tendría sentido crear una columna de area en la tabla que podríamos indexar por motivos de rendimiento. Ordenar el resultado de forma descendente, y utilizando el comando "LIMIT" de PostgreSQL podemos extraer el valor mas grande de forma sencilla sin utilizar una función agregada como max().

4.7.2.4.

¿Cuál es la longitud de las carreteras contenidas por completo dentro de cada municipio?

Este es un ejemplo de "unión espacial", ya que estamos utilizando datos de dos tablas (haciendo una unión) pero utilizando una condición de interacción espacial ("contained") como la condición de unión en lugar del enfoque relacional habitual de unión de la clave primaria:

SELECT
  m.name,
  sum(ST_Length(r.the_geom))/1000 as roads_km
FROM
  bc_roads AS r,
  bc_municipality AS m
WHERE
  ST_Contains(m.the_geom,r.the_geom)
GROUP BY m.name
ORDER BY roads_km;

name                        | roads_km
----------------------------+------------------
SURREY                      | 1539.47553551242
VANCOUVER                   | 1450.33093486576
LANGLEY DISTRICT            | 833.793392535662
BURNABY                     | 773.769091404338
PRINCE GEORGE               | 694.37554369147
...

Esta consulta toma un tiempo, ya que todas las carreteras de la tabla se resume en el resultado final (unas 250k carreteras para nuestra tabla del ejemplo). Para superposiciones mas pequeñas (de algunos cientos o miles de registros) la respuesta puede ser muy rápida.

4.7.2.5.

Crear una tabla con todas las carreteras de la ciudad Prince George.

Este es un ejemplo de "superposición", que tomo dos tablas y extrae una tabla nueva que contiene un resultado de un recorte espacial. A diferencia de la "Unión espacial" del ejemplo anterior, esta consulta en realidad crea nuevas geometrías. Una superposición es como una unión espacial "turbo-cargada", y es útil para un trabajo de análisis mas exacto:

CREATE TABLE pg_roads as
SELECT
  ST_Intersection(r.the_geom, m.the_geom) AS intersection_geom,
  ST_Length(r.the_geom) AS rd_orig_length,
  r.*
FROM
  bc_roads AS r,
  bc_municipality AS m
WHERE  m.name = 'PRINCE GEORGE' AND ST_Intersects(r.the_geom, m.the_geom);

4.7.2.6.

¿Cual es la longitud en kilómetros de "Douglas St" en Victoria?

SELECT
  sum(ST_Length(r.the_geom))/1000 AS kilometers
FROM
  bc_roads r,
  bc_municipality m
WHERE  r.name = 'Douglas St' AND m.name = 'VICTORIA'
        AND ST_Contains(m.the_geom, r.the_geom) ;

kilometers
------------------
4.89151904172838
(1 row)

4.7.2.7.

¿Cual es el polígono de municipios mas grande que tiene un agujero?

SELECT gid, name, ST_Area(the_geom) AS area
FROM bc_municipality
WHERE ST_NRings(the_geom) > 1
ORDER BY area DESC LIMIT 1;

gid  | name         | area
-----+--------------+------------------
12   | SPALLUMCHEEN | 257374619.430216
(1 row)

Chapter 5. Gestión, Consulta y Aplicaciones de Datos Raster

5.1. Cargando y Creando Rasters

En la mayoría de casos, crearás rasters PostGIS cargando un fichero raster utilizando el paquete de carga raster raster2pgsql.

5.1.1. Utilizar el paquete raster2pgsql para cargar rasters

El ejecutable raster2pgsql es un cargador de datos raster que carga formatos raster soportados por GDAL en una consulta sql para ejecutarla en una tabla PostGIS. Es capaz de cargar carpetas de ficheros raster y crear previsualizaciones de los rater.

Como raster2pgsql se compila como parte de PostGIS, a menudo (a menos que compiles tu propia librería GDAL), los tipos de raster que admite el ejecutable serán los mismos que los compilados en la librería de dependencias de GDAL. Para obtener una lista de tipos de raster que tu comando raster2pgsql soporta, utiliza el valor -G . Estos deben ser los mismos que los previstos por tu instalación de PostGIS, documentado aquí ST_GDALDrivers si utilizas la misma librería GDAL en ambos casos.

[Note]

La versión mas antigua de esta herramienta era un script python. El ejecutable ha reemplazado el script python. Si todavía necesitas Ejemplos del Script Python del ejecutable en python los puedes encontrar en GDAL PostGIS Raster Driver Usage. Fijate que el script python raster2pgsql no funcionará en versiones futuras de PostGIS raster y no sera soportado.

[Note]

Cuando creamos previsualizaciones de un factor específico de un conjunto de rasters que están alineados, es posible que las previsualizaciones no estén alineadas. Visita http://trac.osgeo.org/postgis/ticket/1764 para un ejemplo donde las previsualizaciones no se alinean.

EJEMPLO DE USO:

raster2pgsql aquí_van_opciones_raster fichero_raster nombre_esquema.nombre_tabla > salida.sql

-?

Muestra la pantalla de ayuda. También se mostrará la ayuda si no incluyes ningún argumento.

-G

Imprime los formatos raster soportados.

(c|a|d|p) Estas opciones son exclusivas de forma mutua:

-c

Crea una nueva tabla y la rellena con el raster(s). Esta es la opción por defecto.

-a

Añade el/los raster/s a una tabla existente.

-d

Borra la tabla, crea una nueva y la rellena con el/los raster(s)

-p

Modo preparación, solo crea la tabla.

Procesamiento Raster: Añade condiciones para registrar de forma limpia en el catalogo raster

-C

Añade restricciones raster --srid, tamaño del pixel, etc. para asegurar que el raster es registrado de forma correcta en la vista raster_columns.

-x

Desactiva la opción de restricción de maxima extensión. Solo se aplica si la opción -C esta en uso.

-r

Establezca las restricciones (espacialmente única y tesela de cobertura) para el bloqueo regular. Sólo se aplica si la la bandera -C también está en uso.

Procesado Raster: Parámetros opcionales utilizados para manipular la entrada de datos raster

-s <SRID>

Asigna un SRID especifico al raster de salida. Si no se especifica o es igual a 0, se comprueban los metadatos del raster para determinar un SRID apropiado.

-b BAND

Indice (en base 1) de la banda para extraer del raster. Para indices de mas de una banda, separalo con comas(,). Si no se especifica, se extraerán todas las bandas del raster.

-t TILE_SIZE

Cortar el ráster en teselas para ser insertadas una por una en registros de la tabla. TILE_SIZE se expresa como ANCHOxALTO o establecer el valor "auto" para permitir que se cargue a la computadora en un tamaño de tesela apropiado utilizando el primer ráster y aplicarlo a todos los rásters.

-P

Pad right-most and bottom-most tiles to guarantee that all tiles have the same width and height.

-R, --register

Registra el raster como un fichero de sistema (out-db) raster.

Solo los metadatos del raster y el camino de acceso al raster se almacenan en la base de datos (no los pixeles).

-l OVERVIEW_FACTOR

Crear una previsualización del ráster. Para más de un factor, separar con coma(,). El nombre de la tabla de la previsualización sigue el patrón o_factor de previsualización_tabla, donde factor previsualización es un marcador de posición para el factor de previsualización numérica y tabla se reemplaza con el nombre de la tabla base. La previsualización creada es almacenada en la base de datos y no se afecta por -R. Tenga en cuenta que su archivo sql generado contendrá ambas, la tabla principal y las tablas de previsualización.

-N NODATA

Valor NODATA para utilizar en bandas con valores NODATA.

Parametros opcionales para manipular objetos de la base de datos

-q

Identificadores Wrap de PostgreSQL entre comillas

-f COLUMN

Especifica el nombre de la columna raster de destino , por defecto es 'rast'

-F

Añade una columna con el nombre del fichero

-n COLUMN

Specify the name of the filename column. Implies -F.

-q

Wrap PostgreSQL identifiers in quotes.

-I

Crea un indice GiST de la columna raster.

-M

Ejecuta Vacuum analyze en la tabla raster.

-k

Skip NODATA value checks for each raster band.

-T tablespace

Especifica el "tablespace" de la nueva tabla. Observa que los indices (incluyendo el de clave primaria) seguirá utilizando en "tablespace" a menos que se utilice también la opción -X.

-X tablespace

Especifica el "tablespace" para el nuevo indice de la tabla. Esto se aplica a los indices de claves primarias y indices espaciales si la opción -I se esta usando.

-Y

Utiliza el comando copia en lugar del comando insertar.

-e

Ejecuta cada comando de forma individual, no utiliza transacciones.

-E ENDIAN

Controla el formato en el que se almacenan los datos de más de un byte (endianness) de la salida binaria generada del raster; especifica 0 para XDR y 1 para NDR(por defecto); solo las salidas NDR están soportadas actualmente.

-V versión

Especifica la version del formato de salida. Por defecto es 0. Solo 0 esta soportado actualmente.

Un ejemplo de sesión utilizando el cargador para crear un fichero de entrada y cargarlo cortado en teselas de 100x100 debería parecerse a:

[Note]

Puedes omitir el nombre del esquema, por ejemplo demelevation en vez de public.demelevation creará la tabla raster en el esquema por defecto de la base de datos del usuario.

raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 public.demelevation 
> elev.sql
psql -d gisdb -f elev.sql

Se puede hacer una conversion y carga en un solo paso con el caracter "|" en sistemas UNIX:

raster2pgsql -s 4326 -I -C -M *.tif -F -t 100x100 public.demelevation | psql -d gisdb

Carga las teselas planas métricas aéreas de los Raster del estado Massachusetts en un esquema denominado aerial y crear una vista completa, y previsualizaciones de niveles 2 y 4, utiliza el modo de copia para insertar (sin archivo intermedio sólo directamente a db), y -e no fuerces todo en una transacción (bueno si quieres ver datos en tablas de inmediato sin tener que esperar). Divide los raster en teselas de 128x128 píxeles y aplica las restricciones de raster. Utiliza el modo copia en lugar de insertar en la tabla.(-F) Incluye un campo llamado nombre de archivo para contener el nombre del archivo de las teselas de donde proceden los cortes.

raster2pgsql -I -C -e -Y -F -s 26986 -t 128x128  -l 2,4 bostonaerials2008/*.jpg aerials.boston | psql -U postgres -d gisdb -h localhost -p 5432
-- obtener una lista de los tipos de raster soportados:
raster2pgsql -G

El comando -G extrae una lista similar a esta:

Available GDAL raster formats:
  Virtual Raster
  GeoTIFF
  National Imagery Transmission Format
  Raster Product Format TOC format
  ECRG TOC format
  Erdas Imagine Images (.img)
  CEOS SAR Image
  CEOS Image
  JAXA PALSAR Product Reader (Level 1.1/1.5)
  Ground-based SAR Applications Testbed File Format (.gff)
  ELAS
  Arc/Info Binary Grid
  Arc/Info ASCII Grid
  GRASS ASCII Grid
  SDTS Raster
  DTED Elevation Raster
  Portable Network Graphics
  JPEG JFIF
  In Memory Raster
  Japanese DEM (.mem)
  Graphics Interchange Format (.gif)
  Graphics Interchange Format (.gif)
  Envisat Image Format
  Maptech BSB Nautical Charts
  X11 PixMap Format
  MS Windows Device Independent Bitmap
  SPOT DIMAP
  AirSAR Polarimetric Image
  RadarSat 2 XML Product
  PCIDSK Database File
  PCRaster Raster File
  ILWIS Raster Map
  SGI Image File Format 1.0
  SRTMHGT File Format
  Leveller heightfield
  Terragen heightfield
  USGS Astrogeology ISIS cube (Version 3)
  USGS Astrogeology ISIS cube (Version 2)
  NASA Planetary Data System
  EarthWatch .TIL
  ERMapper .ers Labelled
  NOAA Polar Orbiter Level 1b Data Set
  FIT Image
  GRIdded Binary (.grb)
  Raster Matrix Format
  EUMETSAT Archive native (.nat)
  Idrisi Raster A.1
  Intergraph Raster
  Golden Software ASCII Grid (.grd)
  Golden Software Binary Grid (.grd)
  Golden Software 7 Binary Grid (.grd)
  COSAR Annotated Binary Matrix (TerraSAR-X)
  TerraSAR-X Product
  DRDC COASP SAR Processor Raster
  R Object Data Store
  Portable Pixmap Format (netpbm)
  USGS DOQ (Old Style)
  USGS DOQ (New Style)
  ENVI .hdr Labelled
  ESRI .hdr Labelled
  Generic Binary (.hdr Labelled)
  PCI .aux Labelled
  Vexcel MFF Raster
  Vexcel MFF2 (HKV) Raster
  Fuji BAS Scanner Image
  GSC Geogrid
  EOSAT FAST Format
  VTP .bt (Binary Terrain) 1.3 Format
  Erdas .LAN/.GIS
  Convair PolGASP
  Image Data and Analysis
  NLAPS Data Format
  Erdas Imagine Raw
  DIPEx
  FARSITE v.4 Landscape File (.lcp)
  NOAA Vertical Datum .GTX
  NADCON .los/.las Datum Grid Shift
  NTv2 Datum Grid Shift
  ACE2
  Snow Data Assimilation System
  Swedish Grid RIK (.rik)
  USGS Optional ASCII DEM (and CDED)
  GeoSoft Grid Exchange Format
  Northwood Numeric Grid Format .grd/.tab
  Northwood Classified Grid Format .grc/.tab
  ARC Digitized Raster Graphics
  Standard Raster Product (ASRP/USRP)
  Magellan topo (.blx)
  SAGA GIS Binary Grid (.sdat)
  Kml Super Overlay
  ASCII Gridded XYZ
  HF2/HFZ heightfield raster
  OziExplorer Image File
  USGS LULC Composite Theme Grid
  Arc/Info Export E00 GRID
  ZMap Plus Grid
  NOAA NGS Geoid Height Grids

5.1.2. Crear rastrees utilizando las funciones raster de PostGIS

En muchas ocasiones, querrás crear tablas raster en la base de datos. Existen una gran cantidad de funciones para hacerlo. Los pasos generales a seguir.

  1. Crear una tabla con una columna raster para almacenar los nuevos registros raster se puede hacer de la siguiente manera:

    CREATE TABLE myrasters(rid serial primary key, rast raster);
  2. Existen muchas funciones de ayuda. Si no estas creando rasters con derivados de otro raster, entonces deberías comenzar con: ST_MakeEmptyRaster, seguido de ST_AddBand

    También puedes crear rasters a partir de geometrias. Para conseguir esto deberás utilizar ST_AsRaster quizás acompañado de otras funciones como ST_Union o ST_MapAlgebraFct o cualquier otra de la familia de funciones de álgebra de mapas.

    Incluso hay muchas más opciones para crear nuevas tablas raster a partir de las tablas existentes. Por ejemplo, puede crear una tabla raster en una proyección diferente de una existente utilizando ST_Transform

  3. Una vez que hayas terminado de llenar la tabla, tendrás que crear un índice espacial en la columna raster con algo similar a:

    CREATE INDEX myrasters_rast_st_convexhull_idx ON myrasters USING gist( ST_ConvexHull(rast) );

    Observa que utilizamos ST_ConvexHull ya que muchas de las operaciones raster se basan en la envolvente convexa del raster.

    [Note]

    En versiones anteriores a PostGIS 2.0 los raster se basaban en la envolvente y no en la envolvente convexa. Para que los indices espaciales funcionen correctamente necesitaras borrarlos y reemplazarlos por los indices basados en la envolvente convexa.

  4. Aplica las restricciones raster con AddRasterConstraints

5.2. Catalogos raster

Existen dos vistas de catalogo raster que vienen en el paquete PostGIS. Ambas vistas utilizan información de las restricciones de las tablas raster. Como resultado, las vistas de catálogo tienen siempre consistencia con los datos raster de las tablas mientras que las restricciones son reforzadas.

  1. La vista raster_columns cataloga todas las columnas raster de todas las tablas de la base de datos.

  2. La vista raster_overviews cataloga todas las columnas raster de las tablas de la base de datos que sirven como previsualizaciones de tablas de grano más fino. Las tablas de este tipo se generan cuando utilizas la opción -l durante la carga.

5.2.1. Catalogo de columnas raster

El catálogo raster_columns es un catálogo de todas las columnas de la tablas raster en la base de datos que son de tipo raster. Es una vista que utiliza las restricciones de las tablas por lo que la información es siempre consistente, incluso si se restaura una tabla raster de una copia de seguridad de otra base de datos. Existen las siguientes columnas en el catálogo raster_columns.

Si has creado tus tablas sin el cargador o has olvidado especificar la variable -C del comando de carga durante la carga, puedes hacer cumplir las restricciones por defecto utilizando AddRasterConstraints, de este modo el catálogo raster_columns guardará la información mas común de tus teselas raster.

  • r_table_catalog Contienen la tabla de la base de datos. Esto siempre leerá la base de datos actual.

  • r_table_schema Esquema al que pertenece la tabla.

  • r_table_name tabla raster

  • r_raster_column Columna de la tabla r_table_name que es de tipo raster. No hay nada en PostGIS que impida tener múltiples columnas raster por tabla así que es posible tener varias veces la misma tabla raster en la lista con diferentes columnas cada vez.

  • srid El identificador del sistema de referencia espacial del raster. Debe ser una de las entradas de la tabla Section 4.3.1, “La tabla SPATIAL_REF_SYS y los Sistemas de Referencia Espacial”.

  • scale_x Escala entre las coordenadas espaciales geométricas y el pixel. Esto esta disponible únicamente si todas las teselas de la columna raster tienen el mismo valor scale_x y se aplica la restricción. Para mas detalles visita ST_ScaleX .

  • scale_y Escala entre las coordenadas espaciales geométricas y el pixel. Esto esta disponible únicamente si todas las teselas de la columna raster tienen el mismo valor scale_y y se aplica la restricción scale_y. Para mas detalles visita ST_ScaleY .

  • blocksize_x Es el ancho (numero de pixeles en horizontal) de cada tesela raster.Para mas detalles visita ST_Width.

  • blocksize_y Es el ancho (numero de pixeles en vertical hacia abajo) de cada tesela raster.Para mas detalles visita ST_Height.

  • same_alignment Valor booleano que valdrá "True" si todas las teselas raster tienen el mismo alineamiento. Visita ST_SameAlignment para más información.

  • regular_blocking Si la columna del ráster tiene las limitaciones de espacio único y de cobertura de tesela, el valor es TRUE. De lo contrario, será FALSE.

  • num_bands Numero de bandas por tesela del conjunto de rasters. Es la misma información que la devuelta por ST_NumBands

  • pixel_types Un array definiendo el tipo de pixel de cada banda. Tendrás el mismo numero de elementos en este array que el numero de bandas. Los pixel_types son uno de los definidos en ST_BandPixelType.

  • nodata_values Un array de números de doble precisión que define el valor nodata_value de cada banda. En este array deberás tener el mismo numero de elementos que el numero de bandas. Este numero define el valor de los pixeles de cada banda que deben ignorarse para la mayoría de operaciones. Esta información es similar a la proporcionada por ST_BandNoDataValue.

  • out_db Una colección de banderas booleanas indican si los datos de las bandas del ráster se mantienen fuera de la base de datos. Se tendrá el mismo número de elementos en esta colección como se tiene número de bandas.

  • extent Esta es la extensión de todas las columnas raster en tu conjunto raster. Si planeas cargar mas datos que cambiarán la extensión del conjunto, deberás ejecutar la función DropRasterConstraints antes de la carga y después de la carga restablecer las restricciones con AddRasterConstraints.

  • spatial_index Un boolean es verdadero si la columna del ráster tiene un índice espacial.

5.2.2. Previsualizaciones raster

raster_overviews Los catálogos de información acerca de las columnas de tablas ráster utilizadas para las previsualizaciones e información adicional de ellos que son útiles para conocer cuando utilizar vistas generales. Las tablas de previsualización Overview tables están catalogados tanto en raster_columns y raster_overviews porque son rásters en su propio derecho pero también sirven a un propósito especial adicional de ser una caricatura de resolución baja o de una tabla de resolución alta. Estos se generan a lo largo de la tabla ráster principal cuando se utiliza el -l interuptor en la carga del ráster o se puede generar manualmente utilizando AddOverviewConstraints.

Las tablas de previsualización contienen las mismas restricciones que cualquier tabla raster además de restricciones adicionales especificas a las previsualizaciones.

[Note]

La información de la tabla raster_overviews no duplica la información de raster_columns. Si necesitas información sobre una tabla de previsualizaciones pobremente en raster_columns puedes unir la tabla raster_overviews a raster_columns para obtener toda la información que necesitas.

Las dos principales razones de crear previsualizaciones son:

  1. Tener una representación de baja resolución de las tablas principales para tener una respuesta rápida en operaciones de zoom-out.

  2. Los cálculos son generalmente más rápidos en las previsualizaciones que en las imágenes de mayor resolución porque hay menos registros y cada pixel cubre más territorio. Aunque los cálculos no son tan precisos como en las tablas de alta resolución de las que provienen, pueden ser suficientes en muchos cálculos empíricos.

El catálogo raster_overviews contiene las siguientes columnas de información.

  • o_table_catalog La base de datos a la cual pertenece la tabla de previsualizaciones. Esto siempre leerá la base de datos actual.

  • o_table_schema El esquema de la base de datos al cual pertenece la tabla de previsualizaciones.

  • o_table_name El nombre de la tala de previsualizaciones.

  • o_raster_column La columna raster de la tabla de previsualizaciones.

  • r_table_catalog La base de datos de la tabla raster para la cual esta previsualización sirve. Esto siempre va a leer la base de datos actual.

  • r_table_schema El esquema de la base de datos de la tabla ráster al cual pertenecen estas previsualizaciones.

  • r_table_name tabla raster para la cual sirven las previsualizaciones.

  • r_raster_column la columna raster para la cual sirven estas previsualizaciones.

  • overview_factor - este es el nivel de pirámide de la tabla de previsualizaciones . Cuanto más alto sea el número, más baja es la resolución de la tabla. Si se le da una carpeta de imágenes al comando raster2pgsql, se calcularán previsualizaciones de cada archivo de imagen y se cargarán por separado. El Nivel 1 supone siempre el archivo original. Nivel 2 tendrá cada tesela representada por 4 de la original. Por ejemplo, si tienes una carpeta de archivos de imagen de 5000x5000 pixeles que decidiste dividir en imágenes de 125x125 , para presentar cada imagen tu tabla base tendrá (5000*5000)/(125*125)=1.600 registros , tu tabla (l=2) o_2 tendrá un tope de (1600/Potencia (2,2))=400 filas , tu (l=3) o_3 tendrá un tope de (1600/Potencia (2,3)) = 200 filas. Si los píxeles no son divisibles por el tamaño de tus teselas , obtendrás algunas de relleno (teselas no completamente llenas ) . Ten en cuenta que cada tesela de previsualización generada por el comando raster2pgsql tiene el mismo número de pixeles que la tesela de origen , pero es de menor resolución que cada pixel de la que representa (Potencia(2,factor_de_previsualizacion) pixeles del original) .

5.3. Contruyendo aplicaciones personalizadas con PostGIS Raster

El hecho de que PostGIS raster te proporcione las funciones de SQL para crear rasters en formatos de imagen conocidos te da un montón de opciones para crearlas. Por ejemplo, puedes usar OpenOffice / LibreOffice para una representación como se demuestra en Renderizar Gráficos PostGIS Raster con LibreOffice. Además se puede utilizar una amplia variedad de lenguajes de programación como se demuestra en esta sección.

5.3.1. Ejemplo de salida utilizando ST_AsPNG junto con otras opciones raster en PHP

En esta sección, mostraremos como utilizar el driver PHP PostgreSQL y la familia de funciones ST_AsGDALRaster para extraer las nadas 1,2,3 de un raster a una consulta PHP que puede incluirse como una marca html img src.

La consulta de ejemplo muestra cómo combinar un montón de funciones de mapa de bits juntos para obtener todas las teselas que se cruzan con un cuadro delimitador en wgs84 en particular y luego unimos las teselas que intersectan con ST_Union devolviendo todas las bandas, transformadas al sistema de proyección especifico del usuario con ST_Transform, y luego enviamos el resultado como un png con ST_AsPNG.

Se podría llamar a la continuación utilizando

http://mywebserver/test_raster.php?srid=2249

para obtener la imagen raster en pies del estado de Massachusetts.

<?php
/** contents of test_raster.php **/
$conn_str ='dbname=mydb host=localhost port=5432 user=myuser password=mypwd';
$dbconn = pg_connect($conn_str);
header('Content-Type: image/png');  
/**If a particular projection was requested use it otherwise use mass state plane meters **/
if (!empty( $_REQUEST['srid'] ) && is_numeric( $_REQUEST['srid']) ){
                $input_srid = intval($_REQUEST['srid']);
}
else { $input_srid = 26986; }
/** The set bytea_output may be needed for PostgreSQL 9.0+, but not for 8.4 **/
$sql = "set bytea_output='escape';
SELECT ST_AsPNG(ST_Transform(
                        ST_AddBand(ST_Union(rast,1), ARRAY[ST_Union(rast,2),ST_Union(rast,3)])
                                ,$input_srid) ) As new_rast
 FROM aerials.boston 
        WHERE 
         ST_Intersects(rast, ST_Transform(ST_MakeEnvelope(-71.1217, 42.227, -71.1210, 42.218,4326),26986) )"; 
$result = pg_query($sql);
$row = pg_fetch_row($result);
pg_free_result($result);
if ($row === false) return;
echo pg_unescape_bytea($row[0]);
?>

5.3.2. Ejemplo de salida utilizando ST_AsPNG junto con otras opciones raster en ASP.NET C#

En esta sección, mostraremos como utilizar el driver Npgsql PostgreSQL .NET y la familia de funciones ST_AsGDALRaster para extraer las nadas 1,2,3 de un raster a una consulta PHP que puede incluirse como una marca html imv src.

Necesitarás el driver npgsql .NET PostgreSQL para este ejercicio que puedes obtener en http://npgsql.projects.postgresql.org/ en su ultima versión. Simplemente descarga la última versión y copialo en tu carpeta bin de ASP.NET y ya estarás listo para seguir.

La consulta de ejemplo muestra cómo combinar un montón de funciones de mapa de bits juntos para obtener todas las teselas que se cruzan con un cuadro delimitador en wgs84 en particular y luego unimos las teselas que intersectan con ST_Union devolviendo todas las bandas, transformadas al sistema de proyección especifico del usuario con ST_Transform, y luego enviamos el resultado como un png con ST_AsPNG.

Este ejemplo es el mismo que el ejemplo Section 5.3.1, “Ejemplo de salida utilizando ST_AsPNG junto con otras opciones raster en PHP” salvo que este esta implementado en C#.

Puedes llamar a este método utilizando

http://mywebserver/TestRaster.ashx?srid=2249

para obtener la imagen raster en coordenadas planas en pies del estado de Massachusetts.

-- web.config sección de string de conexion --
<connectionStrings>
    <add name="DSN" 
        connectionString="server=localhost;database=mydb;Port=5432;User Id=myuser;password=mypwd"/>
</connectionStrings
>
// Codigo para  TestRaster.ashx
<%@ WebHandler Language="C#" Class="TestRaster" %>
using System;
using System.Data;
using System.Web;
using Npgsql;

public class TestRaster : IHttpHandler
{
        public void ProcessRequest(HttpContext context)
        {
                
                context.Response.ContentType = "image/png";
                context.Response.BinaryWrite(GetResults(context));
                
        }

        public bool IsReusable {
                get { return false; }
        }

        public byte[] GetResults(HttpContext context)
        {
                byte[] result = null;
                NpgsqlCommand command;
                string sql = null;
                int input_srid = 26986;
        try {
                    using (NpgsqlConnection conn = new NpgsqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DSN"].ConnectionString)) {
                            conn.Open();

                if (context.Request["srid"] != null)
                {
                    input_srid = Convert.ToInt32(context.Request["srid"]);  
                }
                sql = @"SELECT ST_AsPNG(
                            ST_Transform(
                                        ST_AddBand(
                                ST_Union(rast,1), ARRAY[ST_Union(rast,2),ST_Union(rast,3)])
                                                    ,:input_srid) ) As new_rast 
                        FROM aerials.boston 
                                WHERE 
                                    ST_Intersects(rast, 
                                    ST_Transform(ST_MakeEnvelope(-71.1217, 42.227, -71.1210, 42.218,4326),26986) )";
                            command = new NpgsqlCommand(sql, conn);
                command.Parameters.Add(new NpgsqlParameter("input_srid", input_srid));
           
                        
                            result = (byte[]) command.ExecuteScalar();
                conn.Close();
                        }

                }
        catch (Exception ex)
        {
            result = null;
            context.Response.Write(ex.Message.Trim());
        }
                return result;
        }
}

5.3.3. Aplicación de consola Java que extrae un raster como un fichero de imagen

Esta es una aplicación simple de la consola java que toma una consulta y devuelve una imagen y la extrae a un fichero especificado.

Puedes descargar el último driver PostgreSQL JDBC desde http://jdbc.postgresql.org/download.html

Puedes compilar el siguiente código utilizando un comando similar a este:

set env CLASSPATH .:..\postgresql-9.0-801.jdbc4.jar
javac SaveQueryImage.java
jar cfm SaveQueryImage.jar Manifest.txt *.class

Y llamarlo desde la linea de comandos de forma similar a:

java -jar SaveQueryImage.jar "SELECT ST_AsPNG(ST_AsRaster(ST_Buffer(ST_Point(1,5),10, 'quad_segs=2'),150, 150, '8BUI',100));" "test.png" 
-- Manifest.txt --
Class-Path: postgresql-9.0-801.jdbc4.jar
Main-Class: SaveQueryImage
// Codigo para SaveQueryImage.java
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.io.*;

public class SaveQueryImage {
  public static void main(String[] argv) {
      System.out.println("Checking if Driver is registered with DriverManager.");
      
      try {
        //java.sql.DriverManager.registerDriver (new org.postgresql.Driver());
        Class.forName("org.postgresql.Driver");
      } 
      catch (ClassNotFoundException cnfe) {
        System.out.println("Couldn't find the driver!");
        cnfe.printStackTrace();
        System.exit(1);
      }
      
      Connection conn = null;
      
      try {
        conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/mydb","myuser", "mypwd");
        conn.setAutoCommit(false);

        PreparedStatement sGetImg = conn.prepareStatement(argv[0]);
                
        ResultSet rs = sGetImg.executeQuery();
                
                FileOutputStream fout;
                try
                {
                        rs.next();
                        /** Output to file name requested by user **/
                        fout = new FileOutputStream(new File(argv[1]) );
                        fout.write(rs.getBytes(1));
                        fout.close();
                }
                catch(Exception e)
                {
                        System.out.println("Can't create file");
                        e.printStackTrace();
                }
                
        rs.close();
                sGetImg.close();
        conn.close();
      } 
      catch (SQLException se) {
        System.out.println("Couldn't connect: print out a stack trace and exit.");
        se.printStackTrace();
        System.exit(1);
      }   
  }
}

5.3.4. Utilizar PLPython para extraer imágenes vía SQL

Este es una función de almacenamiento plpython que crea un archivo en el directorio del servidor por cada registro. Requiere que tenga instalado plpython. Deberá trabajar bien con ambos plpythonu y plpython3u.

CREATE OR REPLACE FUNCTION write_file (param_bytes bytea, param_filepath text)
RETURNS text
AS $$
f = open(param_filepath, 'wb+')
f.write(param_bytes)
return param_filepath
$$ LANGUAGE plpythonu;
-- escribe 5 imágenes en el servidor PostgreSQL cambiando los tamaños
-- observa que la cuenta del daemon postgresql necesita permisos de escritura en la carpeta
-- esto devuelve echo en los nombres de los ficheros creados
 SELECT write_file(ST_AsPNG(
        ST_AsRaster(ST_Buffer(ST_Point(1,5),j*5, 'quad_segs=2'),150*j, 150*j, '8BUI',100)),
         'C:/temp/slices'|| j || '.png')
         FROM generate_series(1,5) As j;
         
     write_file
---------------------
 C:/temp/slices1.png
 C:/temp/slices2.png
 C:/temp/slices3.png
 C:/temp/slices4.png
 C:/temp/slices5.png

5.3.5. Extraer un raster con PSQL

PSQL no tiene un uso fácil de la funcionalidad integrada para la salida de binarios. Esto es un pequeño truco y se basa en una de las propuestas que contiene el Clever Trick Challenge -- Outputting bytes with psql que respalda en PostgreSQL algo del legado de soporte de objetos. Para utilizarlo, primero lanza la línea de comandos psql conectando a tu base de datos.

A diferencia del enfoque de python, este, crea el fichero en tu equipo local.

SELECT oid, lowrite(lo_open(oid, 131072), png) As num_bytes
 FROM 
 ( VALUES (lo_create(0), 
   ST_AsPNG( (SELECT rast FROM aerials.boston WHERE rid=1) ) 
  ) ) As v(oid,png);
-- obtendras una salida similar a la siguiente --
   oid   | num_bytes
---------+-----------
 2630819 |     74860
 
-- obten el oid y hazlo reemplazando c:/test.png por el directorio
-- de tu equipo local
 \lo_export 2630819 'C:/temp/aerial_samp.png'
 
-- Esto borra el fichero de almacenamiento de objetos grandes en la db
SELECT lo_unlink(2630819);
                        

Chapter 6. Usando PostGIS Geometry: Construyendo Aplicaciones

6.1. Usando Mapserver

El Minnesota MapServer es un servidor web de mapas para internet que cumple la especificación OpenGIS Web Mapping Server 'Servidor de Mapas Web'.

6.1.1. Uso Básico

Para utilizar PostGIS con MapServer necesitará saber como configurar MapServer, lo cual está fuera del alcance de esta documentación. Esta sección cubrirá cuestiones específicas de PostGIS y detalles de su configuración.

Para usar PostGIS con MapServer, necesitará:

  • La versión 0.6 o posterior de PostGIS.

  • La versión 3.5 o posterior de MapServer.

MapServer accede a los datos de PostGIS/PostgreSQL como cualquier otro cliente de PostgreSQL -- usando la interfaz libpq. Esto significa que MapServer puede instalarse en cualquier máquina con acceso de red al servidor PostGIS, y usar PostGIS como una fuente de datos. La conexión entre los sistemas será mejor cuanto más rápida sea ésta.

  1. Compile e instale MapServer con las opciones que desee, incluyendo la opción de configuración "--with-postgis".

  2. En el fichero de mapas de MapServer agregue una capa PostGIS. Por ejemplo:

    LAYER 
      CONNECTIONTYPE postgis 
      NAME "widehighways" 
      # Conectar a una base de datos espacial remota
      CONNECTION "user=dbuser dbname=gisdatabase host=bigserver"
      PROCESSING "CLOSE_CONNECTION=DEFER"
      # Obtener las filas de la columna 'geom' de la tabla 'roads' 
      DATA "geom from roads using srid=4326 using unique gid" 
      STATUS ON
      TYPE LINE 
      # De las filas, sólo dibujar las autopistas de 4 o más carriles 
      FILTER "type = 'highway' and numlanes >= 4" 
      CLASS 
        # Hacer que las superautopistas sean más brillantes y de 2 pixels de grososr
        EXPRESSION ([numlanes] >= 6) 
        STYLE
          COLOR 255 22 22 
          WIDTH 2 
        END
      END 
      CLASS 
        # El resto son más oscuras y de sólo 1 pixel de grososr 
        EXPRESSION ([numlanes] < 6) 
        STYLE
          COLOR 205 92 82
        END
      END 
    END

    En el ejemplo de arriba, las directivas específicas de PostGIS son:

    CONNECTIONTYPE

    Para las capas PostGIS, es siempre "postgis".

    CONNECTION

    La conexión a la base de datos se rige por una 'cadena de conexión' que se compone de un conjunto estándar de claves y valores como (con los valores por defecto en <>):

    user=<username> password=<password> dbname=<username> hostname=<server> port=<5432>

    Cualquier par clave/valor puede omitirse, incluso es válida una cadena de conexión vacía. Como mínimo generalmente se proporcionará el nombre de la base de datos y el del usuario con el que conectarse.

    DATA

    Este parámetro toma la forma "<geocolumn> from <tablename> using srid=<srid> using unique <primary key>" donde 'geocolumn' es la columna espacial a representar en el mapa, el 'srid' es el identificador del sistema de referencia utilizado por dicha columna y la 'primary key' es la clave primaria de la tabla (o cualquier otra columna con valores únicos y un índice).

    Se pueden omitir las cláusulas "using srid" y "using unique" y MapServer determinará automáticamente los valores correctos si ello es posible, pero al precio de ejecutar unas pocas consultas extra al servidor cada vez que se dibuje el mapa.

    PROCESSING

    Si tenemos múltiples capas, el poner CLOSE_CONNECTION=DEFER hace que se reutilicen conexiones existentes en vez de cerrarlas. Esto mejora la velocidad. Para una explicación más detallada se puede consultar MapServer PostGIS Performance Tips.

    FILTER

    El filtro debe ser una cadena SQL correcta que corresponda a lo que sigue habitualmente a la palabra clave "WHERE" en una consulta SQL. Así que, por ejemplo, para representar solamente carreteras con 6 o más carriles usaremos un filtro con "num_lanes >= 6".

  3. Asegúrese de haber generado índices espaciales (GIST) en su base de datos espacial para cualquiera de las capas a ser dibujadas.

    CREATE INDEX [nombreindice] ON [nombretabla] USING GIST ( [columnageometria] );
  4. Si va a hacer consultas de las capas usando MapServer necesitará también usar la cláusula "using unique" en el enunciado DATA.

    MapServer requiere identificadores únicos para cada registro espacial cuando realiza las consultas, y el módulo PostGIS de MapServer utiliza el valor único especificado para proporcionar esos identificadores únicos. La mejor práctica es el uso de la clave primaria.

6.1.2. Preguntas frecuentes

6.1.2.1. Cuando uso una EXPRESSION en mi fichero de mapas, la condición nunca se devuelve como verdadera, aunque sé que los valores existen en mi tabla.
6.1.2.2. El filtro que uso para mis ficheros 'shape' no funciona con mi tabla PostGIS para los mismos datos.
6.1.2.3. Mi capa PostGIS tarda mucho más en dibujarse que mi capa del fichero 'shape'. ¿Es normal?
6.1.2.4. Mi capa PostGIS se dibuja bien, pero las consultas son realmente lentas. ¿Cuál es el problema?
6.1.2.5. ¿Puedo utilizar las columnas "geography" (nuevas en PostGIS 1.5) como fuente para las capas de MapServer?

6.1.2.1.

Cuando uso una EXPRESSION en mi fichero de mapas, la condición nunca se devuelve como verdadera, aunque sé que los valores existen en mi tabla.

A diferencia de los ficheros 'shape' los nombres de campo en PostGIS tienen que estar referenciados en EXPRESSIONS utilizando minúsculas.

EXPRESSION ([numlanes] >= 6)

6.1.2.2.

El filtro que uso para mis ficheros 'shape' no funciona con mi tabla PostGIS para los mismos datos.

A diferencia de los ficheros 'shape', los filtros de capas PostGIS usan la sintaxis SQL (se añaden a la instrucción SQL que el conector PostGIS genera para dibujar las capas en MapServer).

FILTER "type = 'highway' and numlanes >= 4"

6.1.2.3.

Mi capa PostGIS tarda mucho más en dibujarse que mi capa del fichero 'shape'. ¿Es normal?

En general, cuantos más elementos haya que dibujar en un mapa dado, más probable es que PostGIS sea más lento que los ficheros 'shape'. Para mapas con relativamente pocos elementos (100 ...cientos), PostGIS será seguramente más rápido. Para mapas con una alta densidad de elementos (1000 ...miles), PostGIS será siempre más lento.

Si está experimentando sustanciales problemas de ejecución, es posible que no haya generado un índice espacial en su tabla.

postgis# CREATE INDEX geotable_gix ON geotable USING GIST ( geocolumn ); 
postgis# VACUUM ANALYZE;

6.1.2.4.

Mi capa PostGIS se dibuja bien, pero las consultas son realmente lentas. ¿Cuál es el problema?

Para que las consultas sean rápidas, debe tener una clave única para su tabla espacial y un índice sobre esa clave única.

Puede especificar qué clave única debe usar MapServer con la cláusula USING UNIQUE en la línea DATA:

DATA "geom FROM geotable USING UNIQUE gid"

6.1.2.5.

¿Puedo utilizar las columnas "geography" (nuevas en PostGIS 1.5) como fuente para las capas de MapServer?

¡Sí! MapServer acepta las columnas 'geography' como si fueran columnas 'geometry', pero si se usa el SRID número 4326. Asegúrese de incluir una cláusula "using srid=4326" en su instrucción DATA . Todo funciona igual que con 'geometry'.

DATA "geog FROM geogtable USING SRID=4326 USING UNIQUE gid"

6.1.3. Uso avanzado

Se usa la cláusula pseudo-SQL USING para añadir alguna información que ayude a MapServer a comprender los resultados de consultas más complejas. Más específicamente, cuando se usa bien una vista o una subselección como la tabla origen (lo que está a la derecha de "FROM" en una definición DATA) es más difícil para MapServer determinar automáticamente un identificador único para cada fila y también el SRID para la tabla. La cláusula USING puede proporcionar a MapServer estas dos piezas de información de la siguiente manera:

DATA "geom FROM (
  SELECT 
    table1.geom AS geom, 
    table1.gid AS gid, 
    table2.data AS data 
  FROM table1 
  LEFT JOIN table2 
  ON table1.id = table2.id
) AS new_table USING UNIQUE gid USING SRID=4326"
USING UNIQUE <uniqueid>

MapServer requiere un identificador único para poder identificar la fila cuando se hacen consultas al mapa. Normalmente identifica la clave primaria de las tablas del sistema. Sin embargo, vistas y subconsultas no tienen automáticamente una columna única conocida. Si quiere usar la funcionalidad de consultas de MapServer debe asegurarse de que la vista o subconsulta incluye una columna de valores únicos, y declararla con USING UNIQUE. Por ejemplo, podría seleccionar explícitamente valores de la clave primaria de la tabla para este propósito, o cualquier otra columna que garantice ser única para el conjunto de resultados.

[Note]

"Consultar un mapa" es la acción de hacer click sobre un mapa para obtener información acerca de los elementos del mapa en esa posición. No confundir con "consultas al mapa" con la petición SQL en una definición DATA.

USING SRID=<srid>

PostGIS necesita saber qué sistema de referencia espacial están usando las geometrías para poder devolver los datos correctos a MapServer. Normalmente es posible encontrar esta información en la tabla 'geometry_columns' de la base de datos PostGIS, sin embargo esto no es posible con tablas que se crean al vuelo tal como subconsultas y vistas. Así que la opción USING SRID= permite indicar el SRID correcto en la definición DATA.

6.1.4. Ejemplos

Comencemos con un ejemplo sencillo. Consideremos la siguiente definición de capa en MapServer:

LAYER 
  CONNECTIONTYPE postgis 
  NAME "roads"
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" 
  DATA "geom from roads" 
  STATUS ON 
  TYPE LINE 
  CLASS 
    STYLE
      COLOR 0 0 0 
    END
  END 
END

Esta capa visualizará todas las geometrías de carreteras de la tabla carreteras 'roads' como líneas negras.

Ahora, digamos que queremos mostrar sólo las autopistas cuando hagamos un zoom al menos de una escala 1:100000. Las siguientes dos capas conseguirán este efecto:

LAYER 
  CONNECTIONTYPE postgis 
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" 
  PROCESSING "CLOSE_CONNECTION=DEFER"
  DATA "geom from roads"
  MINSCALE 100000 
  STATUS ON 
  TYPE LINE 
  FILTER "road_type = 'highway'" 
  CLASS 
    COLOR 0 0 0 
  END 
END 
LAYER 
  CONNECTIONTYPE postgis 
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver"
  PROCESSING "CLOSE_CONNECTION=DEFER"
  DATA "geom from roads" 
  MAXSCALE 100000 
  STATUS ON 
  TYPE LINE
  CLASSITEM road_type 
  CLASS 
    EXPRESSION "highway" 
    STYLE
      WIDTH 2 
      COLOR 255 0 0  
    END
  END 
  CLASS  
    STYLE
      COLOR 0 0 0 
    END
  END 
END

La primera capa se usa cuando la escala es superior a 1:100000 y muestra sólo las carreteras de tipo "highway" como líneas negras. La opción FILTER hace que sólo se visualicen las carreteras de tipo "highway".

La segunda capa se usa cuando la escala es menor de 1:100000 y mostrará las autopistas como líneas rojas de doble grueso, y las otras carreteras como líneas negras de grosor normal.

Así que, hemos hecho un par de cosas interesantes usando sólo la funcionalidad de MapServer, pero nuestra sentencia SQL DATA ha seguido siendo sencilla. Supongamos que el nombre de las carreteras está almacenado en otra tabla (por la razón que sea) y necesitamos hacer una unión (join) para obtenerlo y etiquetar nuestras carreteras.

LAYER 
  CONNECTIONTYPE postgis
  CONNECTION "user=theuser password=thepass dbname=thedb host=theserver" 
  DATA "geom FROM (SELECT roads.gid AS gid, roads.geom AS geom, 
        road_names.name as name FROM roads LEFT JOIN road_names ON 
        roads.road_name_id = road_names.road_name_id) 
        AS named_roads USING UNIQUE gid USING SRID=4326" 
  MAXSCALE 20000 
  STATUS ON 
  TYPE ANNOTATION 
  LABELITEM name
  CLASS 
    LABEL 
      ANGLE auto 
      SIZE 8 
      COLOR 0 192 0 
      TYPE truetype 
      FONT arial
    END
  END 
END

Esta capa de anotaciones añade etiquetas verdes a todas las carreteras cuando la escala baje a 1:20000 o menos. También demuestra como usar una unión (join) SQL en una definición DATA.

6.2. Clientes Java (JDBC)

Los clientes java pueden acceder a los objetos 'geometry' de PostGIS en la base de datos PostgreSQL bien directamente como representaciones en texto o usando los objetos de extensión JDBC incluídos con PostGIS. Para poder usar los objetos de extensión, el fichero "postgis.jar" debe estar en su CLASSPATH así como el paquete controlador JDBC "postgresql.jar".

import java.sql.*; 
import java.util.*; 
import java.lang.*; 
import org.postgis.*; 

public class JavaGIS { 

public static void main(String[] args) { 

  java.sql.Connection conn; 

  try { 
    /* 
    * Cargar el controlador JDBC y establecer la conexión. 
    */
    Class.forName("org.postgresql.Driver"); 
    String url = "jdbc:postgresql://localhost:5432/database"; 
    conn = DriverManager.getConnection(url, "postgres", ""); 
    /* 
    * Agregar los tipos 'geometry' a la conexión. Tenga en cuenta que
    * debe adaptar la conexión a la implementación de la conexión 
    *  específica pgsql antes de llamar al método addDataType(). 
    */
    ((org.postgresql.PGConnection)conn).addDataType("geometry",Class.forName("org.postgis.PGgeometry"));
    ((org.postgresql.PGConnection)conn).addDataType("box3d",Class.forName("org.postgis.PGbox3d"));
    /* 
    * Crear una sentencia y ejecutar una consulta 'select'. 
    */ 
    Statement s = conn.createStatement(); 
    ResultSet r = s.executeQuery("select geom,id from geomtable"); 
    while( r.next() ) { 
      /* 
      * Recuperar la geometría como un objeto, luego convertirlo al tipo geometry. 
      * Imprimir resultados. 
      */ 
      PGgeometry geom = (PGgeometry)r.getObject(1); 
      int id = r.getInt(2); 
      System.out.println("Row " + id + ":");
      System.out.println(geom.toString()); 
    } 
    s.close(); 
    conn.close(); 
  } 
catch( Exception e ) { 
  e.printStackTrace(); 
  } 
} 
}

El objeto "PGeometry" es un objeto envoltorio que contiene un objeto geométrico de topología específica (subclase de la clase abstracta "Geometry") dependiendo del tipo: Point, LineString, Polygon, MultiPoint, MultiLineString, MultiPolygon.

PGgeometry geom = (PGgeometry)r.getObject(1); 
if( geom.getType() == Geometry.POLYGON ) { 
  Polygon pl = (Polygon)geom.getGeometry(); 
  for( int r = 0; r < pl.numRings(); r++) { 
    LinearRing rng = pl.getRing(r); 
    System.out.println("Ring: " + r); 
    for( int p = 0; p < rng.numPoints(); p++ ) { 
      Point pt = rng.getPoint(p); 
      System.out.println("Point: " + p);
      System.out.println(pt.toString()); 
    } 
  } 
}

JavaDoc proporciona una referencia para los objetos extensión para las diferentes funciones de acceso a datos en los objetos geométricos.

6.3. Clientes C (libpq)

...

6.3.1. Cursores de Texto

...

6.3.2. Cursores Binarios

...

Chapter 7. Consejos de rendimiento

7.1. Tablas pequeñas de geometrías grandes

7.1.1. Descripcion del problema

Versiones actuales de PostgreSQL (incluyendo la 8.0) tienen algunas debilidades en la optimización de consultas respecto a tablas TOAST. Las tablas TOAST son una especie de "cámara de extensiones" utilizadas para almacenar valores grandes (en sentido de tamaño de datos) que no se pueden mostrar en paginas de datos (como textos largos, imágenes o geometrías complejas con muchos vértices). Para mas información visita the PostgreSQL Documentation for TOAST

El problema aparece si ocurre que tienes una tabla con geometrías bastante grandes, pero no demasiadas filas de ellas (como una tabla que contiene los límites de todos los países europeos en alta resolución). A continuación, la tabla en sí es pequeña, pero utiliza una gran cantidad de espacio TOAST. En nuestro caso de ejemplo, la tabla en sí tenía alrededor de 80 filas y se utiliza sólo 3 páginas de datos, pero la tabla TOAST utiliza 8225 páginas.

Ahora al emitir una consulta en la que utilizas el operador geométrico && para buscar un límite que coincide sólo unas pocas de esas filas, el optimizador de consultas ve que la tabla sólo tiene 3 páginas y 80 filas. Se estima que un escaseo secuencial en una tabla pequeña de este tipo es mucho más rápida que usando un índice. Y por lo que decide ignorar el índice de GIST. Por lo general, esta estimación es correcta. Pero en nuestro caso, el operador && tiene que buscar en cada geometría del disco la comparación de los limites, y leer todas las páginas TOAST también.

Para comprobar si padeces de este error, utiliza el comando "EXPLAIN ANALYZE" postgresql. Para obtener más información y los detalles técnicos, puedes leer el hilo en la lista de correo de rendimiento postgres: http://archives.postgresql.org/pgsql-performance/2005-02/msg00030.php

and newer thread on PostGIS https://lists.osgeo.org/pipermail/postgis-devel/2017-June/026209.html

7.1.2. Soluciones provisionales

La gente de PostgreSQL esta intentando resolver este problema haciendo la estimación de la consulta compatible con TOAST. Por el momento, aquí van dos soluciones provisionales:

La primera consiste en forzar la consulta a utilizar indices. Envia "SET enable_seqscan TO off;" al servidor antes de ejecutar la consulta. Esto, básicamente fuerza al planificador de consultas a evitar exploraciones secuenciales siempre que sea posible. Por lo tanto, utiliza el índice GIST como de costumbre. Pero este comando debe ser establecido en cada conexión, y hace que el planeador de consultas cometa errores de estimación en otros casos, por lo que debes enviar al servidor "SET enable_seqscan TO on;" después de la consulta.

La segunda solución es hacer el escaseo secuencia tan rápido como el planificador de consultas cree. Esto, se puede lograr creando una consulta que "cachee" los limites o bbox, y hacer coincidir en contra de esta. En nuestro ejemplo, los comandos son:

SELECT AddGeometryColumn('myschema','mytable','bbox','4326','GEOMETRY','2'); 
UPDATE mytable SET bbox = ST_Envelope(ST_Force_2d(the_geom));

Ahora cambia tu consulta para utilizar el operador espacial && con bbox en vez de geom_column, así:

SELECT geom_column 
FROM mytable 
WHERE bbox && ST_SetSRID('BOX3D(0 0,1 1)'::box3d,4326);

Por supuesto, si añades o cambias filas de "mutable", tienes que mantener el campo bbox sincronizado. La forma mas transparente de hacerlo son los triggers o funciones disparadoras, pero también puedes modificar tu aplicación para mantener la columna bbox o ejecutar la consulta UPDATE siguiente después de cada modificación.

7.2. CLUSTERing o indices geométricos

Para las tablas que en su mayoría son de sólo lectura, y donde se utiliza un índice único para la mayoría de las consultas, PostgreSQL ofrece el comando CLUSTER. Este comando reordena físicamente todas las filas de datos en el mismo orden que los criterios de índice, dando dos ventajas de rendimiento: En primer lugar, para los recorridos de intervalo del índice, el número de búsquedas en la tabla de datos se reduce drásticamente. En segundo lugar, si el conjunto de trabajo se concentra en algunos intervalos pequeños en los índices, tienes un caché más eficiente porque las filas de datos se distribuyen a lo largo de un menor número de páginas de datos. (Te invitamos a leer la documentación de comandos CLUSTER del manual de PostgreSQL sobre este tema.)

De todas formas, PostgreSQL no permite el "clustering" en indices GiST de PostGIS por que los indices GiST simplemente ignoran los valores NULL, tendrás el siguiente mensaje de error:

lwgeom=# CLUSTER my_geom_index ON my_table; 
ERROR: cannot cluster when index access method does not handle null values
HINT: You may be able to work around this by marking column "the_geom" NOT NULL.

Como sugiere el mensaje de ayuda, podemos evitar esta deficiencia añadiendo una restricción "not null" a la tabla:

lwgeom=# ALTER TABLE my_table ALTER COLUMN the_geom SET not null; 
ALTER TABLE

Por supuesto, esto no funcionará si necesitas valores NULL en tu columna de geometrías. Adicionalmente, debes utilizar el método anterior para añadir la restricción, utilizando restricciones CHEK como "ALTER TABLE blubb ADD CHECK (geómetra is not nulo);" no funcionara.

7.3. Evitar la conversión de dimensión

A veces, sucede que tienes datos en 3D o 4D en tus tablas pero siempre, al acceder a ella utilizando funciones conformes con OpenGIS como ST_AsText () o ST_AsBinary (), sólo devuelven geometrías 2D de salida. Esto ocurre por que lo hacen llamando internamente a la función ST_Force_2d (), que introduce una sobrecarga significativa para geometrías grandes . Para evitar esta sobrecarga, puede ser factible comprobar la validez de suprimir esas dimensiones adicionales de una vez por todas:

UPDATE mytable SET the_geom = ST_Force_2d(the_geom); 
VACUUM FULL ANALYZE mytable;

Ten en cuenta que si las has añadido a tu columna de geometría utilizando addGeometryColumn () habrá una restricción en la dimensión de la geometría. Para pasar la restricción por alto tendrás que quitarla. Recuerda actualizar la entrada en la tabla geometry_columns y volver a crear la restricción después.

En el caso de tablas de gran tamaño, puede ser conveniente dividir este UPDATE en porciones más pequeñas, restringiendo la actualización de una parte de la tabla a través de una cláusula WHERE y su clave primaria o de otros criterios, y la ejecución de un simple "VACUUM"; entre los UPDATE. Esto reduce drásticamente la necesidad de espacio de disco temporal. Además, si has mezclado dimensiones de geometrías, que restringen el UPDATE con "WHERE dimension(the_geom)>2" salta la reescritura de geometrías que ya están en 2D.

7.4. Ajusta tu configuración

Tuning for PostGIS is much like tuning for any PostgreSQL workload. The only additional note to keep in mind is that geometries and rasters are heavy so memory related optimizations generally have more of an impact on PostGIS than other types of PostgreSQL queries.

For general details about optimizing PostgreSQL, refer to Tuning your PostgreSQL Server.

For PostgreSQL 9.4+ all these can be set at the server level without touching postgresql.conf or postgresql.auto.conf by using the ALTER SYSTEM.. command.

ALTER SYSTEM SET work_mem = '256MB';
-- this will force, non-startup configs to take effect for new connections
SELECT pg_reload_conf();
-- show current setting value
-- use SHOW ALL to see all settings
SHOW work_mem;

In addition to these settings, PostGIS also has some custom settings which you can find listed in Section 8.2, “PostGIS Grand Unified Custom Variables (GUCs)”.

7.4.1. Puesta en marcha

Estas opciones se configuran en postgresql.conf:

constraint_exclusion

  • Por defecto: 1MB

  • Esto se utiliza generalmente para la partición de tablas. Si estás ejecutando versiones anteriores a PostgreSQL 8.4 , se establece en "on" para garantizar que el planeador de consultas optimizará. A partir de PostgreSQL 8.4, el valor predeterminado para este está ajustado a "partición", que es ideal para PostgreSQL 8.4 y superiores, ya que obligará al planificador a analizar sólo las tablas para considerar las restricciones si están en una jerarquía hereditaria y no penalizar al planificador de otra manera .

shared_buffers

  • Default: ~128MB in PostgreSQL 9.6

  • Set to about 25% to 40% of available RAM. On windows you may not be able to set as high.

work_mem (memoria utilizada para operaciones cortas y consultas complejas)

  • Por defecto: 1MB

  • Sets the maximum number of background processes that the system can support. This parameter can only be set at server start.

7.4.2. Runtime

work_mem (memoria utilizada para operaciones cortas y consultas complejas)

  • Por defecto: 1MB

  • Ajuste para bases de datos grandes, consultas complejas, mucha RAM

  • Ajuste para muchos usuarios concurrentes o menos RAM

  • Si tienes mucha RAM y algunos desarrolladores:

    SET work_mem TO 1200000;
                    

maintenance_work_mem (utilizado en operaciones de VACUUM, CREATE INDEX, etc.)

  • Por defecto: 16MB

  • Generalmente muy bajo - cierra I/O, bloquea objetos en la memoria de intercambio

  • Se recomienda de 32MB a 256MB en servidores de producción con mucha RAM, pero depende del numero de usuarios simultáneos. Si tienes mucha memoria RAM y algunos desarrolladores:

    SET maintainence_work_mem TO 1200000;
                    

max_parallel_workers_per_gather This setting is only available for PostgreSQL 9.6+ and will only affect PostGIS 2.3+, since only PostGIS 2.3+ supports parallel queries. If set to higher than 0, then some queries such as those involving relation functions like ST_Intersects can use multiple processes and can run more than twice as fast when doing so. If you have a lot of processors to spare, you should change the value of this to as many processors as you have. Also make sure to bump up max_worker_processes to at least as high as this number.

  • Por defecto: 1MB

  • Sets the maximum number of workers that can be started by a single Gather node. Parallel workers are taken from the pool of processes established by max_worker_processes. Note that the requested number of workers may not actually be available at run time. If this occurs, the plan will run with fewer workers than expected, which may be inefficient. Setting this value to 0, which is the default, disables parallel query execution.

Chapter 8. Manual de Referencia PostGIS

Las siguientes funciones son las que probablemente necesite un usuario PortGIS . Existen otras funciones de soporte necesarias para los objetos PostGIS que no se usan por la mayoría de usuarios.

[Note]

PostGIS ha comenzado una transición de la convención de nomenclatura existente, a una convención SQL-MM-céntrica. Como resultado, la mayoría de las funciones que conoces y adoras han sido renombradas usando el prefijo espacial estándar (ST). Funciones anteriores están todavía disponibles, aunque no se enumeran en este documento donde las funciones actualizadas son equivalentes. Las funciones no st_ no mencionadas en esta documentación están en desuso y se eliminarán en una versión futura de modo que DEJA DE UTILIZARLAS.

8.1. Tipos Geometry/Geography/Box en PostgreSQL PostGIS

Abstract

Esta sección detalla los tipos de dato de PostgreSQL instalados por PostGIS. Note que describimos el comportamiento de la conversión de tipos en los casos en los que es muy importante, especialmente cuando se diseñe sis propias funciones.

Cast es la conversión forzada de un tipo a otro. PostgreSQL se diferencia de la mayoría de base de datos em que permite defnir el comportamiento de la conversión de tipos de datos i las funciones usadas para ello. Un cast se puede especificar como automático, caso en el que no hace falta llamar CAST(myfoo as otherfootype) o myfoo::otherfootype si se está pasando a una función que solo acepta otherfootype como parámetro, en el caso en que haya un cast automático para hacerlo.

El peligro de confiar en la conversión de tipo automática es cuando hay una función que usa sobrecarga que coja, por ejemplo, un box2d en un caso y un box3d sin geometría en otro. Lo que pasa en este caso es que las dos funciones son igualmente buenas para usar con un tipo geometry, ya que geometry tiene autocast para los dos, por lo que se devuelve un error de función ambigua. Para forzar PostgreSQL a escoger, hay que llamar CAST(mygeom As box3d) o mygeom::box3d.

Desde la versión PostgreSQL 8.3 - Todo puede ser convertido a texto (presumiblemente debido al tipo mágico unknown), por lo que no hay necesidad de un CAST definido para convertir un objeto a texto.

box2d — Una caja compuesta por xmin, ymin, xmax, ymax. Usada a menudo para devolver la caja 2d que contiene una geometría.
box3d — Una caja compuesta por xmin, ymin, zmin, xmax, ymax, zmax. Usada habitualmente para devolver la extensión 3d de una geometría o grupo de geometrías.
geometry — Tipo de dato espacial planar
geometry_dump — Un tipo de datos espacial con dos campos: geom (que contiene el objeto geometry) y path[] (un array 1-d que contiene la posición de la geometría dentro el objeto volcado).
geography — Tipo de dato espacial elipsoidal

Name

box2d — Una caja compuesta por xmin, ymin, xmax, ymax. Usada a menudo para devolver la caja 2d que contiene una geometría.

Descripción

box2d es un tipo de dato espacial usado para representar la caja que contiene una geometría o un grupo de geometrías. En versiones anteriores a PostGIS 1.4, ST_Extent devolvía un objeto box2d.


Name

box3d — Una caja compuesta por xmin, ymin, zmin, xmax, ymax, zmax. Usada habitualmente para devolver la extensión 3d de una geometría o grupo de geometrías.

Descripción

box3d es un tipo de dato espacial usado para representar la caja que contiene una geometría o un grupo de geometrías. ST_3DExtent devuelve un objecto box3d.

Comportamiento de la conversión de tipo de dato

Esta sección detalla los cambios de tipo automáticos y explícitos permitidos para este tipo de dato

Convertir aComportamiento
boxautomatic
box2dautomatic
geometryautomatic

Name

geometry — Tipo de dato espacial planar

Descripción

geometry es un tipo de datos postgis fundamental, usado para representar una feature en un sistema de coordenadas euclidiano.

Comportamiento de la conversión de tipo de dato

Esta sección detalla los cambios de tipo automáticos y explícitos permitidos para este tipo de dato

Convertir aComportamiento
boxautomatic
box2dautomatic
box3dautomatic
byteaautomatic
geographyautomatic
textautomatic

Name

geometry_dump — Un tipo de datos espacial con dos campos: geom (que contiene el objeto geometry) y path[] (un array 1-d que contiene la posición de la geometría dentro el objeto volcado).

Descripción

geometry_dump es un tipo de datos compuesto, que consiste en un objeto geometry referenciado por el campo .geom y path[], un array 1-dimensional de integers (que empeza por el elemento 1. path[1] contiene el primer elemento). Este array define el camino de navegación en la geometría volcada para encontrar el elemento. Es usado por la familia de funciones ST_Dump* como tipo de salida para separar un tipo de geometría complejo en las partes que la componen y su localización.


Name

geography — Tipo de dato espacial elipsoidal

Descripción

geography es un tipo de dato espacial usado para representar una feature en un sistema de coordenadas de Tierra esférica.

Comportamiento de la conversión de tipo de dato

Esta sección detalla los cambios de tipo automáticos y explícitos permitidos para este tipo de dato

Convertir aComportamiento
geometryexplicit

8.2. PostGIS Grand Unified Custom Variables (GUCs)

Abstract

This section lists custom PostGIS Grand Unified Custom Variables(GUC). These can be set globally, by database, by session or by transaction. Best set at global or database level.

postgis.backend — The backend to service a function where GEOS and SFCGAL overlap. Options: geos or sfcgal. Defaults to geos.
postgis.gdal_datapath — A configuration option to assign the value of GDAL's GDAL_DATA option. If not set, the environmentally set GDAL_DATA variable is used.
postgis.gdal_enabled_drivers — A configuration option to set the enabled GDAL drivers in the PostGIS environment. Affects the GDAL configuration variable GDAL_SKIP.
postgis.enable_outdb_rasters — A boolean configuration option to enable access to out-db raster bands.

Name

postgis.backend — The backend to service a function where GEOS and SFCGAL overlap. Options: geos or sfcgal. Defaults to geos.

Descripción

This GUC is only relevant if you compiled PostGIS with sfcgal support. By default geos backend is used for functions where both GEOS and SFCGAL have the same named function. This variable allows you to override and make sfcgal the backend to service the request.

Disponibilidad: 2.1.0

Ejemplos

Sets backend just for life of connection

set postgis.backend = sfcgal;

Sets backend for new connections to database

ALTER DATABASE mygisdb SET postgis.backend = sfcgal;

Name

postgis.gdal_datapath — A configuration option to assign the value of GDAL's GDAL_DATA option. If not set, the environmentally set GDAL_DATA variable is used.

Descripción

A PostgreSQL GUC variable for setting the value of GDAL's GDAL_DATA option. The postgis.gdal_datapath value should be the complete physical path to GDAL's data files.

This configuration option is of most use for Windows platforms where GDAL's data files path is not hard-coded. This option should also be set when GDAL's data files are not located in GDAL's expected path.

[Note]

This option can be set in PostgreSQL's configuration file postgresql.conf. It can also be set by connection or transaction.

Disponibilidad: 2.2.0

[Note]

Additional information about GDAL_DATA is available at GDAL's Configuration Options.

Ejemplos

Set and reset postgis.gdal_datapath

SET postgis.gdal_datapath TO '/usr/local/share/gdal.hidden';
SET postgis.gdal_datapath TO default;
                                

Setting on windows for a particular database

ALTER DATABASE gisdb
SET postgis.gdal_datapath = 'C:/Program Files/PostgreSQL/9.3/gdal-data';

Name

postgis.gdal_enabled_drivers — A configuration option to set the enabled GDAL drivers in the PostGIS environment. Affects the GDAL configuration variable GDAL_SKIP.

Descripción

A configuration option to set the enabled GDAL drivers in the PostGIS environment. Affects the GDAL configuration variable GDAL_SKIP. This option can be set in PostgreSQL's configuration file: postgresql.conf. It can also be set by connection or transaction.

The initial value of postgis.gdal_enabled_drivers may also be set by passing the environment variable POSTGIS_GDAL_ENABLED_DRIVERS with the list of enabled drivers to the process starting PostgreSQL.

Enabled GDAL specified drivers can be specified by the driver's short-name or code. Driver short-names or codes can be found at GDAL Raster Formats. Multiple drivers can be specified by putting a space between each driver.

[Note]

There are three special codes available for postgis.gdal_enabled_drivers. The codes are case-sensitive.

  • DISABLE_ALL disables all GDAL drivers. If present, DISABLE_ALL overrides all other values in postgis.gdal_enabled_drivers.

  • ENABLE_ALL enables all GDAL drivers.

  • VSICURL enables GDAL's /vsicurl/ virtual file system.

When postgis.gdal_enabled_drivers is set to DISABLE_ALL, attempts to use out-db rasters, ST_FromGDALRaster(), ST_AsGDALRaster(), ST_AsTIFF(), ST_AsJPEG() and ST_AsPNG() will result in error messages.

[Note]

In the standard PostGIS installation, postgis.gdal_enabled_drivers is set to DISABLE_ALL.

[Note]

Additional information about GDAL_SKIP is available at GDAL's Configuration Options.

Disponibilidad: 2.2.0

Ejemplos

Set and reset postgis.gdal_enabled_drivers

Sets backend for all new connections to database

ALTER DATABASE mygisdb SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG';

Sets default enabled drivers for all new connections to server. Requires super user access and PostgreSQL 9.4+. Also not that database, session, and user settings override this.

ALTER SYSTEM SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG';
SELECT pg_reload_conf();
                                
SET postgis.gdal_enabled_drivers TO 'GTiff PNG JPEG';
SET postgis.gdal_enabled_drivers = default;
                                

Enable all GDAL Drivers

SET postgis.gdal_enabled_drivers = 'ENABLE_ALL';
                                

Disable all GDAL Drivers

SET postgis.gdal_enabled_drivers = 'DISABLE_ALL';
                                

Name

postgis.enable_outdb_rasters — A boolean configuration option to enable access to out-db raster bands.

Descripción

A boolean configuration option to enable access to out-db raster bands. This option can be set in PostgreSQL's configuration file: postgresql.conf. It can also be set by connection or transaction.

The initial value of postgis.enable_outdb_rasters may also be set by passing the environment variable POSTGIS_ENABLE_OUTDB_RASTERS with a non-zero value to the process starting PostgreSQL.

[Note]

Even if postgis.enable_outdb_rasters is True, the GUC postgis.enable_outdb_rasters determines the accessible raster formats.

[Note]

In the standard PostGIS installation, postgis.enable_outdb_rasters is set to False.

Disponibilidad: 2.2.0

Ejemplos

Set and reset postgis.enable_outdb_rasters

SET postgis.enable_outdb_rasters TO True;
SET postgis.enable_outdb_rasters = default;
SET postgis.enable_outdb_rasters = True;
SET postgis.enable_outdb_rasters = False;
                                

8.3. Funciones de Gestión

AddGeometryColumn — Añade una columna de geometrías a una tabla de atributos existente. Por defecto utiliza el modificador de tipo en vez de restricciones. Si se cambia a falso use_typmode se utilizará el metido antiguo basado en restricciones
DropGeometryColumn — Suprime una columna de geometrías de una tabla espacial.
DropGeometryTable — Borra una tabla y todas sus referencias en la tabla geómetra_columns.
PostGIS_Full_Version — Devuelve la versión completa e informaciones de compilación de postgis.
PostGIS_GEOS_Version — Devuelve el numero de versión de la libreria GEOS.
PostGIS_Lib_Version — Devuelve el numero de la versión de la libreria libxml2.
PostGIS_LibXML_Version — Devuelve el numero de la versión de la libreria libxml2.
PostGIS_Lib_Build_Date — Devuelve la fecha de compilación de la librería PostGIS.
PostGIS_Lib_Version — Devuelve el numero de versión de la librería PostGIS.
PostGIS_PROJ_Version — Devuelve el numero de versión de la librería PROJ4
PostGIS_Scripts_Build_Date — Devuelve la fecha de compilación del script PostGIS.
PostGIS_Scripts_Installed — Devuelve la versión del script postgis instalado en la base de datos.
PostGIS_Scripts_Released — Devuelve el numero de versión del script postgis.sql liberado con la libreria instalada postgis.
PostGIS_Version — Devuelve el numero de versión e información sobre su compilación de PostGIS.
Populate_Geometry_Columns — Asegura que las columnas de geometría se define con modificadores de tipo o tienen restricciones espaciales apropiadas Esto asegura que se registrarán correctamente en la vista geometry_columns. Por defecto se convertirán todas las columnas de geometría sin modificador de tipo a modificadores de tipo. Para conseguir el comportamiento del sistema antiguo selecciona use_typmod = false
UpdateGeometrySRID — Actualiza el SRID de todos los objetos espaciales de una columna de geometría, GEOMETRY_COLUMNS metadatos y srid. Si se cumple con las limitaciones, las restricciones se actualizarán con una nueva restricción srid. Si el viejo se impuso por tipo de definición, se cambiará la definición de tipo.

Name

AddGeometryColumn — Añade una columna de geometrías a una tabla de atributos existente. Por defecto utiliza el modificador de tipo en vez de restricciones. Si se cambia a falso use_typmode se utilizará el metido antiguo basado en restricciones

Synopsis

text AddGeometryColumn(varchar table_name, varchar column_name, integer srid, varchar type, integer dimension, boolean use_typmod=true);

text AddGeometryColumn(varchar schema_name, varchar table_name, varchar column_name, integer srid, varchar type, integer dimension, boolean use_typmod=true);

text AddGeometryColumn(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid, varchar type, integer dimension, boolean use_typmod=true);

Descripción

Añade una columna de geometría a una tabla existente de atributos. schema_name es el nombre del esquema de la tabla. srid debe ser una referencia de valor entero a una entrada en la tabla SPATIAL_REF_SYS. type debe ser una cadena que corresponde al tipo de geometría, por ejemplo, 'POLYGON' or 'MULTILINESTRING'. Se lanza un error si no existe el schemaname (o no esta visible en el search_path actual) o el SRID, el tipo de geometría, o la dimensión no son validos.

[Note]

Cambiado: 2.0.0 Esta función ya no se actualiza desde geometry_columns ya que geometry_columns es una vista que se lee dede los catálogos del sistema. Por defecto tampoco crea las restricciones, sino que utiliza el modificador de tipo de PostgreSQL. Así que para la construcción de una columna de tipo POINT en wgs84 con esta función ejemplo que hoy es equivalente a: ALTER TABLE some_table ADD COLUMN geom geometry(Point,4326);

Cambiado: 2.0.0 Si necesitas el comportamiento antiguo de restricciones, utiliza el valor predeterminado use_typmod, pero cambiala a false.

[Note]

Cambiado: 2.0.0 Las Vistas ya no pueden ser registradas manualmente en geometry_columns, no obstante las vistas se que construyan a partir de geometrías typmod de las tablas de geometrías y sean utilizadas ​​sin funciones wrapper se registraran correctamente porque heredan el comportamiento typmod de su columna de la tabla padre. Las vistas que utilizan funciones de geometría que devuelvan geometrías necesitarán de transformación cast a geometrías typmod para esta columnas de geometrías de la vista y que se registren correctamente en geometry_columns. Consulta Section 4.3.4, “Registrando la columna de geometrias de forma manual en la tabla geometry_columns”.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Mejorada: 2.0.0 introducción del argumento use_typmod. El valor predeterminado es crearcolumnas de geometrías basadas en typmod en lugar de las basadas en restricciones.

Ejemplos

-- Crea un  schema para albergar los datos
CREATE SCHEMA my_schema;
-- Crea una tbla simple de PostgreSQL
CREATE TABLE my_schema.my_spatial_table (id serial);

-- Descripcion de la tabla que muestra una unica tabla con una unica columna "id".
postgis=# \d my_schema.my_spatial_table
                                                         Table "my_schema.my_spatial_table"
 Column |  Type   |                                Modifiers
--------+---------+-------------------------------------------------------------------------
 id     | integer | not null default nextval('my_schema.my_spatial_table_id_seq'::regclass)

-- Añadde una columna espacial a la tabla
SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom',4326,'POINT',2);

-- Añade un punto utilizando la antigua forma basada en restricciones
SELECT AddGeometryColumn ('my_schema','my_spatial_table','geom_c',4326,'POINT',2, false);

--Añade un polygon curvo utilizando la antigua forma basada en restricciones
SELECT AddGeometryColumn ('my_schema','my_spatial_table','geomcp_c',4326,'CURVEPOLYGON',2, false);

-- Describimos de nuevo la tabla para ver la columna de geometrias añadida
\d my_schema.my_spatial_table
                            addgeometrycolumn                            
-------------------------------------------------------------------------
 my_schema.my_spatial_table.geomcp_c SRID:4326 TYPE:CURVEPOLYGON DIMS:2 
(1 row)

                                    Table "my_schema.my_spatial_table"
  Column  |         Type         |                                Modifiers                                
----------+----------------------+-------------------------------------------------------------------------
 id       | integer              | not null default nextval('my_schema.my_spatial_table_id_seq'::regclass)
 geom     | geometry(Point,4326) | 
 geom_c   | geometry             | 
 geomcp_c | geometry             | 
Check constraints:
    "enforce_dims_geom_c" CHECK (st_ndims(geom_c) = 2)
    "enforce_dims_geomcp_c" CHECK (st_ndims(geomcp_c) = 2)
    "enforce_geotype_geom_c" CHECK (geometrytype(geom_c) = 'POINT'::text OR geom_c IS NULL)
    "enforce_geotype_geomcp_c" CHECK (geometrytype(geomcp_c) = 'CURVEPOLYGON'::text OR geomcp_c IS NULL)
    "enforce_srid_geom_c" CHECK (st_srid(geom_c) = 4326)
    "enforce_srid_geomcp_c" CHECK (st_srid(geomcp_c) = 4326)
    
--La vista geometry_columns  también registra las columnas nuevas--
SELECT f_geometry_column As col_name, type, srid, coord_dimension As ndims 
    FROM geometry_columns
    WHERE f_table_name = 'my_spatial_table' AND f_table_schema = 'my_schema';

 col_name |     type     | srid | ndims 
----------+--------------+------+-------
 geom     | Point        | 4326 |     2
 geom_c   | Point        | 4326 |     2
 geomcp_c | CurvePolygon | 4326 |     2

Name

DropGeometryColumn — Suprime una columna de geometrías de una tabla espacial.

Synopsis

text DropGeometryColumn(varchar table_name, varchar column_name);

text DropGeometryColumn(varchar schema_name, varchar table_name, varchar column_name);

text DropGeometryColumn(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name);

Descripción

Suprime una columna de geometrías de una tabla espacial. Observa que schema_name debe apuntar al campo f_table_schema del registro de la tabla geometry_columns.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

[Note]

Cambiado: 2.0.0 Se proporciona esta función para la compatibilidad con versiones anteriores. Ahora que geometry_columns es una vista y no un catálogo del sistema, se puede eliminar una columna de geometría como cualquier otra columna de la tabla utilizando ALTER TABLE

Ejemplos

SELECT DropGeometryColumn ('my_schema','my_spatial_table','geom');
                        ----RESULT output ---
                                          dropgeometrycolumn
------------------------------------------------------
 my_schema.my_spatial_table.geom effectively removed.
 
-- En PostGIS 2.0+ lo anterior es equivalente a alter table standar.
-- Ambos quitaran el registro de la tabla geometry_columns
ALTER TABLE my_schema.my_spatial_table DROP column geom;
                

Name

DropGeometryTable — Borra una tabla y todas sus referencias en la tabla geómetra_columns.

Synopsis

boolean DropGeometryTable(varchar table_name);

boolean DropGeometryTable(varchar schema_name, varchar table_name);

boolean DropGeometryTable(varchar catalog_name, varchar schema_name, varchar table_name);

Descripción

Borra la tabla y todas sus referencias en la tabla geómetra_column. Nota: utiliza el esquema current_schema() de una instalación pgsql si el esquema no se especifica.

[Note]

Cambiado: 2.0.0 Se proporciona esta función para la compatibilidad con versiones anteriores. Ahora que geometry_columns es una vista y no un catálogo del sistema, se puede borrar una tabla con columnas de geometría como cualquier otra tabla utilizando DROP TABLE

Ejemplos

SELECT DropGeometryTable ('my_schema','my_spatial_table');
----RESULT output ---
my_schema.my_spatial_table dropped.
                        
-- El comando anterior es equivalente a --
DROP TABLE my_schema.my_spatial_table;
                

Name

PostGIS_Full_Version — Devuelve la versión completa e informaciones de compilación de postgis.

Synopsis

text PostGIS_Full_Version();

Descripción

Devuelve la versión completa e informaciones de compilación de postgis. También informa sobre la sincronización entre librerías y scripts, y además sugiere si son necesarias actualizaciones.

Ejemplos

SELECT PostGIS_Full_Version();
postgis_full_version
----------------------------------------------------------------------------------
POSTGIS="2.2.0dev r12699" GEOS="3.5.0dev-CAPI-1.9.0 r3989" SFCGAL="1.0.4" PROJ="Rel. 4.8.0, 6 March 2012" 
GDAL="GDAL 1.11.0, released 2014/04/16" LIBXML="2.7.8" LIBJSON="0.12" RASTER
(1 row)

Name

PostGIS_GEOS_Version — Devuelve el numero de versión de la libreria GEOS.

Synopsis

text PostGIS_GEOS_Version();

Descripción

Devuelve el numero de versión de la libreria GEOS, o NULL si el soporte de GEOS no esta activo.

Ejemplos

SELECT PostGIS_GEOS_Version();
 postgis_geos_version
----------------------
 3.1.0-CAPI-1.5.0
(1 row)

Name

PostGIS_Lib_Version — Devuelve el numero de la versión de la libreria libxml2.

Synopsis

text PostGIS_Lib_Version();

Descripción

Devuelve el numero de la versión de la libreria libxml2.

Ejemplos

SELECT PostGIS_Lib_Version();
 postgis_lib_version
---------------------
 1.3.3
(1 row)

Name

PostGIS_LibXML_Version — Devuelve el numero de la versión de la libreria libxml2.

Synopsis

text PostGIS_LibXML_Version();

Descripción

Devuelve el numero de la versión de la libreria LibXML2.

Disponibilidad: 1.5

Ejemplos

SELECT PostGIS_LibXML_Version();
 postgis_libxml_version
----------------------
 2.7.6
(1 row)

Name

PostGIS_Lib_Build_Date — Devuelve la fecha de compilación de la librería PostGIS.

Synopsis

text PostGIS_Lib_Build_Date();

Descripción

Devuelve la fecha de compilación de la librería PostGIS.

Ejemplos

SELECT PostGIS_Lib_Build_Date();
 postgis_lib_build_date
------------------------
 2008-06-21 17:53:21
(1 row)

Name

PostGIS_Lib_Version — Devuelve el numero de versión de la librería PostGIS.

Synopsis

text PostGIS_Lib_Version();

Descripción

Devuelve el numero de versión de la librería PostGIS.

Ejemplos

SELECT PostGIS_Lib_Version();
 postgis_lib_version
---------------------
 1.3.3
(1 row)

Name

PostGIS_PROJ_Version — Devuelve el numero de versión de la librería PROJ4

Synopsis

text PostGIS_PROJ_Version();

Descripción

Devuelve el numero de versión de la librería PROJ4, o NULL si el soporte de PROJ4 no esta activado.

Ejemplos

SELECT PostGIS_PROJ_Version();
  postgis_proj_version
-------------------------
 Rel. 4.4.9, 29 Oct 2004
(1 row)

Name

PostGIS_Scripts_Build_Date — Devuelve la fecha de compilación del script PostGIS.

Synopsis

text PostGIS_Scripts_Build_Date();

Descripción

Devuelve la fecha de compilación del script PostGIS.

Disponibilidad: 1.0.0RC1

Ejemplos

SELECT PostGIS_Scripts_Build_Date();
  postgis_scripts_build_date
-------------------------
 2007-08-18 09:09:26
(1 row)

Name

PostGIS_Scripts_Installed — Devuelve la versión del script postgis instalado en la base de datos.

Synopsis

text PostGIS_Scripts_Installed();

Descripción

Devuelve la versión del script postgis instalado en la base de datos.

[Note]

Si la salida de esta función no se corresponde con la de PostGIS_Scripts_Released probablemente no has actualizado correctamente la base de datos existente. Ve a la sección Actualización para mas información.

Disponibilidad: 0.9.0

Ejemplos

SELECT PostGIS_Scripts_Installed();
  postgis_scripts_installed
-------------------------
 1.5.0SVN
(1 row)

Name

PostGIS_Scripts_Released — Devuelve el numero de versión del script postgis.sql liberado con la libreria instalada postgis.

Synopsis

text PostGIS_Scripts_Released();

Descripción

Devuelve el numero de versión del script postgis.sql liberado con la libreria instalada postgis.

[Note]

Desde la versión 1.1.0 esta función devuelve el mismo valor que PostGIS_Lib_Version. Mantenido por compatibilidad con versiones anteriores.

Disponibilidad: 0.9.0

Ejemplos

SELECT PostGIS_Scripts_Released();
  postgis_scripts_released
-------------------------
 1.3.4SVN
(1 row)

Name

PostGIS_Version — Devuelve el numero de versión e información sobre su compilación de PostGIS.

Synopsis

text PostGIS_Version();

Descripción

Devuelve el numero de versión e información sobre su compilación de PostGIS.

Ejemplos

SELECT PostGIS_Version();
                        postgis_version
---------------------------------------
 1.3 USE_GEOS=1 USE_PROJ=1 USE_STATS=1
(1 row)

Name

Populate_Geometry_Columns — Asegura que las columnas de geometría se define con modificadores de tipo o tienen restricciones espaciales apropiadas Esto asegura que se registrarán correctamente en la vista geometry_columns. Por defecto se convertirán todas las columnas de geometría sin modificador de tipo a modificadores de tipo. Para conseguir el comportamiento del sistema antiguo selecciona use_typmod = false

Synopsis

text Populate_Geometry_Columns(boolean use_typmod=true);

int Populate_Geometry_Columns(oid relation_oid, boolean use_typmod=true);

Descripción

Asegura que las columnas de geometría se define con modificadores de tipo o tienen restricciones espaciales apropiadas Esto asegura que se registrarán correctamente en la vista geometry_columns.

For backwards compatibility and for spatial needs such as table inheritance where each child table may have different geometry type, the old check constraint behavior is still supported. If you need the old behavior, you need to pass in the new optional argument as false use_typmod=false. When this is done geometry columns will be created with no type modifiers but will have 3 constraints defined. In particular, this means that every geometry column belonging to a table has at least three constraints:

  • enforce_dims_the_geom - asegura que cada geometría posee la misma dimensión (mira en ST_NDims)

  • enforce_geotype_the_geom - asegura que cada geometría es del mismo tipo (mira en GeometryType)

  • enforce_srid_the_geom - asegura que cada geometría tiene la misma proyección (mira en ST_SRID)

Si se da una tabla oid, esta función trata de determinar el srid, la dimensión, y el tipo de geometría de todas las columnas de geometrías en la tabla, añadiendo las restricciones si es necesario. Si no hay errores, una fila apropiada se insertará en la tabla geometry_columns, si hay errores, se captura la excepción y se envía un mensaje de error con la descripción del problema.

Si se da una vista oíd, como en el caso de una tabla oíd, esta función trata de determinar el srid, la dimensión, y el tipo de geometría de todas las columnas de geometrías en la tabla, añadiendo las filas apropiadas tabla geometry_columns, pero no se ejecuta nada para hacer cumplir las restricciones.

La variante sin parámetros es un simple wrapper de la variante con parámetros que trunca y rellena la tabla geometry_columns para cada tabla y vista espacial de la base de datos, añadiendo restricciones espaciales apropiadas a cada tabla. Devuelve un sumario de los numero de columnas de geometrías detectadas en la base de datos y el numeroque se insertaron en la tabla geometry_columns. La versión con parámetros simplemente devuelve el numero de filas insertado en la tabla geometry_columns.

Disponibilidad: 1.4.0

Cambiado: 2.0.0 Por defecto, ahora utiliza modificadores de tipo en lugar de restricciones de tipo check para limitar los tipos de geometría. Puedes seguir utilizando el comportamiento de las restricciones check con el uso de la nueva variable use_typmod y estableciéndolo a false.

Mejorado: 2.0.0 el argumento opcional use_typmod fue introducido y permite controlar si las columnas se crean con modificadores de tipo o con restricciones de tipo check.

Ejemplos

CREATE TABLE public.myspatial_table(gid serial, geom geometry);
INSERT INTO myspatial_table(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) );
-- Esto utilizara modificadores de tipo. Para que esto funcione deben existir datos
SELECT Populate_Geometry_Columns('public.myspatial_table'::regclass);

populate_geometry_columns
--------------------------
                        1
                        
                        
\d myspatial_table

                                   Table "public.myspatial_table"
 Column |           Type            |                           Modifiers                           
--------+---------------------------+---------------------------------------------------------------
 gid    | integer                   | not null default nextval('myspatial_table_gid_seq'::regclass)
 geom   | geometry(LineString,4326) |
-- Esto cambiara las columnas de geometría a utilizar restricciones si no son  typmod o ya tienen restrciciones.
-- Para que esto funcione deben existir datos
CREATE TABLE public.myspatial_table_cs(gid serial, geom geometry);
INSERT INTO myspatial_table_cs(geom) VALUES(ST_GeomFromText('LINESTRING(1 2, 3 4)',4326) );
SELECT Populate_Geometry_Columns('public.myspatial_table_cs'::regclass, false);
populate_geometry_columns
--------------------------
                        1
\d myspatial_table_cs

                          Table "public.myspatial_table_cs"
 Column |   Type   |                            Modifiers                             
--------+----------+------------------------------------------------------------------
 gid    | integer  | not null default nextval('myspatial_table_cs_gid_seq'::regclass)
 geom   | geometry | 
Check constraints:
    "enforce_dims_geom" CHECK (st_ndims(geom) = 2)
    "enforce_geotype_geom" CHECK (geometrytype(geom) = 'LINESTRING'::text OR geom IS NULL)
    "enforce_srid_geom" CHECK (st_srid(geom) = 4326)

Name

UpdateGeometrySRID — Actualiza el SRID de todos los objetos espaciales de una columna de geometría, GEOMETRY_COLUMNS metadatos y srid. Si se cumple con las limitaciones, las restricciones se actualizarán con una nueva restricción srid. Si el viejo se impuso por tipo de definición, se cambiará la definición de tipo.

Synopsis

text UpdateGeometrySRID(varchar table_name, varchar column_name, integer srid);

text UpdateGeometrySRID(varchar schema_name, varchar table_name, varchar column_name, integer srid);

text UpdateGeometrySRID(varchar catalog_name, varchar schema_name, varchar table_name, varchar column_name, integer srid);

Descripción

Actualiza el SRID de todos los registros de una columna de geometrías, actualizando las restricciones y referencias en geometry_columns. Nota: utiliza current_schema() en instalaciones pgsql que aceptan esquemas, si no se pasa ningún esquema.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

Esto cambiará el srid de la tabla de roads a 4326 de lo que era antes

SELECT UpdateGeometrySRID('roads','geom',4326);

El ejemplo previo es equivalente a esta sentencia DDL

ALTER TABLE roads 
ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 4326) 
USING ST_SetSRID(geom,4326);

Si se obtuvo la proyección incorrecta (o que se señala como desconocido) en la carga y que quería transformar a mercator web todo en una sola toma, puede hacer esto con DDL pero no hay ninguna función de gestión de PostGIS equivalente para hacerlo de una sola vez.

ALTER TABLE roads 
ALTER COLUMN geom TYPE geometry(MULTILINESTRING, 3857) USING ST_Transform(ST_SetSRID(geom,4326),3857) ;

8.4. Contructores Geométricos

ST_BdPolyFromText — Construye un polígono dando una colección arbitraria de cadenas de líneas cerradas como representación "MultiLineString" de texto "Well-Known".
ST_BdMPolyFromText — Construye un multipolígono dando una colección arbitraria de cadenas de líneas cerradas como representación "MultiLineString" de texto "Well-Known".
ST_Box2dFromGeoHash — Devuelve un BOX2D de una cadena de GeoHash.
ST_GeogFromText — Devuelve un valor especifico "geography" desde una representación "Well-Known Text" (WKT) o extendida.
ST_GeographyFromText — Devuelve un valor especifico "geography" desde una representación "Well-Known Text" (WKT) o extendida.
ST_GeogFromWKB — Crea una instancia "geography" desde la representación de una geometría en "Well-Known Binary" (WKB) o "Extended Well-Known Binary" (EWKB).
ST_GeomFromTWKB — Crea una instancia de geometría de una representación geométrica TWKB ("Tiny Well-Known Binary").
ST_GeomCollFromText — Hace una colección Geometry de la colección WKT con el SRID dado. Si no se da SRID, el valor predeterminado es 0.
ST_GeomFromEWKB — Devuelve un valor especifico de ST_Geometry desde una representación " Extended Well-Known Binary" (EWKB).
ST_GeomFromEWKT — Devuelve un valor especificado ST_Geometry desde una representación "Extended Well-Known Text" (EWKT).
ST_GeometryFromText — Devuelve un valor especifico de ST_Geometry desde una representación "Well-Known Text" (WKT). Es un alias para ST_GeomFromText
ST_GeomFromGeoHash — Devuelve una geometría de una cadena de GeoHash.
ST_GeomFromGML — Toma una representación GML como entrada de una geometría y extrae un objeto geométrico PostGIS
ST_GeomFromGeoJSON — Toma como entrada una representación geojson de una geometría y devuelve un objeto geométrico PostGIS
ST_GeomFromKML — Toma una representación de una geometría KML de entrada y devuelve un objeto geométrico PostGIS
ST_GMLToSQL — Devuelve un valor especifico ST_Geometry desde una representación GML. Esto es un alias de ST_GeomFromGML
ST_GeomFromText — Devuelve un valor especifico de ST_Geometry desde una representación "Extended Well-Known Binary" (EWKB).
ST_GeomFromWKB — Crea una instancia de geometría desde la representación de una geometría en "Well-Known Binary" (WKB) y un SRID opcional.
ST_LineFromEncodedPolyline — Crea un LineString desde una polilínea codificada.
ST_LineFromMultiPoint — Crea una LineString desde una geometría MultiPoint.
ST_LineFromText — Hace una geometría de la representación WKT con el SRID dado. Si SRID no se da, el valor predeterminado es 0.
ST_LineFromWKB — Crea un LINESTRING desde un WKB con el SRID dado
ST_LinestringFromWKB — Crea una geometría desde un WKB con el SRID dado.
ST_MakeBox2D — Crea una BOX2D definida por los puntos de la geometría dada.
ST_3DMakeBox — Crea una BOX3D definida por las geometrías puntuales 3D.
ST_MakeLine — Crea una cadena de línea desde geometrías de punto, multipunto o de línea.
ST_MakeEnvelope — Crea un polígono rectangular formado a partir de los mínimos y máximos especificados. Los valores de entrada deben estar en el SRS especificado en el SRID.
ST_MakePolygon — Crea un polígono formado por el contorno dado. Las geometrías de entrada deben ser LINESTRINGS cerradas.
ST_MakePoint — Crea una geometria puntual 2D,3DZ o 4D.
ST_MakePointM — Crea una geometria puntual con coordenadas x, y y m.
ST_MLineFromText — Devuelve un valor especificado ST_MultiLineString desde una representación WKT.
ST_MPointFromText — Hace una geometría desde un WKT con el SRID dado. Si no se da un SRID, el valor predeterminado es 0.
ST_MPolyFromText — Hace una Geometría MultiPolygon desde un WKT con el SRID dado. Si no se da SRID, el valor predeterminado es 0.
ST_Point — Devuelve un ST_Point con el valor de coordenadas dado. Es un alias de ST_MakePoint del OGC.
ST_PointFromGeoHash — Devuelve un punto de una cadena de GeoHash.
ST_PointFromText — Crea una geometría puntual desde un WKT con el SRID dado. Si no se especifica el SRID por defecto será unknown.
ST_PointFromWKB — Crea una geometría desde un WKB con el SRID dado.
ST_Polygon — Devuelve un polygon construido desde un linestring especifico y un SRID.
ST_PolygonFromText — Hace una geometría desde un WKT con el SRID dado. Si no se da un SRID, el valor predeterminado es 0.
ST_WKBToSQL — Devuelve un valor especifico de ST_Geometry desde una representación "Well-Known Binary" (WKB). Es un alias para ST_GeomFromWKB que no toma srid
ST_WKTToSQL — Devuelve un valor especifico de ST_Geometry desde una representación "Well-Known Text" (WKT). Es un alias para ST_GeomFromText

Name

ST_BdPolyFromText — Construye un polígono dando una colección arbitraria de cadenas de líneas cerradas como representación "MultiLineString" de texto "Well-Known".

Synopsis

geometry ST_BdPolyFromText(text WKT, integer srid);

Descripción

Construye un polígono dando una colección arbitraria de cadenas de líneas cerradas como representación "MultiLineString" de texto "Well-Known".

[Note]

Envia un error si la cadena WKT no representa una MULTILINESTRING. Envía un error si la salida es un MULTIPOLYGON; en este caso puedes utilizar ST_BdMPolyFromText, o mira ST_BuildArea() para un enfoque mas especifico de postgis.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

Disponibilidad: 1.1.0 - requiere GEOS >= 2.1.0.

Ejemplos

Proximamente

Name

ST_BdMPolyFromText — Construye un multipolígono dando una colección arbitraria de cadenas de líneas cerradas como representación "MultiLineString" de texto "Well-Known".

Synopsis

geometry ST_BdMPolyFromText(text WKT, integer srid);

Descripción

Construye un Polígono dando una colección arbitraria de cadenas de líneas cerradas, polígonos, "MultiLineString" en formato de texto "Well-Known".

[Note]

Envia un error si el WKT no es una MULTILINESTRING. Fuerza una salida MULTIPOLYGON aunque el resultado este compuesto por un único POLYGON; puedes utilizar ST_BdPolyFromText si estas seguro que un único POLYGON será el resultado de la operación, o ver ST_BuildArea() para un enfoque mas especifico de postgis.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

Disponibilidad: 1.1.0 - requiere GEOS >= 2.1.0.

Ejemplos

Proximamente

Name

ST_Box2dFromGeoHash — Devuelve un BOX2D de una cadena de GeoHash.

Synopsis

box2d ST_Box2dFromGeoHash(text geohash, integer precision=full_precision_of_geohash);

Descripción

Devuelve un BOX2D de una cadena de GeoHash.

Si no es especificada la precisión ST_Box2dFromGeoHash devuelve un BOX2D basado en la precisión completa de la cadena de GeoHash de entrada.

Si es especificada la precisión ST_Box2dFromGeoHash utilizará muchos caracteres del GeoHash para crear el BOX2D. Los valores de precisión más bajos resultan en BOX2Ds más grandes y los valores más grandes aumentan la precisión.

Disponibilidad: 2.1.0

Ejemplos

SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0');

                st_geomfromgeohash
--------------------------------------------------
 BOX(-115.172816 36.114646,-115.172816 36.114646)

SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 0);

 st_box2dfromgeohash
----------------------
 BOX(-180 -90,180 90)

 SELECT ST_Box2dFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10);
                            st_box2dfromgeohash
---------------------------------------------------------------------------
 BOX(-115.17282128334 36.1146408319473,-115.172810554504 36.1146461963654)
                
                

Name

ST_GeogFromText — Devuelve un valor especifico "geography" desde una representación "Well-Known Text" (WKT) o extendida.

Synopsis

geography ST_GeogFromText(text EWKT);

Descripción

Devuelve un objeto geográfico del texto bien conocido o de la representación bien conocida extendida. Se asume SRID 4326 si no se especifica. Este es un alias para ST_GeographyFromText. Los puntos se expresan siempre en forma latitud longitud.

Ejemplos

--- convertir coordenadas latitud longitud a geográficas
ALTER TABLE sometable ADD COLUMN geog geography(POINT,4326);
UPDATE sometable SET geog = ST_GeogFromText('SRID=4326;POINT(' || lon || ' ' || lat || ')');

--- Especificar un punto geográfico usando EPSG:4267, NAD27
SELECT ST_AsEWKT(ST_GeogFromText('SRID=4267;POINT(-77.0092 38.889588)'));
                        

Name

ST_GeographyFromText — Devuelve un valor especifico "geography" desde una representación "Well-Known Text" (WKT) o extendida.

Synopsis

geography ST_GeographyFromText(text EWKT);

Descripción

Devuelve un objeto geográfico de la representación bien conocida de texto. Se supone SRID 4326 si no se especifica.


Name

ST_GeogFromWKB — Crea una instancia "geography" desde la representación de una geometría en "Well-Known Binary" (WKB) o "Extended Well-Known Binary" (EWKB).

Synopsis

geography ST_GeogFromWKB(bytea wkb);

Descripción

La función ST_GeogFromWKB , toma una representación de una geometría en "Well-Known Binary" (WKB) o la versión extendida de PostGIS y crea la instancia apropiada de tipo "geography". Esta función juega el rol de "Geometry Factory" en SQL.

Si no se define un SRID, por defecto es 4326 (WGS 84 long lat).

This method supports Circular Strings and Curves

Ejemplos

--Aunque bytes rep contiene solo \, esto se necesita para escapar caracteres cuando se e insertan en una tabla
SELECT ST_AsText(
ST_GeogFromWKB(E'\\001\\002\\000\\000\\000\\002\\000\\000\\000\\037\\205\\353Q\\270~\\\\\\300\\323Mb\\020X\\231C@\\020X9\\264\\310~\\\\\\300)\\\\\\217\\302\\365\\230C@')
);
                                          st_astext
------------------------------------------------------
 LINESTRING(-113.98 39.198,-113.981 39.195)
(1 row)


Name

ST_GeomFromTWKB — Crea una instancia de geometría de una representación geométrica TWKB ("Tiny Well-Known Binary").

Synopsis

geometry ST_GeomFromTWKB(bytea twkb);

Descripción

La función ST_GeomFromTWKB toma un TWKB ("Tiny Well-Known Binary") a una representación geométrica (WKB) y crea una instancia apropiada de un tipo de geometía.

Ejemplos

SELECT ST_AsText(ST_GeomFromTWKB(ST_AsTWKB('LINESTRING(126 34, 127 35)'::geometry)));

         st_astext
-----------------------------
 LINESTRING(126 34, 127 35)
(1 row)


SELECT ST_AsEWKT(
  ST_GeomFromTWKB(E'\\x620002f7f40dbce4040105')
);
                                          st_asewkt
------------------------------------------------------
LINESTRING(-113.98 39.198,-113.981 39.195)
(1 row)

Ver también

ST_AsTWKB


Name

ST_GeomCollFromText — Hace una colección Geometry de la colección WKT con el SRID dado. Si no se da SRID, el valor predeterminado es 0.

Synopsis

geometry ST_GeomCollFromText(text WKT, integer srid);

geometry ST_GeomCollFromText(text WKT);

Descripción

Hace una colección Geometry de la representación de texto conocido (WKT) con el SRID dado. Si no se da SRID, el valor predeterminado es 0.

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

Devuelve null si el WKT no es una GEOMETRYCOLLECTION

[Note]

Si estas completamente seguro que todas tus geometrias WKT son colecciones, no utilices esta función. Es mas lenta que ST_GeomFromText ya que añade pasos de validación adicionales.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification.

Ejemplos

SELECT ST_GeomCollFromText('GEOMETRYCOLLECTION(POINT(1 2),LINESTRING(1 2, 3 4))');

Name

ST_GeomFromEWKB — Devuelve un valor especifico de ST_Geometry desde una representación " Extended Well-Known Binary" (EWKB).

Synopsis

geometry ST_GeomFromEWKB(bytea EWKB);

Descripción

Construye un objeto ST_Geometry de PostGIS desde un formato OGC "Extended Well-Known Binary" (EWKB).

[Note]

El formato EWKB no es un estándar del OGC, sino un formato especifico de PostGIS que incluye el identificador del sistema de referencia espacial (SRID)

Mejora: 2.0.0 se introdujeron soporte de superficies poliédricas y TIN.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos

Representación binaria de LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932) en NAD 83 long lat (4269).

[Note]

Nota: Aunque los arrays de bits están delimitados por \ y deben tener ', necesitaremos escapar ambos con \ y '' si el valor de standard_conforming_strings es off. Asi que esto puede no ser exactamente como la representación AsEWKB.

SELECT ST_GeomFromEWKB(E'\\001\\002\\000\\000 \\255\\020\\000\\000\\003\\000\\000\\000\\344J=
\\013B\\312Q\\300n\\303(\\010\\036!E@''\\277E''K
\\312Q\\300\\366{b\\235*!E@\\225|\\354.P\\312Q
\\300p\\231\\323e1!E@');
[Note]

En PostgreSQL 9.1 +-standard_conforming_strings se establece en on de forma predeterminada, donde como en versiones anteriores se estableció en off. Puede cambiar los valores predeterminados según sea necesario para una sola consulta o a nivel de base de datos o de servidor. A continuación se muestra cómo lo haría con standard_conforming_strings = on. En este caso nos escapamos del ' with standard ansi ', pero las barras no se escapan

set standard_conforming_strings = on;
SELECT ST_GeomFromEWKB('\001\002\000\000 \255\020\000\000\003\000\000\000\344J=\012\013B
    \312Q\300n\303(\010\036!E@''\277E''K\012\312Q\300\366{b\235*!E@\225|\354.P\312Q\012\300p\231\323e1')

Name

ST_GeomFromEWKT — Devuelve un valor especificado ST_Geometry desde una representación "Extended Well-Known Text" (EWKT).

Synopsis

geometry ST_GeomFromEWKT(text EWKT);

Descripción

Construye un objeto PostGIS ST_Geometry desde una representación OGC "Extended Well-Known text" (EWKT).

[Note]

El formato EWKT no es un estándar OGC, sino un formato especifico PostGIS que incluye el identificador del sistema de referencia espacial (SRID).

Mejora: 2.0.0 se introdujeron soporte de superficies poliédricas y TIN.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos

SELECT ST_GeomFromEWKT('SRID=4269;LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)');
SELECT ST_GeomFromEWKT('SRID=4269;MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))');

SELECT ST_GeomFromEWKT('SRID=4269;POINT(-71.064544 42.28787)');

SELECT ST_GeomFromEWKT('SRID=4269;POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))');

SELECT ST_GeomFromEWKT('SRID=4269;MULTIPOLYGON(((-71.1031880899493 42.3152774590236,
-71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307,
-71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248,
-71.102505233663 42.3144722937587,-71.10277487471 42.3141658254797,
-71.103113945163 42.3142739188902,-71.10324876416 42.31402489987,
-71.1033002961013 42.3140393340215,-71.1033488797549 42.3139495090772,
-71.103396240451 42.3138632439557,-71.1041521907712 42.3141153348029,
-71.1041411411543 42.3141545014533,-71.1041287795912 42.3142114839058,
-71.1041188134329 42.3142693656241,-71.1041112482575 42.3143272556118,
-71.1041072845732 42.3143851580048,-71.1041057218871 42.3144430686681,
-71.1041065602059 42.3145009876017,-71.1041097995362 42.3145589148055,
-71.1041166403905 42.3146168544148,-71.1041258822717 42.3146748022936,
-71.1041375307579 42.3147318674446,-71.1041492906949 42.3147711126569,
-71.1041598612795 42.314808571739,-71.1042515013869 42.3151287620809,
-71.1041173835118 42.3150739481917,-71.1040809891419 42.3151344119048,
-71.1040438678912 42.3151191367447,-71.1040194562988 42.3151832057859,
-71.1038734225584 42.3151140942995,-71.1038446938243 42.3151006300338,
-71.1038315271889 42.315094347535,-71.1037393329282 42.315054824985,
-71.1035447555574 42.3152608696313,-71.1033436658644 42.3151648370544,
-71.1032580383161 42.3152269126061,-71.103223066939 42.3152517403219,
-71.1031880899493 42.3152774590236)),
((-71.1043632495873 42.315113108546,-71.1043583974082 42.3151211109857,
-71.1043443253471 42.3150676015829,-71.1043850704575 42.3150793250568,-71.1043632495873 42.315113108546)))');
-- Cadena circular 3d
SELECT ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)');
-- Ejemplo de superficie de poliedros
SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE(
        ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
        ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)),
        ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
        ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
        ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)),
        ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1))
)');

Name

ST_GeometryFromText — Devuelve un valor especifico de ST_Geometry desde una representación "Well-Known Text" (WKT). Es un alias para ST_GeomFromText

Synopsis

geometry ST_GeometryFromText(text WKT);

geometry ST_GeometryFromText(text WKT, integer srid);

Descripción

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.40

Ver también

ST_GeomFromText


Name

ST_GeomFromGeoHash — Devuelve una geometría de una cadena de GeoHash.

Synopsis

geometry ST_GeomFromGeoHash(text geohash, integer precision=full_precision_of_geohash);

Descripción

Devuelve una geometría de una cadena de GeoHash. La geometría será un polígono que representa los límites de GeoHash.

Si no se especifica ninguna precisión, ST_GeomFromGeoHash devuelve un polígono basándose en la precisión completa de la cadena de GeoHash de entrada.

Si se especifica la precisión, ST_GeomFromGeoHash utilizará muchos caracteres del GeoHash para crear el polígono.

Disponibilidad: 2.1.0

Ejemplos

SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0'));
                                                        st_astext
--------------------------------------------------------------------------------------------------------------------------
 POLYGON((-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646,-115.172816 36.114646))

SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4));
                                                          st_astext
------------------------------------------------------------------------------------------------------------------------------
 POLYGON((-115.3125 36.03515625,-115.3125 36.2109375,-114.9609375 36.2109375,-114.9609375 36.03515625,-115.3125 36.03515625))

SELECT ST_AsText(ST_GeomFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10));
                                                                                       st_astext
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 POLYGON((-115.17282128334 36.1146408319473,-115.17282128334 36.1146461963654,-115.172810554504 36.1146461963654,-115.172810554504 36.1146408319473,-115.17282128334 36.1146408319473))
                
                

Name

ST_GeomFromGML — Toma una representación GML como entrada de una geometría y extrae un objeto geométrico PostGIS

Synopsis

geometry ST_GeomFromGML(text geomgml);

geometry ST_GeomFromGML(text geomgml, integer srid);

Descripción

Construye un objeto ST_Geometry de PostGIS desde una representación OGC GML.

ST_GeomFromGML funciona solamente para fragmentos geométricos GML. Lanza un error si intentas utilizar un documento GML completo.

Versiones OGC GML soportadas:

  • GML 3.2.1 Namespace

  • GML 3.1.1 Simple Features profile SF-2 (con GML 3.1.0 y 3.0.0 compatibilidad para versiones anteriores)

  • GML 2.1.2

OGC GML standards, cf: http://www.opengeospatial.org/standards/gml:

Disponibilidad: 1.5, requiere libxml2 1.6+

Mejora: 2.0.0 se introdujeron soporte de superficies poliédricas y TIN.

Mejorada: 2.0.0 se agregó el parámetro por defecto opcional srid.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

GML permite dimensiones mixtas (2D y 3D dentro de la misma MultiGeometry, por ejemplo). Como las geometrías PostGIS no lo hacen, ST_GeomFromGML convierte todas las geometrías a 2D si se encuentra una dimensión Z que falta.

GML soporta SRS diferentes en la misma MultiGeometry. Como las geometrías de PostGIS no lo hacen, ST_GeomFromGML, en este caso, reproyecta todas las subgeometrías al SRS del nodo padre. Si no esta disponible el atributo srsName en el nodo padre del GML, la función lanza un error.

La función ST_GeomFromGML no es muy estricta con los namespaces explícitos de un GML. Puedes evitar mencionarlos explícitamente para usos comunes. Pero lo necesitas si deseas utilizar la función XLink dentro del GML.

[Note]

La función ST_GeomFromGML no soporta geometrias curvas SQL/MM.

Ejemplos - Una geometría simple con srsName

SELECT ST_GeomFromGML('
                <gml:LineString srsName="EPSG:4269">
                        <gml:coordinates>
                                -71.16028,42.258729 -71.160837,42.259112 -71.161143,42.25932
                        </gml:coordinates>
                </gml:LineString
>');
                

Ejemplos - uso de XLink

SELECT ST_GeomFromGML('
                <gml:LineString xmlns:gml="http://www.opengis.net/gml"
                                xmlns:xlink="http://www.w3.org/1999/xlink"
                                srsName="urn:ogc:def:crs:EPSG::4269">
                        <gml:pointProperty>
                                <gml:Point gml:id="p1"
><gml:pos
>42.258729 -71.16028</gml:pos
></gml:Point>
                        </gml:pointProperty>
                        <gml:pos
>42.259112 -71.160837</gml:pos>
                        <gml:pointProperty>
                                <gml:Point xlink:type="simple" xlink:href="#p1"/>
                        </gml:pointProperty>
                </gml:LineString
>'););
                

Ejemplos - Superficie polihédrica

SELECT ST_AsEWKT(ST_GeomFromGML('
<gml:PolyhedralSurface>
<gml:polygonPatches>
  <gml:PolygonPatch>
    <gml:exterior>
      <gml:LinearRing
><gml:posList srsDimension="3"
>0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList
></gml:LinearRing>
    </gml:exterior>
  </gml:PolygonPatch>
  <gml:PolygonPatch>
    <gml:exterior>
        <gml:LinearRing
><gml:posList srsDimension="3"
>0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList
></gml:LinearRing>
    </gml:exterior>
  </gml:PolygonPatch>
  <gml:PolygonPatch>
    <gml:exterior>
        <gml:LinearRing
><gml:posList srsDimension="3"
>0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList
></gml:LinearRing>
    </gml:exterior>
  </gml:PolygonPatch>
  <gml:PolygonPatch>
    <gml:exterior>
        <gml:LinearRing
><gml:posList srsDimension="3"
>1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList
></gml:LinearRing>
    </gml:exterior>
  </gml:PolygonPatch>
  <gml:PolygonPatch>
    <gml:exterior>
        <gml:LinearRing
><gml:posList srsDimension="3"
>0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList
></gml:LinearRing>
    </gml:exterior>
  </gml:PolygonPatch>
  <gml:PolygonPatch>
    <gml:exterior>
        <gml:LinearRing
><gml:posList srsDimension="3"
>0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList
></gml:LinearRing>
    </gml:exterior>
  </gml:PolygonPatch>
</gml:polygonPatches>
</gml:PolyhedralSurface
>'));

-- result --
 POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),
 ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),
 ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),
 ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),
 ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),
 ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))
                

Name

ST_GeomFromGeoJSON — Toma como entrada una representación geojson de una geometría y devuelve un objeto geométrico PostGIS

Synopsis

geometry ST_GeomFromGeoJSON(text geomjson);

Descripción

Construye un objeto geométrico PostGIS desde una representación GeoJSON.

ST_GeomFromGeoJSON solo funciona con fragmentos geométricos JSON. Devolverá un error si intentas utilizar un documento JSON completo.

Disponibilidad: 2.0.0 necesita de - JSON-C >= 0.9

[Note]

Si no tienes activado el soporte de JSON-C, tendrás un mensaje error en vez de ver la salida. Para activar el soporte JSON-C, ejecuta configure --with-jsondir=/path/to/json-c. Para mas detalles ve a Section 2.4.1, “Configuración”.

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"Point","coordinates":[-48.23456,20.12345]}')) As wkt;
wkt
------
POINT(-48.23456 20.12345)
-- un linestring 3D
SELECT ST_AsText(ST_GeomFromGeoJSON('{"type":"LineString","coordinates":[[1,2,3],[4,5,6],[7,8,9]]}')) As wkt;

wkt
-------------------
LINESTRING(1 2,4 5,7 8)

Name

ST_GeomFromKML — Toma una representación de una geometría KML de entrada y devuelve un objeto geométrico PostGIS

Synopsis

geometry ST_GeomFromKML(text geomkml);

Descripción

Construye un objeto ST_Geometry de PostGIS desde una representación OGC KML.

ST_GeomFromKML solo funciona con fragmentos geométricos KML. Devuelve un error si intentas utilizar un documento KML completo.

Versiones soportadas OGC KML:

  • KML 2.2.0 Namespace

OGC KML standards, cf: http://www.opengeospatial.org/standards/kml:

Disponibilidad: 1.5, libxml2 2.6+

This function supports 3d and will not drop the z-index.

[Note]

ST_GeomFromKML no soporta geometrías curvas SQL/MM.

Ejemplos - Una geometría simple con srsName

SELECT ST_GeomFromKML('
                <LineString>
                        <coordinates
>-71.1663,42.2614
                                -71.1667,42.2616</coordinates>
                </LineString
>');
                

Name

ST_GMLToSQL — Devuelve un valor especifico ST_Geometry desde una representación GML. Esto es un alias de ST_GeomFromGML

Synopsis

geometry ST_GMLToSQL(text geomgml);

geometry ST_GMLToSQL(text geomgml, integer srid);

Descripción

This method implements the SQL/MM specification. SQL-MM 3: 5.1.50 (excepto para soporte de curvas).

Disponibilidad: 1.5, requiere libxml2 1.6+

Mejora: 2.0.0 se introdujeron soporte de superficies poliédricas y TIN.

Mejorada: 2.0.0 se agregó el parámetro por defecto opcional srid.


Name

ST_GeomFromText — Devuelve un valor especifico de ST_Geometry desde una representación "Extended Well-Known Binary" (EWKB).

Synopsis

geometry ST_GeomFromText(text WKT);

geometry ST_GeomFromText(text WKT, integer srid);

Descripción

Construye un objeto ST_Geometry de PostGIS desde una representación OGC "Well-Known Text" (WKT).

[Note]

Hay dos variantes de la función ST_GeomFromText. El primero no toma SRID y devuelve una geometría sin sistema de referencia espacial definido (SRID = 0). La segunda toma un SRID como segundo argumento y devuelve una geometría que incluye esta SRID como parte de sus metadatos.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2 - la opción SRID es de la suite de conformidad.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.40

This method supports Circular Strings and Curves

[Warning]

Cambiado: 2.0.0 En las versiones anteriores de PostGIS ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') estaba permitido. Esto no esta permitido ahora en PostGIS 2.0.0 para ajustarse mejor a las normas SQL/MM. Esto debería ser escrito como ST_GeomFromText('GEOMETRYCOLLECTION EMPTY')

Ejemplos

SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)');
SELECT ST_GeomFromText('LINESTRING(-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932)',4269);

SELECT ST_GeomFromText('MULTILINESTRING((-71.160281 42.258729,-71.160837 42.259113,-71.161144 42.25932))');

SELECT ST_GeomFromText('POINT(-71.064544 42.28787)');

SELECT ST_GeomFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))');

SELECT ST_GeomFromText('MULTIPOLYGON(((-71.1031880899493 42.3152774590236,
-71.1031627617667 42.3152960829043,-71.102923838298 42.3149156848307,
-71.1023097974109 42.3151969047397,-71.1019285062273 42.3147384934248,
-71.102505233663 42.3144722937587,-71.10277487471 42.3141658254797,
-71.103113945163 42.3142739188902,-71.10324876416 42.31402489987,
-71.1033002961013 42.3140393340215,-71.1033488797549 42.3139495090772,
-71.103396240451 42.3138632439557,-71.1041521907712 42.3141153348029,
-71.1041411411543 42.3141545014533,-71.1041287795912 42.3142114839058,
-71.1041188134329 42.3142693656241,-71.1041112482575 42.3143272556118,
-71.1041072845732 42.3143851580048,-71.1041057218871 42.3144430686681,
-71.1041065602059 42.3145009876017,-71.1041097995362 42.3145589148055,
-71.1041166403905 42.3146168544148,-71.1041258822717 42.3146748022936,
-71.1041375307579 42.3147318674446,-71.1041492906949 42.3147711126569,
-71.1041598612795 42.314808571739,-71.1042515013869 42.3151287620809,
-71.1041173835118 42.3150739481917,-71.1040809891419 42.3151344119048,
-71.1040438678912 42.3151191367447,-71.1040194562988 42.3151832057859,
-71.1038734225584 42.3151140942995,-71.1038446938243 42.3151006300338,
-71.1038315271889 42.315094347535,-71.1037393329282 42.315054824985,
-71.1035447555574 42.3152608696313,-71.1033436658644 42.3151648370544,
-71.1032580383161 42.3152269126061,-71.103223066939 42.3152517403219,
-71.1031880899493 42.3152774590236)),
((-71.1043632495873 42.315113108546,-71.1043583974082 42.3151211109857,
-71.1043443253471 42.3150676015829,-71.1043850704575 42.3150793250568,-71.1043632495873 42.315113108546)))',4326);

SELECT ST_GeomFromText('CIRCULARSTRING(220268 150415,220227 150505,220227 150406)');
        

Name

ST_GeomFromWKB — Crea una instancia de geometría desde la representación de una geometría en "Well-Known Binary" (WKB) y un SRID opcional.

Synopsis

geometry ST_GeomFromWKB(bytea geom);

geometry ST_GeomFromWKB(bytea geom, integer srid);

Descripción

La función ST_GeomFromWKB, toma una representación binaria "well-known" de una geometría y un ID de un Sistema de Referencia Espacial (SRID) y crea una instancia del tipo de geometría adecuado. Esta función juega un rol de "Geometry Factory" en SQL. Es un nombre alternativo para ST_WKBToSQL.

Si no se especifica SRID, el valor predeterminado es 0 (desconocido).

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.7.2 - El SRID opcional es para el paquete de conformidad

This method implements the SQL/MM specification. SQL-MM 3: 5.1.41

This method supports Circular Strings and Curves

Ejemplos

-- Aunque bytea rep contiene single \, estos deben ser escapados al insertar en una tabla
                -- a menos que standard_conforming_strings esté establecido en on.
SELECT ST_AsEWKT(
ST_GeomFromWKB(E'\\001\\002\\000\\000\\000\\002\\000\\000\\000\\037\\205\\353Q\\270~\\\\\\300\\323Mb\\020X\\231C@\\020X9\\264\\310~\\\\\\300)\\\\\\217\\302\\365\\230C@',4326)
);
                                          st_asewkt
------------------------------------------------------
 SRID=4326;LINESTRING(-113.98 39.198,-113.981 39.195)
(1 row)

SELECT
  ST_AsText(
        ST_GeomFromWKB(
          ST_AsEWKB('POINT(2 5)'::geometry)
        )
  );
 st_astext
------------
 POINT(2 5)
(1 row)

Name

ST_LineFromEncodedPolyline — Crea un LineString desde una polilínea codificada.

Synopsis

geometry ST_LineFromEncodedPolyline(text polyline, integer precision=5);

Descripción

Crea un LineString desde una cadena de polilínea codificada.

Ver http://developers.google.com/maps/documentation/utilities/polylinealgorithm

Disponibilidad: 2.2.0

Ejemplos

-- Crear una cadena de línea desde una polilínea
SELECT ST_AsEWKT(ST_LineFromEncodedPolyline('_p~iF~ps|U_ulLnnqC_mqNvxq`@'));
--result--
LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)
    

Name

ST_LineFromMultiPoint — Crea una LineString desde una geometría MultiPoint.

Synopsis

geometry ST_LineFromMultiPoint(geometry aMultiPoint);

Descripción

Crea una LineString desde una geometría MultiPoint.

This function supports 3d and will not drop the z-index.

Ejemplos

--Crea una linea 3d desde un multipunto 3d
SELECT ST_AsEWKT(ST_LineFromMultiPoint(ST_GeomFromEWKT('MULTIPOINT(1 2 3, 4 5 6, 7 8 9)')));
--resultado--
LINESTRING(1 2 3,4 5 6,7 8 9)
                

Name

ST_LineFromText — Hace una geometría de la representación WKT con el SRID dado. Si SRID no se da, el valor predeterminado es 0.

Synopsis

geometry ST_LineFromText(text WKT);

geometry ST_LineFromText(text WKT, integer srid);

Descripción

Hace una Geometry desde un WKT con el SRID dado. Si no se da un SRID, el valor predeterminado es 0. Si el WKT pasado no es un LINESTRING, se devuelve null.

[Note]

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

[Note]

Si sabes que todas tus geometrías son LINESTRING, es mas eficiente el uso de ST_GeomFromText. Esto llama únicamente a ST_GeomFromText y añade validaciones adicionales que devuelven un linestring.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification. SQL-MM 3: 7.2.8

Ejemplos

SELECT ST_LineFromText('LINESTRING(1 2, 3 4)') AS aline, ST_LineFromText('POINT(1 2)') AS null_return;
aline                            | null_return
------------------------------------------------
010200000002000000000000000000F ... | t
                

Ver también

ST_GeomFromText


Name

ST_LineFromWKB — Crea un LINESTRING desde un WKB con el SRID dado

Synopsis

geometry ST_LineFromWKB(bytea WKB);

geometry ST_LineFromWKB(bytea WKB, integer srid);

Descripción

La función ST_GeomFromWKB, toma una representación binaria "well-known" de una geometría y un ID de un Sistema de Referencia Espacial (SRID) y crea una instancia del tipo de geometría adecuado - en este caso una geometría LINESTRING. Esta función juega un rol de "Geometry Factory" en SQL.

Si no se especifica un SRID, el valor predeterminado es 0. NULL se devuelve si la entrada bytea no representa un LINESTRING.

[Note]

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

[Note]

Si sabes que todas tus geometrías son LINESTRING, es mas eficiente el uso de ST_GeomFromWKB. Esta función simplemente llama a ST_GeomFromWKB y añade validaciones adicionales y devuelve una linestring.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification. SQL-MM 3: 7.2.9

Ejemplos

SELECT ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('LINESTRING(1 2, 3 4)'))) AS aline,
                ST_LineFromWKB(ST_AsBinary(ST_GeomFromText('POINT(1 2)'))) IS NULL AS null_return;
aline                            | null_return
------------------------------------------------
010200000002000000000000000000F ... | t
                

Name

ST_LinestringFromWKB — Crea una geometría desde un WKB con el SRID dado.

Synopsis

geometry ST_LinestringFromWKB(bytea WKB);

geometry ST_LinestringFromWKB(bytea WKB, integer srid);

Descripción

La función ST_LinestringFromWKB, toma una representación de una geometría en "well-known binary" y un ID de un Sistema de Referencia Espacial (SRID) y crea una instancia del tipo apropiado de geometría - en este caso, una geometría LINESTRING. Esta función juega un rol de "Geometry Factory" en SQL.

Si no se especifica un SRID, el valor predeterminado es 0.NULL se devuelve si la entrada bytea no representa una geometría LINESTRING. Esto es un alias para ST_LineFromWKB.

[Note]

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

[Note]

Si sabes que todas tus geometrías son LINESTRING, es mas eficiente el uso de ST_GeomFromWKB. Esta función simplemente llama a ST_GeomFromWKB y añade validaciones adicionales y devuelve una LINESTRING.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification. SQL-MM 3: 7.2.9

Ejemplos

SELECT
  ST_LineStringFromWKB(
        ST_AsBinary(ST_GeomFromText('LINESTRING(1 2, 3 4)'))
  ) AS aline,
  ST_LinestringFromWKB(
        ST_AsBinary(ST_GeomFromText('POINT(1 2)'))
  ) IS NULL AS null_return;
   aline                            | null_return
------------------------------------------------
010200000002000000000000000000F ... | t

Name

ST_MakeBox2D — Crea una BOX2D definida por los puntos de la geometría dada.

Synopsis

box2d ST_MakeBox2D(geometry pointLowLeft, geometry pointUpRight);

Descripción

Crea una BOX2D definida por los puntos de la geometría dada. Esto es útil para hacer consultas de rango

Ejemplos

--Devuelve todos los registros que residen por completo o solo una parte en la bounding box de un atlas nacional de USA
--Se asume que las geometrias estan guardadas con SRID = 2163 (US National atlas equal area)
SELECT feature_id, feature_name, the_geom
FROM features
WHERE the_geom && ST_SetSRID(ST_MakeBox2D(ST_Point(-989502.1875, 528439.5625),
        ST_Point(-987121.375 ,529933.1875)),2163)

Name

ST_3DMakeBox — Crea una BOX3D definida por las geometrías puntuales 3D.

Synopsis

box3d ST_3DMakeBox(geometry point3DLowLeftBottom, geometry point3DUpRightTop);

Descripción

Crea una BOX3D definida por las geometrías puntuales 2 3D dadas.

Esta función soporta 3D y no suprime el indice z.

Cambiado: 2.0.0 En versiones anteriores se solía llamar ST_MakeBox3D

Ejemplos

SELECT ST_3DMakeBox(ST_MakePoint(-989502.1875, 528439.5625, 10),
        ST_MakePoint(-987121.375 ,529933.1875, 10)) As abb3d

--bb3d--
--------
BOX3D(-989502.1875 528439.5625 10,-987121.375 529933.1875 10)
        

Name

ST_MakeLine — Crea una cadena de línea desde geometrías de punto, multipunto o de línea.

Synopsis

geometry ST_MakeLine(geometry set geoms);

geometry ST_MakeLine(geometry geom1, geometry geom2);

geometry ST_MakeLine(geometry[] geoms_array);

Descripción

ST_MakeLine viene en 3 formas: un agregado espacial que toma filas de geometrías de punto, multipunto o de línea y devuelve una cadena de línea, una función que toma una matriz de punto, multipunto, o línea, y una función regular que toma dos puntos, multipunto, o geometrías de línea. Es posible que desee utilizar una subselección para ordenar los puntos antes de alimentarlos a la versión global de esta función.

Las entradas que no sean de punto, multipunto o líneas se omiten.

Al agregar componentes de línea, los nodos comunes al principio de las líneas se eliminan de la salida. Los nodos comunes en las entradas Point y multipunto no se eliminan.

This function supports 3d and will not drop the z-index.

Disponibilidad: 2.3.0 - Se introdujo soporte para elementos de entrada multipunto

Disponibilidad: 2.0.0 - Se introdujo el soporte de una cadena lineal como elemento de entrada

Disponibilidad: 1.4.0 - ST_MakeLine (geomarray) fue introducido. Las Funciones agregadas ST_MakeLine se mejoraron para manejar más puntos más rápido.

Ejemplos: Version Agregado Espacial

Este ejemplo toma una secuencia de puntos GPS y crea un registro para cada trayecto GPS donde el campo geómetra es una cadena lineal compuesta de los puntos GPS en el orden del trayecto.

-- Para versiones anteriores a PostgreSQL 9.0 - Esto suele funcionar,
-- pero el planificador puede en ocasiones optar por no respetar el orden de la subconsulta
SELECT gps.gps_track, ST_MakeLine(gps.the_geom) As newgeom
        FROM (SELECT gps_track,gps_time, the_geom
                        FROM gps_points ORDER BY gps_track, gps_time) As gps
        GROUP BY gps.gps_track;
-- Si está usando PostgreSQL 9.0 +
-- (puede utilizar el nuevo pedido mediante soporte para agregados)
-- esta es una forma garantizada de obtener una cadena de línea correctamente ordenada
-- Su orden por parte puede ordenar por más de una columna si es necesario
SELECT gps.gps_track, ST_MakeLine(gps.the_geom ORDER BY gps_time) As newgeom
        FROM gps_points As gps
        GROUP BY gps.gps_track;

Ejemplos: Version Agregado No-Espacial

El primer ejemplo es un ejemplo simple de una cadena lineal compuesta por 2 puntos. El segundo formula una cadena lineal a partir de dos puntos dibujados por el usuario. El tercero es un hecho aislado que une 2 puntos 3D para crear una línea en el espacio 3D.

SELECT ST_AsText(ST_MakeLine(ST_MakePoint(1,2), ST_MakePoint(3,4)));
          st_astext
---------------------
 LINESTRING(1 2,3 4)

SELECT userpoints.id, ST_MakeLine(startpoint, endpoint) As drawn_line
        FROM userpoints ;

SELECT ST_AsEWKT(ST_MakeLine(ST_MakePoint(1,2,3), ST_MakePoint(3,4,5)));
                st_asewkt
-------------------------
 LINESTRING(1 2 3,3 4 5)
                        

Ejemplos: Utilizando la versión Array

SELECT ST_MakeLine(ARRAY(SELECT ST_Centroid(the_geom) FROM visit_locations ORDER BY visit_time));

-- Haciendo una linea 3d com 3 puntos 3-d
SELECT ST_AsEWKT(ST_MakeLine(ARRAY[ST_MakePoint(1,2,3),
                                ST_MakePoint(3,4,5), ST_MakePoint(6,6,6)]));
                st_asewkt
-------------------------
LINESTRING(1 2 3,3 4 5,6 6 6)
                        

Name

ST_MakeEnvelope — Crea un polígono rectangular formado a partir de los mínimos y máximos especificados. Los valores de entrada deben estar en el SRS especificado en el SRID.

Synopsis

geometry ST_MakeEnvelope(double precision xmin, double precision ymin, double precision xmax, double precision ymax, integer srid=unknown);

Descripción

Crea un polígono rectangular formado a partir de los mínimos y máximos de la caja dada. Los valores de entrada deben estar en el SRS especificado por el SRID. Si no se especifica SRID se supone que el sistema de referencia espacial es desconocido.

Disponibilidad: 1.5

Mejorado: 2.0: Se introdujo capacidad de especificar una caja sin especificar un SRID.

Ejemplo: Contruir un poligono correspondiente a la bounding box

SELECT ST_AsText(ST_MakeEnvelope(10, 10, 11, 11, 4326));

st_asewkt
-----------
POLYGON((10 10, 10 11, 11 11, 11 10, 10 10))
                          

Name

ST_MakePolygon — Crea un polígono formado por el contorno dado. Las geometrías de entrada deben ser LINESTRINGS cerradas.

Synopsis

geometry ST_MakePolygon(geometry linestring);

geometry ST_MakePolygon(geometry outerlinestring, geometry[] interiorlinestrings);

Descripción

Crea un polígono formado por el contorno dado. Las geometrias de entrada deben ser LINESTRINGS cerradas. Viene en 2 variantes.

Variante 1: Toma una cadena de líneas cerrada.

Variante 2: Crea un Poligono formado por el contorno dado y un array con huecos. Puedes construir un array de geometría utilizando ST_Accum o los constructores ARRAY[] y ARRAY() de PostgreSQL. Las geometrías de entrada deben ser LINESTRINGS cerradas.

[Note]

Esta función no acepta una MULTILINESTRING. Utiliza ST_LineMerge o ST_Dump para generar una linestring.

This function supports 3d and will not drop the z-index.

Ejemplos: LINESTRING única y cerrada

--linea 2d
SELECT ST_MakePolygon(ST_GeomFromText('LINESTRING(75.15 29.53,77 29,77.6 29.5, 75.15 29.53)'));
--Si la cadena lineal no es cerrada
--puedes añadir el punto de inicio para cerrarla
SELECT ST_MakePolygon(ST_AddPoint(foo.open_line, ST_StartPoint(foo.open_line)))
FROM (
SELECT ST_GeomFromText('LINESTRING(75.15 29.53,77 29,77.6 29.5)') As open_line) As foo;

--linea cerrada 3d
SELECT ST_MakePolygon(ST_GeomFromText('LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)'));

st_asewkt
-----------
POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))

--linea medida --
SELECT ST_MakePolygon(ST_GeomFromText('LINESTRINGM(75.15 29.53 1,77 29 1,77.6 29.5 2, 75.15 29.53 2)'));

st_asewkt
----------
POLYGONM((75.15 29.53 1,77 29 1,77.6 29.5 2,75.15 29.53 2))
                          

Ejemplos: carcasa exterior con carcasas interiores

Contruye un donut con un agujero de hormiga

SELECT ST_MakePolygon(
                ST_ExteriorRing(ST_Buffer(foo.line,10)),
        ARRAY[ST_Translate(foo.line,1,1),
                ST_ExteriorRing(ST_Buffer(ST_MakePoint(20,20),1)) ]
        )
FROM
        (SELECT ST_ExteriorRing(ST_Buffer(ST_MakePoint(10,10),10,10))
                As line )
                As foo;
                

Construya los límites de la provincia con los agujeros que representan los lagos en la provincia de un sistema polígonos/multipolígonos de la provincia y de cadena de línea de agua. Este es un ejemplo de uso de PostGIS ST_Acc

[Note]

El constructor CASE se utiliza porque la alimentación de una matriz nula en ST_MakePolygon resulta en NULL.

[Note]

Un unión por la izquierda se utiliza para garantizar que se devuelva a todas las provincias, incluso si no tienen lagos.

SELECT p.gid, p.province_name,
                CASE WHEN
                        ST_Accum(w.the_geom) IS NULL THEN p.the_geom
                ELSE  ST_MakePolygon(ST_LineMerge(ST_Boundary(p.the_geom)), ST_Accum(w.the_geom)) END
        FROM
                provinces p LEFT JOIN waterlines w
                        ON (ST_Within(w.the_geom, p.the_geom) AND ST_IsClosed(w.the_geom))
        GROUP BY p.gid, p.province_name, p.the_geom;

        -- El mismo ejemplo que antes pero utilizando una subconsulta correlada
        -- y la función ARRAY() de PostgreSQL, que convierte todo el conjunto de filas en una array

        SELECT p.gid,  p.province_name, CASE WHEN
                EXISTS(SELECT w.the_geom
                        FROM waterlines w
                        WHERE ST_Within(w.the_geom, p.the_geom)
                        AND ST_IsClosed(w.the_geom))
                THEN
                ST_MakePolygon(ST_LineMerge(ST_Boundary(p.the_geom)),
                        ARRAY(SELECT w.the_geom
                                FROM waterlines w
                                WHERE ST_Within(w.the_geom, p.the_geom)
                                AND ST_IsClosed(w.the_geom)))
                ELSE p.the_geom END As the_geom
        FROM
                provinces p;
                          

Name

ST_MakePoint — Crea una geometria puntual 2D,3DZ o 4D.

Synopsis

geometry ST_MakePoint(double precision x, double precision y);

geometry ST_MakePoint(double precision x, double precision y, double precision z);

geometry ST_MakePoint(double precision x, double precision y, double precision z, double precision m);

Descripción

Crea una geometría puntual 2D,3DZ o 4D (geometría con un valor de medida).Aunque no es conforme con el OGC ST_MakePoint generalmente es mas rápida y precisa que ST_GeomFromText y ST_PointFromText. También es mas fácil de usar si tienes registros con coordenadas en lugar de un WKT.

[Note]

Nota que x es la longitud e y es la latitud

[Note]

Si necesitas crear un punto con x,y,m utiliza ST_MakePointM.

This function supports 3d and will not drop the z-index.

Ejemplos

--Devuelve un punto con un SRID desconocido
SELECT ST_MakePoint(-71.1043443253471, 42.3150676015829);

--Devuelve un punto como WGS 84 long lat
SELECT ST_SetSRID(ST_MakePoint(-71.1043443253471, 42.3150676015829),4326);

--Devuelve un punto 3D (por ejemplo, tiene altitud)
SELECT ST_MakePoint(1, 2,1.5);

--Obtiene z del punto
SELECT ST_Z(ST_MakePoint(1, 2,1.5));
result
-------
1.5

Name

ST_MakePointM — Crea una geometria puntual con coordenadas x, y y m.

Synopsis

geometry ST_MakePointM(float x, float y, float m);

Descripción

Crea un punto con coordenadas x, y y un valor de medida.

[Note]

Nota que x es la longitud e y es la latitud

Ejemplos

Utilizaremos ST_AsEWKT en el ejemplo para mostrar la representación como texto en lugar de ST_AsText, ya que ST_AsText no soporta devolver el valor M.

--Devuelve la representación EWKT del punto con un SRID desconocido
SELECT ST_AsEWKT(ST_MakePointM(-71.1043443253471, 42.3150676015829, 10));

--result
                                   st_asewkt
-----------------------------------------------
 POINTM(-71.1043443253471 42.3150676015829 10)

--Devuelve la representación EWKT del punto con medida como WGS 84 long lat
SELECT ST_AsEWKT(ST_SetSRID(ST_MakePointM(-71.1043443253471, 42.3150676015829,10),4326));

                                                st_asewkt
---------------------------------------------------------
SRID=4326;POINTM(-71.1043443253471 42.3150676015829 10)

--Devuelve un punto 3D (por ejemplo, tiene altitud)
SELECT ST_MakePoint(1, 2,1.5);

--Obtiene el valor m del punto
SELECT ST_M(ST_MakePointM(-71.1043443253471, 42.3150676015829,10));
result
-------
10
                          

Name

ST_MLineFromText — Devuelve un valor especificado ST_MultiLineString desde una representación WKT.

Synopsis

geometry ST_MLineFromText(text WKT, integer srid);

geometry ST_MLineFromText(text WKT);

Descripción

Hace una Geometry desde el texto bien conocido (WKT) con el SRID dado. Si no se da un SRID, el valor predeterminado es 0.

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

Devuelve NULL si el WKT no es un MULTILINESTRING

[Note]

Si estas completamente seguro que todas tus geometrias WKT son puntos, no utilices esta función. Es mas lenta que ST_GeomFromText ya que añade algunos pasos de validación.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification.SQL-MM 3: 9.4.4

Ejemplos

SELECT ST_MLineFromText('MULTILINESTRING((1 2, 3 4), (4 5, 6 7))');

Ver también

ST_GeomFromText


Name

ST_MPointFromText — Hace una geometría desde un WKT con el SRID dado. Si no se da un SRID, el valor predeterminado es 0.

Synopsis

geometry ST_MPointFromText(text WKT, integer srid);

geometry ST_MPointFromText(text WKT);

Descripción

Hace una geometría desde un WKT con el SRID dado. Si no se da un SRID, el valor predeterminado es 0.

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

Devuelve NULL si el WKT no es un MULTIPUNTO

[Note]

Si estas completamente seguro que todas tus geometrias WKT son puntos, no utilices esta función. Es mas lenta que ST_GeomFromText ya que añade algunos pasos de validación.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. 3.2.6.2

This method implements the SQL/MM specification. SQL-MM 3: 9.2.4

Ejemplos

SELECT ST_MPointFromText('MULTIPOINT(1 2, 3 4)');
SELECT ST_MPointFromText('MULTIPOINT(-70.9590 42.1180, -70.9611 42.1223)', 4326);

Ver también

ST_GeomFromText


Name

ST_MPolyFromText — Hace una Geometría MultiPolygon desde un WKT con el SRID dado. Si no se da SRID, el valor predeterminado es 0.

Synopsis

geometry ST_MPolyFromText(text WKT, integer srid);

geometry ST_MPolyFromText(text WKT);

Descripción

Hace un MultiPolygon desde un WKT con el SRID dado. Si no se da SRID, el valor predeterminado es 0.

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

Devuelve un error si el WKT no es un MULTIPOLYGON

[Note]

Si estas completamente seguro que todas tus geometrías WKT son multipolygon, no utilices esta función. Es mas lenta que ST_GeomFromText ya que añade algunos pasos de validación adicionales.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification. SQL-MM 3: 9.6.4

Ejemplos

SELECT ST_MPolyFromText('MULTIPOLYGON(((0 0 1,20 0 1,20 20 1,0 20 1,0 0 1),(5 5 3,5 7 3,7 7 3,7 5 3,5 5 3)))');
SELECt ST_MPolyFromText('MULTIPOLYGON(((-70.916 42.1002,-70.9468 42.0946,-70.9765 42.0872,-70.9754 42.0875,-70.9749 42.0879,-70.9752 42.0881,-70.9754 42.0891,-70.9758 42.0894,-70.9759 42.0897,-70.9759 42.0899,-70.9754 42.0902,-70.9756 42.0906,-70.9753 42.0907,-70.9753 42.0917,-70.9757 42.0924,-70.9755 42.0928,-70.9755 42.0942,-70.9751 42.0948,-70.9755 42.0953,-70.9751 42.0958,-70.9751 42.0962,-70.9759 42.0983,-70.9767 42.0987,-70.9768 42.0991,-70.9771 42.0997,-70.9771 42.1003,-70.9768 42.1005,-70.977 42.1011,-70.9766 42.1019,-70.9768 42.1026,-70.9769 42.1033,-70.9775 42.1042,-70.9773 42.1043,-70.9776 42.1043,-70.9778 42.1048,-70.9773 42.1058,-70.9774 42.1061,-70.9779 42.1065,-70.9782 42.1078,-70.9788 42.1085,-70.9798 42.1087,-70.9806 42.109,-70.9807 42.1093,-70.9806 42.1099,-70.9809 42.1109,-70.9808 42.1112,-70.9798 42.1116,-70.9792 42.1127,-70.979 42.1129,-70.9787 42.1134,-70.979 42.1139,-70.9791 42.1141,-70.9987 42.1116,-71.0022 42.1273,
        -70.9408 42.1513,-70.9315 42.1165,-70.916 42.1002)))',4326);

Name

ST_Point — Devuelve un ST_Point con el valor de coordenadas dado. Es un alias de ST_MakePoint del OGC.

Synopsis

geometry ST_Point(float x_lon, float y_lat);

Descripción

Devuelve un ST_Point con el valor de coordenadas dado. Conforme con el alias MM para ST_MakePoint que toma únicamente una x y una y.

This method implements the SQL/MM specification. SQL-MM 3: 6.1.2

Ejemplos: Geometry

SELECT ST_SetSRID(ST_Point(-71.1043443253471, 42.3150676015829),4326)

Ejemplos: Geography

SELECT CAST(ST_SetSRID(ST_Point(-71.1043443253471, 42.3150676015829),4326) As geography);
-- el :: es el alias de PostgreSQL para conversiones cast.
SELECT ST_SetSRID(ST_Point(-71.1043443253471, 42.3150676015829),4326)::geography;
--Si las coordenadas de tus puntos están en sistemas de reference espaciales diferentes que WGS-84 long lat, tendras que transformarlos antes de hacer una conversión de tipo cast
-- En este ejemplo convertimos un punto desde coordenadas planas en pies del estado de Pennsylvania en WGS 84 y después transformamos el tipo a  geography
SELECT ST_Transform(ST_SetSRID(ST_Point(3637510, 3014852),2273),4326)::geography;

Name

ST_PointFromGeoHash — Devuelve un punto de una cadena de GeoHash.

Synopsis

point ST_PointFromGeoHash(text geohash, integer precision=full_precision_of_geohash);

Descripción

Devuelve un punto de una cadena de GeoHash. El punto representa el punto central del GeoHash.

Si no se especifica ninguna precisión, ST_PointFromGeoHash devuelve un punto basándose en la precisión completa de la cadena de GeoHash de entrada.

Si precision es especificado ST_PointFromGeoHash utilizará muchos caracteres de GeoHash para crear el punto.

Disponibilidad: 2.1.0

Ejemplos

SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0'));
          st_astext
------------------------------
 POINT(-115.172816 36.114646)

SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 4));
             st_astext
-----------------------------------
 POINT(-115.13671875 36.123046875)

SELECT ST_AsText(ST_PointFromGeoHash('9qqj7nmxncgyy4d0dbxqz0', 10));
                 st_astext
-------------------------------------------
 POINT(-115.172815918922 36.1146435141563)
                
                

Name

ST_PointFromText — Crea una geometría puntual desde un WKT con el SRID dado. Si no se especifica el SRID por defecto será unknown.

Synopsis

geometry ST_PointFromText(text WKT);

geometry ST_PointFromText(text WKT, integer srid);

Descripción

Construye un objeto de punto de PostGIS ST_GEOMETRY de la representación bien conocida del texto de OGC. Si no se da SRID, se omite a desconocido (actualmente 0). Si la geometría no es una representación de punto WKT, devuelve null. Si WKT es totalmente inválido, entonces lanza un error.

[Note]

Hay 2 variantes de la función ST_PointFromText, la primera no toma SRID y devuelve una geometría sin sistema de referencia espacial definido. La segunda toma un id de un sistema de referencia como segundo argumento y devuelve una ST_Geometry que incluye este srid como parte de sus metadatos. El srid debe estar definido en la tabla spatial_ref_sys.

[Note]

Si estas completamente seguro que todas tus geometrias WKT son puntos, no utilices esta función. Es mas lenta que ST_GeomFromText ya que añade algunos pasos de validación. Si estas construyendo puntos desde coordenadas long lat y te interesan mas el rendimiento y la precisión que la conformidad con OGC, utiliza ST_MakePoint o el alias conforme al OGCST_Point.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2 - la opción SRID es de la suite de conformidad.

This method implements the SQL/MM specification. SQL-MM 3: 6.1.8

Ejemplos

SELECT ST_PointFromText('POINT(-71.064544 42.28787)');
SELECT ST_PointFromText('POINT(-71.064544 42.28787)', 4326);
        

Name

ST_PointFromWKB — Crea una geometría desde un WKB con el SRID dado.

Synopsis

geometry ST_GeomFromWKB(bytea geom);

geometry ST_GeomFromWKB(bytea geom, integer srid);

Descripción

La función ST_PointFromWKB, toma una representación binaria "well-known" de una geometría y un ID de un Sistema de Referencia Espacial (SRID) y crea una instancia del tipo de geometría adecuado - en este caso una geometría POINT. Esta función juega un rol de "Geometry Factory" en SQL.

Si no se especifica un SRID, el valor predeterminado es 0. NULL se devuelve si la entrada bytea no representa una geometría de POINT.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.7.2

This method implements the SQL/MM specification. SQL-MM 3: 6.1.9

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT
  ST_AsText(
        ST_PointFromWKB(
          ST_AsEWKB('POINT(2 5)'::geometry)
        )
  );
 st_astext
------------
 POINT(2 5)
(1 row)

SELECT
  ST_AsText(
        ST_PointFromWKB(
          ST_AsEWKB('LINESTRING(2 5, 2 6)'::geometry)
        )
  );
 st_astext
-----------

(1 row)

Name

ST_Polygon — Devuelve un polygon construido desde un linestring especifico y un SRID.

Synopsis

geometry ST_Polygon(geometry aLineString, integer srid);

Descripción

Devuelve un polygon construido desde un linestring especifico y un SRID.

[Note]

ST_Polygon es similar a la primera versión de ST_MakePolygon excepto que también establece el sistema de referencia espacial (SRID) del polígono. No funcionará con MULTILINESTRINGS así que utilice LineMerge para combinar multilines. Tampoco crea polígonos con agujeros. Utilice ST_MakePolygon para eso.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 8.3.2

This function supports 3d and will not drop the z-index.

Ejemplos

--un poligono 2d
SELECT ST_Polygon(ST_GeomFromText('LINESTRING(75.15 29.53,77 29,77.6 29.5, 75.15 29.53)'), 4326);

--resultado--
POLYGON((75.15 29.53,77 29,77.6 29.5,75.15 29.53))
--un poligono 3d
SELECT ST_AsEWKT(ST_Polygon(ST_GeomFromEWKT('LINESTRING(75.15 29.53 1,77 29 1,77.6 29.5 1, 75.15 29.53 1)'), 4326));

result
------
SRID=4326;POLYGON((75.15 29.53 1,77 29 1,77.6 29.5 1,75.15 29.53 1))
                        

Name

ST_PolygonFromText — Hace una geometría desde un WKT con el SRID dado. Si no se da un SRID, el valor predeterminado es 0.

Synopsis

geometry ST_PolygonFromText(text WKT);

geometry ST_PolygonFromText(text WKT, integer srid);

Descripción

Hace una geometría desde WKT con el SRID dado. Si no se da SRID, el valor predeterminado es 0. Devuelve null si WKT no es un polígono.

OGC SPEC 3.2.6.2 - La opción SRID es del paquete de conformidad

[Note]

Si estas completamente seguro que todas tus geometrías WKT son poligonos, no utilices esta función. Es mas lenta que ST_GeomFromText ya que añade algunos pasos de validación adicionales.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s3.2.6.2

This method implements the SQL/MM specification. SQL-MM 3: 8.3.6

Ejemplos

SELECT ST_PolygonFromText('POLYGON((-71.1776585052917 42.3902909739571,-71.1776820268866 42.3903701743239,
-71.1776063012595 42.3903825660754,-71.1775826583081 42.3903033653531,-71.1776585052917 42.3902909739571))');
st_polygonfromtext
------------------
010300000001000000050000006...


SELECT ST_PolygonFromText('POINT(1 2)') IS NULL as point_is_notpoly;

point_is_not_poly
----------
t

Ver también

ST_GeomFromText


Name

ST_WKBToSQL — Devuelve un valor especifico de ST_Geometry desde una representación "Well-Known Binary" (WKB). Es un alias para ST_GeomFromWKB que no toma srid

Synopsis

geometry ST_WKBToSQL(bytea WKB);

Descripción

This method implements the SQL/MM specification. SQL-MM 3: 5.1.36

Ver también

ST_GeomFromWKB


Name

ST_WKTToSQL — Devuelve un valor especifico de ST_Geometry desde una representación "Well-Known Text" (WKT). Es un alias para ST_GeomFromText

Synopsis

geometry ST_WKTToSQL(text WKT);

Descripción

This method implements the SQL/MM specification. SQL-MM 3: 5.1.34

Ver también

ST_GeomFromText

8.5. Métodos de Acceso a Geometrías

GeometryType — Devuelve el tipo de geometría como una cadena de texto. Ej: 'LINESTRING', 'POLYGON', 'MULTIPOINT', etc.
ST_Boundary — Devuelve el cierre del limite combinatorio de esta geometría.
ST_CoordDim — Devuelve la dimensión de las coordenadas del valor de ST_Geometry.
ST_Dimension — La dimensión inherente del objeto Geometry, la cual debe ser menor o igual a la dimensión de coordenadas.
ST_EndPoint — Returns the last point of a LINESTRING or CIRCULARLINESTRING geometry as a POINT.
ST_Envelope — Devuelve una geometría que representa la caja en doble precisión (float8) de la geometría dada.
ST_BoundingDiagonal — Returns the diagonal of the supplied geometry's bounding box.
ST_ExteriorRing — Devuelve una linestring representando el anillo exterior de una geometria tipo POLYGON. Devuelve NULL si la geometria no es un poligono. No funcionará con MULTIPOLYGON
ST_GeometryN — Devuelve la geometría en la cual se basa si la geometría es una GEOMETRYCOLLECTION, un (MULTI)POINT, una (MULTI)LINESTRING, una MULTICURVE o un (MULTI)POLYGON, una POLYHEDRALSURFACE si no devuelve NULL.
ST_GeometryType — Devuelve el tipo de geometría del valor de ST_Geometry.
ST_InteriorRingN — Devuelve la cadena de texto del anillo interior N del poligono. Devuelve NULL si la geometría no es un polígono o el indice N dado esta fuera de rango.
ST_IsCollection — Returns true if all exterior rings are oriented counter-clockwise and all interior rings are oriented clockwise.
ST_IsCollection — Returns true if all exterior rings are oriented clockwise and all interior rings are oriented counter-clockwise.
ST_IsClosed — Devuelve TRUE si los puntos de inicio y final de una LINESTRINGson coincidentes. Para superficies poliedricas si son cerradas (volumetricas).
ST_IsCollection — Devuelve TRUE si el argumento es una colección (MULTI*, GEOMETRYCOLLECTION, ...)
ST_IsEmpty — Devuelve True si la Geometría es una colección vacía, polígono vacio, punto vacío etc.
ST_IsRing — Devuelve TRUE si esta LINESTRING es simple y cerrada.
ST_IsSimple — Devuelve (TRUE) si la geometría no tiene puntos geométricos anómalos, como auto intersecciones o tangencias.
ST_IsValid — Devuelve true si la ST_Geometry esta bien formada.
ST_IsValidReason — Devuelve un texto indicando si una geometría es valida o no, y el porque.
ST_IsValidDetail — Devuelve una fila de estado valid_detail (validez,razón ,lugar) si una geometría es valida o no y si no lo es , una razón del porque y el lugar donde no lo es.
ST_M — Devuelve la coordenada M del punto, o NULL si no seta disponible. La entrada debe ser un punto.
ST_NDims — Devuelve la dimension de las coordenadas de la geometría como un entero "small int". Los valores son: 2,3 o 4.
ST_NPoints — Devuelve el numero de puntos (vértices) en la geometría.
ST_NRings — Si la geometria es un polígono o un multi-polígono devuelve el numero de anillos.
ST_NumGeometries — Si la geometría es una GEOMETRYCOLLECTION (o MULTI*) devuelve el numero de geometrías, para geometrias simples devuelve 1, si no devuelve NULL.
ST_NumInteriorRings — Devuelve el numero de puntos (vértices) en la geometría.
ST_NumInteriorRing — Return the number of interior rings of a polygon in the geometry. Synonym for ST_NumInteriorRings.
ST_NumPatches — Return the number of faces on a Polyhedral Surface. Will return null for non-polyhedral geometries.
ST_NumPoints — Return the number of points in an ST_LineString or ST_CircularString value.
ST_PatchN — Return the 1-based Nth geometry (face) if the geometry is a POLYHEDRALSURFACE, POLYHEDRALSURFACEM. Otherwise, return NULL.
ST_PointN — Return the Nth point in the first LineString or circular LineString in the geometry. Negative values are counted backwards from the end of the LineString. Returns NULL if there is no linestring in the geometry.
ST_NPoints — Returns a MultiPoint containing all of the coordinates of a geometry.
ST_SRID — Returns the spatial reference identifier for the ST_Geometry as defined in spatial_ref_sys table.
ST_StartPoint — Returns the first point of a LINESTRING geometry as a POINT.
ST_Summary — Returns a text summary of the contents of the geometry.
ST_X — Return the X coordinate of the point, or NULL if not available. Input must be a point.
ST_XMax — Returns X maxima of a bounding box 2d or 3d or a geometry.
ST_XMin — Returns X minima of a bounding box 2d or 3d or a geometry.
ST_Y — Return the Y coordinate of the point, or NULL if not available. Input must be a point.
ST_YMax — Returns Y maxima of a bounding box 2d or 3d or a geometry.
ST_YMin — Returns Y minima of a bounding box 2d or 3d or a geometry.
ST_Z — Return the Z coordinate of the point, or NULL if not available. Input must be a point.
ST_ZMax — Returns Z minima of a bounding box 2d or 3d or a geometry.
ST_Zmflag — Returns ZM (dimension semantic) flag of the geometries as a small int. Values are: 0=2d, 1=3dm, 2=3dz, 3=4d.
ST_ZMin — Returns Z minima of a bounding box 2d or 3d or a geometry.

Name

GeometryType — Devuelve el tipo de geometría como una cadena de texto. Ej: 'LINESTRING', 'POLYGON', 'MULTIPOINT', etc.

Synopsis

text GeometryType(geometry geomA);

Descripción

Devuelve el tipo de geometría como una cadena de texto. Ej: 'LINESTRING', 'POLYGON', 'MULTIPOINT', etc.

OGC SPEC s2.1.1.1 - Devuelve el nombre del subtipo de la instancia de la geometría de la cual la instancia de la geometría es miembro. El nombre del subtipo de geometría de la instancia se devuelve en forma de cadena de texto.

[Note]

Esta función también indica si la geometría tiene valores de medida, devolviendo una cadena de tipo 'POINTM'.

Mejorado: 2.0.0 se introdujo soporte para superficies poliédricas, Triangulos y TIN.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method supports Circular Strings and Curves

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos

SELECT GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
 geometrytype
--------------
 LINESTRING
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), 
                ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
                ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), 
                ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'));
                        --resultado
                        POLYHEDRALSURFACE
                        
SELECT GeometryType(geom) as result
  FROM
    (SELECT 
       ST_GeomFromEWKT('TIN (((
                0 0 0, 
                0 0 1, 
                0 1 0, 
                0 0 0
            )), ((
                0 0 0, 
                0 1 0, 
                1 1 0, 
                0 0 0
            ))
            )')  AS geom
    ) AS g;
 result
--------
 TIN    

Ver también

ST_GeometryType


Name

ST_Boundary — Devuelve el cierre del limite combinatorio de esta geometría.

Synopsis

geometry ST_Boundary(geometry geomA);

Descripción

Devuelve el cierre del limite combinatorio de esta geometría. El limite combinatorio esta definido como se describe en la sección 3.12.3.2 de la especificación OGC. Ya que el resultado de esta función es un cerco, y por lo tanto topológicamente cerrado, el límite resultante puede ser representado utilizando geometrías primitivas como se discute en la especificación OGC en la sección 3.12.2.

Realizado por el módulo de GEOS

[Note]

Anterior a la version 2.0.0, esta función lanza una excepción si se utiliza con GEOMETRYCOLLECTION. Desde la version 2.0.0 y superiores devolverá NULL en lugar de la excepción (entrada no soportada).

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. OGC SPEC s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.14

This function supports 3d and will not drop the z-index.

Enhanced: 2.1.0 support for Triangle was introduced

Ejemplos

Linestring with boundary points overlaid

SELECT ST_Boundary(geom)
FROM (SELECT 'LINESTRING(100 150,50 60, 70 80, 160 170)'::geometry As geom) As f;
                                

-- ST_AsText output
MULTIPOINT(100 150,160 170)

polygon holes with boundary multilinestring

SELECT ST_Boundary(geom)
FROM (SELECT
'POLYGON (( 10 130, 50 190, 110 190, 140 150, 150 80, 100 10, 20 40, 10 130 ),
        ( 70 40, 100 50, 120 80, 80 110, 50 90, 70 40 ))'::geometry As geom) As f;
                                

-- ST_AsText output
MULTILINESTRING((10 130,50 190,110 190,140 150,150 80,100 10,20 40,10 130),
        (70 40,100 50,120 80,80 110,50 90,70 40))

SELECT ST_AsText(ST_Boundary(ST_GeomFromText('LINESTRING(1 1,0 0, -1 1)')));
st_astext
-----------
MULTIPOINT(1 1,-1 1)

SELECT ST_AsText(ST_Boundary(ST_GeomFromText('POLYGON((1 1,0 0, -1 1, 1 1))')));
st_astext
----------
LINESTRING(1 1,0 0,-1 1,1 1)

--Utilizando un poligono 3d
SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromEWKT('POLYGON((1 1 1,0 0 1, -1 1 1, 1 1 1))')));

st_asewkt
-----------------------------------
LINESTRING(1 1 1,0 0 1,-1 1 1,1 1 1)

--Utilizando una multilinestring 3d
SELECT ST_AsEWKT(ST_Boundary(ST_GeomFromEWKT('MULTILINESTRING((1 1 1,0 0 0.5, -1 1 1),(1 1 0.5,0 0 0.5, -1 1 0.5, 1 1 0.5) )')));

st_asewkt
----------
MULTIPOINT(-1 1 1,1 1 0.75)

Name

ST_CoordDim — Devuelve la dimensión de las coordenadas del valor de ST_Geometry.

Synopsis

integer ST_CoordDim(geometry geomA);

Descripción

Devuelve la dimensión de las coordenadas del valor de ST_Geometry.

Es el alias de ST_NDims conforme a MM

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.3

This method supports Circular Strings and Curves

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos

SELECT ST_CoordDim('CIRCULARSTRING(1 2 3, 1 3 4, 5 6 7, 8 9 10, 11 12 13)');
                        ---resultado--
                                3

                                SELECT ST_CoordDim(ST_Point(1,2));
                        --resultado--
                                2

                

Ver también

ST_NDims


Name

ST_Dimension — La dimensión inherente del objeto Geometry, la cual debe ser menor o igual a la dimensión de coordenadas.

Synopsis

integer ST_Dimension(geometry g);

Descripción

La dimensión inherente del objeto Geometry, la cual debe ser menor o igual a la dimensión de coordenadas. En la Especificación OGC s2.1.1.1 - devuelve 0 para un POINT, 1 para una LINESTRING, 2 para un POLYGON, y la dimensión mayor de los componentes de una GEOMETRYCOLLECTION. Si es desconocida (geometría vacía) se devuelve null.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.2

Mejora: 2.0.0 se introdujeron soporte de superficies poliédricas y TIN. No lanza una excepción si se envia una geometría vacía.

[Note]

Anterior a la versión 2.0.0, esta función lanzaba una excepción si se enviaba una geometría vacía.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos

SELECT ST_Dimension('GEOMETRYCOLLECTION(LINESTRING(1 1,0 0),POINT(0 0))');
ST_Dimension
-----------
1

Ver también

ST_NDims


Name

ST_EndPoint — Returns the last point of a LINESTRING or CIRCULARLINESTRING geometry as a POINT.

Synopsis

boolean ST_EndPoint(geometry g);

Descripción

Devuelve el último punto de una geometría LINESTRING como POINT o NULL si el parametro de entrada no es una LINESTRING.

This method implements the SQL/MM specification. SQL-MM 3: 7.1.4

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

[Note]

Cambiado: 2.0.0 ya no funciona con multilinestrings de geometrías simples. En versiones anteriores de PostGIS -- una linea simple multilinestring funciona sin problemas con esta función y devuelve el punto inicial. En la version 2.0.0 simplemente devuelve NULL como con cualquier multilinestring. La antigua version era una función sin documentar, pero la gente que asumía que tenia sus datos almacenados en LINESTRING pueden experimentar este comportamiento ahora de resultado NULL en la version 2.0.

Ejemplos

postgis=# SELECT ST_AsText(ST_EndPoint('LINESTRING(1 1, 2 2, 3 3)'::geometry));
 st_astext
------------
 POINT(3 3)
(1 row)

postgis=# SELECT ST_EndPoint('POINT(1 1)'::geometry) IS NULL AS is_null;
  is_null
----------
 t
(1 row)

--punto final 3d
SELECT ST_AsEWKT(ST_EndPoint('LINESTRING(1 1 2, 1 2 3, 0 0 5)'));
  st_asewkt
--------------
 POINT(0 0 5)
(1 row)

Name

ST_Envelope — Devuelve una geometría que representa la caja en doble precisión (float8) de la geometría dada.

Synopsis

geometry ST_Envelope(geometry g1);

Descripción

Devuelve una geometría que representa la caja mínima en doble precisión (float8) de la geometría dada. El polígono definido por las esquinas de la caja ((MINX, MINY), (MINX, MAXY), (MAXX, MAXY), (MAXX, MINY), (MINX, MINY)). (PostGIS añadirá las coordenadas ZMIN/ZMAX también).

Algunos casos particulares(lineas verticales, puntos) devolverán una geometría de dimension menor que POLYGON, por ejemplo POINT o LINESTRING.

Disponibilidad: 1.5.0 comportamiento modificado para devolver doble precisión en vez de float4.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.15

Ejemplos

SELECT ST_AsText(ST_Envelope('POINT(1 3)'::geometry));
 st_astext
------------
 POINT(1 3)
(1 row)


SELECT ST_AsText(ST_Envelope('LINESTRING(0 0, 1 3)'::geometry));
                   st_astext
--------------------------------
 POLYGON((0 0,0 3,1 3,1 0,0 0))
(1 row)


SELECT ST_AsText(ST_Envelope('POLYGON((0 0, 0 1, 1.0000001 1, 1.0000001 0, 0 0))'::geometry));
                                                  st_astext
--------------------------------------------------------------
 POLYGON((0 0,0 1,1.00000011920929 1,1.00000011920929 0,0 0))
(1 row)
SELECT ST_AsText(ST_Envelope('POLYGON((0 0, 0 1, 1.0000000001 1, 1.0000000001 0, 0 0))'::geometry));
                                                  st_astext
--------------------------------------------------------------
 POLYGON((0 0,0 1,1.00000011920929 1,1.00000011920929 0,0 0))
(1 row)
        
SELECT Box3D(geom), Box2D(geom), ST_AsText(ST_Envelope(geom)) As envelopewkt
        FROM (SELECT 'POLYGON((0 0, 0 1000012333334.34545678, 1.0000001 1, 1.0000001 0, 0 0))'::geometry As geom) As foo;


        

Ver también

Box2D, Box3D


Name

ST_BoundingDiagonal — Returns the diagonal of the supplied geometry's bounding box.

Synopsis

geometry ST_BoundingDiagonal(geometry geom, boolean fits=false);

Descripción

Returns the diagonal of the supplied geometry's bounding box as linestring. If the input geometry is empty, the diagonal line is also empty, otherwise it is a 2-points linestring with minimum values of each dimension in its start point and maximum values in its end point.

The returned linestring geometry always retains SRID and dimensionality (Z and M presence) of the input geometry.

The fits parameter specifies if the best fit is needed. If false, the diagonal of a somewhat larger bounding box can be accepted (is faster to obtain for geometries with a lot of vertices). In any case the bounding box of the returned diagonal line always covers the input geometry.

[Note]

In degenerate cases (a single vertex in input) the returned linestring will be topologically invalid (no interior). This does not make the return semantically invalid.

Availability: 2.2.0

This function supports 3d and will not drop the z-index.

This function supports M coordinates.

Ejemplos

-- Get the minimum X in a buffer around a point
SELECT ST_X(ST_StartPoint(ST_BoundingDiagonal(
  ST_Buffer(ST_MakePoint(0,0),10)
)));
 st_x
------
  -10
                

Name

ST_ExteriorRing — Devuelve una linestring representando el anillo exterior de una geometria tipo POLYGON. Devuelve NULL si la geometria no es un poligono. No funcionará con MULTIPOLYGON

Synopsis

geometry ST_ExteriorRing(geometry a_polygon);

Descripción

Devuelve una linestring representando el anillo exterior de una geometria tipo POLYGON. Devuelve NULL si la geometria no es un poligono. No funcionará con MULTIPOLYGON

[Note]

Solo funciona con geometrias de tipo POLYGON

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. 2.1.5.1

This method implements the SQL/MM specification. SQL-MM 3: 8.2.3, 8.3.3

This function supports 3d and will not drop the z-index.

Ejemplos

--Si tienes una tabla de poligonos
SELECT gid, ST_ExteriorRing(the_geom) AS ering
FROM sometable;

--Si tienes una tbla de MULTIPOLYGONos
--y quieres que te devuelva una MULTILINESTRING compuesta por los anillos exteriores de cada poligono
SELECT gid, ST_Collect(ST_ExteriorRing(the_geom)) AS erings
        FROM (SELECT gid, (ST_Dump(the_geom)).geom As the_geom
                        FROM sometable) As foo
GROUP BY gid;

--Ejemplo 3d
SELECT ST_AsEWKT(
        ST_ExteriorRing(
        ST_GeomFromEWKT('POLYGON((0 0 1, 1 1 1, 1 2 1, 1 1 1, 0 0 1))')
        )
);

st_asewkt
---------
LINESTRING(0 0 1,1 1 1,1 2 1,1 1 1,0 0 1)

Name

ST_GeometryN — Devuelve la geometría en la cual se basa si la geometría es una GEOMETRYCOLLECTION, un (MULTI)POINT, una (MULTI)LINESTRING, una MULTICURVE o un (MULTI)POLYGON, una POLYHEDRALSURFACE si no devuelve NULL.

Synopsis

geometry ST_GeometryN(geometry geomA, integer n);

Descripción

Devuelve la geometría en la cual se basa si la geometría es una GEOMETRYCOLLECTION, un (MULTI)POINT, una (MULTI)LINESTRING, una MULTICURVE o un (MULTI)POLYGON, una POLYHEDRALSURFACE si no devuelve NULL.

[Note]

El indice es 1-based en la especificación OGC desde la version 0.8.0. Versiones anteriormente implementadas era de tipo 0-based.

[Note]

Si quieres extraer todas las geometrías de una geometría, ST_Dump es mas eficiente y funcionará con geometrías simples.

Mejorado: 2.0.0 se introdujo soporte para superficies poliédricas, Triangulos y TIN.

Cambiado: 2.0.0 Versiones anteriores devuelven NULL para geometrias simples. Esto ha sido cambiado para devolver la geometría en el caso de ST_GeometryN(..,1) .

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 9.1.5

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos Estándar

--Extrayendo un conjunto de puntos desde una geometría 3d multipoint
SELECT n, ST_AsEWKT(ST_GeometryN(the_geom, n)) As geomewkt
FROM (
VALUES (ST_GeomFromEWKT('MULTIPOINT(1 2 7, 3 4 7, 5 6 7, 8 9 10)') ),
( ST_GeomFromEWKT('MULTICURVE(CIRCULARSTRING(2.5 2.5,4.5 2.5, 3.5 3.5), (10 11, 12 11))') )
        )As foo(the_geom)
        CROSS JOIN generate_series(1,100) n
WHERE n <= ST_NumGeometries(the_geom);

 n |               geomewkt
---+-----------------------------------------
 1 | POINT(1 2 7)
 2 | POINT(3 4 7)
 3 | POINT(5 6 7)
 4 | POINT(8 9 10)
 1 | CIRCULARSTRING(2.5 2.5,4.5 2.5,3.5 3.5)
 2 | LINESTRING(10 11,12 11)


--Extracción de todas las geometrías (tip cuando quieres asignar un id)
SELECT gid, n, ST_GeometryN(the_geom, n)
FROM sometable CROSS JOIN generate_series(1,100) n
WHERE n <= ST_NumGeometries(the_geom);

Ejemplos de superficies poliedricas, MDT y triángulos

-- Ejemplo de superficie poliedrica
-- Descompone una superficie poliedrica en caras
SELECT ST_AsEWKT(ST_GeometryN(p_geom,3)) As geom_ewkt
  FROM (SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE( 
((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),  
((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), 
((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),  
((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)),  
((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) 
)')  AS p_geom )  AS a;

                geom_ewkt
------------------------------------------
 POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0))
-- MDT --                
SELECT ST_AsEWKT(ST_GeometryN(geom,2)) as wkt
  FROM
    (SELECT 
       ST_GeomFromEWKT('TIN (((
                0 0 0, 
                0 0 1, 
                0 1 0, 
                0 0 0
            )), ((
                0 0 0, 
                0 1 0, 
                1 1 0, 
                0 0 0
            ))
            )')  AS geom
    ) AS g;
-- result --
                 wkt
-------------------------------------
 TRIANGLE((0 0 0,0 1 0,1 1 0,0 0 0))

Name

ST_GeometryType — Devuelve el tipo de geometría del valor de ST_Geometry.

Synopsis

text ST_GeometryType(geometry g1);

Descripción

Devuelve el tipo de geometría como una cadena de texto. Por Ejemplo: 'ST_Linestring', 'ST_Polygon','ST_MultiPolygon' etc. Esta función difiere de GeometryType(geometría) en este caso se devuelve la cadena de texto y ST delante, como el hecho de que no indicará como se mide la geometría.

Mejora: 2.0.0 se introdujo soporte de superficies poliédricas.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.4

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_GeometryType(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
                        --resultado
                        ST_LineString
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), 
                ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
                ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), 
                ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'));
                        --resultado
                        ST_PolyhedralSurface
SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), 
                ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
                ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), 
                ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'));
                        --resultado
                        ST_PolyhedralSurface
SELECT ST_GeometryType(geom) as result
  FROM
    (SELECT 
       ST_GeomFromEWKT('TIN (((
                0 0 0, 
                0 0 1, 
                0 1 0, 
                0 0 0
            )), ((
                0 0 0, 
                0 1 0, 
                1 1 0, 
                0 0 0
            ))
            )')  AS geom
    ) AS g;
 result
--------
 ST_Tin    

Ver también

GeometryType


Name

ST_InteriorRingN — Devuelve la cadena de texto del anillo interior N del poligono. Devuelve NULL si la geometría no es un polígono o el indice N dado esta fuera de rango.

Synopsis

geometry ST_InteriorRingN(geometry a_polygon, integer n);

Descripción

Devuelve la cadena de texto del anillo interior N del poligono. Devuelve NULL si la geometría no es un polígono o el indice N dado esta fuera de rango. El indice empieza en 1.

[Note]

Esto no funcionara con MULTIPOLYGONs. Para MULTIPOLYGONs utilizaba junto a ST_Dump.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 8.2.6, 8.3.5

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_AsText(ST_InteriorRingN(the_geom, 1)) As the_geom
FROM (SELECT ST_BuildArea(
                ST_Collect(ST_Buffer(ST_Point(1,2), 20,3),
                        ST_Buffer(ST_Point(1, 2), 10,3))) As the_geom
                )  as foo
                

Name

ST_IsCollection — Returns true if all exterior rings are oriented counter-clockwise and all interior rings are oriented clockwise.

Synopsis

boolean ST_IsEmpty(geometry geomA);

Descripción

Returns true if all polygonal components of the input geometry use a counter-clockwise orientation for their exterior ring, and a clockwise direction for all interior rings.

Devuelve True si la Geometría es una colección vacía, polígono vacio, punto vacío etc.

[Note]

Closed linestrings are not considered polygonal components, so you would still get a true return by passing a single closed linestring no matter its orientation.

[Note]

If a polygonal geometry does not use reversed orientation for interior rings (i.e., if one or more interior rings are oriented in the same direction as an exterior ring) then both ST_IsPolygonCW and ST_IsPolygonCCW will return false.

This function supports 3d and will not drop the z-index.

This function supports M coordinates.


Name

ST_IsCollection — Returns true if all exterior rings are oriented clockwise and all interior rings are oriented counter-clockwise.

Synopsis

boolean ST_IsEmpty(geometry geomA);

Descripción

Returns true if all polygonal components of the input geometry use a clockwise orientation for their exterior ring, and a counter-clockwise direction for all interior rings.

Devuelve True si la Geometría es una colección vacía, polígono vacio, punto vacío etc.

[Note]

Closed linestrings are not considered polygonal components, so you would still get a true return by passing a single closed linestring no matter its orientation.

[Note]

If a polygonal geometry does not use reversed orientation for interior rings (i.e., if one or more interior rings are oriented in the same direction as an exterior ring) then both ST_IsPolygonCW and ST_IsPolygonCCW will return false.

This function supports 3d and will not drop the z-index.

This function supports M coordinates.


Name

ST_IsClosed — Devuelve TRUE si los puntos de inicio y final de una LINESTRINGson coincidentes. Para superficies poliedricas si son cerradas (volumetricas).

Synopsis

boolean ST_IsClosed(geometry g);

Descripción

Devuelve TRUE si los puntos de inicio y final de una LINESTRINGson coincidentes. Para superficies poliédricas , te dice si las superficies son áreas (abiertas) o si son volumétricas (cerradas).

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 7.1.5, 9.3.3

[Note]

SQL-MM define que el resultado de ST_IsClosed(NULL) debe ser 0, mientras que PostGIS devuelve NULL.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Mejora: 2.0.0 se introdujo soporte de superficies poliédricas.

This function supports Polyhedral surfaces.

Ejemplos con lineas y puntos

postgis=# SELECT ST_IsClosed('LINESTRING(0 0, 1 1)'::geometry);
 st_isclosed
-------------
 f
(1 row)

postgis=# SELECT ST_IsClosed('LINESTRING(0 0, 0 1, 1 1, 0 0)'::geometry);
 st_isclosed
-------------
 t
(1 row)

postgis=# SELECT ST_IsClosed('MULTILINESTRING((0 0, 0 1, 1 1, 0 0),(0 0, 1 1))'::geometry);
 st_isclosed
-------------
 f
(1 row)

postgis=# SELECT ST_IsClosed('POINT(0 0)'::geometry);
 st_isclosed
-------------
 t
(1 row)

postgis=# SELECT ST_IsClosed('MULTIPOINT((0 0), (1 1))'::geometry);
 st_isclosed
-------------
 t
(1 row)

Ejemplos con superficies Poliédricas

-- A cube --
                SELECT ST_IsClosed(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), 
                ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
                ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), 
                ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'));

 st_isclosed
-------------
 t


 -- Same as cube but missing a side --
 SELECT ST_IsClosed(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), 
                ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
                ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), 
                ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)) )'));

 st_isclosed
-------------
 f

Ver también

ST_IsRing


Name

ST_IsCollection — Devuelve TRUE si el argumento es una colección (MULTI*, GEOMETRYCOLLECTION, ...)

Synopsis

boolean ST_IsCollection(geometry g);

Descripción

Devuelve TRUE si la geometría del argumento es:

  • GEOMETRYCOLLECTION

  • MULTI{POINT,POLYGON,LINESTRING,CURVE,SURFACE}

  • COMPOUNDCURVE

[Note]

Esta función analiza el tipo de geometría. Esto significa que devolverá TRUE en colecciones que estén vacías o que contengan un único elemento.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

postgis=# SELECT ST_IsCollection('LINESTRING(0 0, 1 1)'::geometry);
 st_iscollection
-------------
 f
(1 row)

postgis=# SELECT ST_IsCollection('MULTIPOINT EMPTY'::geometry);
 st_iscollection
-------------
 t
(1 row)

postgis=# SELECT ST_IsCollection('MULTIPOINT((0 0))'::geometry);
 st_iscollection
-------------
 t
(1 row)

postgis=# SELECT ST_IsCollection('MULTIPOINT((0 0), (42 42))'::geometry);
 st_iscollection
-------------
 t
(1 row)

postgis=# SELECT ST_IsCollection('GEOMETRYCOLLECTION(POINT(0 0))'::geometry);
 st_iscollection
-------------
 t
(1 row)

Ver también

ST_NumGeometries


Name

ST_IsEmpty — Devuelve True si la Geometría es una colección vacía, polígono vacio, punto vacío etc.

Synopsis

boolean ST_IsEmpty(geometry geomA);

Descripción

Devuelve True si la Geometría es una geometría vacía. Si es cierto, entonces esta Geometría representa una colección de geometrías vacías, polígonos vacíos, puntos vacíos, etc.

[Note]

SQL-MM define que el resultado de ST_IsEmpty(NULL) debe ser 0, mientras que PostGIS devuelve NULL.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.7

This method supports Circular Strings and Curves

[Warning]

Cambiado: 2.0.0 En las versiones anteriores de PostGIS ST_GeomFromText('GEOMETRYCOLLECTION(EMPTY)') estaba permitido. Esto no esta permitido ahora en PostGIS 2.0.0 para ajustarse mejor a las normas SQL/MM.

Ejemplos

SELECT ST_IsEmpty(ST_GeomFromText('GEOMETRYCOLLECTION EMPTY'));
 st_isempty
------------
 t
(1 row)

 SELECT ST_IsEmpty(ST_GeomFromText('POLYGON EMPTY'));
 st_isempty
------------
 t
(1 row)

SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))'));

 st_isempty
------------
 f
(1 row)

 SELECT ST_IsEmpty(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))')) = false;
 ?column?
----------
 t
(1 row)

 SELECT ST_IsEmpty(ST_GeomFromText('CIRCULARSTRING EMPTY'));
  st_isempty
------------
 t
(1 row)


                

Name

ST_IsRing — Devuelve TRUE si esta LINESTRING es simple y cerrada.

Synopsis

boolean ST_IsRing(geometry g);

Descripción

Devuelve TRUE si esta LINESTRING es ST_IsClosed (ST_StartPoint(g) ~= ST_Endpoint(g)) y ST_IsSimple (no se intersecta con ella misma).

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. 2.1.5.1

This method implements the SQL/MM specification. SQL-MM 3: 7.1.6

[Note]

SQL-MM define que el resultado de ST_IsRing(NULL) debe ser 0, mientras que PostGIS devuelve NULL.

Ejemplos

SELECT ST_IsRing(the_geom), ST_IsClosed(the_geom), ST_IsSimple(the_geom)
FROM (SELECT 'LINESTRING(0 0, 0 1, 1 1, 1 0, 0 0)'::geometry AS the_geom) AS foo;
 st_isring | st_isclosed | st_issimple
-----------+-------------+-------------
 t         | t           | t
(1 row)

SELECT ST_IsRing(the_geom), ST_IsClosed(the_geom), ST_IsSimple(the_geom)
FROM (SELECT 'LINESTRING(0 0, 0 1, 1 0, 1 1, 0 0)'::geometry AS the_geom) AS foo;
 st_isring | st_isclosed | st_issimple
-----------+-------------+-------------
 f         | t           | f
(1 row)

Name

ST_IsSimple — Devuelve (TRUE) si la geometría no tiene puntos geométricos anómalos, como auto intersecciones o tangencias.

Synopsis

boolean ST_IsSimple(geometry geomA);

Descripción

Devuelve TRUE si la geometría no tiene puntos geométricos anómalos, como auto intersecciones o tangencias. Para mas información sobre la definición del OGC de simplicidad y validez geométrica, visita el enlace "Ensuring OpenGIS compliancy of geometries"

[Note]

SQL-MM define que el resultado de ST_IsSimple(NULL) debe ser 0, mientras que PostGIS devuelve NULL.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.8

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_IsSimple(ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))'));
 st_issimple
-------------
 t
(1 row)

 SELECT ST_IsSimple(ST_GeomFromText('LINESTRING(1 1,2 2,2 3.5,1 3,1 2,2 1)'));
 st_issimple
-------------
 f
(1 row)

Ver también

ST_IsValid


Name

ST_IsValid — Devuelve true si la ST_Geometry esta bien formada.

Synopsis

boolean ST_IsValid(geometry g);

boolean ST_IsValid(geometry g, integer flags);

Descripción

Prueba si el valor de una ST_Geometry esta bien formado. Para las geometrías que no son validas, PostgreSQL NOTICE nos dará detalles del porque no es valida. Para mas información sobre la definición de simplicidad y validez de geometrías del OGC, visita el enlace "Ensuring OpenGIS compliancy of geometries"

[Note]

SQL-MM define que el resultado de ST_IsValid(NULL) debe ser 0, mientras que PostGIS devuelve NULL.

La versión que acepta parámetros esta disponible desde la 2.0.0 y requiere GEOS >= 3.3.0. Dicha versión no imprime un aviso explicando la invalidez. Los parámetros permitidos están documentados en ST_IsValidDetail.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.9

[Note]

Neither OGC-SFS nor SQL-MM specifications include a flag argument for ST_IsValid. The flag is a PostGIS extension.

Ejemplos

SELECT ST_IsValid(ST_GeomFromText('LINESTRING(0 0, 1 1)')) As good_line,
        ST_IsValid(ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) As bad_poly
--resultados
NOTICE:  Self-intersection at or near point 0 0
 good_line | bad_poly
-----------+----------
 t         | f

Name

ST_IsValidReason — Devuelve un texto indicando si una geometría es valida o no, y el porque.

Synopsis

text ST_IsValidReason(geometry geomA);

text ST_IsValidReason(geometry geomA, integer flags);

Descripción

Devuelve un texto indicando si una geometría es valida o no, y el porque.

Util en combinación con ST_IsValid para generar un informe detallado de geometrías invalidas y el porque.

Los parametros permitidos están documentados en ST_IsValidDetail.

Disponibilidad: 1.4 - necesita GEOS >=3.1.0.

Disponibilidad: 2.0 - necesita GEOS >= 3.3.0 para la version que toma parámetros.

Ejemplos

--Primeros 3 rechazados de un quinteto de prueba
SELECT gid, ST_IsValidReason(the_geom) as validity_info
FROM
(SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), ST_Accum(f.line)) As the_geom, gid
FROM (SELECT ST_Buffer(ST_MakePoint(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid
        FROM generate_series(-4,6) x1
        CROSS JOIN generate_series(2,5) y1
        CROSS JOIN generate_series(1,8) z1
        WHERE x1 > y1*0.5 AND z1 < x1*y1) As e
        INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_MakePoint(x1*10,y1), z1)),y1*1, z1*2) As line
        FROM generate_series(-3,6) x1
        CROSS JOIN generate_series(2,5) y1
        CROSS JOIN generate_series(1,10) z1
        WHERE x1 > y1*0.75 AND z1 < x1*y1) As f
ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line))
GROUP BY gid, e.buff) As quintuplet_experiment
WHERE ST_IsValid(the_geom) = false
ORDER BY gid
LIMIT 3;

 gid  |      validity_info
------+--------------------------
 5330 | Self-intersection [32 5]
 5340 | Self-intersection [42 5]
 5350 | Self-intersection [52 5]

 -- ejemplo simple
SELECT ST_IsValidReason('LINESTRING(220227 150406,2220227 150407,222020 150410)');

 st_isvalidreason
------------------
 Valid Geometry

                

Ver también

ST_IsValid, ST_Summary


Name

ST_IsValidDetail — Devuelve una fila de estado valid_detail (validez,razón ,lugar) si una geometría es valida o no y si no lo es , una razón del porque y el lugar donde no lo es.

Synopsis

valid_detail ST_IsValidDetail(geometry geom);

valid_detail ST_IsValidDetail(geometry geom, integer flags);

Descripción

Devuelve una fila valid_detail, formada por un valor boleano (valido) de estado si la geometría es valida, un texto (razón) explicando la razón por la cual es valida y una geometría (lugar) señalando donde no es valida la geometría.

Util para sustituir y mejorar la combinación de ST_IsValid y ST_IsValidReason para generar un informe detallado de geometrías no validas.

Los argumentos 'parámetro' son un campo de bits. Pueden tener los siguientes valores:

  • 1: Considera anillos que se auto intersectan como validos. Esto también es conocido como "the ESRI flag". Observa que esto es contrario al modelo OGC.

Disponibilidad: 2.0.0 - requiere GEOS >= 3.3.0.

Ejemplos

---Primeros 3 rechazados de un quinteto de prueba
SELECT gid, reason(ST_IsValidDetail(the_geom)), ST_AsText(location(ST_IsValidDetail(the_geom))) as location 
FROM
(SELECT ST_MakePolygon(ST_ExteriorRing(e.buff), ST_Accum(f.line)) As the_geom, gid
FROM (SELECT ST_Buffer(ST_MakePoint(x1*10,y1), z1) As buff, x1*10 + y1*100 + z1*1000 As gid
        FROM generate_series(-4,6) x1
        CROSS JOIN generate_series(2,5) y1
        CROSS JOIN generate_series(1,8) z1
        WHERE x1 > y1*0.5 AND z1 < x1*y1) As e
        INNER JOIN (SELECT ST_Translate(ST_ExteriorRing(ST_Buffer(ST_MakePoint(x1*10,y1), z1)),y1*1, z1*2) As line
        FROM generate_series(-3,6) x1
        CROSS JOIN generate_series(2,5) y1
        CROSS JOIN generate_series(1,10) z1
        WHERE x1 > y1*0.75 AND z1 < x1*y1) As f
ON (ST_Area(e.buff) > 78 AND ST_Contains(e.buff, f.line))
GROUP BY gid, e.buff) As quintuplet_experiment
WHERE ST_IsValid(the_geom) = false
ORDER BY gid
LIMIT 3;

 gid  |      reason       |  location
------+-------------------+-------------
 5330 | Self-intersection | POINT(32 5)
 5340 | Self-intersection | POINT(42 5)
 5350 | Self-intersection | POINT(52 5)

 --ejemplo simple
SELECT * FROM ST_IsValidDetail('LINESTRING(220227 150406,2220227 150407,222020 150410)');

 valid | reason | location
-------+--------+----------
 t     |        |

                

Name

ST_M — Devuelve la coordenada M del punto, o NULL si no seta disponible. La entrada debe ser un punto.

Synopsis

float ST_M(geometry a_point);

Descripción

Devuelve la coordenada M del punto, o NULL si no seta disponible. La entrada debe ser un punto.

[Note]

Esto no es (todavía) parte de la especificación OGC, pero esta incluida aquí para completar la lista de extracción de coordenadas de un punto.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification.

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_M(ST_GeomFromEWKT('POINT(1 2 3 4)'));
 st_m
------
        4
(1 row)

                

Ver también

ST_GeomFromEWKT, ST_X, ST_Y, ST_Z


Name

ST_NDims — Devuelve la dimension de las coordenadas de la geometría como un entero "small int". Los valores son: 2,3 o 4.

Synopsis

integer ST_NDims(geometry g1);

Descripción

Devuelve la dimension de las coordenadas de la geometría. PostGIS soporta 2 - (x,y), 3 - (x,y,z) o 2D con medidas - x,y,m y 4 -3D con mediadas en el espacio x,y,z,m.

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_NDims(ST_GeomFromText('POINT(1 1)')) As d2point,
        ST_NDims(ST_GeomFromEWKT('POINT(1 1 2)')) As d3point,
        ST_NDims(ST_GeomFromEWKT('POINTM(1 1 0.5)')) As d2pointm;

         d2point | d3point | d2pointm
---------+---------+----------
           2 |       3 |        3
                        

Name

ST_NPoints — Devuelve el numero de puntos (vértices) en la geometría.

Synopsis

integer ST_NPoints(geometry g1);

Descripción

Devuelve el numero de puntos en la geometría. Funciona con todas las geometrías.

Mejora: 2.0.0 se introdujo soporte de superficies poliédricas.

[Note]

Anterior a 1.3.4, esta función daba errores si se utilizaba con geometrias que contenían CURVES. Esto se corrigió en 1.3.4+

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_NPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
--resultado
4

--Polígono en espacio 3D
SELECT ST_NPoints(ST_GeomFromEWKT('LINESTRING(77.29 29.07 1,77.42 29.26 0,77.27 29.31 -1,77.29 29.07 3)'))
--resultado
4

Ver también

ST_NumPoints


Name

ST_NRings — Si la geometria es un polígono o un multi-polígono devuelve el numero de anillos.

Synopsis

integer ST_NRings(geometry geomA);

Descripción

Si la geometria es un polígono o un multi-polígono devuelve el numero de anillos. Al contrario que NumInteriorRings, cuenta el anille exterior tambien.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_NRings(the_geom) As Nrings, ST_NumInteriorRings(the_geom) As ninterrings
                                        FROM (SELECT ST_GeomFromText('POLYGON((1 2, 3 4, 5 6, 1 2))') As the_geom) As foo;
         nrings | ninterrings
--------+-------------
          1 |           0
(1 row)

Name

ST_NumGeometries — Si la geometría es una GEOMETRYCOLLECTION (o MULTI*) devuelve el numero de geometrías, para geometrias simples devuelve 1, si no devuelve NULL.

Synopsis

integer ST_NumGeometries(geometry geom);

Descripción

Devuelve el numero de geometrías. Si la geometría es una GEOMETRYCOLLECTION (o MULTI*) devuelve el numero de geometrías, para geometrias simples devuelve 1, si no devuelve NULL.

Mejorado: 2.0.0 se introdujo soporte para superficies poliédricas, Triangulos y TIN.

Changed: 2.0.0 In prior versions this would return NULL if the geometry was not a collection/MULTI type. 2.0.0+ now returns 1 for single geometries e.g POLYGON, LINESTRING, POINT.

This method implements the SQL/MM specification. SQL-MM 3: 9.1.4

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Ejemplos

--En versiones anteriores esto habría devuelto NULL
-- en 2.0.0 devuelve 1
SELECT ST_NumGeometries(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
--resultado
1

--Ejemplo de Colección de geometrías - al contar las geometrías múltiples cuentan como 1 en una colección
SELECT ST_NumGeometries(ST_GeomFromEWKT('GEOMETRYCOLLECTION(MULTIPOINT(-2 3 , -2 2),
LINESTRING(5 5 ,10 10),
POLYGON((-7 4.2,-7.1 5,-7.1 4.3,-7 4.2)))'));
--resultado
3

Ver también

ST_GeometryN, ST_Multi


Name

ST_NumInteriorRings — Devuelve el numero de puntos (vértices) en la geometría.

Synopsis

integer ST_NumInteriorRings(geometry a_polygon);

Descripción

Devuelve la cadena de texto del anillo interior N del poligono. Devuelve NULL si la geometría no es un polígono o el indice N dado esta fuera de rango.

This method implements the SQL/MM specification. SQL-MM 3: 8.2.5

Changed: 2.0.0 - in prior versions it would allow passing a MULTIPOLYGON, returning the number of interior rings of first POLYGON.

Ejemplos

--If you have a regular polygon
SELECT gid, field1, field2, ST_NumInteriorRings(the_geom) AS numholes
FROM sometable;

--If you have multipolygons
--And you want to know the total number of interior rings in the MULTIPOLYGON
SELECT gid, field1, field2, SUM(ST_NumInteriorRings(the_geom)) AS numholes
FROM (SELECT gid, field1, field2, (ST_Dump(the_geom)).geom As the_geom
        FROM sometable) As foo
GROUP BY gid, field1,field2;
                        

Ver también

ST_NumInteriorRing


Name

ST_NumInteriorRing — Return the number of interior rings of a polygon in the geometry. Synonym for ST_NumInteriorRings.

Synopsis

integer ST_NumInteriorRing(geometry a_polygon);


Name

ST_NumPatches — Return the number of faces on a Polyhedral Surface. Will return null for non-polyhedral geometries.

Synopsis

integer ST_NumPatches(geometry g1);

Descripción

Return the number of faces on a Polyhedral Surface. Will return null for non-polyhedral geometries. This is an alias for ST_NumGeometries to support MM naming. Faster to use ST_NumGeometries if you don't care about MM convention.

Availability: 2.0.0

This function supports 3d and will not drop the z-index.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: ?

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_GeometryType(ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), 
                ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
                ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), 
                ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'));
                        --resultado
                        POLYHEDRALSURFACE
                

Name

ST_NumPoints — Return the number of points in an ST_LineString or ST_CircularString value.

Synopsis

integer ST_NumPoints(geometry g1);

Descripción

Return the number of points in an ST_LineString or ST_CircularString value. Prior to 1.4 only works with Linestrings as the specs state. From 1.4 forward this is an alias for ST_NPoints which returns number of vertexes for not just line strings. Consider using ST_NPoints instead which is multi-purpose and works with many geometry types.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 7.2.4

Ejemplos

SELECT ST_NumPoints(ST_GeomFromText('LINESTRING(77.29 29.07,77.42 29.26,77.27 29.31,77.29 29.07)'));
                --result
                4
                

Ver también

ST_NPoints


Name

ST_PatchN — Return the 1-based Nth geometry (face) if the geometry is a POLYHEDRALSURFACE, POLYHEDRALSURFACEM. Otherwise, return NULL.

Synopsis

geometry ST_PatchN(geometry geomA, integer n);

Descripción

>Return the 1-based Nth geometry (face) if the geometry is a POLYHEDRALSURFACE, POLYHEDRALSURFACEM. Otherwise, return NULL. This returns the same answer as ST_GeometryN for Polyhedral Surfaces. Using ST_GemoetryN is faster.

[Note]

Index is 1-based.

[Note]

If you want to extract all geometries, of a geometry, ST_Dump is more efficient.

Availability: 2.0.0

This method implements the SQL/MM specification. SQL-MM 3: ?

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Ejemplos

-- Ejemplo de superficie poliedrica
-- Descompone una superficie poliedrica en caras
SELECT ST_AsEWKT(ST_GeometryN(p_geom,3)) As geom_ewkt
  FROM (SELECT ST_GeomFromEWKT('POLYHEDRALSURFACE( 
((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),  
((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), 
((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), 
((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),  
((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)),  
((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) 
)')  AS p_geom )  AS a;

                geom_ewkt
------------------------------------------
 POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0))

Name

ST_PointN — Return the Nth point in the first LineString or circular LineString in the geometry. Negative values are counted backwards from the end of the LineString. Returns NULL if there is no linestring in the geometry.

Synopsis

geometry ST_PointN(geometry a_linestring, integer n);

Descripción

Return the Nth point in a single linestring or circular linestring in the geometry. Negative values are counted backwards from the end of the LineString, so that -1 is the last point. Returns NULL if there is no linestring in the geometry.

[Note]

El indice es 1-based en la especificación OGC desde la version 0.8.0. Versiones anteriormente implementadas era de tipo 0-based.

[Note]

If you want to get the nth point of each line string in a multilinestring, use in conjunction with ST_Dump

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 7.2.5, 7.3.5

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

[Note]

Changed: 2.0.0 no longer works with single geometry multilinestrings. In older versions of PostGIS -- a single line multilinestring would work happily with this function and return the start point. In 2.0.0 it just returns NULL like any other multilinestring.

Changed: 2.3.0 : negative indexing available (-1 is last point)

Ejemplos

-- Extract all POINTs from a LINESTRING
SELECT ST_AsText(
   ST_PointN(
          column1,
          generate_series(1, ST_NPoints(column1))
   ))
FROM ( VALUES ('LINESTRING(0 0, 1 1, 2 2)'::geometry) ) AS foo;

 st_astext
------------
 POINT(0 0)
 POINT(1 1)
 POINT(2 2)
(3 rows)

--Example circular string
SELECT ST_AsText(ST_PointN(ST_GeomFromText('CIRCULARSTRING(1 2, 3 2, 1 2)'),2));

st_astext
----------
POINT(3 2)

SELECT st_astext(f)
FROM ST_GeometryFromtext('LINESTRING(0 0 0, 1 1 1, 2 2 2)') as g
        ,ST_PointN(g, -2) AS f -- 1 based index

st_astext
----------
"POINT Z (1 1 1)"

Ver también

ST_NPoints


Name

ST_NPoints — Returns a MultiPoint containing all of the coordinates of a geometry.

Synopsis

geometry ST_Boundary(geometry geomA);

Descripción

Returns a MultiPoint containing all of the coordinates of a geometry. Does not remove points that are duplicated in the input geometry, including start and end points of ring geometries. (If this behavior is undesired, duplicates may be removed using ST_RemoveRepeatedPoints).

M and Z ordinates will be preserved if present.

This method supports Circular Strings and Curves

This function supports 3d and will not drop the z-index.

Availability: 2.3.0

Ejemplos

SELECT ST_AsText(ST_Points('POLYGON Z ((30 10 4,10 30 5,40 40 6, 30 10))'));

--result
MULTIPOINT Z (30 10 4,10 30 5,40 40 6, 30 10 4)
                        

Name

ST_SRID — Returns the spatial reference identifier for the ST_Geometry as defined in spatial_ref_sys table.

Synopsis

integer ST_SRID(geometry g1);

Descripción

Returns the spatial reference identifier for the ST_Geometry as defined in spatial_ref_sys table. Section 4.3.1, “La tabla SPATIAL_REF_SYS y los Sistemas de Referencia Espacial”

[Note]

spatial_ref_sys table is a table that catalogs all spatial reference systems known to PostGIS and is used for transformations from one spatial reference system to another. So verifying you have the right spatial reference system identifier is important if you plan to ever transform your geometries.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.5

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_SRID(ST_GeomFromText('POINT(-71.1043 42.315)',4326));
                --result
                4326
                

Name

ST_StartPoint — Returns the first point of a LINESTRING geometry as a POINT.

Synopsis

geometry ST_StartPoint(geometry geomA);

Descripción

Returns the first point of a LINESTRING or CIRCULARLINESTRING geometry as a POINT or NULL if the input parameter is not a LINESTRING or CIRCULARLINESTRING.

This method implements the SQL/MM specification. SQL-MM 3: 7.1.3

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

[Note]

Cambiado: 2.0.0 ya no funciona con multilinestrings de geometrías simples. En versiones anteriores de PostGIS -- una linea simple multilinestring funciona sin problemas con esta función y devuelve el punto inicial. En la version 2.0.0 simplemente devuelve NULL como con cualquier multilinestring. La antigua version era una función sin documentar, pero la gente que asumía que tenia sus datos almacenados en LINESTRING pueden experimentar este comportamiento ahora de resultado NULL en la version 2.0.

Ejemplos

SELECT ST_AsText(ST_StartPoint('LINESTRING(0 1, 0 2)'::geometry));
 st_astext
------------
 POINT(0 1)
(1 row)

SELECT ST_StartPoint('POINT(0 1)'::geometry) IS NULL AS is_null;
  is_null
----------
 t
(1 row)

--3d line
SELECT ST_AsEWKT(ST_StartPoint('LINESTRING(0 1 1, 0 2 2)'::geometry));
 st_asewkt
------------
 POINT(0 1 1)
(1 row)

-- circular linestring --
SELECT ST_AsText(ST_StartPoint('CIRCULARSTRING(5 2,-3 1.999999, -2 1, -4 2, 5 2)'::geometry));
 st_astext
------------
 POINT(5 2)

Ver también

ST_EndPoint, ST_PointN


Name

ST_Summary — Returns a text summary of the contents of the geometry.

Synopsis

text ST_Summary(geometry g);

text ST_Summary(geography g);

Descripción

Returns a text summary of the contents of the geometry.

Flags shown square brackets after the geometry type have the following meaning:

  • M: has M ordinate

  • Z: has Z ordinate

  • B: has a cached bounding box

  • G: is geodetic (geography)

  • S: has spatial reference system

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Availability: 1.2.2

Enhanced: 2.0.0 added support for geography

Enhanced: 2.1.0 S flag to denote if has a known spatial reference system

Enhanced: 2.2.0 Added support for TIN and Curves

Ejemplos

=# SELECT ST_Summary(ST_GeomFromText('LINESTRING(0 0, 1 1)')) as geom,
        ST_Summary(ST_GeogFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))')) geog;
            geom             |          geog
-----------------------------+--------------------------
 LineString[B] with 2 points | Polygon[BGS] with 1 rings
                             | ring 0 has 5 points
                             :
(1 row)


=# SELECT ST_Summary(ST_GeogFromText('LINESTRING(0 0 1, 1 1 1)')) As geog_line,
        ST_Summary(ST_GeomFromText('SRID=4326;POLYGON((0 0 1, 1 1 2, 1 2 3, 1 1 1, 0 0 1))')) As geom_poly;
;
           geog_line             |        geom_poly
-------------------------------- +--------------------------
 LineString[ZBGS] with 2 points | Polygon[ZBS] with 1 rings
                                :    ring 0 has 5 points
                                :
(1 row)


Name

ST_X — Return the X coordinate of the point, or NULL if not available. Input must be a point.

Synopsis

float ST_X(geometry a_point);

Descripción

Return the X coordinate of the point, or NULL if not available. Input must be a point.

[Note]

If you want to get the max min x values of any geometry look at ST_XMin, ST_XMax functions.

This method implements the SQL/MM specification. SQL-MM 3: 6.1.3

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_X(ST_GeomFromEWKT('POINT(1 2 3 4)'));
 st_x
------
        1
(1 row)

SELECT ST_Y(ST_Centroid(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)')));
 st_y
------
  1.5
(1 row)

                

Name

ST_XMax — Returns X maxima of a bounding box 2d or 3d or a geometry.

Synopsis

float ST_XMax(box3d aGeomorBox2DorBox3D);

Descripción

Returns X maxima of a bounding box 2d or 3d or a geometry.

[Note]

Although this function is only defined for box3d, it will work for box2d and geometry because of the auto-casting behavior defined for geometries and box2d. However you can not feed it a geometry or box2d text representation, since that will not auto-cast.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_XMax('BOX3D(1 2 3, 4 5 6)');
st_xmax
-------
4

SELECT ST_XMax(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)'));
st_xmax
-------
5

SELECT ST_XMax(CAST('BOX(-3 2, 3 4)' As box2d));
st_xmax
-------
3
--Observe THIS DOES NOT WORK because it will try to autocast the string representation to a BOX3D
SELECT ST_XMax('LINESTRING(1 3, 5 6)');

--ERROR:  BOX3D parser - doesn't start with BOX3D(

SELECT ST_XMax(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'));
st_xmax
--------
220288.248780547
                

Name

ST_XMin — Returns X minima of a bounding box 2d or 3d or a geometry.

Synopsis

float ST_XMin(box3d aGeomorBox2DorBox3D);

Descripción

Returns X minima of a bounding box 2d or 3d or a geometry.

[Note]

Although this function is only defined for box3d, it will work for box2d and geometry because of the auto-casting behavior defined for geometries and box2d. However you can not feed it a geometry or box2d text representation, since that will not auto-cast.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_XMin('BOX3D(1 2 3, 4 5 6)');
st_xmin
-------
1

SELECT ST_XMin(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)'));
st_xmin
-------
1

SELECT ST_XMin(CAST('BOX(-3 2, 3 4)' As box2d));
st_xmin
-------
-3
--Observe THIS DOES NOT WORK because it will try to autocast the string representation to a BOX3D
SELECT ST_XMin('LINESTRING(1 3, 5 6)');

--ERROR:  BOX3D parser - doesn't start with BOX3D(

SELECT ST_XMin(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'));
st_xmin
--------
220186.995121892
                

Name

ST_Y — Return the Y coordinate of the point, or NULL if not available. Input must be a point.

Synopsis

float ST_Y(geometry a_point);

Descripción

Return the Y coordinate of the point, or NULL if not available. Input must be a point.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 6.1.4

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_Y(ST_GeomFromEWKT('POINT(1 2 3 4)'));
 st_y
------
        2
(1 row)

SELECT ST_Y(ST_Centroid(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)')));
 st_y
------
  1.5
(1 row)


                

Name

ST_YMax — Returns Y maxima of a bounding box 2d or 3d or a geometry.

Synopsis

float ST_YMax(box3d aGeomorBox2DorBox3D);

Descripción

Returns Y maxima of a bounding box 2d or 3d or a geometry.

[Note]

Although this function is only defined for box3d, it will work for box2d and geometry because of the auto-casting behavior defined for geometries and box2d. However you can not feed it a geometry or box2d text representation, since that will not auto-cast.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_YMax('BOX3D(1 2 3, 4 5 6)');
st_ymax
-------
5

SELECT ST_YMax(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)'));
st_ymax
-------
6

SELECT ST_YMax(CAST('BOX(-3 2, 3 4)' As box2d));
st_ymax
-------
4
--Observe THIS DOES NOT WORK because it will try to autocast the string representation to a BOX3D
SELECT ST_YMax('LINESTRING(1 3, 5 6)');

--ERROR:  BOX3D parser - doesn't start with BOX3D(

SELECT ST_YMax(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'));
st_ymax
--------
150506.126829327
                

Name

ST_YMin — Returns Y minima of a bounding box 2d or 3d or a geometry.

Synopsis

float ST_YMin(box3d aGeomorBox2DorBox3D);

Descripción

Returns Y minima of a bounding box 2d or 3d or a geometry.

[Note]

Although this function is only defined for box3d, it will work for box2d and geometry because of the auto-casting behavior defined for geometries and box2d. However you can not feed it a geometry or box2d text representation, since that will not auto-cast.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_YMin('BOX3D(1 2 3, 4 5 6)');
st_ymin
-------
2

SELECT ST_YMin(ST_GeomFromText('LINESTRING(1 3 4, 5 6 7)'));
st_ymin
-------
3

SELECT ST_YMin(CAST('BOX(-3 2, 3 4)' As box2d));
st_ymin
-------
2
--Observe THIS DOES NOT WORK because it will try to autocast the string representation to a BOX3D
SELECT ST_YMin('LINESTRING(1 3, 5 6)');

--ERROR:  BOX3D parser - doesn't start with BOX3D(

SELECT ST_YMin(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'));
st_ymin
--------
150406
                

Name

ST_Z — Return the Z coordinate of the point, or NULL if not available. Input must be a point.

Synopsis

float ST_Z(geometry a_point);

Descripción

Return the Z coordinate of the point, or NULL if not available. Input must be a point.

This method implements the SQL/MM specification.

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_Z(ST_GeomFromEWKT('POINT(1 2 3 4)'));
 st_z
------
        3
(1 row)

                

Name

ST_ZMax — Returns Z minima of a bounding box 2d or 3d or a geometry.

Synopsis

float ST_ZMax(box3d aGeomorBox2DorBox3D);

Descripción

Returns Z maxima of a bounding box 2d or 3d or a geometry.

[Note]

Although this function is only defined for box3d, it will work for box2d and geometry because of the auto-casting behavior defined for geometries and box2d. However you can not feed it a geometry or box2d text representation, since that will not auto-cast.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_ZMax('BOX3D(1 2 3, 4 5 6)');
st_zmax
-------
6

SELECT ST_ZMax(ST_GeomFromEWKT('LINESTRING(1 3 4, 5 6 7)'));
st_zmax
-------
7

SELECT ST_ZMax('BOX3D(-3 2 1, 3 4 1)' );
st_zmax
-------
1
--Observe THIS DOES NOT WORK because it will try to autocast the string representation to a BOX3D
SELECT ST_ZMax('LINESTRING(1 3 4, 5 6 7)');

--ERROR:  BOX3D parser - doesn't start with BOX3D(

SELECT ST_ZMax(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'));
st_zmax
--------
3
                

Name

ST_Zmflag — Returns ZM (dimension semantic) flag of the geometries as a small int. Values are: 0=2d, 1=3dm, 2=3dz, 3=4d.

Synopsis

smallint ST_Zmflag(geometry geomA);

Descripción

Returns ZM (dimension semantic) flag of the geometries as a small int. Values are: 0=2d, 1=3dm, 2=3dz, 3=4d.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_Zmflag(ST_GeomFromEWKT('LINESTRING(1 2, 3 4)'));
 st_zmflag
-----------
                 0

SELECT ST_Zmflag(ST_GeomFromEWKT('LINESTRINGM(1 2 3, 3 4 3)'));
 st_zmflag
-----------
                 1

SELECT ST_Zmflag(ST_GeomFromEWKT('CIRCULARSTRING(1 2 3, 3 4 3, 5 6 3)'));
 st_zmflag
-----------
                 2
SELECT ST_Zmflag(ST_GeomFromEWKT('POINT(1 2 3 4)'));
 st_zmflag
-----------
                 3

Name

ST_ZMin — Returns Z minima of a bounding box 2d or 3d or a geometry.

Synopsis

float ST_ZMin(box3d aGeomorBox2DorBox3D);

Descripción

Returns Z minima of a bounding box 2d or 3d or a geometry.

[Note]

Although this function is only defined for box3d, it will work for box2d and geometry because of the auto-casting behavior defined for geometries and box2d. However you can not feed it a geometry or box2d text representation, since that will not auto-cast.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Ejemplos

SELECT ST_ZMin('BOX3D(1 2 3, 4 5 6)');
st_zmin
-------
3

SELECT ST_ZMin(ST_GeomFromEWKT('LINESTRING(1 3 4, 5 6 7)'));
st_zmin
-------
4

SELECT ST_ZMin('BOX3D(-3 2 1, 3 4 1)' );
st_zmin
-------
1
--Observe THIS DOES NOT WORK because it will try to autocast the string representation to a BOX3D
SELECT ST_ZMin('LINESTRING(1 3 4, 5 6 7)');

--ERROR:  BOX3D parser - doesn't start with BOX3D(

SELECT ST_ZMin(ST_GeomFromEWKT('CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)'));
st_zmin
--------
1
                

8.6. Geometry Editors

ST_AddPoint — Add a point to a LineString.
ST_Affine — Apply a 3d affine transformation to a geometry.
ST_Force2D — Force the geometries into a "2-dimensional mode".
ST_Force3D — Force the geometries into XYZ mode. This is an alias for ST_Force3DZ.
ST_Force3DZ — Force the geometries into XYZ mode.
ST_Force3DM — Force the geometries into XYM mode.
ST_Force4D — Force the geometries into XYZM mode.
ST_ForcePolygonCCW — Orients all exterior rings counter-clockwise and all interior rings clockwise.
ST_ForceCollection — Convert the geometry into a GEOMETRYCOLLECTION.
ST_ForcePolygonCW — Orients all exterior rings clockwise and all interior rings counter-clockwise.
ST_ForceSFS — Force the geometries to use SFS 1.1 geometry types only.
ST_ForceRHR — Force the orientation of the vertices in a polygon to follow the Right-Hand-Rule.
ST_ForceCurve — Upcast a geometry into its curved type, if applicable.
ST_LineMerge — Return a (set of) LineString(s) formed by sewing together a MULTILINESTRING.
ST_CollectionExtract — Given a (multi)geometry, return a (multi)geometry consisting only of elements of the specified type.
ST_CollectionHomogenize — Given a geometry collection, return the "simplest" representation of the contents.
ST_Multi — Return the geometry as a MULTI* geometry.
ST_Normalize — Return the geometry in its canonical form.
ST_RemovePoint — Remove point from a linestring.
ST_Reverse — Return the geometry with vertex order reversed.
ST_Rotate — Rotate a geometry rotRadians counter-clockwise about an origin.
ST_RotateX — Rotate a geometry rotRadians about the X axis.
ST_RotateY — Rotate a geometry rotRadians about the Y axis.
ST_RotateZ — Rotate a geometry rotRadians about the Z axis.
ST_Scale — Scale a geometry by given factors.
ST_Segmentize — Return a modified geometry/geography having no segment longer than the given distance.
ST_SetPoint — Replace point of a linestring with a given point.
ST_SetSRID — Set the SRID on a geometry to a particular integer value.
ST_SnapToGrid — Snap all points of the input geometry to a regular grid.
ST_Snap — Snap segments and vertices of input geometry to vertices of a reference geometry.
ST_Transform — Return a new geometry with its coordinates transformed to a different spatial reference.
ST_Translate — Translate a geometry by given offsets.
ST_TransScale — Translate a geometry by given factors and offsets.

Name

ST_AddPoint — Add a point to a LineString.

Synopsis

geometry ST_AddPoint(geometry linestring, geometry point);

geometry ST_AddPoint(geometry linestring, geometry point, integer position);

Description

Adds a point to a LineString before point <position> (0-based index). Third parameter can be omitted or set to -1 for appending.

Availability: 1.1.0

This function supports 3d and will not drop the z-index.

Examples

--guarantee all linestrings in a table are closed
                --by adding the start point of each linestring to the end of the line string
                --only for those that are not closed
                UPDATE sometable
                SET the_geom = ST_AddPoint(the_geom, ST_StartPoint(the_geom))
                FROM sometable
                WHERE ST_IsClosed(the_geom) = false;

                --Adding point to a 3-d line
                SELECT ST_AsEWKT(ST_AddPoint(ST_GeomFromEWKT('LINESTRING(0 0 1, 1 1 1)'), ST_MakePoint(1, 2, 3)));

                --result
                st_asewkt
                ----------
                LINESTRING(0 0 1,1 1 1,1 2 3)
                        

Name

ST_Affine — Apply a 3d affine transformation to a geometry.

Synopsis

geometry ST_Affine(geometry geomA, float a, float b, float c, float d, float e, float f, float g, float h, float i, float xoff, float yoff, float zoff);

geometry ST_Affine(geometry geomA, float a, float b, float d, float e, float xoff, float yoff);

Description

Applies a 3d affine transformation to the geometry to do things like translate, rotate, scale in one step.

Version 1: The call

ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff) 

represents the transformation matrix

/ a  b  c  xoff \
| d  e  f  yoff |
| g  h  i  zoff |
\ 0  0  0     1 /

and the vertices are transformed as follows:

x' = a*x + b*y + c*z + xoff
y' = d*x + e*y + f*z + yoff
z' = g*x + h*y + i*z + zoff

All of the translate / scale functions below are expressed via such an affine transformation.

Version 2: Applies a 2d affine transformation to the geometry. The call

ST_Affine(geom, a, b, d, e, xoff, yoff)

represents the transformation matrix

/  a  b  0  xoff  \       /  a  b  xoff  \
|  d  e  0  yoff  | rsp.  |  d  e  yoff  |
|  0  0  1     0  |       \  0  0     1  /
\  0  0  0     1  /

and the vertices are transformed as follows:

x' = a*x + b*y + xoff
y' = d*x + e*y + yoff
z' = z 

This method is a subcase of the 3D method above.

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

Availability: 1.1.2. Name changed from Affine to ST_Affine in 1.2.2

[Note]

Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

--Rotate a 3d line 180 degrees about the z axis.  Note this is long-hand for doing ST_Rotate();
 SELECT ST_AsEWKT(ST_Affine(the_geom,  cos(pi()), -sin(pi()), 0,  sin(pi()), cos(pi()), 0,  0, 0, 1,  0, 0, 0)) As using_affine,
         ST_AsEWKT(ST_Rotate(the_geom, pi())) As using_rotate
        FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As the_geom) As foo;
        using_affine         |        using_rotate
-----------------------------+-----------------------------
 LINESTRING(-1 -2 3,-1 -4 3) | LINESTRING(-1 -2 3,-1 -4 3)
(1 row)

--Rotate a 3d line 180 degrees in both the x and z axis
SELECT ST_AsEWKT(ST_Affine(the_geom, cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), 0, 0, 0))
        FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As the_geom) As foo;
           st_asewkt
-------------------------------
 LINESTRING(-1 -2 -3,-1 -4 -3)
(1 row)
                

Name

ST_Force2D — Force the geometries into a "2-dimensional mode".

Synopsis

geometry ST_Force2D(geometry geomA);

Description

Forces the geometries into a "2-dimensional mode" so that all output representations will only have the X and Y coordinates. This is useful for force OGC-compliant output (since OGC only specifies 2-D geometries).

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

Changed: 2.1.0. Up to 2.0.x this was called ST_Force_2D.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports 3d and will not drop the z-index.

Examples

SELECT ST_AsEWKT(ST_Force2D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)')));
                st_asewkt
-------------------------------------
CIRCULARSTRING(1 1,2 3,4 5,6 7,5 6)

SELECT  ST_AsEWKT(ST_Force2D('POLYGON((0 0 2,0 5 2,5 0 2,0 0 2),(1 1 2,3 1 2,1 3 2,1 1 2))'));

                                  st_asewkt
----------------------------------------------
 POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))

                

See Also

ST_Force3D


Name

ST_Force3D — Force the geometries into XYZ mode. This is an alias for ST_Force3DZ.

Synopsis

geometry ST_Force3D(geometry geomA);

Description

Forces the geometries into XYZ mode. This is an alias for ST_Force_3DZ. If a geometry has no Z component, then a 0 Z coordinate is tacked on.

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

Changed: 2.1.0. Up to 2.0.x this was called ST_Force_3D.

This function supports Polyhedral surfaces.

This method supports Circular Strings and Curves

This function supports 3d and will not drop the z-index.

Examples

--Nothing happens to an already 3D geometry
                SELECT ST_AsEWKT(ST_Force3D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)')));
                                   st_asewkt
-----------------------------------------------
 CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)


SELECT  ST_AsEWKT(ST_Force3D('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))'));

                                                 st_asewkt
--------------------------------------------------------------
 POLYGON((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
                

Name

ST_Force3DZ — Force the geometries into XYZ mode.

Synopsis

geometry ST_Force3DZ(geometry geomA);

Description

Forces the geometries into XYZ mode. This is a synonym for ST_Force3DZ. If a geometry has no Z component, then a 0 Z coordinate is tacked on.

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

Changed: 2.1.0. Up to 2.0.x this was called ST_Force_3DZ.

This function supports Polyhedral surfaces.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

--Nothing happens to an already 3D geometry
SELECT ST_AsEWKT(ST_Force3DZ(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)')));
                                   st_asewkt
-----------------------------------------------
 CIRCULARSTRING(1 1 2,2 3 2,4 5 2,6 7 2,5 6 2)


SELECT  ST_AsEWKT(ST_Force3DZ('POLYGON((0 0,0 5,5 0,0 0),(1 1,3 1,1 3,1 1))'));

                                                 st_asewkt
--------------------------------------------------------------
 POLYGON((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))
                

Name

ST_Force3DM — Force the geometries into XYM mode.

Synopsis

geometry ST_Force3DM(geometry geomA);

Description

Forces the geometries into XYM mode. If a geometry has no M component, then a 0 M coordinate is tacked on. If it has a Z component, then Z is removed

Changed: 2.1.0. Up to 2.0.x this was called ST_Force_3DM.

This method supports Circular Strings and Curves

Examples

--Nothing happens to an already 3D geometry
SELECT ST_AsEWKT(ST_Force3DM(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)')));
                                   st_asewkt
------------------------------------------------
 CIRCULARSTRINGM(1 1 0,2 3 0,4 5 0,6 7 0,5 6 0)


SELECT  ST_AsEWKT(ST_Force3DM('POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))'));

                                                  st_asewkt
---------------------------------------------------------------
 POLYGONM((0 0 0,0 5 0,5 0 0,0 0 0),(1 1 0,3 1 0,1 3 0,1 1 0))

                

Name

ST_Force4D — Force the geometries into XYZM mode.

Synopsis

geometry ST_Force4D(geometry geomA);

Description

Forces the geometries into XYZM mode. 0 is tacked on for missing Z and M dimensions.

Changed: 2.1.0. Up to 2.0.x this was called ST_Force_4D.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

--Nothing happens to an already 3D geometry
SELECT ST_AsEWKT(ST_Force4D(ST_GeomFromEWKT('CIRCULARSTRING(1 1 2, 2 3 2, 4 5 2, 6 7 2, 5 6 2)')));
                                                st_asewkt
---------------------------------------------------------
 CIRCULARSTRING(1 1 2 0,2 3 2 0,4 5 2 0,6 7 2 0,5 6 2 0)



SELECT  ST_AsEWKT(ST_Force4D('MULTILINESTRINGM((0 0 1,0 5 2,5 0 3,0 0 4),(1 1 1,3 1 1,1 3 1,1 1 1))'));

                                                                          st_asewkt
--------------------------------------------------------------------------------------
 MULTILINESTRING((0 0 0 1,0 5 0 2,5 0 0 3,0 0 0 4),(1 1 0 1,3 1 0 1,1 3 0 1,1 1 0 1))

                

Name

ST_ForcePolygonCCW — Orients all exterior rings counter-clockwise and all interior rings clockwise.

Synopsis

geometry ST_ForcePolygonCCW ( geometry geom );

Description

Forces (Multi)Polygons to use a counter-clockwise orientation for their exterior ring, and a clockwise orientation for their interior rings. Non-polygonal geometries are returned unchanged.

This function supports 3d and will not drop the z-index.

This function supports M coordinates.


Name

ST_ForceCollection — Convert the geometry into a GEOMETRYCOLLECTION.

Synopsis

geometry ST_ForceCollection(geometry geomA);

Description

Converts the geometry into a GEOMETRYCOLLECTION. This is useful for simplifying the WKB representation.

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

Availability: 1.2.2, prior to 1.3.4 this function will crash with Curves. This is fixed in 1.3.4+

Changed: 2.1.0. Up to 2.0.x this was called ST_Force_Collection.

This function supports Polyhedral surfaces.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

SELECT  ST_AsEWKT(ST_ForceCollection('POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1))'));

                                                                   st_asewkt
----------------------------------------------------------------------------------
 GEOMETRYCOLLECTION(POLYGON((0 0 1,0 5 1,5 0 1,0 0 1),(1 1 1,3 1 1,1 3 1,1 1 1)))


  SELECT ST_AsText(ST_ForceCollection('CIRCULARSTRING(220227 150406,2220227 150407,220227 150406)'));
                                                                   st_astext
--------------------------------------------------------------------------------
 GEOMETRYCOLLECTION(CIRCULARSTRING(220227 150406,2220227 150407,220227 150406))
(1 row)

                
-- POLYHEDRAL example --
SELECT ST_AsEWKT(ST_ForceCollection('POLYHEDRALSURFACE(((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),
 ((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),
 ((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),
 ((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),
 ((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),
 ((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1)))'))

                                                                   st_asewkt
----------------------------------------------------------------------------------
GEOMETRYCOLLECTION(
  POLYGON((0 0 0,0 0 1,0 1 1,0 1 0,0 0 0)),
  POLYGON((0 0 0,0 1 0,1 1 0,1 0 0,0 0 0)),
  POLYGON((0 0 0,1 0 0,1 0 1,0 0 1,0 0 0)),
  POLYGON((1 1 0,1 1 1,1 0 1,1 0 0,1 1 0)),
  POLYGON((0 1 0,0 1 1,1 1 1,1 1 0,0 1 0)),
  POLYGON((0 0 1,1 0 1,1 1 1,0 1 1,0 0 1))
)
                

Name

ST_ForcePolygonCW — Orients all exterior rings clockwise and all interior rings counter-clockwise.

Synopsis

geometry ST_ForcePolygonCW ( geometry geom );

Description

Forces (Multi)Polygons to use a clockwise orientation for their exterior ring, and a counter-clockwise orientation for their interior rings. Non-polygonal geometries are returned unchanged.

This function supports 3d and will not drop the z-index.

This function supports M coordinates.


Name

ST_ForceSFS — Force the geometries to use SFS 1.1 geometry types only.

Synopsis

geometry ST_ForceSFS(geometry geomA);

geometry ST_ForceSFS(geometry geomA, text version);

Description

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This method supports Circular Strings and Curves

This function supports 3d and will not drop the z-index.


Name

ST_ForceRHR — Force the orientation of the vertices in a polygon to follow the Right-Hand-Rule.

Synopsis

geometry ST_ForceRHR(geometry g);

Description

Forces the orientation of the vertices in a polygon to follow a Right-Hand-Rule, in which the area that is bounded by the polygon is to the right of the boundary. In particular, the exterior ring is orientated in a clockwise direction and the interior rings in a counter-clockwise direction. This function is a synonym for ST_ForcePolygonCW

[Note]

The above definition of the Right-Hand-Rule conflicts with definitions used in other contexts. To avoid confusion, it is recommended to use ST_ForcePolygonCW.

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Examples

SELECT ST_AsEWKT(
  ST_ForceRHR(
        'POLYGON((0 0 2, 5 0 2, 0 5 2, 0 0 2),(1 1 2, 1 3 2, 3 1 2, 1 1 2))'
  )
);
                                                  st_asewkt
--------------------------------------------------------------
 POLYGON((0 0 2,0 5 2,5 0 2,0 0 2),(1 1 2,3 1 2,1 3 2,1 1 2))
(1 row)

Name

ST_ForceCurve — Upcast a geometry into its curved type, if applicable.

Synopsis

geometry ST_ForceCurve(geometry g);

Description

Turns a geometry into its curved representation, if applicable: lines become compoundcurves, multilines become multicurves polygons become curvepolygons multipolygons become multisurfaces. If the geometry input is already a curved representation returns back same as input.

Availability: 2.2.0

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

SELECT ST_AsText(
  ST_ForceCurve(
        'POLYGON((0 0 2, 5 0 2, 0 5 2, 0 0 2),(1 1 2, 1 3 2, 3 1 2, 1 1 2))'::geometry
  )
);
                              st_astext
----------------------------------------------------------------------
 CURVEPOLYGON Z ((0 0 2,5 0 2,0 5 2,0 0 2),(1 1 2,1 3 2,3 1 2,1 1 2))
(1 row)

Name

ST_LineMerge — Return a (set of) LineString(s) formed by sewing together a MULTILINESTRING.

Synopsis

geometry ST_LineMerge(geometry amultilinestring);

Description

Returns a (set of) LineString(s) formed by sewing together the constituent line work of a MULTILINESTRING.

[Note]

Only use with MULTILINESTRING/LINESTRINGs. If you feed a polygon or geometry collection into this function, it will return an empty GEOMETRYCOLLECTION

Availability: 1.1.0

[Note]

requires GEOS >= 2.1.0

Examples

SELECT ST_AsText(ST_LineMerge(
ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))')
                )
);
st_astext
--------------------------------------------------------------------------------------------------
LINESTRING(-29 -27,-30 -29.7,-36 -31,-45 -33,-46 -32)
(1 row)

--If can't be merged - original MULTILINESTRING is returned
SELECT ST_AsText(ST_LineMerge(
ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45.2 -33.2,-46 -32))')
)
);
st_astext
----------------
MULTILINESTRING((-45.2 -33.2,-46 -32),(-29 -27,-30 -29.7,-36 -31,-45 -33))
                        

Name

ST_CollectionExtract — Given a (multi)geometry, return a (multi)geometry consisting only of elements of the specified type.

Synopsis

geometry ST_CollectionExtract(geometry collection, integer type);

Description

Given a (multi)geometry, returns a (multi)geometry consisting only of elements of the specified type. Sub-geometries that are not the specified type are ignored. If there are no sub-geometries of the right type, an EMPTY geometry will be returned. Only points, lines and polygons are supported. Type numbers are 1 == POINT, 2 == LINESTRING, 3 == POLYGON.

Availability: 1.5.0

[Note]

Prior to 1.5.3 this function returned non-collection inputs untouched, no matter type. In 1.5.3 non-matching single geometries result in a NULL return. In of 2.0.0 every case of missing match results in a typed EMPTY return.

[Warning]

When specifying 3 == POLYGON a multipolygon is returned even when the edges are shared. This results in an invalid multipolygon for many cases such as applying this function on an ST_Split result.

Examples

-- Constants: 1 == POINT, 2 == LINESTRING, 3 == POLYGON
SELECT ST_AsText(ST_CollectionExtract(ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(POINT(0 0)))'),1));
st_astext
---------------
MULTIPOINT(0 0)
(1 row)

SELECT ST_AsText(ST_CollectionExtract(ST_GeomFromText('GEOMETRYCOLLECTION(GEOMETRYCOLLECTION(LINESTRING(0 0, 1 1)),LINESTRING(2 2, 3 3))'),2));
st_astext
---------------
MULTILINESTRING((0 0, 1 1), (2 2, 3 3))
(1 row)
                        

Name

ST_CollectionHomogenize — Given a geometry collection, return the "simplest" representation of the contents.

Synopsis

geometry ST_CollectionHomogenize(geometry collection);

Description

Given a geometry collection, returns the "simplest" representation of the contents. Singletons will be returned as singletons. Collections that are homogeneous will be returned as the appropriate multi-type.

[Warning]

When specifying 3 == POLYGON a multipolygon is returned even when the edges are shared. This results in an invalid multipolygon for many cases such as applying this function on an ST_Split result.

Availability: 2.0.0

Examples

SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0))'));

        st_astext
        ------------
         POINT(0 0)
        (1 row)

  SELECT ST_AsText(ST_CollectionHomogenize('GEOMETRYCOLLECTION(POINT(0 0),POINT(1 1))'));

        st_astext
        ---------------------
         MULTIPOINT(0 0,1 1)
        (1 row)

                                

Name

ST_Multi — Return the geometry as a MULTI* geometry.

Synopsis

geometry ST_Multi(geometry g1);

Description

Returns the geometry as a MULTI* geometry. If the geometry is already a MULTI*, it is returned unchanged.

Examples

SELECT ST_AsText(ST_Multi(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
                        743265 2967450,743265.625 2967416,743238 2967416))')));
                        st_astext
                        --------------------------------------------------------------------------------------------------
                        MULTIPOLYGON(((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,
                        743238 2967416)))
                        (1 row)
                        

See Also

ST_AsText


Name

ST_Normalize — Return the geometry in its canonical form.

Synopsis

geometry ST_Normalize(geometry geom);

Description

Returns the geometry in its normalized/canonical form. May reorder vertices in polygon rings, rings in a polygon, elements in a multi-geometry complex.

Mostly only useful for testing purposes (comparing expected and obtained results).

Examples

SELECT ST_AsText(ST_Normalize(ST_GeomFromText(
  'GEOMETRYCOLLECTION(
    POINT(2 3),
    MULTILINESTRING((0 0, 1 1),(2 2, 3 3)),
    POLYGON(
      (0 10,0 0,10 0,10 10,0 10),
      (4 2,2 2,2 4,4 4,4 2),
      (6 8,8 8,8 6,6 6,6 8)
    )
  )'
)));
                                                                     st_astext
----------------------------------------------------------------------------------------------------------------------------------------------------
 GEOMETRYCOLLECTION(POLYGON((0 0,0 10,10 10,10 0,0 0),(6 6,8 6,8 8,6 8,6 6),(2 2,4 2,4 4,2 4,2 2)),MULTILINESTRING((2 2,3 3),(0 0,1 1)),POINT(2 3))
(1 row)
                        

See Also

ST_Equals,


Name

ST_RemovePoint — Remove point from a linestring.

Synopsis

geometry ST_RemovePoint(geometry linestring, integer offset);

Description

Remove a point from a linestring, given its 0-based index. Useful for turning a closed ring into an open line string

Availability: 1.1.0

This function supports 3d and will not drop the z-index.

Examples

--guarantee no LINESTRINGS are closed
--by removing the end point.  The below assumes the_geom is of type LINESTRING
UPDATE sometable
        SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1)
        FROM sometable
        WHERE ST_IsClosed(the_geom) = true;
                

Name

ST_Reverse — Return the geometry with vertex order reversed.

Synopsis

geometry ST_Reverse(geometry g1);

Description

Can be used on any geometry and reverses the order of the vertexes.

Enhanced: 2.4.0 support for curves was introduced.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Examples

SELECT ST_AsText(the_geom) as line, ST_AsText(ST_Reverse(the_geom)) As reverseline
FROM
(SELECT ST_MakeLine(ST_MakePoint(1,2),
                ST_MakePoint(1,10)) As the_geom) as foo;
--result
                line         |     reverseline
---------------------+----------------------
LINESTRING(1 2,1 10) | LINESTRING(1 10,1 2)

Name

ST_Rotate — Rotate a geometry rotRadians counter-clockwise about an origin.

Synopsis

geometry ST_Rotate(geometry geomA, float rotRadians);

geometry ST_Rotate(geometry geomA, float rotRadians, float x0, float y0);

geometry ST_Rotate(geometry geomA, float rotRadians, geometry pointOrigin);

Description

Rotates geometry rotRadians counter-clockwise about the origin. The rotation origin can be specified either as a POINT geometry, or as x and y coordinates. If the origin is not specified, the geometry is rotated about POINT(0 0).

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

Enhanced: 2.0.0 additional parameters for specifying the origin of rotation were added.

Availability: 1.1.2. Name changed from Rotate to ST_Rotate in 1.2.2

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples

--Rotate 180 degrees
SELECT ST_AsEWKT(ST_Rotate('LINESTRING (50 160, 50 50, 100 50)', pi()));
               st_asewkt
---------------------------------------
 LINESTRING(-50 -160,-50 -50,-100 -50)
(1 row)

--Rotate 30 degrees counter-clockwise at x=50, y=160
SELECT ST_AsEWKT(ST_Rotate('LINESTRING (50 160, 50 50, 100 50)', pi()/6, 50, 160));
                                 st_asewkt
---------------------------------------------------------------------------
 LINESTRING(50 160,105 64.7372055837117,148.301270189222 89.7372055837117)
(1 row)

--Rotate 60 degrees clockwise from centroid
SELECT ST_AsEWKT(ST_Rotate(geom, -pi()/3, ST_Centroid(geom)))
FROM (SELECT 'LINESTRING (50 160, 50 50, 100 50)'::geometry AS geom) AS foo;
                           st_asewkt
--------------------------------------------------------------
 LINESTRING(116.4225 130.6721,21.1597 75.6721,46.1597 32.3708)
(1 row)
                

Name

ST_RotateX — Rotate a geometry rotRadians about the X axis.

Synopsis

geometry ST_RotateX(geometry geomA, float rotRadians);

Description

Rotate a geometry geomA - rotRadians about the X axis.

[Note]

ST_RotateX(geomA, rotRadians) is short-hand for ST_Affine(geomA, 1, 0, 0, 0, cos(rotRadians), -sin(rotRadians), 0, sin(rotRadians), cos(rotRadians), 0, 0, 0).

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

Availability: 1.1.2. Name changed from RotateX to ST_RotateX in 1.2.2

This function supports Polyhedral surfaces.

This function supports 3d and will not drop the z-index.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples

--Rotate a line 90 degrees along x-axis
SELECT ST_AsEWKT(ST_RotateX(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2));
                 st_asewkt
---------------------------
 LINESTRING(1 -3 2,1 -1 1)

Name

ST_RotateY — Rotate a geometry rotRadians about the Y axis.

Synopsis

geometry ST_RotateY(geometry geomA, float rotRadians);

Description

Rotate a geometry geomA - rotRadians about the y axis.

[Note]

ST_RotateY(geomA, rotRadians) is short-hand for ST_Affine(geomA, cos(rotRadians), 0, sin(rotRadians), 0, 1, 0, -sin(rotRadians), 0, cos(rotRadians), 0, 0, 0).

Availability: 1.1.2. Name changed from RotateY to ST_RotateY in 1.2.2

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

This function supports Polyhedral surfaces.

This function supports 3d and will not drop the z-index.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples

--Rotate a line 90 degrees along y-axis
 SELECT ST_AsEWKT(ST_RotateY(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2));
                 st_asewkt
---------------------------
 LINESTRING(3 2 -1,1 1 -1)

Name

ST_RotateZ — Rotate a geometry rotRadians about the Z axis.

Synopsis

geometry ST_RotateZ(geometry geomA, float rotRadians);

Description

Rotate a geometry geomA - rotRadians about the Z axis.

[Note]

This is a synonym for ST_Rotate

[Note]

ST_RotateZ(geomA, rotRadians) is short-hand for SELECT ST_Affine(geomA, cos(rotRadians), -sin(rotRadians), 0, sin(rotRadians), cos(rotRadians), 0, 0, 0, 1, 0, 0, 0).

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

Availability: 1.1.2. Name changed from RotateZ to ST_RotateZ in 1.2.2

[Note]

Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples

--Rotate a line 90 degrees along z-axis
SELECT ST_AsEWKT(ST_RotateZ(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2));
                 st_asewkt
---------------------------
 LINESTRING(-2 1 3,-1 1 1)

 --Rotate a curved circle around z-axis
SELECT ST_AsEWKT(ST_RotateZ(the_geom, pi()/2))
FROM (SELECT ST_LineToCurve(ST_Buffer(ST_GeomFromText('POINT(234 567)'), 3)) As the_geom) As foo;

                                                                                                           st_asewkt
----------------------------------------------------------------------------------------------------------------------------
 CURVEPOLYGON(CIRCULARSTRING(-567 237,-564.87867965644 236.12132034356,-564 234,-569.12132034356 231.87867965644,-567 237))


Name

ST_Scale — Scale a geometry by given factors.

Synopsis

geometry ST_Scale(geometry geomA, float XFactor, float YFactor, float ZFactor);

geometry ST_Scale(geometry geomA, float XFactor, float YFactor);

geometry ST_Scale(geometry geom, geometry factor);

Description

Scales the geometry to a new size by multiplying the ordinates with the corresponding factor parameters.

The version taking a geometry as the factor parameter allows passing a 2d, 3dm, 3dz or 4d point to set scaling factor for all supported dimensions. Missing dimensions in the factor point are equivalent to no scaling the corresponding dimension.

[Note]

Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+

Availability: 1.1.0.

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

Enhanced: 2.2.0 support for scaling all dimension (geometry parameter) was introduced.

This function supports Polyhedral surfaces.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports M coordinates.

Examples

--Version 1: scale X, Y, Z
SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 0.75, 0.8));
                          st_asewkt
--------------------------------------
 LINESTRING(0.5 1.5 2.4,0.5 0.75 0.8)

--Version 2: Scale X Y
 SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 0.75));
                        st_asewkt
----------------------------------
 LINESTRING(0.5 1.5 3,0.5 0.75 1)

--Version 3: Scale X Y Z M
 SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'),
   ST_MakePoint(0.5, 0.75, 2, -1)));
                               st_asewkt
----------------------------------------
 LINESTRING(0.5 1.5 6 -4,0.5 0.75 2 -1)



Name

ST_Segmentize — Return a modified geometry/geography having no segment longer than the given distance.

Synopsis

geometry ST_Segmentize(geometry geom, float max_segment_length);

geography ST_Segmentize(geography geog, float max_segment_length);

Description

Returns a modified geometry having no segment longer than the given max_segment_length. Distance computation is performed in 2d only. For geometry, length units are in units of spatial reference. For geography, units are in meters.

Availability: 1.2.2

Enhanced: 2.3.0 Segmentize geography now uses equal length segments

Enhanced: 2.1.0 support for geography was introduced.

Changed: 2.1.0 As a result of the introduction of geography support: The construct SELECT ST_Segmentize('LINESTRING(1 2, 3 4)',0.5); will result in ambiguous function error. You need to have properly typed object e.g. a geometry/geography column, use ST_GeomFromText, ST_GeogFromText or SELECT ST_Segmentize('LINESTRING(1 2, 3 4)'::geometry,0.5);

[Note]

This will only increase segments. It will not lengthen segments shorter than max length

Examples

SELECT ST_AsText(ST_Segmentize(
ST_GeomFromText('MULTILINESTRING((-29 -27,-30 -29.7,-36 -31,-45 -33),(-45 -33,-46 -32))')
                ,5)
);
st_astext
--------------------------------------------------------------------------------------------------
MULTILINESTRING((-29 -27,-30 -29.7,-34.886615700134 -30.758766735029,-36 -31,
-40.8809353009198 -32.0846522890933,-45 -33),
(-45 -33,-46 -32))
(1 row)

SELECT ST_AsText(ST_Segmentize(ST_GeomFromText('POLYGON((-29 28, -30 40, -29 28))'),10));
st_astext
-----------------------
POLYGON((-29 28,-29.8304547985374 37.9654575824488,-30 40,-29.1695452014626 30.0345424175512,-29 28))
(1 row)

                        

Name

ST_SetPoint — Replace point of a linestring with a given point.

Synopsis

geometry ST_SetPoint(geometry linestring, integer zerobasedposition, geometry point);

Description

Replace point N of linestring with given point. Index is 0-based.Negative index are counted backwards, so that -1 is last point. This is especially useful in triggers when trying to maintain relationship of joints when one vertex moves.

Availability: 1.1.0

Updated 2.3.0 : negative indexing

This function supports 3d and will not drop the z-index.

Examples

--Change first point in line string from -1 3 to -1 1
SELECT ST_AsText(ST_SetPoint('LINESTRING(-1 2,-1 3)', 0, 'POINT(-1 1)'));
           st_astext
-----------------------
 LINESTRING(-1 1,-1 3)

---Change last point in a line string (lets play with 3d linestring this time)
SELECT ST_AsEWKT(ST_SetPoint(foo.the_geom, ST_NumPoints(foo.the_geom) - 1, ST_GeomFromEWKT('POINT(-1 1 3)')))
FROM (SELECT ST_GeomFromEWKT('LINESTRING(-1 2 3,-1 3 4, 5 6 7)') As the_geom) As foo;
           st_asewkt
-----------------------
LINESTRING(-1 2 3,-1 3 4,-1 1 3)

SELECT ST_AsText(ST_SetPoint(g, -3, p))
FROM ST_GEomFromText('LINESTRING(0 0, 1 1, 2 2, 3 3, 4 4)') AS g
        , ST_PointN(g,1) as p;
           st_astext
-----------------------
LINESTRING(0 0,1 1,0 0,3 3,4 4)

                        

Name

ST_SetSRID — Set the SRID on a geometry to a particular integer value.

Synopsis

geometry ST_SetSRID(geometry geom, integer srid);

Description

Sets the SRID on a geometry to a particular integer value. Useful in constructing bounding boxes for queries.

[Note]

This function does not transform the geometry coordinates in any way - it simply sets the meta data defining the spatial reference system the geometry is assumed to be in. Use ST_Transform if you want to transform the geometry into a new projection.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method supports Circular Strings and Curves

Examples

-- Mark a point as WGS 84 long lat --

SELECT ST_SetSRID(ST_Point(-123.365556, 48.428611),4326) As wgs84long_lat;
-- the ewkt representation (wrap with ST_AsEWKT) -
SRID=4326;POINT(-123.365556 48.428611)
                        

-- Mark a point as WGS 84 long lat and then transform to web mercator (Spherical Mercator) --

SELECT ST_Transform(ST_SetSRID(ST_Point(-123.365556, 48.428611),4326),3785) As spere_merc;
-- the ewkt representation (wrap with ST_AsEWKT) -
SRID=3785;POINT(-13732990.8753491 6178458.96425423)
                        

Name

ST_SnapToGrid — Snap all points of the input geometry to a regular grid.

Synopsis

geometry ST_SnapToGrid(geometry geomA, float originX, float originY, float sizeX, float sizeY);

geometry ST_SnapToGrid(geometry geomA, float sizeX, float sizeY);

geometry ST_SnapToGrid(geometry geomA, float size);

geometry ST_SnapToGrid(geometry geomA, geometry pointOrigin, float sizeX, float sizeY, float sizeZ, float sizeM);

Description

Variant 1,2,3: Snap all points of the input geometry to the grid defined by its origin and cell size. Remove consecutive points falling on the same cell, eventually returning NULL if output points are not enough to define a geometry of the given type. Collapsed geometries in a collection are stripped from it. Useful for reducing precision.

Variant 4: Introduced 1.1.0 - Snap all points of the input geometry to the grid defined by its origin (the second argument, must be a point) and cell sizes. Specify 0 as size for any dimension you don't want to snap to a grid.

[Note]

The returned geometry might lose its simplicity (see ST_IsSimple).

[Note]

Before release 1.1.0 this function always returned a 2d geometry. Starting at 1.1.0 the returned geometry will have same dimensionality as the input one with higher dimension values untouched. Use the version taking a second geometry argument to define all grid dimensions.

Availability: 1.0.0RC1

Availability: 1.1.0 - Z and M support

This function supports 3d and will not drop the z-index.

Examples

--Snap your geometries to a precision grid of 10^-3
UPDATE mytable
   SET the_geom = ST_SnapToGrid(the_geom, 0.001);

SELECT ST_AsText(ST_SnapToGrid(
                        ST_GeomFromText('LINESTRING(1.1115678 2.123, 4.111111 3.2374897, 4.11112 3.23748667)'),
                        0.001)
                );
                          st_astext
-------------------------------------
 LINESTRING(1.112 2.123,4.111 3.237)
 --Snap a 4d geometry
SELECT ST_AsEWKT(ST_SnapToGrid(
        ST_GeomFromEWKT('LINESTRING(-1.1115678 2.123 2.3456 1.11111,
                4.111111 3.2374897 3.1234 1.1111, -1.11111112 2.123 2.3456 1.1111112)'),
 ST_GeomFromEWKT('POINT(1.12 2.22 3.2 4.4444)'),
 0.1, 0.1, 0.1, 0.01) );
                                                                  st_asewkt
------------------------------------------------------------------------------
 LINESTRING(-1.08 2.12 2.3 1.1144,4.12 3.22 3.1 1.1144,-1.08 2.12 2.3 1.1144)


--With a 4d geometry - the ST_SnapToGrid(geom,size) only touches x and y coords but keeps m and z the same
SELECT ST_AsEWKT(ST_SnapToGrid(ST_GeomFromEWKT('LINESTRING(-1.1115678 2.123 3 2.3456,
                4.111111 3.2374897 3.1234 1.1111)'),
           0.01)      );
                                                st_asewkt
---------------------------------------------------------
 LINESTRING(-1.11 2.12 3 2.3456,4.11 3.24 3.1234 1.1111)

                

Name

ST_Snap — Snap segments and vertices of input geometry to vertices of a reference geometry.

Synopsis

geometry ST_Snap(geometry input, geometry reference, float tolerance);

Description

Snaps the vertices and segments of a geometry another Geometry's vertices. A snap distance tolerance is used to control where snapping is performed. The result geometry is the input geometry with the vertices snapped. If no snapping occurs then the input geometry is returned unchanged.

Snapping one geometry to another can improve robustness for overlay operations by eliminating nearly-coincident edges (which cause problems during noding and intersection calculation).

Too much snapping can result in invalid topology being created, so the number and location of snapped vertices is decided using heuristics to determine when it is safe to snap. This can result in some potential snaps being omitted, however.

[Note]

The returned geometry might lose its simplicity (see ST_IsSimple) and validity (see ST_IsValid).

Availability: 2.0.0 requires GEOS >= 3.3.0.

Examples

A multipolygon shown with a linestring (before any snapping)

A multipolygon snapped to linestring to tolerance: 1.01 of distance. The new multipolygon is shown with reference linestring

SELECT ST_AsText(ST_Snap(poly,line, ST_Distance(poly,line)*1.01)) AS polysnapped
FROM (SELECT
   ST_GeomFromText('MULTIPOLYGON(
     ((26 125, 26 200, 126 200, 126 125, 26 125 ),
      ( 51 150, 101 150, 76 175, 51 150 )),
      (( 151 100, 151 200, 176 175, 151 100 )))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line

        ) As foo;

                             polysnapped
---------------------------------------------------------------------
 MULTIPOLYGON(((26 125,26 200,126 200,126 125,101 100,26 125),
 (51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100)))
                                

A multipolygon snapped to linestring to tolerance: 1.25 of distance. The new multipolygon is shown with reference linestring

SELECT ST_AsText(
    ST_Snap(poly,line, ST_Distance(poly,line)*1.25)
  ) AS polysnapped
FROM (SELECT
  ST_GeomFromText('MULTIPOLYGON(
    (( 26 125, 26 200, 126 200, 126 125, 26 125 ),
      ( 51 150, 101 150, 76 175, 51 150 )),
      (( 151 100, 151 200, 176 175, 151 100 )))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line

        ) As foo;

                             polysnapped
---------------------------------------------------------------------
MULTIPOLYGON(((5 107,26 200,126 200,126 125,101 100,54 84,5 107),
(51 150,101 150,76 175,51 150)),((151 100,151 200,176 175,151 100)))
                                

The linestring snapped to the original multipolygon at tolerance 1.01 of distance. The new linestring is shown with reference multipolygon

SELECT ST_AsText(
   ST_Snap(line, poly, ST_Distance(poly,line)*1.01)
  ) AS linesnapped
FROM (SELECT
  ST_GeomFromText('MULTIPOLYGON(
     ((26 125, 26 200, 126 200, 126 125, 26 125),
      (51 150, 101 150, 76 175, 51 150 )),
      ((151 100, 151 200, 176 175, 151 100)))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line
        ) As foo;

              linesnapped
----------------------------------------
 LINESTRING(5 107,26 125,54 84,101 100)
                                

The linestring snapped to the original multipolygon at tolerance 1.25 of distance. The new linestring is shown with reference multipolygon

SELECT ST_AsText(
 ST_Snap(line, poly, ST_Distance(poly,line)*1.25)
  ) AS linesnapped
FROM (SELECT
  ST_GeomFromText('MULTIPOLYGON(
     (( 26 125, 26 200, 126 200, 126 125, 26 125 ),
      (51 150, 101 150, 76 175, 51 150 )),
      ((151 100, 151 200, 176 175, 151 100 )))') As poly,
       ST_GeomFromText('LINESTRING (5 107, 54 84, 101 100)') As line
        ) As foo;
              linesnapped
---------------------------------------
LINESTRING(26 125,54 84,101 100)
                                

See Also

ST_SnapToGrid


Name

ST_Transform — Return a new geometry with its coordinates transformed to a different spatial reference.

Synopsis

geometry ST_Transform(geometry g1, integer srid);

geometry ST_Transform(geometry geom, text to_proj);

geometry ST_Transform(geometry geom, text from_proj, text to_proj);

geometry ST_Transform(geometry geom, text from_proj, integer to_srid);

Description

Returns a new geometry with its coordinates transformed to a different spatial reference system. The destination spatial reference to_srid may be identified by a valid SRID integer parameter (i.e. it must exist in the spatial_ref_sys table). Alternatively, a spatial reference defined as a PROJ.4 string can be used for to_proj and/or from_proj, however these methods are not optimized. If the destination spatial reference system is expressed with a PROJ.4 string instead of an SRID, the SRID of the output geometry will be set to zero. With the exception of functions with from_proj, input geometries must have a defined SRID.

ST_Transform is often confused with ST_SetSRID(). ST_Transform actually changes the coordinates of a geometry from one spatial reference system to another, while ST_SetSRID() simply changes the SRID identifier of the geometry.

[Note]

Requires PostGIS be compiled with Proj support. Use PostGIS_Full_Version to confirm you have proj support compiled in.

[Note]

If using more than one transformation, it is useful to have a functional index on the commonly used transformations to take advantage of index usage.

[Note]

Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

Enhanced: 2.3.0 support for direct PROJ.4 text was introduced.

This method implements the SQL/MM specification. SQL-MM 3: 5.1.6

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Examples

Change Massachusetts state plane US feet geometry to WGS 84 long lat

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
        743265 2967450,743265.625 2967416,743238 2967416))',2249),4326)) As wgs_geom;

 wgs_geom
---------------------------
 POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,
-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.177684
8522251 42.3902896512902));
(1 row)

--3D Circular String example
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'),4326));

                                 st_asewkt
--------------------------------------------------------------------------------------
 SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512902 1,-71.1776843766326 42.3903829478009 2,
 -71.1775844305465 42.3903826677917 3,
 -71.1775825927231 42.3902893647987 3,-71.1776848522251 42.3902896512902 4)

                

Example of creating a partial functional index. For tables where you are not sure all the geometries will be filled in, its best to use a partial index that leaves out null geometries which will both conserve space and make your index smaller and more efficient.

CREATE INDEX idx_the_geom_26986_parcels
  ON parcels
  USING gist
  (ST_Transform(the_geom, 26986))
  WHERE the_geom IS NOT NULL;
                

Examples of using PROJ.4 text to transform with custom spatial references.

-- Find intersection of two polygons near the North pole, using a custom Gnomic projection
-- See http://boundlessgeo.com/2012/02/flattening-the-peel/
 WITH data AS (
   SELECT
     ST_GeomFromText('POLYGON((170 50,170 72,-130 72,-130 50,170 50))', 4326) AS p1,
     ST_GeomFromText('POLYGON((-170 68,-170 90,-141 90,-141 68,-170 68))', 4326) AS p2,
     '+proj=gnom +ellps=WGS84 +lat_0=70 +lon_0=-160 +no_defs'::text AS gnom
 )
 SELECT ST_AsText(
   ST_Transform(
     ST_Intersection(ST_Transform(p1, gnom), ST_Transform(p2, gnom)),
   gnom, 4326))
 FROM data;
                                          st_astext
 --------------------------------------------------------------------------------
  POLYGON((-170 74.053793645338,-141 73.4268621378904,-141 68,-170 68,-170 74.053793645338))
                

Configuring transformation behaviour

Sometimes coordinate transformation involving a grid-shift can fail, for example if PROJ.4 has not been built with grid-shift files or the coordinate does not lie within the range for which the grid shift is defined. By default, PostGIS will throw an error if a grid shift file is not present, but this behaviour can be configured on a per-SRID basis either by testing different to_proj values of PROJ.4 text, or altering the proj4text value within the spatial_ref_sys table.

For example, the proj4text parameter +datum=NAD87 is a shorthand form for the following +nadgrids parameter:

+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat

The @ prefix means no error is reported if the files are not present, but if the end of the list is reached with no file having been appropriate (ie. found and overlapping) then an error is issued.

If, conversely, you wanted to ensure that at least the standard files were present, but that if all files were scanned without a hit a null transformation is applied you could use:

+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null

The null grid shift file is a valid grid shift file covering the whole world and applying no shift. So for a complete example, if you wanted to alter PostGIS so that transformations to SRID 4267 that didn't lie within the correct range did not throw an ERROR, you would use the following:

UPDATE spatial_ref_sys SET proj4text = '+proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null +no_defs' WHERE srid = 4267;

Name

ST_Translate — Translate a geometry by given offsets.

Synopsis

geometry ST_Translate(geometry g1, float deltax, float deltay);

geometry ST_Translate(geometry g1, float deltax, float deltay, float deltaz);

Description

Returns a new geometry whose coordinates are translated delta x,delta y,delta z units. Units are based on the units defined in spatial reference (SRID) for this geometry.

[Note]

Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+

Availability: 1.2.2

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

Move a point 1 degree longitude

SELECT ST_AsText(ST_Translate(ST_GeomFromText('POINT(-71.01 42.37)',4326),1,0)) As wgs_transgeomtxt;

        wgs_transgeomtxt
        ---------------------
        POINT(-70.01 42.37)
                

Move a linestring 1 degree longitude and 1/2 degree latitude

SELECT ST_AsText(ST_Translate(ST_GeomFromText('LINESTRING(-71.01 42.37,-71.11 42.38)',4326),1,0.5)) As wgs_transgeomtxt;
                   wgs_transgeomtxt
        ---------------------------------------
        LINESTRING(-70.01 42.87,-70.11 42.88)
                

Move a 3d point

SELECT ST_AsEWKT(ST_Translate(CAST('POINT(0 0 0)' As geometry), 5, 12,3));
        st_asewkt
        ---------
        POINT(5 12 3)
                

Move a curve and a point

SELECT ST_AsText(ST_Translate(ST_Collect('CURVEPOLYGON(CIRCULARSTRING(4 3,3.12 0.878,1 0,-1.121 5.1213,6 7, 8 9,4 3))','POINT(1 3)'),1,2));
                                                                                                                 st_astext
------------------------------------------------------------------------------------------------------------
 GEOMETRYCOLLECTION(CURVEPOLYGON(CIRCULARSTRING(5 5,4.12 2.878,2 2,-0.121 7.1213,7 9,9 11,5 5)),POINT(2 5))

Name

ST_TransScale — Translate a geometry by given factors and offsets.

Synopsis

geometry ST_TransScale(geometry geomA, float deltaX, float deltaY, float XFactor, float YFactor);

Description

Translates the geometry using the deltaX and deltaY args, then scales it using the XFactor, YFactor args, working in 2D only.

[Note]

ST_TransScale(geomA, deltaX, deltaY, XFactor, YFactor) is short-hand for ST_Affine(geomA, XFactor, 0, 0, 0, YFactor, 0, 0, 0, 1, deltaX*XFactor, deltaY*YFactor, 0).

[Note]

Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+

Availability: 1.1.0.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

SELECT ST_AsEWKT(ST_TransScale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 1, 1, 2));
                  st_asewkt
-----------------------------
 LINESTRING(1.5 6 3,1.5 4 1)


--Buffer a point to get an approximation of a circle, convert to curve and then translate 1,2 and scale it 3,4
  SELECT ST_AsText(ST_Transscale(ST_LineToCurve(ST_Buffer('POINT(234 567)', 3)),1,2,3,4));
                                                                                                                  st_astext
------------------------------------------------------------------------------------------------------------------------------
 CURVEPOLYGON(CIRCULARSTRING(714 2276,711.363961030679 2267.51471862576,705 2264,698.636038969321 2284.48528137424,714 2276))

8.7. Geometry Outputs

ST_AsBinary — Return the Well-Known Binary (WKB) representation of the geometry/geography without SRID meta data.
ST_AsEncodedPolyline — Returns an Encoded Polyline from a LineString geometry.
ST_AsEWKB — Return the Well-Known Binary (WKB) representation of the geometry with SRID meta data.
ST_AsEWKT — Return the Well-Known Text (WKT) representation of the geometry with SRID meta data.
ST_AsGeoJSON — Return the geometry as a GeoJSON element.
ST_AsGML — Return the geometry as a GML version 2 or 3 element.
ST_AsHEXEWKB — Returns a Geometry in HEXEWKB format (as text) using either little-endian (NDR) or big-endian (XDR) encoding.
ST_AsKML — Return the geometry as a KML element. Several variants. Default version=2, default precision=15
ST_AsLatLonText — Return the Degrees, Minutes, Seconds representation of the given point.
ST_AsSVG — Returns a Geometry in SVG path data given a geometry or geography object.
ST_AsText — Return the Well-Known Text (WKT) representation of the geometry/geography without SRID metadata.
ST_AsTWKB — Returns the geometry as TWKB, aka "Tiny Well-Known Binary"
ST_AsX3D — Returns a Geometry in X3D xml node element format: ISO-IEC-19776-1.2-X3DEncodings-XML
ST_GeoHash — Return a GeoHash representation of the geometry.
ST_AsGeobuf — Return a Geobuf representation of a set of rows.
ST_AsMVTGeom — Transform a geometry into the coordinate space of a Mapbox Vector Tile.
ST_AsMVT — Return a Mapbox Vector Tile representation of a set of rows.

Name

ST_AsBinary — Return the Well-Known Binary (WKB) representation of the geometry/geography without SRID meta data.

Synopsis

bytea ST_AsBinary(geometry g1);

bytea ST_AsBinary(geometry g1, text NDR_or_XDR);

bytea ST_AsBinary(geography g1);

bytea ST_AsBinary(geography g1, text NDR_or_XDR);

Description

Returns the Well-Known Binary representation of the geometry. There are 2 variants of the function. The first variant takes no endian encoding parameter and defaults to server machine endian. The second variant takes a second argument denoting the encoding - using little-endian ('NDR') or big-endian ('XDR') encoding.

This is useful in binary cursors to pull data out of the database without converting it to a string representation.

[Note]

The WKB spec does not include the SRID. To get the WKB with SRID format use ST_AsEWKB

[Note]

ST_AsBinary is the reverse of ST_GeomFromWKB for geometry. Use ST_GeomFromWKB to convert to a postgis geometry from ST_AsBinary representation.

[Note]

The default behavior in PostgreSQL 9.0 has been changed to output bytea in hex encoding. ST_AsBinary is the reverse of ST_GeomFromWKB for geometry. If your GUI tools require the old behavior, then SET bytea_output='escape' in your database.

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

Enhanced: 2.0.0 support for higher coordinate dimensions was introduced.

Enhanced: 2.0.0 support for specifying endian with geography was introduced.

Availability: 1.5.0 geography support was introduced.

Changed: 2.0.0 Inputs to this function can not be unknown -- must be geometry. Constructs such as ST_AsBinary('POINT(1 2)') are no longer valid and you will get an n st_asbinary(unknown) is not unique error. Code like that needs to be changed to ST_AsBinary('POINT(1 2)'::geometry);. If that is not possible, then install legacy.sql.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.37

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports 3d and will not drop the z-index.

Examples

SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));

                   st_asbinary
--------------------------------
\001\003\000\000\000\001\000\000\000\005
\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000
\000\000\000\360?\000\000\000\000\000\000
\360?\000\000\000\000\000\000\360?\000\000
\000\000\000\000\360?\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000
(1 row)
SELECT ST_AsBinary(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR');
                   st_asbinary
--------------------------------
\000\000\000\000\003\000\000\000\001\000\000\000\005\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000?\360\000\000\000\000\000\000?\360\000\000\000\000\000\000?\360\000\000
\000\000\000\000?\360\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
(1 row)

Name

ST_AsEncodedPolyline — Returns an Encoded Polyline from a LineString geometry.

Synopsis

text ST_AsEncodedPolyline(geometry geom, integer precision=5);

Description

Returns the geometry as an Encoded Polyline. This is a format very useful if you are using google maps

Availability: 2.2.0

Examples

Basic

SELECT ST_AsEncodedPolyline(GeomFromEWKT('SRID=4326;LINESTRING(-120.2 38.5,-120.95 40.7,-126.453 43.252)'));
        --result--
        |_p~iF~ps|U_ulLnnqC_mqNvxq`@
        

Use in conjunction with geography linestring and geography segmentize, and put on google maps

-- the SQL for Boston to San Francisco, segments every 100 KM
        SELECT ST_AsEncodedPolyline(
                ST_Segmentize(
                        ST_GeogFromText('LINESTRING(-71.0519 42.4935,-122.4483 37.64)'),
                                100000)::geometry) As encodedFlightPath;

javascript will look something like this where $ variable you replace with query result

<script type="text/javascript" src="http://maps.googleapis.com/maps/api/js?libraries=geometry"></script>
<script type="text/javascript">
         flightPath = new google.maps.Polyline({
                        path:  google.maps.geometry.encoding.decodePath("$encodedFlightPath"),
                        map: map,
                        strokeColor: '#0000CC',
                        strokeOpacity: 1.0,
                        strokeWeight: 4
                });
</script>
        

Name

ST_AsEWKB — Return the Well-Known Binary (WKB) representation of the geometry with SRID meta data.

Synopsis

bytea ST_AsEWKB(geometry g1);

bytea ST_AsEWKB(geometry g1, text NDR_or_XDR);

Description

Returns the Well-Known Binary representation of the geometry with SRID metadata. There are 2 variants of the function. The first variant takes no endian encoding parameter and defaults to little endian. The second variant takes a second argument denoting the encoding - using little-endian ('NDR') or big-endian ('XDR') encoding.

This is useful in binary cursors to pull data out of the database without converting it to a string representation.

[Note]

The WKB spec does not include the SRID. To get the OGC WKB format use ST_AsBinary

[Note]

ST_AsEWKB is the reverse of ST_GeomFromEWKB. Use ST_GeomFromEWKB to convert to a postgis geometry from ST_AsEWKB representation.

Enhanced: 2.0.0 support for Polyhedral surfaces, Triangles and TIN was introduced.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples

SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));

                   st_asewkb
--------------------------------
\001\003\000\000 \346\020\000\000\001\000
\000\000\005\000\000\000\000
\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000
\000\000\360?\000\000\000\000\000\000\360?
\000\000\000\000\000\000\360?\000\000\000\000\000
\000\360?\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000
(1 row)
SELECT ST_AsEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326), 'XDR');
                   st_asewkb
--------------------------------
\000 \000\000\003\000\000\020\346\000\000\000\001\000\000\000\005\000\000\000\000\
000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000?
\360\000\000\000\000\000\000?\360\000\000\000\000\000\000?\360\000\000\000\000
\000\000?\360\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000
\000\000\000\000\000\000\000\000\000\000\000\000\000
                

Name

ST_AsEWKT — Return the Well-Known Text (WKT) representation of the geometry with SRID meta data.

Synopsis

text ST_AsEWKT(geometry g1);

text ST_AsEWKT(geography g1);

Description

Returns the Well-Known Text representation of the geometry prefixed with the SRID.

[Note]

The WKT spec does not include the SRID. To get the OGC WKT format use ST_AsText

WKT format does not maintain precision so to prevent floating truncation, use ST_AsBinary or ST_AsEWKB format for transport.

[Note]

ST_AsEWKT is the reverse of ST_GeomFromEWKT. Use ST_GeomFromEWKT to convert to a postgis geometry from ST_AsEWKT representation.

Enhanced: 2.0.0 support for Geography, Polyhedral surfaces, Triangles and TIN was introduced.

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples

SELECT ST_AsEWKT('0103000020E61000000100000005000000000000
                        000000000000000000000000000000000000000000000000000000
                        F03F000000000000F03F000000000000F03F000000000000F03
                        F000000000000000000000000000000000000000000000000'::geometry);

                   st_asewkt
--------------------------------
SRID=4326;POLYGON((0 0,0 1,1 1,1 0,0 0))
(1 row)

SELECT ST_AsEWKT('0108000080030000000000000060E30A4100000000785C0241000000000000F03F0000000018
E20A4100000000485F024100000000000000400000000018
E20A4100000000305C02410000000000000840')

--st_asewkt---
CIRCULARSTRING(220268 150415 1,220227 150505 2,220227 150406 3)

Name

ST_AsGeoJSON — Return the geometry as a GeoJSON element.

Synopsis

text ST_AsGeoJSON(geometry geom, integer maxdecimaldigits=15, integer options=0);

text ST_AsGeoJSON(geography geog, integer maxdecimaldigits=15, integer options=0);

text ST_AsGeoJSON(integer gj_version, geometry geom, integer maxdecimaldigits=15, integer options=0);

text ST_AsGeoJSON(integer gj_version, geography geog, integer maxdecimaldigits=15, integer options=0);

Description

Return the geometry as a Geometry Javascript Object Notation (GeoJSON) element. (Cf GeoJSON specifications 1.0). 2D and 3D Geometries are both supported. GeoJSON only support SFS 1.1 geometry type (no curve support for example).

The gj_version parameter is the major version of the GeoJSON spec. If specified, must be 1. This represents the spec version of GeoJSON.

The third argument may be used to reduce the maximum number of decimal places used in output (defaults to 15).

The last 'options' argument could be used to add Bbox or Crs in GeoJSON output:

  • 0: means no option (default value)

  • 1: GeoJSON Bbox

  • 2: GeoJSON Short CRS (e.g EPSG:4326)

  • 4: GeoJSON Long CRS (e.g urn:ogc:def:crs:EPSG::4326)

Version 1: ST_AsGeoJSON(geom) / precision=15 version=1 options=0

Version 2: ST_AsGeoJSON(geom, precision) / version=1 options=0

Version 3: ST_AsGeoJSON(geom, precision, options) / version=1

Version 4: ST_AsGeoJSON(gj_version, geom) / precision=15 options=0

Version 5: ST_AsGeoJSON(gj_version, geom, precision) /options=0

Version 6: ST_AsGeoJSON(gj_version, geom, precision,options)

Availability: 1.3.4

Availability: 1.5.0 geography support was introduced.

Changed: 2.0.0 support default args and named args.

This function supports 3d and will not drop the z-index.

Examples

GeoJSON format is generally more efficient than other formats for use in ajax mapping. One popular javascript client that supports this is Open Layers. Example of its use is OpenLayers GeoJSON Example

SELECT ST_AsGeoJSON(the_geom) from fe_edges limit 1;
                                           st_asgeojson
-----------------------------------------------------------------------------------------------------------

{"type":"MultiLineString","coordinates":[[[-89.734634999999997,31.492072000000000],
[-89.734955999999997,31.492237999999997]]]}
(1 row)
--3d point
SELECT ST_AsGeoJSON('LINESTRING(1 2 3, 4 5 6)');

st_asgeojson
-----------------------------------------------------------------------------------------
 {"type":"LineString","coordinates":[[1,2,3],[4,5,6]]}


Name

ST_AsGML — Return the geometry as a GML version 2 or 3 element.

Synopsis

text ST_AsGML(geometry geom, integer maxdecimaldigits=15, integer options=0);

text ST_AsGML(geography geog, integer maxdecimaldigits=15, integer options=0);

text ST_AsGML(integer version, geometry geom, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null);

text ST_AsGML(integer version, geography geog, integer maxdecimaldigits=15, integer options=0, text nprefix=null, text id=null);

Description

Return the geometry as a Geography Markup Language (GML) element. The version parameter, if specified, may be either 2 or 3. If no version parameter is specified then the default is assumed to be 2. The precision argument may be used to reduce the maximum number of decimal places (maxdecimaldigits) used in output (defaults to 15).

GML 2 refer to 2.1.2 version, GML 3 to 3.1.1 version

The 'options' argument is a bitfield. It could be used to define CRS output type in GML output, and to declare data as lat/lon:

  • 0: GML Short CRS (e.g EPSG:4326), default value

  • 1: GML Long CRS (e.g urn:ogc:def:crs:EPSG::4326)

  • 2: For GML 3 only, remove srsDimension attribute from output.

  • 4: For GML 3 only, use <LineString> rather than <Curve> tag for lines.

  • 16: Declare that datas are lat/lon (e.g srid=4326). Default is to assume that data are planars. This option is useful for GML 3.1.1 output only, related to axis order. So if you set it, it will swap the coordinates so order is lat lon instead of database lon lat.

  • 32: Output the box of the geometry (envelope).

The 'namespace prefix' argument may be used to specify a custom namespace prefix or no prefix (if empty). If null or omitted 'gml' prefix is used

Availability: 1.3.2

Availability: 1.5.0 geography support was introduced.

Enhanced: 2.0.0 prefix support was introduced. Option 4 for GML3 was introduced to allow using LineString instead of Curve tag for lines. GML3 Support for Polyhedral surfaces and TINS was introduced. Option 32 was introduced to output the box.

Changed: 2.0.0 use default named args

Enhanced: 2.1.0 id support was introduced, for GML 3.

[Note]

Only version 3+ of ST_AsGML supports Polyhedral Surfaces and TINS.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Examples: Version 2

SELECT ST_AsGML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
                st_asgml
                --------
                <gml:Polygon srsName="EPSG:4326"><gml:outerBoundaryIs><gml:LinearRing><gml:coordinates>0,0 0,1 1,1 1,0 0,0</gml:coordinates></gml:LinearRing></gml:outerBoundaryIs></gml:Polygon>
                        

Examples: Version 3

-- Flip coordinates and output extended EPSG (16 | 1)--
SELECT ST_AsGML(3, ST_GeomFromText('POINT(5.234234233242 6.34534534534)',4326), 5, 17);
                        st_asgml
                        --------
                <gml:Point srsName="urn:ogc:def:crs:EPSG::4326"><gml:pos>6.34535 5.23423</gml:pos></gml:Point>
                        
-- Output the envelope (32) --
SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 32);
                st_asgml
                --------
        <gml:Envelope srsName="EPSG:4326">
                <gml:lowerCorner>1 2</gml:lowerCorner>
                <gml:upperCorner>10 20</gml:upperCorner>
        </gml:Envelope>
                        
-- Output the envelope (32) , reverse (lat lon instead of lon lat) (16), long srs (1)= 32 | 16 | 1 = 49 --
SELECT ST_AsGML(3, ST_GeomFromText('LINESTRING(1 2, 3 4, 10 20)',4326), 5, 49);
        st_asgml
        --------
<gml:Envelope srsName="urn:ogc:def:crs:EPSG::4326">
        <gml:lowerCorner>2 1</gml:lowerCorner>
        <gml:upperCorner>20 10</gml:upperCorner>
</gml:Envelope>
                        
-- Polyhedral Example --
SELECT ST_AsGML(3, ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'));
        st_asgml
        --------
 <gml:PolyhedralSurface>
<gml:polygonPatches>
   <gml:PolygonPatch>
                <gml:exterior>
                          <gml:LinearRing>
                                   <gml:posList srsDimension="3">0 0 0 0 0 1 0 1 1 0 1 0 0 0 0</gml:posList>
                          </gml:LinearRing>
                </gml:exterior>
   </gml:PolygonPatch>
   <gml:PolygonPatch>
                <gml:exterior>
                          <gml:LinearRing>
                                   <gml:posList srsDimension="3">0 0 0 0 1 0 1 1 0 1 0 0 0 0 0</gml:posList>
                          </gml:LinearRing>
                </gml:exterior>
   </gml:PolygonPatch>
   <gml:PolygonPatch>
                <gml:exterior>
                          <gml:LinearRing>
                                   <gml:posList srsDimension="3">0 0 0 1 0 0 1 0 1 0 0 1 0 0 0</gml:posList>
                          </gml:LinearRing>
                </gml:exterior>
   </gml:PolygonPatch>
   <gml:PolygonPatch>
                <gml:exterior>
                          <gml:LinearRing>
                                   <gml:posList srsDimension="3">1 1 0 1 1 1 1 0 1 1 0 0 1 1 0</gml:posList>
                          </gml:LinearRing>
                </gml:exterior>
   </gml:PolygonPatch>
   <gml:PolygonPatch>
                <gml:exterior>
                          <gml:LinearRing>
                                   <gml:posList srsDimension="3">0 1 0 0 1 1 1 1 1 1 1 0 0 1 0</gml:posList>
                          </gml:LinearRing>
                </gml:exterior>
   </gml:PolygonPatch>
   <gml:PolygonPatch>
                <gml:exterior>
                          <gml:LinearRing>
                                   <gml:posList srsDimension="3">0 0 1 1 0 1 1 1 1 0 1 1 0 0 1</gml:posList>
                          </gml:LinearRing>
                </gml:exterior>
   </gml:PolygonPatch>
</gml:polygonPatches>
</gml:PolyhedralSurface>
                        

Name

ST_AsHEXEWKB — Returns a Geometry in HEXEWKB format (as text) using either little-endian (NDR) or big-endian (XDR) encoding.

Synopsis

text ST_AsHEXEWKB(geometry g1, text NDRorXDR);

text ST_AsHEXEWKB(geometry g1);

Description

Returns a Geometry in HEXEWKB format (as text) using either little-endian (NDR) or big-endian (XDR) encoding. If no encoding is specified, then NDR is used.

[Note]

Availability: 1.2.2

This function supports 3d and will not drop the z-index.

This method supports Circular Strings and Curves

Examples

SELECT ST_AsHEXEWKB(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));
                which gives same answer as

                SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326)::text;

                st_ashexewkb
                --------
                0103000020E6100000010000000500
                00000000000000000000000000000000
                00000000000000000000000000000000F03F
                000000000000F03F000000000000F03F000000000000F03
                F000000000000000000000000000000000000000000000000

Name

ST_AsKML — Return the geometry as a KML element. Several variants. Default version=2, default precision=15

Synopsis

text ST_AsKML(geometry geom, integer maxdecimaldigits=15);

text ST_AsKML(geography geog, integer maxdecimaldigits=15);

text ST_AsKML(integer version, geometry geom, integer maxdecimaldigits=15, text nprefix=NULL);

text ST_AsKML(integer version, geography geog, integer maxdecimaldigits=15, text nprefix=NULL);

Description

Return the geometry as a Keyhole Markup Language (KML) element. There are several variants of this function. maximum number of decimal places used in output (defaults to 15), version default to 2 and default namespace is no prefix.

Version 1: ST_AsKML(geom_or_geog, maxdecimaldigits) / version=2 / maxdecimaldigits=15

Version 2: ST_AsKML(version, geom_or_geog, maxdecimaldigits, nprefix) maxdecimaldigits=15 / nprefix=NULL

[Note]

Requires PostGIS be compiled with Proj support. Use PostGIS_Full_Version to confirm you have proj support compiled in.

[Note]

Availability: 1.2.2 - later variants that include version param came in 1.3.2

[Note]

Enhanced: 2.0.0 - Add prefix namespace. Default is no prefix

[Note]

Changed: 2.0.0 - uses default args and supports named args

[Note]

AsKML output will not work with geometries that do not have an SRID

This function supports 3d and will not drop the z-index.

Examples

SELECT ST_AsKML(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));

                st_askml
                --------
                <Polygon><outerBoundaryIs><LinearRing><coordinates>0,0 0,1 1,1 1,0 0,0</coordinates></LinearRing></outerBoundaryIs></Polygon>

                --3d linestring
                SELECT ST_AsKML('SRID=4326;LINESTRING(1 2 3, 4 5 6)');
                <LineString><coordinates>1,2,3 4,5,6</coordinates></LineString>
                
                

Name

ST_AsLatLonText — Return the Degrees, Minutes, Seconds representation of the given point.

Synopsis

text ST_AsLatLonText(geometry pt, text format='');

Description

Returns the Degrees, Minutes, Seconds representation of the point.

[Note]

It is assumed the point is in a lat/lon projection. The X (lon) and Y (lat) coordinates are normalized in the output to the "normal" range (-180 to +180 for lon, -90 to +90 for lat).

The text parameter is a format string containing the format for the resulting text, similar to a date format string. Valid tokens are "D" for degrees, "M" for minutes, "S" for seconds, and "C" for cardinal direction (NSEW). DMS tokens may be repeated to indicate desired width and precision ("SSS.SSSS" means " 1.0023").

"M", "S", and "C" are optional. If "C" is omitted, degrees are shown with a "-" sign if south or west. If "S" is omitted, minutes will be shown as decimal with as many digits of precision as you specify. If "M" is also omitted, degrees are shown as decimal with as many digits precision as you specify.

If the format string is omitted (or zero-length) a default format will be used.

Availability: 2.0

Examples

Default format.

SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)'));
      st_aslatlontext
----------------------------
 2°19'29.928"S 3°14'3.243"W

Providing a format (same as the default).

SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"C'));
      st_aslatlontext
----------------------------
 2°19'29.928"S 3°14'3.243"W

Characters other than D, M, S, C and . are just passed through.

SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D degrees, M minutes, S seconds to the C'));
                                   st_aslatlontext
--------------------------------------------------------------------------------------
 2 degrees, 19 minutes, 30 seconds to the S 3 degrees, 14 minutes, 3 seconds to the W

Signed degrees instead of cardinal directions.

SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D°M''S.SSS"'));
      st_aslatlontext
----------------------------
 -2°19'29.928" -3°14'3.243"

Decimal degrees.

SELECT (ST_AsLatLonText('POINT (-3.2342342 -2.32498)', 'D.DDDD degrees C'));
          st_aslatlontext
-----------------------------------
 2.3250 degrees S 3.2342 degrees W

Excessively large values are normalized.

SELECT (ST_AsLatLonText('POINT (-302.2342342 -792.32498)'));
        st_aslatlontext
-------------------------------
 72°19'29.928"S 57°45'56.757"E

Name

ST_AsSVG — Returns a Geometry in SVG path data given a geometry or geography object.

Synopsis

text ST_AsSVG(geometry geom, integer rel=0, integer maxdecimaldigits=15);

text ST_AsSVG(geography geog, integer rel=0, integer maxdecimaldigits=15);

Description

Return the geometry as Scalar Vector Graphics (SVG) path data. Use 1 as second argument to have the path data implemented in terms of relative moves, the default (or 0) uses absolute moves. Third argument may be used to reduce the maximum number of decimal digits used in output (defaults to 15). Point geometries will be rendered as cx/cy when 'rel' arg is 0, x/y when 'rel' is 1. Multipoint geometries are delimited by commas (","), GeometryCollection geometries are delimited by semicolons (";").

[Note]

Availability: 1.2.2. Availability: 1.4.0 Changed in PostGIS 1.4.0 to include L command in absolute path to conform to http://www.w3.org/TR/SVG/paths.html#PathDataBNF

Changed: 2.0.0 to use default args and support named args

Examples

SELECT ST_AsSVG(ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))',4326));

                st_assvg
                --------
                M 0 0 L 0 -1 1 -1 1 0 Z

Name

ST_AsText — Return the Well-Known Text (WKT) representation of the geometry/geography without SRID metadata.

Synopsis

text ST_AsText(geometry g1);

text ST_AsText(geography g1);

Description

Returns the Well-Known Text representation of the geometry/geography.

[Note]

The WKT spec does not include the SRID. To get the SRID as part of the data, use the non-standard PostGIS ST_AsEWKT

WKT format does not maintain precision so to prevent floating truncation, use ST_AsBinary or ST_AsEWKB format for transport.

[Note]

ST_AsText is the reverse of ST_GeomFromText. Use ST_GeomFromText to convert to a postgis geometry from ST_AsText representation.

Availability: 1.5 - support for geography was introduced.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.1

This method implements the SQL/MM specification. SQL-MM 3: 5.1.25

This method supports Circular Strings and Curves

Examples

SELECT ST_AsText('01030000000100000005000000000000000000
000000000000000000000000000000000000000000000000
F03F000000000000F03F000000000000F03F000000000000F03
F000000000000000000000000000000000000000000000000');

                   st_astext
--------------------------------
 POLYGON((0 0,0 1,1 1,1 0,0 0))
(1 row)

Name

ST_AsTWKB — Returns the geometry as TWKB, aka "Tiny Well-Known Binary"

Synopsis

bytea ST_AsTWKB(geometry g1, integer decimaldigits_xy=0, integer decimaldigits_z=0, integer decimaldigits_m=0, boolean include_sizes=false, boolean include_bounding boxes=false);

bytea ST_AsTWKB(geometry[] geometries, bigint[] unique_ids, integer decimaldigits_xy=0, integer decimaldigits_z=0, integer decimaldigits_m=0, boolean include_sizes=false, boolean include_bounding_boxes=false);

Description

Returns the geometry in TWKB (Tiny Well-Known Binary) format. TWKB is a compressed binary format with a focus on minimizing the size of the output.

The decimal digits parameters control how much precision is stored in the output. By default, values are rounded to the nearest unit before encoding. If you want to transfer more precision, increase the number. For example, a value of 1 implies that the first digit to the right of the decimal point will be preserved.

The sizes and bounding boxes parameters control whether optional information about the encoded length of the object and the bounds of the object are included in the output. By default they are not. Do not turn them on unless your client software has a use for them, as they just use up space (and saving space is the point of TWKB).

The array-input form of the function is used to convert a collection of geometries and unique identifiers into a TWKB collection that preserves the identifiers. This is useful for clients that expect to unpack a collection and then access further information about the objects inside. You can create the arrays using the array_agg function. The other parameters operate the same as for the simple form of the function.

[Note]

The format specification is available online at https://github.com/TWKB/Specification, and code for building a JavaScript client can be found at https://github.com/TWKB/twkb.js.

Enhanced: 2.4.0 memory and speed improvements.

Availability: 2.2.0

Examples

SELECT ST_AsTWKB('LINESTRING(1 1,5 5)'::geometry);
                 st_astwkb
--------------------------------------------
\x02000202020808

To create an aggregate TWKB object including identifiers aggregate the desired geometries and objects first, using "array_agg()", then call the appropriate TWKB function.

SELECT ST_AsTWKB(array_agg(geom), array_agg(gid)) FROM mytable;
                 st_astwkb
--------------------------------------------
\x040402020400000202

Name

ST_AsX3D — Returns a Geometry in X3D xml node element format: ISO-IEC-19776-1.2-X3DEncodings-XML

Synopsis

text ST_AsX3D(geometry g1, integer maxdecimaldigits=15, integer options=0);

Description

Returns a geometry as an X3D xml formatted node element http://www.web3d.org/standards/number/19776-1. If maxdecimaldigits (precision) is not specified then defaults to 15.

[Note]

There are various options for translating PostGIS geometries to X3D since X3D geometry types don't map directly to PostGIS geometry types and some newer X3D types that might be better mappings we have avoided since most rendering tools don't currently support them. These are the mappings we have settled on. Feel free to post a bug ticket if you have thoughts on the idea or ways we can allow people to denote their preferred mappings.

Below is how we currently map PostGIS 2D/3D types to X3D types

The 'options' argument is a bitfield. For PostGIS 2.2+, this is used to denote whether to represent coordinates with X3D GeoCoordinates Geospatial node and also whether to flip the x/y axis. By default, ST_AsX3D outputs in database form (long,lat or X,Y), but X3D default of lat/lon, y/x may be preferred.

  • 0: X/Y in database order (e.g. long/lat = X,Y is standard database order), default value, and non-spatial coordinates (just regular old Coordinate tag).

  • 1: Flip X and Y. If used in conjunction with the GeoCoordinate option switch, then output will be default "latitude_first" and coordinates will be flipped as well.

  • 2: Output coordinates in GeoSpatial GeoCoordinates. This option will throw an error if geometries are not in WGS 84 long lat (srid: 4326). This is currently the only GeoCoordinate type supported. Refer to X3D specs specifying a spatial reference system.. Default output will be GeoCoordinate geoSystem='"GD" "WE" "longitude_first"'. If you prefer the X3D default of GeoCoordinate geoSystem='"GD" "WE" "latitude_first"' use (2 + 1) = 3

PostGIS Type2D X3D Type3D X3D Type
LINESTRINGnot yet implemented - will be PolyLine2DLineSet
MULTILINESTRINGnot yet implemented - will be PolyLine2DIndexedLineSet
MULTIPOINTPolypoint2DPointSet
POINToutputs the space delimited coordinatesoutputs the space delimited coordinates
(MULTI) POLYGON, POLYHEDRALSURFACEInvalid X3D markupIndexedFaceSet (inner rings currently output as another faceset)
TINTriangleSet2D (Not Yet Implemented)IndexedTriangleSet
[Note]

2D geometry support not yet complete. Inner rings currently just drawn as separate polygons. We are working on these.

Lots of advancements happening in 3D space particularly with X3D Integration with HTML5

There is also a nice open source X3D viewer you can use to view rendered geometries. Free Wrl http://freewrl.sourceforge.net/ binaries available for Mac, Linux, and Windows. Use the FreeWRL_Launcher packaged to view the geometries.

Also check out PostGIS minimalist X3D viewer that utilizes this function and x3dDom html/js open source toolkit.

Availability: 2.0.0: ISO-IEC-19776-1.2-X3DEncodings-XML

Enhanced: 2.2.0: Support for GeoCoordinates and axis (x/y, long/lat) flipping. Look at options for details.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

Example: Create a fully functional X3D document - This will generate a cube that is viewable in FreeWrl and other X3D viewers.

SELECT '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D>
  <Scene>
    <Transform>
      <Shape>
       <Appearance>
            <Material emissiveColor=''0 0 1''/>
       </Appearance> ' ||
       ST_AsX3D( ST_GeomFromEWKT('POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)),
((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)),
((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)),
((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )')) ||
      '</Shape>
    </Transform>
  </Scene>
</X3D>' As x3ddoc;

                x3ddoc
                --------
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN" "http://www.web3d.org/specifications/x3d-3.0.dtd">
<X3D>
  <Scene>
    <Transform>
      <Shape>
       <Appearance>
            <Material emissiveColor='0 0 1'/>
       </Appearance>
       <IndexedFaceSet  coordIndex='0 1 2 3 -1 4 5 6 7 -1 8 9 10 11 -1 12 13 14 15 -1 16 17 18 19 -1 20 21 22 23'>
            <Coordinate point='0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 1 1 0 1 0 0 0 0 0 1 0 0 1 0 1 0 0 1 1 1 0 1 1 1 1 0 1 1 0 0 0 1 0 0 1 1 1 1 1 1 1 0 0 0 1 1 0 1 1 1 1 0 1 1' />
      </IndexedFaceSet>
      </Shape>
    </Transform>
  </Scene>
</X3D>

Example: An Octagon elevated 3 Units and decimal precision of 6

SELECT ST_AsX3D(
ST_Translate(
    ST_Force_3d(
        ST_Buffer(ST_Point(10,10),5, 'quad_segs=2')), 0,0,
    3)
  ,6) As x3dfrag;

x3dfrag
--------
<IndexedFaceSet coordIndex="0 1 2 3 4 5 6 7">
    <Coordinate point="15 10 3 13.535534 6.464466 3 10 5 3 6.464466 6.464466 3 5 10 3 6.464466 13.535534 3 10 15 3 13.535534 13.535534 3 " />
</IndexedFaceSet>

Example: TIN

SELECT ST_AsX3D(ST_GeomFromEWKT('TIN (((
                0 0 0,
                0 0 1,
                0 1 0,
                0 0 0
            )), ((
                0 0 0,
                0 1 0,
                1 1 0,
                0 0 0
            ))
            )')) As x3dfrag;

                x3dfrag
                --------
<IndexedTriangleSet  index='0 1 2 3 4 5'><Coordinate point='0 0 0 0 0 1 0 1 0 0 0 0 0 1 0 1 1 0'/></IndexedTriangleSet>

Example: Closed multilinestring (the boundary of a polygon with holes)

SELECT ST_AsX3D(
                    ST_GeomFromEWKT('MULTILINESTRING((20 0 10,16 -12 10,0 -16 10,-12 -12 10,-20 0 10,-12 16 10,0 24 10,16 16 10,20 0 10),
  (12 0 10,8 8 10,0 12 10,-8 8 10,-8 0 10,-8 -4 10,0 -8 10,8 -4 10,12 0 10))')
) As x3dfrag;

                x3dfrag
                --------
<IndexedLineSet  coordIndex='0 1 2 3 4 5 6 7 0 -1 8 9 10 11 12 13 14 15 8'>
    <Coordinate point='20 0 10 16 -12 10 0 -16 10 -12 -12 10 -20 0 10 -12 16 10 0 24 10 16 16 10 12 0 10 8 8 10 0 12 10 -8 8 10 -8 0 10 -8 -4 10 0 -8 10 8 -4 10 ' />
 </IndexedLineSet>

Name

ST_GeoHash — Return a GeoHash representation of the geometry.

Synopsis

text ST_GeoHash(geometry geom, integer maxchars=full_precision_of_point);

Description

Return a GeoHash representation (http://en.wikipedia.org/wiki/Geohash) of the geometry. A GeoHash encodes a point into a text form that is sortable and searchable based on prefixing. A shorter GeoHash is a less precise representation of a point. It can also be thought of as a box, that contains the actual point.

If no maxchars is specified ST_GeoHash returns a GeoHash based on full precision of the input geometry type. Points return a GeoHash with 20 characters of precision (about enough to hold the full double precision of the input). Other types return a GeoHash with a variable amount of precision, based on the size of the feature. Larger features are represented with less precision, smaller features with more precision. The idea is that the box implied by the GeoHash will always contain the input feature.

If maxchars is specified ST_GeoHash returns a GeoHash with at most that many characters so a possibly lower precision representation of the input geometry. For non-points, the starting point of the calculation is the center of the bounding box of the geometry.

Availability: 1.4.0

[Note]

ST_GeoHash will not work with geometries that are not in geographic (lon/lat) coordinates.

This method supports Circular Strings and Curves

Examples

SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326));

         st_geohash
----------------------
 c0w3hf1s70w3hf1s70w3

SELECT ST_GeoHash(ST_SetSRID(ST_MakePoint(-126,48),4326),5);

 st_geohash
------------
 c0w3h
                
                

Name

ST_AsGeobuf — Return a Geobuf representation of a set of rows.

Synopsis

bytea ST_AsGeobuf(anyelement set row);

bytea ST_AsGeobuf(anyelement row, text geom_name);

Description

Return a Geobuf representation (https://github.com/mapbox/geobuf) of a set of rows corresponding to a FeatureCollection. Every input geometry is analyzed to determine maximum precision for optimal storage. Note that Geobuf in its current form cannot be streamed so the full output will be assembled in memory.

row row data with at least a geometry column.

geom_name is the name of the geometry column in the row data. If NULL it will default to the first found geometry column.

Availability: 2.4.0

Examples

SELECT encode(ST_AsGeobuf(q, 'geom'), 'base64')
    FROM (SELECT ST_GeomFromText('POLYGON((0 0,0 1,1 1,1 0,0 0))') AS geom) AS q;
 st_asgeobuf
----------------------------------
 GAAiEAoOCgwIBBoIAAAAAgIAAAE=

                
                

Name

ST_AsMVTGeom — Transform a geometry into the coordinate space of a Mapbox Vector Tile.

Synopsis

geometry ST_AsMVTGeom(geometry geom, box2d bounds, integer extent=4096, integer buffer=256, boolean clip_geom=true);

Description

Transform a geometry into the coordinate space of a Mapbox Vector Tile of a set of rows corresponding to a Layer. Makes best effort to keep and even correct validity and might collapse geometry into a lower dimension in the process.

geom is the geometry to transform.

bounds is the geometric bounds of the tile contents without buffer.

extent is the tile extent in tile coordinate space as defined by the specification. If NULL it will default to 4096.

buffer is the buffer distance in tile coordinate space to optionally clip geometries. If NULL it will default to 256.

clip_geom is a boolean to control if geometries should be clipped or encoded as is. If NULL it will default to true.

Availability: 2.4.0

Examples

SELECT ST_AsText(ST_AsMVTGeom(
        ST_GeomFromText('POLYGON ((0 0, 10 0, 10 5, 0 -5, 0 0))'),
        ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)),
        4096, 0, false));
                              st_astext
--------------------------------------------------------------------
 MULTIPOLYGON(((5 4096,10 4096,10 4091,5 4096)),((5 4096,0 4096,0 4101,5 4096)))

                
                

Name

ST_AsMVT — Return a Mapbox Vector Tile representation of a set of rows.

Synopsis

bytea ST_AsMVT(anyelement set row);

bytea ST_AsMVT(anyelement row, text name);

bytea ST_AsMVT(anyelement row, text name, integer extent);

bytea ST_AsMVT(anyelement row, text name, integer extent, text geom_name);

Description

Return a Mapbox Vector Tile representation of a set of rows corresponding to a Layer. Multiple calls can be concatenated to a tile with multiple Layers. Geometry is assumed to be in tile coordinate space and valid as per specification. Typically ST_AsMVTGeom can be used to transform geometry into tile coordinate space. Other row data will be encoded as attributes.

The Mapbox Vector Tile format can store features with a different set of attributes per feature. To make use of this feature supply a JSONB column in the row data containing Json objects one level deep. The keys and values in the object will be parsed into feature attributes.

[Important]

Do not call with a GEOMETRYCOLLECTION as an element in the row. However you can use ST_AsMVTGeom to prep a geometry collection for inclusion.

row row data with at least a geometry column.

name is the name of the Layer. If NULL it will use the string "default".

extent is the tile extent in screen space as defined by the specification. If NULL it will default to 4096.

geom_name is the name of the geometry column in the row data. If NULL it will default to the first found geometry column.

Availability: 2.4.0

Examples

SELECT ST_AsMVT(q, 'test', 4096, 'geom') FROM (SELECT 1 AS c1,
    ST_AsMVTGeom(ST_GeomFromText('POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))'),
    ST_MakeBox2D(ST_Point(0, 0), ST_Point(4096, 4096)), 4096, 0, false) AS geom) AS q;
                              st_asmvt
--------------------------------------------------------------------
 \x1a320a0474657374121d12020000180322150946ec3f1a14453b0a09280f091413121e09091e0f1a026331220228012880207802

                
                

See Also

ST_AsMVTGeom

8.8. Operadores

&& — Returns TRUE if A's 2D bounding box intersects B's 2D bounding box.
&&(geometry,box2df) — Returns TRUE if a geometry's (cached) 2D bounding box intersects a 2D float precision bounding box (BOX2DF).
&&(box2df,geometry) — Returns TRUE if a 2D float precision bounding box (BOX2DF) intersects a geometry's (cached) 2D bounding box.
&&(box2df,box2df) — Returns TRUE if two 2D float precision bounding boxes (BOX2DF) intersect each other.
&&& — Returns TRUE if A's n-D bounding box intersects B's n-D bounding box.
&&&(geometry,gidx) — Returns TRUE if a geometry's (cached) n-D bounding box intersects a n-D float precision bounding box (GIDX).
&&&(gidx,geometry) — Returns TRUE if a n-D float precision bounding box (GIDX) intersects a geometry's (cached) n-D bounding box.
&&&(gidx,gidx) — Returns TRUE if two n-D float precision bounding boxes (GIDX) intersect each other.
&< — Returns TRUE if A's bounding box overlaps or is to the left of B's.
&<| — Returns TRUE if A's bounding box overlaps or is below B's.
&> — Returns TRUE if A' bounding box overlaps or is to the right of B's.
<< — Returns TRUE if A's bounding box is strictly to the left of B's.
<<| — Returns TRUE if A's bounding box is strictly below B's.
= — Returns TRUE if the coordinates and coordinate order geometry/geography A are the same as the coordinates and coordinate order of geometry/geography B.
>> — Returns TRUE if A's bounding box is strictly to the right of B's.
@ — Returns TRUE if A's bounding box is contained by B's.
@(geometry,box2df) — Returns TRUE if a geometry's 2D bounding box is contained into a 2D float precision bounding box (BOX2DF).
@(box2df,geometry) — Returns TRUE if a 2D float precision bounding box (BOX2DF) is contained into a geometry's 2D bounding box.
@(box2df,box2df) — Returns TRUE if a 2D float precision bounding box (BOX2DF) is contained into another 2D float precision bounding box.
|&> — Returns TRUE if A's bounding box overlaps or is above B's.
|>> — Returns TRUE if A's bounding box is strictly above B's.
~ — Returns TRUE if A's bounding box contains B's.
~(geometry,box2df) — Returns TRUE if a geometry's 2D bonding box contains a 2D float precision bounding box (GIDX).
~(box2df,geometry) — Returns TRUE if a 2D float precision bounding box (BOX2DF) contains a geometry's 2D bonding box.
~(box2df,box2df) — Returns TRUE if a 2D float precision bounding box (BOX2DF) contains another 2D float precision bounding box (BOX2DF).
~= — Returns TRUE if A's bounding box is the same as B's.
<-> — Returns the 2D distance between A and B.
|=| — Returns the distance between A and B trajectories at their closest point of approach.
<#> — Returns the 2D distance between A and B bounding boxes.
<<->> — Returns the n-D distance between the centroids of A and B bounding boxes.
<<#>> — Returns the n-D distance between A and B bounding boxes.

Name

&& — Returns TRUE if A's 2D bounding box intersects B's 2D bounding box.

Synopsis

boolean &&( geometry A , geometry B );

boolean &&( geography A , geography B );

Descripción

The && operator returns TRUE if the 2D bounding box of geometry A intersects the 2D bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Enhanced: 2.0.0 support for Polyhedral surfaces was introduced.

Availability: 1.5.0 support for geography was introduced.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 && tbl2.column2 AS overlaps
FROM ( VALUES
        (1, 'LINESTRING(0 0, 3 3)'::geometry),
        (2, 'LINESTRING(0 1, 0 5)'::geometry)) AS tbl1,
( VALUES
        (3, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;

 column1 | column1 | overlaps
---------+---------+----------
           1 |       3 | t
           2 |       3 | f
(2 rows)

Ver también

|&>, &>, &<|, &<, ~, @


Name

&&(geometry,box2df) — Returns TRUE if a geometry's (cached) 2D bounding box intersects a 2D float precision bounding box (BOX2DF).

Synopsis

boolean &&( geometry A , box2df B );

Descripción

The && operator returns TRUE if the cached 2D bounding box of geometry A intersects the 2D bounding box B, using float precision. This means that if B is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakePoint(1,1) && ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(2,2)) AS overlaps;

 overlaps
----------
 t
(1 row)

Name

&&(box2df,geometry) — Returns TRUE if a 2D float precision bounding box (BOX2DF) intersects a geometry's (cached) 2D bounding box.

Synopsis

boolean &&( box2df A , geometry B );

Descripción

The && operator returns TRUE if the 2D bounding box A intersects the cached 2D bounding box of geometry B, using float precision. This means that if A is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(2,2)) && ST_MakePoint(1,1) AS overlaps;

 overlaps
----------
 t
(1 row)

Name

&&(box2df,box2df) — Returns TRUE if two 2D float precision bounding boxes (BOX2DF) intersect each other.

Synopsis

boolean &&( box2df A , box2df B );

Descripción

The && operator returns TRUE if two 2D bounding boxes A and B intersect each other, using float precision. This means that if A (or B) is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operator is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(2,2)) && ST_MakeBox2D(ST_MakePoint(1,1), ST_MakePoint(3,3)) AS overlaps;

 overlaps
----------
 t
(1 row)

Name

&&& — Returns TRUE if A's n-D bounding box intersects B's n-D bounding box.

Synopsis

boolean &&&( geometry A , geometry B );

Descripción

The &&& operator returns TRUE if the n-D bounding box of geometry A intersects the n-D bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Disponibilidad: 2.0.0

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports 3d and will not drop the z-index.

Examples: 3D LineStrings

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3d,
                                    tbl1.column2 && tbl2.column2 AS overlaps_2d
FROM ( VALUES
        (1, 'LINESTRING Z(0 0 1, 3 3 2)'::geometry),
        (2, 'LINESTRING Z(1 2 0, 0 5 -1)'::geometry)) AS tbl1,
( VALUES
        (3, 'LINESTRING Z(1 2 1, 4 6 1)'::geometry)) AS tbl2;

 column1 | column1 | overlaps_3d | overlaps_2d
---------+---------+-------------+-------------
       1 |       3 | t           | t
       2 |       3 | f           | t

Examples: 3M LineStrings

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &&& tbl2.column2 AS overlaps_3zm,
                                    tbl1.column2 && tbl2.column2 AS overlaps_2d
FROM ( VALUES
        (1, 'LINESTRING M(0 0 1, 3 3 2)'::geometry),
        (2, 'LINESTRING M(1 2 0, 0 5 -1)'::geometry)) AS tbl1,
( VALUES
        (3, 'LINESTRING M(1 2 1, 4 6 1)'::geometry)) AS tbl2;

 column1 | column1 | overlaps_3zm | overlaps_2d
---------+---------+-------------+-------------
       1 |       3 | t           | t
       2 |       3 | f           | t

Ver también

&&


Name

&&&(geometry,gidx) — Returns TRUE if a geometry's (cached) n-D bounding box intersects a n-D float precision bounding box (GIDX).

Synopsis

boolean &&&( geometry A , gidx B );

Descripción

The &&& operator returns TRUE if the cached n-D bounding box of geometry A intersects the n-D bounding box B, using float precision. This means that if B is a (double precision) box3d, it will be internally converted to a float precision 3D bounding box (GIDX)

[Note]

This operator is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_MakePoint(1,1,1) &&& ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) AS overlaps;

 overlaps
----------
 t
(1 row)

Name

&&&(gidx,geometry) — Returns TRUE if a n-D float precision bounding box (GIDX) intersects a geometry's (cached) n-D bounding box.

Synopsis

boolean &&&( gidx A , geometry B );

Descripción

The &&& operator returns TRUE if the n-D bounding box A intersects the cached n-D bounding box of geometry B, using float precision. This means that if A is a (double precision) box3d, it will be internally converted to a float precision 3D bounding box (GIDX)

[Note]

This operator is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_MakePoint(1,1,1) AS overlaps;

 overlaps
----------
 t
(1 row)

Name

&&&(gidx,gidx) — Returns TRUE if two n-D float precision bounding boxes (GIDX) intersect each other.

Synopsis

boolean &&&( gidx A , gidx B );

Descripción

The &&& operator returns TRUE if two n-D bounding boxes A and B intersect each other, using float precision. This means that if A (or B) is a (double precision) box3d, it will be internally converted to a float precision 3D bounding box (GIDX)

[Note]

This operator is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This function supports 3d and will not drop the z-index.

Ejemplos

SELECT ST_3DMakeBox(ST_MakePoint(0,0,0), ST_MakePoint(2,2,2)) &&& ST_3DMakeBox(ST_MakePoint(1,1,1), ST_MakePoint(3,3,3)) AS overlaps;

 overlaps
----------
 t
(1 row)

Name

&< — Returns TRUE if A's bounding box overlaps or is to the left of B's.

Synopsis

boolean &<( geometry A , geometry B );

Descripción

The &< operator returns TRUE if the bounding box of geometry A overlaps or is to the left of the bounding box of geometry B, or more accurately, overlaps or is NOT to the right of the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &< tbl2.column2 AS overleft
FROM
  ( VALUES
        (1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING(0 0, 3 3)'::geometry),
        (3, 'LINESTRING(0 1, 0 5)'::geometry),
        (4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2;

 column1 | column1 | overleft
---------+---------+----------
           1 |       2 | f
           1 |       3 | f
           1 |       4 | t
(3 rows)

Ver también

&&, |&>, &>, &<|


Name

&<| — Returns TRUE if A's bounding box overlaps or is below B's.

Synopsis

boolean &<|( geometry A , geometry B );

Descripción

The &<| operator returns TRUE if the bounding box of geometry A overlaps or is below of the bounding box of geometry B, or more accurately, overlaps or is NOT above the bounding box of geometry B.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &<| tbl2.column2 AS overbelow
FROM
  ( VALUES
        (1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING(0 0, 3 3)'::geometry),
        (3, 'LINESTRING(0 1, 0 5)'::geometry),
        (4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;

 column1 | column1 | overbelow
---------+---------+-----------
           1 |       2 | f
           1 |       3 | t
           1 |       4 | t
(3 rows)

Ver también

&&, |&>, &>, &<


Name

&> — Returns TRUE if A' bounding box overlaps or is to the right of B's.

Synopsis

boolean &>( geometry A , geometry B );

Descripción

The &> operator returns TRUE if the bounding box of geometry A overlaps or is to the right of the bounding box of geometry B, or more accurately, overlaps or is NOT to the left of the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 &> tbl2.column2 AS overright
FROM
  ( VALUES
        (1, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING(0 0, 3 3)'::geometry),
        (3, 'LINESTRING(0 1, 0 5)'::geometry),
        (4, 'LINESTRING(6 0, 6 1)'::geometry)) AS tbl2;

 column1 | column1 | overright
---------+---------+-----------
           1 |       2 | t
           1 |       3 | t
           1 |       4 | f
(3 rows)

Ver también

&&, |&>, &<|, &<


Name

<< — Returns TRUE if A's bounding box is strictly to the left of B's.

Synopsis

boolean <<( geometry A , geometry B );

Descripción

The << operator returns TRUE if the bounding box of geometry A is strictly to the left of the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 << tbl2.column2 AS left
FROM
  ( VALUES
        (1, 'LINESTRING (1 2, 1 5)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING (0 0, 4 3)'::geometry),
        (3, 'LINESTRING (6 0, 6 5)'::geometry),
        (4, 'LINESTRING (2 2, 5 6)'::geometry)) AS tbl2;

 column1 | column1 | left
---------+---------+------
           1 |       2 | f
           1 |       3 | t
           1 |       4 | t
(3 rows)

Ver también

>>, |>>, <<|


Name

<<| — Returns TRUE if A's bounding box is strictly below B's.

Synopsis

boolean <<|( geometry A , geometry B );

Descripción

The <<| operator returns TRUE if the bounding box of geometry A is strictly below the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 <<| tbl2.column2 AS below
FROM
  ( VALUES
        (1, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING (1 4, 1 7)'::geometry),
        (3, 'LINESTRING (6 1, 6 5)'::geometry),
        (4, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl2;

 column1 | column1 | below
---------+---------+-------
           1 |       2 | t
           1 |       3 | f
           1 |       4 | f
(3 rows)

Ver también

<<, >>, |>>


Name

= — Returns TRUE if the coordinates and coordinate order geometry/geography A are the same as the coordinates and coordinate order of geometry/geography B.

Synopsis

boolean =( geometry A , geometry B );

boolean =( geography A , geography B );

Descripción

The = operator returns TRUE if the coordinates and coordinate order geometry/geography A are the same as the coordinates and coordinate order of geometry/geography B. PostgreSQL uses the =, <, and > operators defined for geometries to perform internal orderings and comparison of geometries (ie. in a GROUP BY or ORDER BY clause).

[Note]

Only geometry/geography that are exactly equal in all respects, with the same coordinates, in the same order, are considered equal by this operator. For "spatial equality", that ignores things like coordinate order, and can detect features that cover the same spatial area with different representations, use ST_OrderingEquals or ST_Equals

[Caution]

This operand will NOT make use of any indexes that may be available on the geometries. For an index assisted exact equality test, combine = with &&.

Changed: 2.4.0, in prior versions this was bounding box equality not a geometric equality. If you need bounding box equality, use ~= instead.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT 'LINESTRING(0 0, 0 1, 1 0)'::geometry = 'LINESTRING(1 1, 0 0)'::geometry;
 ?column?
----------
 f
(1 row)

SELECT ST_AsText(column1)
FROM ( VALUES
        ('LINESTRING(0 0, 1 1)'::geometry),
        ('LINESTRING(1 1, 0 0)'::geometry)) AS foo;
          st_astext
---------------------
 LINESTRING(0 0,1 1)
 LINESTRING(1 1,0 0)
(2 rows)

-- Note: the GROUP BY uses the "=" to compare for geometry equivalency.
SELECT ST_AsText(column1)
FROM ( VALUES
        ('LINESTRING(0 0, 1 1)'::geometry),
        ('LINESTRING(1 1, 0 0)'::geometry)) AS foo
GROUP BY column1;
      st_astext
---------------------
 LINESTRING(0 0,1 1)
 LINESTRING(1 1,0 0)
(2 rows)

-- In versions prior to 2.0, this used to return true --
 SELECT ST_GeomFromText('POINT(1707296.37 4820536.77)') =
        ST_GeomFromText('POINT(1707296.27 4820536.87)') As pt_intersect;

--pt_intersect --
f

Name

>> — Returns TRUE if A's bounding box is strictly to the right of B's.

Synopsis

boolean >>( geometry A , geometry B );

Descripción

The >> operator returns TRUE if the bounding box of geometry A is strictly to the right of the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 >> tbl2.column2 AS right
FROM
  ( VALUES
        (1, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING (1 4, 1 7)'::geometry),
        (3, 'LINESTRING (6 1, 6 5)'::geometry),
        (4, 'LINESTRING (0 0, 4 3)'::geometry)) AS tbl2;

 column1 | column1 | right
---------+---------+-------
           1 |       2 | t
           1 |       3 | f
           1 |       4 | f
(3 rows)

Ver también

<<, |>>, <<|


Name

@ — Returns TRUE if A's bounding box is contained by B's.

Synopsis

boolean @( geometry A , geometry B );

Descripción

The @ operator returns TRUE if the bounding box of geometry A is completely contained by the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 @ tbl2.column2 AS contained
FROM
  ( VALUES
        (1, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING (0 0, 4 4)'::geometry),
        (3, 'LINESTRING (2 2, 4 4)'::geometry),
        (4, 'LINESTRING (1 1, 3 3)'::geometry)) AS tbl2;

 column1 | column1 | contained
---------+---------+-----------
           1 |       2 | t
           1 |       3 | f
           1 |       4 | t
(3 rows)

Ver también

~, &&


Name

@(geometry,box2df) — Returns TRUE if a geometry's 2D bounding box is contained into a 2D float precision bounding box (BOX2DF).

Synopsis

boolean @( geometry A , box2df B );

Descripción

The @ operator returns TRUE if the A geometry's 2D bounding box is contained the 2D bounding box B, using float precision. This means that if B is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_Buffer(ST_GeomFromText('POINT(2 2)'), 1) @ ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(5,5)) AS is_contained;

 is_contained
--------------
 t
(1 row)

Name

@(box2df,geometry) — Returns TRUE if a 2D float precision bounding box (BOX2DF) is contained into a geometry's 2D bounding box.

Synopsis

boolean @( box2df A , geometry B );

Descripción

The @ operator returns TRUE if the 2D bounding box A is contained into the B geometry's 2D bounding box, using float precision. This means that if B is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakeBox2D(ST_MakePoint(2,2), ST_MakePoint(3,3)) @ ST_Buffer(ST_GeomFromText('POINT(1 1)'), 10) AS is_contained;

 is_contained
--------------
 t
(1 row)

Name

@(box2df,box2df) — Returns TRUE if a 2D float precision bounding box (BOX2DF) is contained into another 2D float precision bounding box.

Synopsis

boolean @( box2df A , box2df B );

Descripción

The @ operator returns TRUE if the 2D bounding box A is contained into the 2D bounding box B, using float precision. This means that if A (or B) is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakeBox2D(ST_MakePoint(2,2), ST_MakePoint(3,3)) @ ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(5,5)) AS is_contained;

 is_contained
--------------
 t
(1 row)

Name

|&> — Returns TRUE if A's bounding box overlaps or is above B's.

Synopsis

boolean |&>( geometry A , geometry B );

Descripción

The |&> operator returns TRUE if the bounding box of geometry A overlaps or is above the bounding box of geometry B, or more accurately, overlaps or is NOT below the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 |&> tbl2.column2 AS overabove
FROM
  ( VALUES
        (1, 'LINESTRING(6 0, 6 4)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING(0 0, 3 3)'::geometry),
        (3, 'LINESTRING(0 1, 0 5)'::geometry),
        (4, 'LINESTRING(1 2, 4 6)'::geometry)) AS tbl2;

 column1 | column1 | overabove
---------+---------+-----------
           1 |       2 | t
           1 |       3 | f
           1 |       4 | f
(3 rows)

Ver también

&&, &>, &<|, &<


Name

|>> — Returns TRUE if A's bounding box is strictly above B's.

Synopsis

boolean |>>( geometry A , geometry B );

Descripción

The |>> operator returns TRUE if the bounding box of geometry A is strictly above the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 |>> tbl2.column2 AS above
FROM
  ( VALUES
        (1, 'LINESTRING (1 4, 1 7)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING (0 0, 4 2)'::geometry),
        (3, 'LINESTRING (6 1, 6 5)'::geometry),
        (4, 'LINESTRING (2 3, 5 6)'::geometry)) AS tbl2;

 column1 | column1 | above
---------+---------+-------
           1 |       2 | t
           1 |       3 | f
           1 |       4 | f
(3 rows)

Ver también

<<, >>, <<|


Name

~ — Returns TRUE if A's bounding box contains B's.

Synopsis

boolean ~( geometry A , geometry B );

Descripción

The ~ operator returns TRUE if the bounding box of geometry A completely contains the bounding box of geometry B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Ejemplos

SELECT tbl1.column1, tbl2.column1, tbl1.column2 ~ tbl2.column2 AS contains
FROM
  ( VALUES
        (1, 'LINESTRING (0 0, 3 3)'::geometry)) AS tbl1,
  ( VALUES
        (2, 'LINESTRING (0 0, 4 4)'::geometry),
        (3, 'LINESTRING (1 1, 2 2)'::geometry),
        (4, 'LINESTRING (0 0, 3 3)'::geometry)) AS tbl2;

 column1 | column1 | contains
---------+---------+----------
           1 |       2 | f
           1 |       3 | t
           1 |       4 | t
(3 rows)

Ver también

@, &&


Name

~(geometry,box2df) — Returns TRUE if a geometry's 2D bonding box contains a 2D float precision bounding box (GIDX).

Synopsis

boolean ~( geometry A , box2df B );

Descripción

The ~ operator returns TRUE if the 2D bounding box of a geometry A contains the 2D bounding box B, using float precision. This means that if B is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_Buffer(ST_GeomFromText('POINT(1 1)'), 10) ~ ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(2,2)) AS contains;

 contains
----------
 t
(1 row)

Name

~(box2df,geometry) — Returns TRUE if a 2D float precision bounding box (BOX2DF) contains a geometry's 2D bonding box.

Synopsis

boolean ~( box2df A , geometry B );

Descripción

The ~ operator returns TRUE if the 2D bounding box A contains the B geometry's bounding box, using float precision. This means that if A is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(5,5)) ~ ST_Buffer(ST_GeomFromText('POINT(2 2)'), 1) AS contains;

 contains
----------
 t
(1 row)

Name

~(box2df,box2df) — Returns TRUE if a 2D float precision bounding box (BOX2DF) contains another 2D float precision bounding box (BOX2DF).

Synopsis

boolean ~( box2df A , box2df B );

Descripción

The ~ operator returns TRUE if the 2D bounding box A contains the 2D bounding box B, using float precision. This means that if A is a (double precision) box2d, it will be internally converted to a float precision 2D bounding box (BOX2DF)

[Note]

This operand is intended to be used internally by BRIN indexes, more than by users.

Availability: 2.3.0 support for Block Range INdexes (BRIN) was introduced. Requires PostgreSQL 9.5+.

This method supports Circular Strings and Curves

This function supports Polyhedral surfaces.

Ejemplos

SELECT ST_MakeBox2D(ST_MakePoint(0,0), ST_MakePoint(5,5)) ~ ST_MakeBox2D(ST_MakePoint(2,2), ST_MakePoint(3,3)) AS contains;

 contains
----------
 t
(1 row)

Name

~= — Returns TRUE if A's bounding box is the same as B's.

Synopsis

boolean ~=( geometry A , geometry B );

Descripción

The ~= operator returns TRUE if the bounding box of geometry/geography A is the same as the bounding box of geometry/geography B.

[Note]

This operand will make use of any indexes that may be available on the geometries.

Availability: 1.5.0 changed behavior

This function supports Polyhedral surfaces.

[Warning]

This operator has changed behavior in PostGIS 1.5 from testing for actual geometric equality to only checking for bounding box equality. To complicate things it also depends on if you have done a hard or soft upgrade which behavior your database has. To find out which behavior your database has you can run the query below. To check for true equality use ST_OrderingEquals or ST_Equals.

Ejemplos

select 'LINESTRING(0 0, 1 1)'::geometry ~= 'LINESTRING(0 1, 1 0)'::geometry as equality;
 equality   |
-----------------+
          t    |
                        

Name

<-> — Returns the 2D distance between A and B.

Synopsis

double precision <->( geometry A , geometry B );

double precision <->( geography A , geography B );

Descripción

The <-> operator returns the 2D distance between two geometries. Used in the "ORDER BY" clause provides index-assisted nearest-neighbor result sets. For PostgreSQL below 9.5 only gives centroid distance of bounding boxes and for PostgreSQL 9.5+, does true KNN distance search giving true distance between geometries, and distance sphere for geographies.

[Note]

This operand will make use of 2D GiST indexes that may be available on the geometries. It is different from other operators that use spatial indexes in that the spatial index is only used when the operator is in the ORDER BY clause.

[Note]

Index only kicks in if one of the geometries is a constant (not in a subquery/cte). e.g. 'SRID=3005;POINT(1011102 450541)'::geometry instead of a.geom

Refer to OpenGeo workshop: Nearest-Neighbour Searching for real live example.

Enhanced: 2.2.0 -- True KNN ("K nearest neighbor") behavior for geometry and geography for PostgreSQL 9.5+. Note for geography KNN is based on sphere rather than spheroid. For PostgreSQL 9.4 and below, geography support is new but only supports centroid box.

Changed: 2.2.0 -- For PostgreSQL 9.5 users, old Hybrid syntax may be slower, so you'll want to get rid of that hack if you are running your code only on PostGIS 2.2+ 9.5+. See examples below.

Availability: 2.0.0 -- Weak KNN provides nearest neighbors based on geometry centroid distances instead of true distances. Exact results for points, inexact for all other types. Available for PostgreSQL 9.1+

Ejemplos

SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

Then the KNN raw answer:

SELECT st_distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
FROM va2005
ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

If you run "EXPLAIN ANALYZE" on the two queries you would see a performance improvement for the second.

For users running with PostgreSQL < 9.5, use a hybrid query to find the true nearest neighbors. First a CTE query using the index-assisted KNN, then an exact query to get correct ordering:

WITH index_query AS (
  SELECT ST_Distance(geom, 'SRID=3005;POINT(1011102 450541)'::geometry) as d,edabbr, vaabbr
        FROM va2005
  ORDER BY geom <-> 'SRID=3005;POINT(1011102 450541)'::geometry LIMIT 100)
  SELECT *
        FROM index_query
  ORDER BY d limit 10;

        d         | edabbr | vaabbr
------------------+--------+--------
                0 | ALQ    | 128
 5541.57712511724 | ALQ    | 129A
 5579.67450712005 | ALQ    | 001
  6083.4207708641 | ALQ    | 131
  7691.2205404848 | ALQ    | 003
 7900.75451037313 | ALQ    | 122
 8694.20710669982 | ALQ    | 129B
 9564.24289057111 | ALQ    | 130
  12089.665931705 | ALQ    | 127
 18472.5531479404 | ALQ    | 002
(10 rows)

                        

Ver también

ST_DWithin, ST_Distance, <#>


Name

|=| — Returns the distance between A and B trajectories at their closest point of approach.

Synopsis

double precision |=|( geometry A , geometry B );

Descripción

The |=| operator returns the 3D distance between two trajectories (See ST_IsValidTrajectory). This is the same as ST_DistanceCPA but as an operator it can be used for doing nearest neightbor searches using an N-dimensional index (requires PostgreSQL 9.5.0 or higher).

[Note]

This operand will make use of ND GiST indexes that may be available on the geometries. It is different from other operators that use spatial indexes in that the spatial index is only used when the operator is in the ORDER BY clause.

[Note]

Index only kicks in if one of the geometries is a constant (not in a subquery/cte). e.g. 'SRID=3005;LINESTRINGM(0 0 0,0 0 1)'::geometry instead of a.geom

Availability: 2.2.0. Index-supported only available for PostgreSQL 9.5+

Ejemplos

-- Save a literal query trajectory in a psql variable...
\set qt 'ST_AddMeasure(ST_MakeLine(ST_MakePointM(-350,300,0),ST_MakePointM(-410,490,0)),10,20)'
-- Run the query !
SELECT track_id, dist FROM (
  SELECT track_id, ST_DistanceCPA(tr,:qt) dist
  FROM trajectories
  ORDER BY tr |=| :qt
  LIMIT 5
) foo;
 track_id        dist
----------+-------------------
      395 | 0.576496831518066
      380 |  5.06797130410151
      390 |  7.72262293958322
      385 |   9.8004461358071
      405 |  10.9534397988433
(5 rows)

Name

<#> — Returns the 2D distance between A and B bounding boxes.

Synopsis

double precision <#>( geometry A , geometry B );

Descripción

The <#> operator returns distance between two floating point bounding boxes, possibly reading them from a spatial index (PostgreSQL 9.1+ required). Useful for doing nearest neighbor approximate distance ordering.

[Note]

This operand will make use of any indexes that may be available on the geometries. It is different from other operators that use spatial indexes in that the spatial index is only used when the operator is in the ORDER BY clause.

[Note]

Index only kicks in if one of the geometries is a constant e.g. ORDER BY (ST_GeomFromText('POINT(1 2)') <#> geom) instead of g1.geom <#>.

Availability: 2.0.0 -- KNN only available for PostgreSQL 9.1+

Ejemplos

SELECT *
FROM (
SELECT b.tlid, b.mtfcc,
        b.geom <#> ST_GeomFromText('LINESTRING(746149 2948672,745954 2948576,
                745787 2948499,745740 2948468,745712 2948438,
                745690 2948384,745677 2948319)',2249) As b_dist,
                ST_Distance(b.geom, ST_GeomFromText('LINESTRING(746149 2948672,745954 2948576,
                745787 2948499,745740 2948468,745712 2948438,
                745690 2948384,745677 2948319)',2249)) As act_dist
    FROM bos_roads As b
    ORDER BY b_dist, b.tlid
    LIMIT 100) As foo
    ORDER BY act_dist, tlid LIMIT 10;

   tlid    | mtfcc |      b_dist      |     act_dist
-----------+-------+------------------+------------------
  85732027 | S1400 |                0 |                0
  85732029 | S1400 |                0 |                0
  85732031 | S1400 |                0 |                0
  85734335 | S1400 |                0 |                0
  85736037 | S1400 |                0 |                0
 624683742 | S1400 |                0 | 128.528874268666
  85719343 | S1400 | 260.839270432962 | 260.839270432962
  85741826 | S1400 | 164.759294123275 | 260.839270432962
  85732032 | S1400 |           277.75 | 311.830282365264
  85735592 | S1400 |           222.25 | 311.830282365264
(10 rows)

Ver también

ST_DWithin, ST_Distance, <->


Name

<<->> — Returns the n-D distance between the centroids of A and B bounding boxes.

Synopsis

double precision <<->>( geometry A , geometry B );

Descripción

The <<->> operator returns the n-D (euclidean) distance between the centroids of the bounding boxes of two geometries. Useful for doing nearest neighbor approximate distance ordering.

[Note]

This operand will make use of n-D GiST indexes that may be available on the geometries. It is different from other operators that use spatial indexes in that the spatial index is only used when the operator is in the ORDER BY clause.

[Note]

Index only kicks in if one of the geometries is a constant (not in a subquery/cte). e.g. 'SRID=3005;POINT(1011102 450541)'::geometry instead of a.geom

Availability: 2.2.0 -- KNN only available for PostgreSQL 9.1+

Ver también

<<#>>, <->


Name

<<#>> — Returns the n-D distance between A and B bounding boxes.

Synopsis

double precision <<#>>( geometry A , geometry B );

Descripción

The <<#>> operator returns distance between two floating point bounding boxes, possibly reading them from a spatial index (PostgreSQL 9.1+ required). Useful for doing nearest neighbor approximate distance ordering.

[Note]

This operand will make use of any indexes that may be available on the geometries. It is different from other operators that use spatial indexes in that the spatial index is only used when the operator is in the ORDER BY clause.

[Note]

Index only kicks in if one of the geometries is a constant e.g. ORDER BY (ST_GeomFromText('POINT(1 2)') <<#>> geom) instead of g1.geom <<#>>.

Availability: 2.2.0 -- KNN only available for PostgreSQL 9.1+

Ver también

<<->>, <#>

8.9. Spatial Relationships and Measurements

ST_3DClosestPoint — Returns the 3-dimensional point on g1 that is closest to g2. This is the first point of the 3D shortest line.
ST_3DDistance — For geometry type Returns the 3-dimensional cartesian minimum distance (based on spatial ref) between two geometries in projected units.
ST_3DDWithin — For 3d (z) geometry type Returns true if two geometries 3d distance is within number of units.
ST_3DDFullyWithin — Returns true if all of the 3D geometries are within the specified distance of one another.
ST_3DIntersects — Returns TRUE if the Geometries "spatially intersect" in 3d - only for points, linestrings, polygons, polyhedral surface (area). With SFCGAL backend enabled also supports TINS
ST_3DLongestLine — Returns the 3-dimensional longest line between two geometries
ST_3DMaxDistance — For geometry type Returns the 3-dimensional cartesian maximum distance (based on spatial ref) between two geometries in projected units.
ST_3DShortestLine — Returns the 3-dimensional shortest line between two geometries
ST_Area — Returns the area of the surface if it is a Polygon or MultiPolygon. For geometry, a 2D Cartesian area is determined with units specified by the SRID. For geography, area is determined on a curved surface with units in square meters.
ST_Azimuth — Returns the north-based azimuth as the angle in radians measured clockwise from the vertical on pointA to pointB.
ST_Centroid — Returns the geometric center of a geometry.
ST_ClosestPoint — Returns the 2-dimensional point on g1 that is closest to g2. This is the first point of the shortest line.
ST_ClusterDBSCAN — Windowing function that returns integer id for the cluster each input geometry is in based on 2D implementation of Density-based spatial clustering of applications with noise (DBSCAN) algorithm.
ST_ClusterIntersecting — Aggregate. Returns an array with the connected components of a set of geometries
ST_ClusterKMeans — Windowing function that returns integer id for the cluster each input geometry is in.
ST_ClusterWithin — Aggregate. Returns an array of GeometryCollections, where each GeometryCollection represents a set of geometries separated by no more than the specified distance.
ST_Contains — Returns true if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A.
ST_ContainsProperly — Returns true if B intersects the interior of A but not the boundary (or exterior). A does not contain properly itself, but does contain itself.
ST_Covers — Returns 1 (TRUE) if no point in Geometry B is outside Geometry A
ST_CoveredBy — Returns 1 (TRUE) if no point in Geometry/Geography A is outside Geometry/Geography B
ST_Crosses — Returns TRUE if the supplied geometries have some, but not all, interior points in common.
ST_LineCrossingDirection — Given 2 linestrings, returns a number between -3 and 3 denoting what kind of crossing behavior. 0 is no crossing.
ST_Disjoint — Returns TRUE if the Geometries do not "spatially intersect" - if they do not share any space together.
ST_Distance — For geometry type Returns the 2D Cartesian distance between two geometries in projected units (based on spatial ref). For geography type defaults to return minimum geodesic distance between two geographies in meters.
ST_MinimumClearance — Returns the minimum clearance of a geometry, a measure of a geometry's robustness.
ST_MinimumClearanceLine — Returns the two-point LineString spanning a geometry's minimum clearance.
ST_HausdorffDistance — Returns the Hausdorff distance between two geometries. Basically a measure of how similar or dissimilar 2 geometries are. Units are in the units of the spatial reference system of the geometries.
ST_FrechetDistance — Returns the Fréchet distance between two geometries. This is a measure of similarity between curves that takes into account the location and ordering of the points along the curves. Units are in the units of the spatial reference system of the geometries.
ST_MaxDistance — Returns the 2-dimensional largest distance between two geometries in projected units.
ST_DistanceSphere — Returns minimum distance in meters between two lon/lat geometries. Uses a spherical earth and radius derived from the spheroid defined by the SRID. Faster than ST_DistanceSpheroid ST_DistanceSpheroid, but less accurate. PostGIS versions prior to 1.5 only implemented for points.
ST_DistanceSpheroid — Returns the minimum distance between two lon/lat geometries given a particular spheroid. PostGIS versions prior to 1.5 only support points.
ST_DFullyWithin — Returns true if all of the geometries are within the specified distance of one another
ST_DWithin — Returns true if the geometries are within the specified distance of one another. For geometry units are in those of spatial reference and For geography units are in meters and measurement is defaulted to use_spheroid=true (measure around spheroid), for faster check, use_spheroid=false to measure along sphere.
ST_Equals — Returns true if the given geometries represent the same geometry. Directionality is ignored.
ST_GeometricMedian — Returns the geometric median of a MultiPoint.
ST_HasArc — Returns true if a geometry or geometry collection contains a circular string
ST_Intersects — Returns TRUE if the Geometries/Geography "spatially intersect in 2D" - (share any portion of space) and FALSE if they don't (they are Disjoint). For geography -- tolerance is 0.00001 meters (so any points that close are considered to intersect)
ST_Length — Returns the 2D length of the geometry if it is a LineString or MultiLineString. geometry are in units of spatial reference and geography are in meters (default spheroid)
ST_Length2D — Returns the 2-dimensional length of the geometry if it is a linestring or multi-linestring. This is an alias for ST_Length
ST_3DLength — Returns the 3-dimensional or 2-dimensional length of the geometry if it is a linestring or multi-linestring.
ST_LengthSpheroid — Calculates the 2D or 3D length/perimeter of a geometry on an ellipsoid. This is useful if the coordinates of the geometry are in longitude/latitude and a length is desired without reprojection.
ST_Length2D_Spheroid — Calculates the 2D length/perimeter of a geometry on an ellipsoid. This is useful if the coordinates of the geometry are in longitude/latitude and a length is desired without reprojection.
ST_LongestLine — Returns the 2-dimensional longest line points of two geometries. The function will only return the first longest line if more than one, that the function finds. The line returned will always start in g1 and end in g2. The length of the line this function returns will always be the same as st_maxdistance returns for g1 and g2.
ST_OrderingEquals — Returns true if the given geometries represent the same geometry and points are in the same directional order.
ST_Overlaps — Returns TRUE if the Geometries share space, are of the same dimension, but are not completely contained by each other.
ST_Perimeter — Return the length measurement of the boundary of an ST_Surface or ST_MultiSurface geometry or geography. (Polygon, MultiPolygon). geometry measurement is in units of spatial reference and geography is in meters.
ST_Perimeter2D — Returns the 2-dimensional perimeter of the geometry, if it is a polygon or multi-polygon. This is currently an alias for ST_Perimeter.
ST_3DPerimeter — Returns the 3-dimensional perimeter of the geometry, if it is a polygon or multi-polygon.
ST_PointOnSurface — Returns a POINT guaranteed to lie on the surface.
ST_Project — Returns a POINT projected from a start point using a distance in meters and bearing (azimuth) in radians.
ST_Relate — Returns true if this Geometry is spatially related to anotherGeometry, by testing for intersections between the Interior, Boundary and Exterior of the two geometries as specified by the values in the intersectionMatrixPattern. If no intersectionMatrixPattern is passed in, then returns the maximum intersectionMatrixPattern that relates the 2 geometries.
ST_RelateMatch — Returns true if intersectionMattrixPattern1 implies intersectionMatrixPattern2
ST_ShortestLine — Returns the 2-dimensional shortest line between two geometries
ST_Touches — Returns TRUE if the geometries have at least one point in common, but their interiors do not intersect.
ST_Within — Returns true if the geometry A is completely inside geometry B

Name

ST_3DClosestPoint — Returns the 3-dimensional point on g1 that is closest to g2. This is the first point of the 3D shortest line.

Synopsis

geometry ST_3DClosestPoint(geometry g1, geometry g2);

Description

Returns the 3-dimensional point on g1 that is closest to g2. This is the first point of the 3D shortest line. The 3D length of the 3D shortest line is the 3D distance.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Availability: 2.0.0

Changed: 2.2.0 - if 2 2D geometries are input, a 2D point is returned (instead of old behavior assuming 0 for missing Z). In case of 2D and 3D, Z is no longer assumed to be 0 for missing Z.

Examples

linestring and point -- both 3d and 2d closest point

SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt,
                ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt
        FROM (SELECT 'POINT(100 100 30)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line
                ) As foo;


 cp3d_line_pt                                                |               cp2d_line_pt
-----------------------------------------------------------+------------------------------------------
 POINT(54.6993798867619 128.935022917228 11.5475869506606) | POINT(73.0769230769231 115.384615384615)
                                        

linestring and multipoint -- both 3d and 2d closest point

SELECT ST_AsEWKT(ST_3DClosestPoint(line,pt)) AS cp3d_line_pt,
                ST_AsEWKT(ST_ClosestPoint(line,pt)) As cp2d_line_pt
        FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line
                ) As foo;


                       cp3d_line_pt                        | cp2d_line_pt
-----------------------------------------------------------+--------------
 POINT(54.6993798867619 128.935022917228 11.5475869506606) | POINT(50 75)
                                        

Multilinestring and polygon both 3d and 2d closest point

SELECT ST_AsEWKT(ST_3DClosestPoint(poly, mline)) As cp3d,
    ST_AsEWKT(ST_ClosestPoint(poly, mline)) As cp2d
        FROM (SELECT  ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly,
                ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1),
                (1 10 2, 5 20 1))') As mline ) As foo;
                   cp3d                    |     cp2d
-------------------------------------------+--------------
 POINT(39.993580415989 54.1889925532825 5) | POINT(20 40)
             


Name

ST_3DDistance — For geometry type Returns the 3-dimensional cartesian minimum distance (based on spatial ref) between two geometries in projected units.

Synopsis

float ST_3DDistance(geometry g1, geometry g2);

Description

For geometry type returns the 3-dimensional minimum cartesian distance between two geometries in projected units (spatial ref units).

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This method implements the SQL/MM specification. SQL-MM ?

This method is also provided by SFCGAL backend.

Availability: 2.0.0

Changed: 2.2.0 - In case of 2D and 3D, Z is no longer assumed to be 0 for missing Z.

Examples

-- Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line)
-- Note: currently no vertical datum support so Z is not transformed and assumed to be same units as final.
SELECT ST_3DDistance(
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163),
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163)
                ) As dist_3d,
                ST_Distance(
                        ST_Transform(ST_GeomFromText('POINT(-72.1235 42.3521)',4326),2163),
                        ST_Transform(ST_GeomFromText('LINESTRING(-72.1260 42.45, -72.123 42.1546)', 4326),2163)
                ) As dist_2d;

     dist_3d      |     dist_2d
------------------+-----------------
 127.295059324629 | 126.66425605671
-- Multilinestring and polygon both 3d and 2d distance
-- Same example as 3D closest point example
SELECT ST_3DDistance(poly, mline) As dist3d,
    ST_Distance(poly, mline) As dist2d
        FROM (SELECT  ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly,
                ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1),
                (1 10 2, 5 20 1))') As mline ) As foo;
      dist3d       | dist2d
-------------------+--------
 0.716635696066337 |      0

Name

ST_3DDWithin — For 3d (z) geometry type Returns true if two geometries 3d distance is within number of units.

Synopsis

boolean ST_3DDWithin(geometry g1, geometry g2, double precision distance_of_srid);

Description

For geometry type returns true if the 3d distance between two objects is within distance_of_srid specified projected units (spatial ref units).

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This method implements the SQL/MM specification. SQL-MM ?

Availability: 2.0.0

Examples

-- Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line)
-- Note: currently no vertical datum support so Z is not transformed and assumed to be same units as final.
SELECT ST_3DDWithin(
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163),
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163),
                        126.8
                ) As within_dist_3d,
ST_DWithin(
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 4)'),2163),
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163),
                        126.8
                ) As within_dist_2d;

 within_dist_3d | within_dist_2d
----------------+----------------
 f              | t

Name

ST_3DDFullyWithin — Returns true if all of the 3D geometries are within the specified distance of one another.

Synopsis

boolean ST_3DDFullyWithin(geometry g1, geometry g2, double precision distance);

Description

Returns true if the 3D geometries are fully within the specified distance of one another. The distance is specified in units defined by the spatial reference system of the geometries. For this function to make sense, the source geometries must both be of the same coordinate projection, having the same SRID.

[Note]

This function call will automatically include a bounding box comparison that will make use of any indexes that are available on the geometries.

Availability: 2.0.0

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Examples

-- This compares the difference between fully within and distance within as well
                -- as the distance fully within for the 2D footprint of the line/point vs. the 3d fully within
                SELECT ST_3DDFullyWithin(geom_a, geom_b, 10) as D3DFullyWithin10, ST_3DDWithin(geom_a, geom_b, 10) as D3DWithin10,
        ST_DFullyWithin(geom_a, geom_b, 20) as D2DFullyWithin20,
        ST_3DDFullyWithin(geom_a, geom_b, 20) as D3DFullyWithin20 from
                (select ST_GeomFromEWKT('POINT(1 1 2)') as geom_a,
                ST_GeomFromEWKT('LINESTRING(1 5 2, 2 7 20, 1 9 100, 14 12 3)') as geom_b) t1;
 d3dfullywithin10 | d3dwithin10 | d2dfullywithin20 | d3dfullywithin20
------------------+-------------+------------------+------------------
 f                | t           | t                | f 

Name

ST_3DIntersects — Returns TRUE if the Geometries "spatially intersect" in 3d - only for points, linestrings, polygons, polyhedral surface (area). With SFCGAL backend enabled also supports TINS

Synopsis

boolean ST_3DIntersects( geometry geomA , geometry geomB );

Description

Overlaps, Touches, Within all imply spatial intersection. If any of the aforementioned returns true, then the geometries also spatially intersect. Disjoint implies false for spatial intersection.

Availability: 2.0.0

[Note]

This function call will automatically include a bounding box comparison that will make use of any indexes that are available on the geometries.

[Note]

In order to take advantage of support for TINS, you need to enable the SFCGAL backend. This can be done at session time with: set postgis.backend = sfcgal; or at the database or system level. Database level can be done with ALTER DATABASE gisdb SET postgis.backend = sfcgal;.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

This function supports Triangles and Triangulated Irregular Network Surfaces (TIN).

This method is also provided by SFCGAL backend.

This method implements the SQL/MM specification. SQL-MM 3: ?

Geometry Examples

SELECT ST_3DIntersects(pt, line), ST_Intersects(pt,line)
        FROM (SELECT 'POINT(0 0 2)'::geometry As pt,
                'LINESTRING (0 0 1, 0 2 3 )'::geometry As line) As foo;
 st_3dintersects | st_intersects
-----------------+---------------
 f               | t
(1 row)
                

TIN Examples

set postgis.backend = sfcgal;
SELECT ST_3DIntersects('TIN(((0 0,1 0,0 1,0 0)))'::geometry, 'POINT(.1 .1)'::geometry);
 st_3dintersects
-----------------
 t

Name

ST_3DLongestLine — Returns the 3-dimensional longest line between two geometries

Synopsis

geometry ST_3DLongestLine(geometry g1, geometry g2);

Description

Returns the 3-dimensional longest line between two geometries. The function will only return the first longest line if more than one. The line returned will always start in g1 and end in g2. The 3D length of the line this function returns will always be the same as ST_3DMaxDistance returns for g1 and g2.

Availability: 2.0.0

Changed: 2.2.0 - if 2 2D geometries are input, a 2D point is returned (instead of old behavior assuming 0 for missing Z). In case of 2D and 3D, Z is no longer assumed to be 0 for missing Z.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Examples

linestring and point -- both 3d and 2d longest line

SELECT ST_AsEWKT(ST_3DLongestLine(line,pt)) AS lol3d_line_pt,
                ST_AsEWKT(ST_LongestLine(line,pt)) As lol2d_line_pt
        FROM (SELECT 'POINT(100 100 30)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line
                ) As foo;


           lol3d_line_pt           |       lol2d_line_pt
-----------------------------------+----------------------------
 LINESTRING(50 75 1000,100 100 30) | LINESTRING(98 190,100 100)
                                        

linestring and multipoint -- both 3d and 2d longest line

SELECT ST_AsEWKT(ST_3DLongestLine(line,pt)) AS lol3d_line_pt,
                ST_AsEWKT(ST_LongestLine(line,pt)) As lol2d_line_pt
        FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line
                ) As foo;


          lol3d_line_pt          |      lol2d_line_pt
---------------------------------+--------------------------
 LINESTRING(98 190 1,50 74 1000) | LINESTRING(98 190,50 74)
                                        

Multilinestring and polygon both 3d and 2d longest line

SELECT ST_AsEWKT(ST_3DLongestLine(poly, mline)) As lol3d,
    ST_AsEWKT(ST_LongestLine(poly, mline)) As lol2d
        FROM (SELECT  ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly,
                ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1),
                (1 10 2, 5 20 1))') As mline ) As foo;
            lol3d             |          lol2d
------------------------------+--------------------------
 LINESTRING(175 150 5,1 10 2) | LINESTRING(175 150,1 10)
             


Name

ST_3DMaxDistance — For geometry type Returns the 3-dimensional cartesian maximum distance (based on spatial ref) between two geometries in projected units.

Synopsis

float ST_3DMaxDistance(geometry g1, geometry g2);

Description

For geometry type returns the 3-dimensional maximum cartesian distance between two geometries in projected units (spatial ref units).

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Availability: 2.0.0

Changed: 2.2.0 - In case of 2D and 3D, Z is no longer assumed to be 0 for missing Z.

Examples

-- Geometry example - units in meters (SRID: 2163 US National Atlas Equal area) (3D point and line compared 2D point and line)
-- Note: currently no vertical datum support so Z is not transformed and assumed to be same units as final.
SELECT ST_3DMaxDistance(
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 10000)'),2163),
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163)
                ) As dist_3d,
                ST_MaxDistance(
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;POINT(-72.1235 42.3521 10000)'),2163),
                        ST_Transform(ST_GeomFromEWKT('SRID=4326;LINESTRING(-72.1260 42.45 15, -72.123 42.1546 20)'),2163)
                ) As dist_2d;

     dist_3d      |     dist_2d
------------------+------------------
 24383.7467488441 | 22247.8472107251

Name

ST_3DShortestLine — Returns the 3-dimensional shortest line between two geometries

Synopsis

geometry ST_3DShortestLine(geometry g1, geometry g2);

Description

Returns the 3-dimensional shortest line between two geometries. The function will only return the first shortest line if more than one, that the function finds. If g1 and g2 intersects in just one point the function will return a line with both start and end in that intersection-point. If g1 and g2 are intersecting with more than one point the function will return a line with start and end in the same point but it can be any of the intersecting points. The line returned will always start in g1 and end in g2. The 3D length of the line this function returns will always be the same as ST_3DDistance returns for g1 and g2.

Availability: 2.0.0

Changed: 2.2.0 - if 2 2D geometries are input, a 2D point is returned (instead of old behavior assuming 0 for missing Z). In case of 2D and 3D, Z is no longer assumed to be 0 for missing Z.

This function supports 3d and will not drop the z-index.

This function supports Polyhedral surfaces.

Examples

linestring and point -- both 3d and 2d shortest line

SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt,
                ST_AsEWKT(ST_ShortestLine(line,pt)) As shl2d_line_pt
        FROM (SELECT 'POINT(100 100 30)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 1000)'::geometry As line
                ) As foo;


 shl3d_line_pt                                                                 |               shl2d_line_pt
----------------------------------------------------------------------------+------------------------------------------------------
 LINESTRING(54.6993798867619 128.935022917228 11.5475869506606,100 100 30)  | LINESTRING(73.0769230769231 115.384615384615,100 100)
                                        

linestring and multipoint -- both 3d and 2d shortest line

SELECT ST_AsEWKT(ST_3DShortestLine(line,pt)) AS shl3d_line_pt,
                ST_AsEWKT(ST_ShortestLine(line,pt)) As shl2d_line_pt
        FROM (SELECT 'MULTIPOINT(100 100 30, 50 74 1000)'::geometry As pt,
                        'LINESTRING (20 80 20, 98 190 1, 110 180 3, 50 75 900)'::geometry As line
                ) As foo;


                       shl3d_line_pt                                       | shl2d_line_pt
---------------------------------------------------------------------------+------------------------
 LINESTRING(54.6993798867619 128.935022917228 11.5475869506606,100 100 30) | LINESTRING(50 75,50 74)
                                        

Multilinestring and polygon both 3d and 2d shortest line

SELECT ST_AsEWKT(ST_3DShortestLine(poly, mline)) As shl3d,
    ST_AsEWKT(ST_ShortestLine(poly, mline)) As shl2d
        FROM (SELECT  ST_GeomFromEWKT('POLYGON((175 150 5, 20 40 5, 35 45 5, 50 60 5, 100 100 5, 175 150 5))') As poly,
                ST_GeomFromEWKT('MULTILINESTRING((175 155 2, 20 40 20, 50 60 -2, 125 100 1, 175 155 1),
                (1 10 2, 5 20 1))') As mline ) As foo;
                   shl3d                                                                           |     shl2d
---------------------------------------------------------------------------------------------------+------------------------
 LINESTRING(39.993580415989 54.1889925532825 5,40.4078575708294 53.6052383805529 5.03423778139177) | LINESTRING(20 40,20 40)
             


Name

ST_Area — Returns the area of the surface if it is a Polygon or MultiPolygon. For geometry, a 2D Cartesian area is determined with units specified by the SRID. For geography, area is determined on a curved surface with units in square meters.

Synopsis

float ST_Area(geometry g1);

float ST_Area(geography geog, boolean use_spheroid=true);

Description

Returns the area of the geometry if it is a Polygon or MultiPolygon. Return the area measurement of an ST_Surface or ST_MultiSurface value. For geometry, a 2D Cartesian area is determined with units specified by the SRID. For geography, by default area is determined on a spheroid with units in square meters. To measure around the faster but less accurate sphere, use ST_Area(geog,false).

Enhanced: 2.0.0 - support for 2D polyhedral surfaces was introduced.

Enhanced: 2.2.0 - measurement on spheroid performed with GeographicLib for improved accuracy and robustness. Requires Proj >= 4.9.0 to take advantage of the new feature.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 8.1.2, 9.5.3

This function supports Polyhedral surfaces.

[Note]

For polyhedral surfaces, only supports 2D polyhedral surfaces (not 2.5D). For 2.5D, may give a non-zero answer, but only for the faces that sit completely in XY plane.

This method is also provided by SFCGAL backend.

Examples

Return area in square feet for a plot of Massachusetts land and multiply by conversion to get square meters. Note this is in square feet because EPSG:2249 is Massachusetts State Plane Feet

SELECT ST_Area(the_geom) As sqft, ST_Area(the_geom)*POWER(0.3048,2) As sqm
                FROM (SELECT
                ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
                        743265 2967450,743265.625 2967416,743238 2967416))',2249) ) As foo(the_geom);
  sqft   |     sqm
---------+-------------
 928.625 | 86.27208552

Return area square feet and transform to Massachusetts state plane meters (EPSG:26986) to get square meters. Note this is in square feet because 2249 is Massachusetts State Plane Feet and transformed area is in square meters since EPSG:26986 is state plane Massachusetts meters

SELECT ST_Area(the_geom) As sqft, ST_Area(ST_Transform(the_geom,26986)) As sqm
                FROM (SELECT
                ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
                        743265 2967450,743265.625 2967416,743238 2967416))',2249) ) As foo(the_geom);
  sqft   |       sqm
---------+------------------
 928.625 | 86.2724304199219
                        

Return area square feet and square meters using geography data type. Note that we transform to our geometry to geography (before you can do that make sure your geometry is in WGS 84 long lat 4326). Geography always measures in meters. This is just for demonstration to compare. Normally your table will be stored in geography data type already.

SELECT ST_Area(the_geog)/POWER(0.3048,2) As sqft_spheroid,  ST_Area(the_geog,false)/POWER(0.3048,2) As sqft_sphere, ST_Area(the_geog) As sqm_spheroid
                FROM (SELECT
                geography(
                ST_Transform(
                        ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,743265 2967450,743265.625 2967416,743238 2967416))',
                                2249
                                ) ,4326
                        )
                )
        ) As foo(the_geog);
  sqft_spheroid   |   sqft_sphere    |   sqm_spheroid
------------------+------------------+------------------
 928.684403538925 | 927.049336105925 | 86.2776042893529

 --if your data is in geography already
 SELECT ST_Area(the_geog)/POWER(0.3048,2) As  sqft, ST_Area(the_geog) As sqm
        FROM somegeogtable;

Name

ST_Azimuth — Returns the north-based azimuth as the angle in radians measured clockwise from the vertical on pointA to pointB.

Synopsis

float ST_Azimuth(geometry pointA, geometry pointB);

float ST_Azimuth(geography pointA, geography pointB);

Description

Returns the azimuth in radians of the segment defined by the given point geometries, or NULL if the two points are coincident. The azimuth is angle is referenced from north, and is positive clockwise: North = 0; East = π/2; South = π; West = 3π/2.

For the geography type, the forward azimuth is solved as part of the inverse geodesic problem.

The azimuth is mathematical concept defined as the angle between a reference plane and a point, with angular units in radians. Units can be converted to degrees using a built-in PostgreSQL function degrees(), as shown in the example.

Availability: 1.1.0

Enhanced: 2.0.0 support for geography was introduced.

Enhanced: 2.2.0 measurement on spheroid performed with GeographicLib for improved accuracy and robustness. Requires Proj >= 4.9.0 to take advantage of the new feature.

Azimuth is especially useful in conjunction with ST_Translate for shifting an object along its perpendicular axis. See upgis_lineshift Plpgsqlfunctions PostGIS wiki section for example of this.

Examples

Geometry Azimuth in degrees

SELECT degrees(ST_Azimuth(ST_Point(25, 45), ST_Point(75, 100))) AS degA_B,
            degrees(ST_Azimuth(ST_Point(75, 100), ST_Point(25, 45))) AS degB_A;

      dega_b       |     degb_a
------------------+------------------
 42.2736890060937 | 222.273689006094

Green: the start Point(25,45) with its vertical. Yellow: degA_B as the path to travel (azimuth).

Green: the start Point(75,100) with its vertical. Yellow: degB_A as the path to travel (azimuth).


Name

ST_Centroid — Returns the geometric center of a geometry.

Synopsis

geometry ST_Centroid(geometry g1);

geography ST_Centroid(geography g1, boolean use_spheroid=true);

Description

Computes the geometric center of a geometry, or equivalently, the center of mass of the geometry as a POINT. For [MULTI]POINTs, this is computed as the arithmetic mean of the input coordinates. For [MULTI]LINESTRINGs, this is computed as the weighted length of each line segment. For [MULTI]POLYGONs, "weight" is thought in terms of area. If an empty geometry is supplied, an empty GEOMETRYCOLLECTION is returned. If NULL is supplied, NULL is returned. If CIRCULARSTRING or COMPOUNDCURVE are supplied, they are converted to linestring wtih CurveToLine first, then same than for LINESTRING

New in 2.3.0 : support CIRCULARSTRING and COMPOUNDCURVE (using CurveToLine)

Availability: 2.4.0 support for geography was introduced.

The centroid is equal to the centroid of the set of component Geometries of highest dimension (since the lower-dimension geometries contribute zero "weight" to the centroid).

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1.

This method implements the SQL/MM specification. SQL-MM 3: 8.1.4, 9.5.5

Examples

In each of the following illustrations, the green dot represents the centroid of the source geometry.

Centroid of a MULTIPOINT

Centroid of a LINESTRING

Centroid of a POLYGON

Centroid of a GEOMETRYCOLLECTION

SELECT ST_AsText(ST_Centroid('MULTIPOINT ( -1 0, -1 2, -1 3, -1 4, -1 7, 0 1, 0 3, 1 1, 2 0, 6 0, 7 8, 9 8, 10 6 )'));
                                st_astext
------------------------------------------
 POINT(2.30769230769231 3.30769230769231)
(1 row)

SELECT ST_AsText(ST_centroid(g))
FROM  ST_GeomFromText('CIRCULARSTRING(0 2, -1 1,0 0, 0.5 0, 1 0, 2 1, 1 2, 0.5 2, 0 2)')  AS g ;
------------------------------------------
POINT(0.5 1)


SELECT ST_AsText(ST_centroid(g))
FROM  ST_GeomFromText('COMPOUNDCURVE(CIRCULARSTRING(0 2, -1 1,0 0),(0 0, 0.5 0, 1 0),CIRCULARSTRING( 1 0, 2 1, 1 2),(1 2, 0.5 2, 0 2))' ) AS g;
------------------------------------------
POINT(0.5 1)


Name

ST_ClosestPoint — Returns the 2-dimensional point on g1 that is closest to g2. This is the first point of the shortest line.

Synopsis

geometry ST_ClosestPoint(geometry g1, geometry g2);

Description

Returns the 2-dimensional point on g1 that is closest to g2. This is the first point of the shortest line.

[Note]

If you have a 3D Geometry, you may prefer to use ST_3DClosestPoint.

Availability: 1.5.0

Examples

Closest between point and linestring is the point itself, but closest point between a linestring and point is the point on line string that is closest.

SELECT ST_AsText(ST_ClosestPoint(pt,line)) AS cp_pt_line,
        ST_AsText(ST_ClosestPoint(line,pt)) As cp_line_pt
FROM (SELECT 'POINT(100 100)'::geometry As pt,
                'LINESTRING (20 80, 98 190, 110 180, 50 75 )'::geometry As line
        ) As foo;


   cp_pt_line   |                cp_line_pt
----------------+------------------------------------------
 POINT(100 100) | POINT(73.0769230769231 115.384615384615)
                                

closest point on polygon A to polygon B

SELECT ST_AsText(
                ST_ClosestPoint(
                        ST_GeomFromText('POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'),
                        ST_Buffer(ST_GeomFromText('POINT(110 170)'), 20)
                        )
                ) As ptwkt;

                  ptwkt
------------------------------------------
 POINT(140.752120669087 125.695053378061)
                                


Name

ST_ClusterDBSCAN — Windowing function that returns integer id for the cluster each input geometry is in based on 2D implementation of Density-based spatial clustering of applications with noise (DBSCAN) algorithm.

Synopsis

integer ST_ClusterDBSCAN(geometry winset geom, float8 eps, integer minpoints);

Description

Returns cluster number for each input geometry, based on a 2D implementation of the Density-based spatial clustering of applications with noise (DBSCAN) algorithm. Unlike ST_ClusterKMeans, it does not require the number of clusters to be specified, but instead uses the desired distance (eps) and density(minpoints) parameters to construct each cluster.

An input geometry will be added to a cluster if it is either:

  • A "core" geometry, that is within eps distance (Cartesian) of at least minpoints input geometries (including itself) or

  • A "border" geometry, that is within eps distance of a core geometry.

Note that border geometries may be within eps distance of core geometries in more than one cluster; in this case, either assignment would be correct, and the border geometry will be arbitrarily asssigned to one of the available clusters. In these cases, it is possible for a correct cluster to be generated with fewer than minpoints geometries. When assignment of a border geometry is ambiguous, repeated calls to ST_ClusterDBSCAN will produce identical results if an ORDER BY clause is included in the window definition, but cluster assignments may differ from other implementations of the same algorithm.

[Note]

Input geometries that do not meet the criteria to join any other cluster will be assigned a cluster number of NULL.

Availability: 2.3.0 - requires GEOS

Examples

Assigning a cluster number to each polygon within 50 meters of each other. Require at least 2 polygons per cluster

within 50 meters at least 2 per cluster. singletons have NULL for cid

SELECT name, ST_ClusterDBSCAN(geom, eps := 50, minpoints := 2) over () AS cid
FROM boston_polys
WHERE name > '' AND building > ''
        AND ST_DWithin(geom,
        ST_Transform(
            ST_GeomFromText('POINT(-71.04054 42.35141)', 4326), 26986),
           500);

                name                 | bucket
-------------------------------------+--------
 Manulife Tower                      |      0
 Park Lane Seaport I                 |      0
 Park Lane Seaport II                |      0
 Renaissance Boston Waterfront Hotel |      0
 Seaport Boston Hotel                |      0
 Seaport Hotel & World Trade Center  |      0
 Waterside Place                     |      0
 World Trade Center East             |      0
 100 Northern Avenue                 |      1
 100 Pier 4                          |      1
 The Institute of Contemporary Art   |      1
 101 Seaport                         |      2
 District Hall                       |      2
 One Marina Park Drive               |      2
 Twenty Two Liberty                  |      2
 Vertex                              |      2
 Vertex                              |      2
 Watermark Seaport                   |      2
 Blue Hills Bank Pavilion            |   NULL
 World Trade Center West             |   NULL
(20 rows)

Combining parcels with the same cluster number into a single geometry. This uses named argument calling

SELECT cid, ST_Collect(geom) AS cluster_geom, array_agg(parcel_id) AS ids_in_cluster FROM (
    SELECT parcel_id, ST_ClusterDBSCAN(geom, eps := 0.5, minpoints := 5) over () AS cid, geom
    FROM parcels) sq
GROUP BY cid;
    

Name

ST_ClusterIntersecting — Aggregate. Returns an array with the connected components of a set of geometries

Synopsis

geometry[] ST_ClusterIntersecting(geometry set g);

Description

ST_ClusterIntersecting is an aggregate function that returns an array of GeometryCollections, where each GeometryCollection represents an interconnected set of geometries.

Availability: 2.2.0 - requires GEOS

Examples

WITH testdata AS
  (SELECT unnest(ARRAY['LINESTRING (0 0, 1 1)'::geometry,
                       'LINESTRING (5 5, 4 4)'::geometry,
                       'LINESTRING (6 6, 7 7)'::geometry,
                       'LINESTRING (0 0, -1 -1)'::geometry,
                       'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry]) AS geom)

SELECT ST_AsText(unnest(ST_ClusterIntersecting(geom))) FROM testdata;

--result

st_astext
---------
GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0)))
GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))
        

Name

ST_ClusterKMeans — Windowing function that returns integer id for the cluster each input geometry is in.

Synopsis

integer ST_ClusterKMeans(geometry winset geom, integer number_of_clusters);

Description

Returns 2D distance based k-means cluster number for each input geometry. The distance used for clustering is the distance between the centroids of the geometries.

Availability: 2.3.0 - requires GEOS

Examples

Generate dummy set of parcels for examples

CREATE TABLE parcels AS
SELECT lpad((row_number() over())::text,3,'0') As parcel_id, geom,
('{residential, commercial}'::text[])[1 + mod(row_number()OVER(),2)] As type
FROM
    ST_Subdivide(ST_Buffer('LINESTRING(40 100, 98 100, 100 150, 60 90)'::geometry,
    40, 'endcap=square'),12) As geom;

Original Parcels

Parcels color-coded by cluster number (cid)

SELECT ST_ClusterKMeans(geom, 5) OVER() AS cid, parcel_id, geom
FROM parcels;
-- result
 cid | parcel_id |   geom
-----+-----------+---------------
   0 | 001       | 0103000000...
   0 | 002       | 0103000000...
   1 | 003       | 0103000000...
   0 | 004       | 0103000000...
   1 | 005       | 0103000000...
   2 | 006       | 0103000000...
   2 | 007       | 0103000000...
(7 rows)

-- Partitioning parcel clusters by type
SELECT ST_ClusterKMeans(geom,3) over (PARTITION BY type) AS cid, parcel_id, type
FROM parcels;
-- result
 cid | parcel_id |    type
-----+-----------+-------------
   1 | 005       | commercial
   1 | 003       | commercial
   2 | 007       | commercial
   0 | 001       | commercial
   1 | 004       | residential
   0 | 002       | residential
   2 | 006       | residential
(7 rows)

Name

ST_ClusterWithin — Aggregate. Returns an array of GeometryCollections, where each GeometryCollection represents a set of geometries separated by no more than the specified distance.

Synopsis

geometry[] ST_ClusterWithin(geometry set g, float8 distance);

Description

ST_ClusterWithin is an aggregate function that returns an array of GeometryCollections, where each GeometryCollection represents a set of geometries separated by no more than the specified distance. (Distances are Cartesian distances in the units of the SRID.)

Availability: 2.2.0 - requires GEOS

Examples

WITH testdata AS
  (SELECT unnest(ARRAY['LINESTRING (0 0, 1 1)'::geometry,
                       'LINESTRING (5 5, 4 4)'::geometry,
                       'LINESTRING (6 6, 7 7)'::geometry,
                       'LINESTRING (0 0, -1 -1)'::geometry,
                       'POLYGON ((0 0, 4 0, 4 4, 0 4, 0 0))'::geometry]) AS geom)

SELECT ST_AsText(unnest(ST_ClusterWithin(geom, 1.4))) FROM testdata;

--result

st_astext
---------
GEOMETRYCOLLECTION(LINESTRING(0 0,1 1),LINESTRING(5 5,4 4),LINESTRING(0 0,-1 -1),POLYGON((0 0,4 0,4 4,0 4,0 0)))
GEOMETRYCOLLECTION(LINESTRING(6 6,7 7))
        

Name

ST_Contains — Returns true if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A.

Synopsis

boolean ST_Contains(geometry geomA, geometry geomB);

Description

Geometry A contains Geometry B if and only if no points of B lie in the exterior of A, and at least one point of the interior of B lies in the interior of A. An important subtlety of this definition is that A does not contain its boundary, but A does contain itself. Contrast that to ST_ContainsProperly where geometry A does not Contain Properly itself.

Returns TRUE if geometry B is completely inside geometry A. For this function to make sense, the source geometries must both be of the same coordinate projection, having the same SRID. ST_Contains is the inverse of ST_Within. So ST_Contains(A,B) implies ST_Within(B,A) except in the case of invalid geometries where the result is always false regardless or not defined.

Performed by the GEOS module

Enhanced: 2.3.0 Enhancement to PIP short-circuit extended to support MultiPoints with few points. Prior versions only supported point in polygon.

[Important]

Do not call with a GEOMETRYCOLLECTION as an argument

[Important]

Do not use this function with invalid geometries. You will get unexpected results.

This function call will automatically include a bounding box comparison that will make use of any indexes that are available on the geometries. To avoid index use, use the function _ST_Contains.

NOTE: this is the "allowable" version that returns a boolean, not an integer.

This method implements the OpenGIS Simple Features Implementation Specification for SQL 1.1. s2.1.1.2 // s2.1.13.3 - same as within(geometry B, geometry A)

This method implements the SQL/MM specification. SQL-MM 3: 5.1.31

There are certain subtleties to ST_Contains and ST_Within that are not intuitively obvious. For details check out Subtleties of OGC Covers, Contains, Within

Examples

The ST_Contains predicate returns TRUE in all the following illustrations.

LINESTRING / MULTIPOINT

POLYGON / POINT

POLYGON / LINESTRING

POLYGON / POLYGON

The ST_Contains predicate returns FALSE in all the following illustrations.

POLYGON / MULTIPOINT

POLYGON / LINESTRING

-- A circle within a circle
SELECT ST_Contains(smallc, bigc) As smallcontainsbig,
           ST_Contains(bigc,smallc) As bigcontainssmall,
           ST_Contains(bigc, ST_Union(smallc, bigc)) as bigcontainsunion,
           ST_Equals(bigc, ST_Union(smallc, bigc)) as bigisunion,
           ST_Covers(bigc, ST_ExteriorRing(bigc)) As bigcoversexterior,
           ST_Contains(bigc, ST_ExteriorRing(bigc)) As bigcontainsexterior
FROM (SELECT ST_Buffer(ST_GeomFromText('POINT(1 2)'), 10) As smallc,
                         ST_Buffer(ST_GeomFromText('POINT(1 2)'), 20) As bigc) As foo;

-- Result
  smallcontainsbig | bigcontainssmall | bigcontainsunion | bigisunion | bigcoversexterior | bigcontainsexterior
------------------+------------------+------------------+------------+-------------------+---------------------
 f                | t                | t                | t          | t        | f

-- Example demonstrating difference between contains and contains properly
SELECT ST_GeometryType(geomA) As geomtype, ST_Contains(geomA,geomA) AS acontainsa, ST_ContainsProperly(geomA, geomA) AS acontainspropa,
   ST_Contains(geomA, ST_Boundary(geomA)) As acontainsba, ST_ContainsProperly(geomA, ST_Boundary(geomA)) As acontainspropba
FROM (VALUES ( ST_Buffer(ST_Point(1,1), 5,1) ),
                         ( ST_MakeLine(ST_Point(1,1), ST_Point(-1,-1) ) ),
                         ( ST_Point(1,1) )
          ) As foo(geomA);

  geomtype    | acontainsa | acontainspropa | acontainsba | acontainspropba
--------------+------------+----------------+-------------+-----------------
ST_Polygon    | t          | f              | f           | f
ST_LineString | t          | f              | f           | f
ST_Point      | t          | t              | f           | f

 

Name

ST_ContainsProperly — Returns true if B intersects the interior of A but not the boundary (or exterior). A does not contain properly itself, but does contain itself.

Synopsis

boolean ST_ContainsProperly(geometry geomA, geometry geomB);

Description

Returns true if B intersects the interior of A but not the boundary (or exterior).

A does not contain properly itself, but does contain itself.

Every point of the other geometry is a point of this geometry's interior. The DE-9IM Intersection Matrix for the two geometries matches [T**FF*FF*] used in ST_Relate

[Note]

From JTS docs slightly reworded: The advantage to using this predicate over ST_Contains and ST_Intersects is that it can be computed efficiently, with no need to compute topology at individual points.

An example use case for this predicate is computing the intersections of a set of geometries with a large polygonal geometry. Since intersection is a fairly slow operation, it can be more efficient to use containsProperly to filter out test geometries which lie wholly inside the area. In these cases the intersection is known a priori to be exactly the original test geometry.

Availability: 1.4.0 - requires GEOS >= 3.1.0.

[Important]

Do not call with a GEOMETRYCOLLECTION as an argument

[Important]

Do not use this function with invalid geometries. You will get unexpected results.

This function call will automatically include a bounding box comparison that will make use of any indexes that are available on the geometries. To avoid index use, use the function _ST_ContainsProperly.

Examples