Este documento presenta una introducción a PostGIS, una extensión de PostgreSQL para almacenar y analizar datos espaciales. Explica conceptos clave como sistemas de coordenadas, proyecciones y primitivas espaciales simples. También describe cómo crear tablas espaciales, cargar y consultar datos espaciales, y realizar cálculos geométricos y geográficos con PostGIS.
1. Cómo empezar con PostGIS
sin morir demasiado
Andrés Moya, agosto 2014
2. Esta presentación forma parte de los
„Kaleidos Summer Mondays“
http://www.kaleidos.net/blog/346/kaleidos-summer-mondays/
Descarga la presentación y mira las notas para más referencias y enlaces.
Publicado con licencia CreativeCommons Reconocimiento – Compartir igual
(cc-by-sa)
6. Definición
● ¿Qué significa GIS?
– „Geographical Information System“
● Sistema de información que gestiona objetos ubicados sobre la
superficie de la Tierra.
7. Organismos normativos
● European Petroleum Survey Group (EPSG)
– Catálogo estándares EPSG:xxxx (SRID).
– Hoy es International Association of Oil & Gas Producers (OGP).
● Open Geospatial Consortium (OGC)
– Anteriormente Open GIS Consortium.
– Estándares abiertos de modelado de datos GIS: GML, KML, GeoRSS,
SFS (Simple Features).
● Open Source Geospatial Foundation (OSGeo)
– Promociona bases de datos y software libre GIS: OpenStreetMaps, PostGIS.
8. Sistemas de referencia
● World Geodetic System (WGS84)
– Código EPSG:4326 (SRID 4326).
– Latitud + longitud en grados, minutos y segundos
(de -180° a 180°, de -90° a 90°).
– Opcional elevación sobre el elipsoide base.
● Otros ejemplos:
– NAD83 / EPSG:4269 (Norteamérica)
– OSGB 1936 / EPSG:27700 (Británico)
– ED50 (Europeo)
9. Proyecciones
● Proyección Mercator
– Proyecta los puntos sobre un cilindro,
que luego se aplana en un rectángulo.
● Sistema UTM
(Universal Transverse Mercator)
● Sistema Spherical Mercator
(Web Mercator / Google Mercator)
– Códigos "EPSG":900913, EPSG:3785, EPSG:3857.
– Coordenadas (x, y) en metros, desde el centro del planeta a los bordes (bounds).
– Valores de -20037508.34, -20037508.34 a 20037508.34, 20037508.34.
10. Bases de datos geográficas planetarias
● Capa base
– Objetos vectoriales (WGS84) o fotografías.
– Convertidos en „tiles“ (imágenes png).
● Capa overlay
– Objetos vectoriales (EPSG:3857).
● Las más conocidas
– Google Maps
– Microsoft Bing
– ESRI ArcGIS
– OpenStreetMap
11. Simple Features (OGC)
● Define primitivas geográficas.
● Indicar el SRID de un sistema de referencia.
● Tipo de primitivas:
– „Geográficas“: grados WGS84, cálculos curvos
sobre un esferoide.
– „Geométricas“: metros EPSG:3857, cálculos rectos
sobre un rectángulo.
● Formato WKB (Well Known Binary)
– El WKT "SRID=4;POINT(0 0)"
– se convierte en el WKB
"010100002004000000000000000000000
00000000000000000"
● Formato WKT (Well Known Text)
– "POINT(-34.10 45.245)“
– "POINT(-34.10 45.245 458)“
– "LINESTRING(0 0, 25.7 34.0, -43.2 22.1)“
– "MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))“
12. PostGIS
● Extensión de PostgreSQL que implementa
OGC Simple Features
– Con algunas extensiones propias.
– Y muchas funciones para hacer cálculos
geográficos.
● Web principal: http://postgis.net
● Un tutorial muy bueno:
http://workshops.boundlessgeo.com/postgis-intro/
13. PostGIS – SQL geográfico
Crear tablas con columnas de tipos geográficos
CREATE TABLE roads (
id INTEGER,
road_name VARCHAR(25),
geom GEOMETRY(LINESTRING, 4326)
);
Insertar datos a partir de un string WKT:
INSERT INTO global_points (name, location)
VALUES (
'Town',
ST_GeographyFromText(
'SRID=4326;POINT(-110 30)'
)
);
Crear índices sobre columnas geográficas
CREATE INDEX idx_roads_geom_gist
ON roads USING gist(geom);
Cargar datos en lote desde un fichero "shapefile"
(un formato abierto de fichero que guarda primitivas
en WKT o WKB), con opción de convertir la proyección:
# shp2pgsql -s 4326:3857 shaperoads.shp
myschema.roadstable | psql -d roadsdb
14. PostGIS – cálculos geográficos
Calcular la longitud total de una carretera
SELECT ST_Length(geom)/1000 AS km_road
FROM roads
WHERE road_name = 'M45';
Obtener los puntos de una tabla cercanos a unas coordenadas
SELECT the_geom
FROM geom_table
WHERE ST_Distance(
the_geom,
ST_GeomFromText('POINT(100000 200000)', 312)
) < 100
Obtener las carreteras dentro del área de un municipio
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);
Notas del editor
Registro EPGSG
http://es.wikipedia.org/wiki/EPSG
http://www.epsg.org/
http://www.epsg-registry.org/
http://spatialreference.org
Catálogo de estándares geográficos. Creado por European Petroleum Survey Group (EPSG), actualmente lo gestiona la International Association of Oil & Gas Producers (OGP), que absorbió EPSG en 2005.
Cada estándar tiene un código EPSG:xxxx. A la parte xxxx se le suele llamar SRID (Spatial Reference ID). Similar a los códigos ISO-yyy o ANSI-zzz.
Open Geospatial Consortium (OGC)
https://en.wikipedia.org/wiki/Open_Geospatial_Consortium
http://www.opengeospatial.org
Anteriormente denominada Open GIS Consortium. Organización que define estándares abiertos para modelar sistemas GIS en aplicaciones informáticas, y formatos de intercambio de datos. Por ejemplo: GML, KML y GeoRSS (tres extensiones de XML con información geográfica) o SFS (Simple Features, modelo de datos para guardar objetos geográficos en una b.d. SQL o intercambiarlos entre aplicaciones, basado en primitivas simples).
Open Source Geospatial Foundation (OSGeo)
http://osgeo.org
Organización que se dedica a fomentar las bases de datos y herramientas libres (como OpenStreetMap o PostGIS).
World Geodetic System (WGS84 / WGS 84 / WGS 1984)
http://en.wikipedia.org/wiki/World_Geodetic_System
Sistema de coordenadas, que identifica un punto sobre la tierra con precisión de unos 2cm. Catalogado como EPSG:4326 (el SRID es 4326).
Usa dos parámetros de posición (latitud y longitud), en grados/minutos/segundos respecto del ecuador y un meridiano de referencia, y opcionalmente uno de elevación, en metros sobre un elipsoide de referencia.
Valores de -180° a 180° y de -90° a 90°.
Los otros ejemplos tienen más exactitud dentro de un área geográfica reducida, y la pierden fuera de ella.
Proyección Mercator: se proyectan los puntos de la superficie del esferoide que sea sobre un cilindro y luego se aplana el cilindro, convirtiéndolo en un rectángulo. Las coordenadas son la distancia en línea recta a los bordes del rectángulo.
UTM (Universal Transverse Mercator)
https://en.wikipedia.org/wiki/Universal_Transverse_Mercator_coordinate_system
Proyección Mercator mejorada, sobre una elipsoide (normalmente la de WGS84), con distintas regiones cada cual referida a su propia zona (una casilla de una rejilla).
Spherical Mercator / Web Mercator / Google Mercator
La que usan Google, Bing y OpenStreetMap. Proyección simple a partir de una esfera perfecta. Coordenadas en metros.
&quot;EPSG&quot;:900913 -&gt; la EPSG consideraba que era una chapuza y no quería darle un código; los programadores se inventaron 900913, que es &quot;google&quot; en l33t sp34k.
EPSG:3785 -&gt; en 2008 aceptó darle un código de estándar, marcándolo como &quot;no reconocido&quot;.
EPSG:3857 -&gt; en 2009 revisaron el estándar, anularon el anterior y lo reconocieron como oficial. Sí, la mitad de los sitios donde lo explican confunden ambos códigos.
Valores: (x, y) de -20037508.34, -20037508.34 a 20037508.34, 20037508.34.
http://alastaira.wordpress.com/2011/01/23/the-google-maps-bing-maps-spherical-mercator-projection/
http://wiki.openstreetmap.org/wiki/EPSG:3857
Una &quot;capa base&quot; es una base de datos vectorial con líneas de costa, carreteras, poblaciones, accidentes geográficos, etc. Normalmente las líneas y polígonos indican sus coordenadas en WGS84.
Los servidores de mapas la convierten en un &quot;Tile Map&quot;: se proyectan las coordenadas en Spherical Mercator, se renderizan en imágenes PNG, a distintos niveles de zoom, en forma de cuadrados (tiles) de tamaño fijo (normalmente 256x256 pixels) y se alojan en un servidor web normal.
Sobre ella se suelen mostrar &quot;capas overlay&quot; con objetos adicionales: zonas resaltadas, POIs, rutas, etc. Los overlays pueden ser también tiles con fondo transparente, o ser objetos vectoriales, normalmente con las coordenadas directamente en Mercator, que se dibujan sobre la capa base.
Estándar del OGC para definir sistemas geográficos a base de primitivas simples: punto, polilínea, polígono, colección, etc. Las primitivas pueden ser en 2D (lat,lng o x,y) o 3D (incluye elevación), y todas incluyen el SRID del sistema de referencia que usan sus coordenadas.
- Tipos &quot;geográficos&quot;: las coordenadas se indican en grados WGS84, y los cálculos son geográficos. Por ejemplo, la distancia entre dos puntos es un arco de esfera o esferoide.
- Tipos &quot;geométricos&quot;: las coordenadas se indican en metros EPGS:3857, y los cálculos son sobre un plano. La distanca entre dos puntos es una línea recta. Los cálculos son mucho más rápidos, pero menos exactos.
- Formato WKT (Well Known Text): para representar entidades como un string ASCII legible por humanos. Ejemplos:
&quot;POINT(-34.10 45.245)&quot; un punto en 2D
&quot;POINT(-34.10 45.245 458)&quot; un punto en 3D
&quot;LINESTRING(0 0, 25.7 34.0, -43.2 22.1)&quot; una polilínea 2D con tres vértices
&quot;MULTILINESTRING((0 0,1 1,1 2),(2 3,3 2,5 4))&quot; una multi polilínea 2D, con dos polilíneas de tres vértices cada una
- Formato WKB (Well Known Binary): para representar entidades de forma compacta. Se puede usar para guardar los datos en un fichero binario, o mostrar como un string de códigos hexadecimales.
Las primitivas se pueden convertir a otros formatos por otros estándares (p. ej. XML o JSON), o implementarse como tipos custom de herramientas como bases de datos o bibliotecas python o java.
Otros manuales interesantes:
http://postgis.net/docs/manual-2.1/using_postgis_dbmanagement.html
http://www.postgis.us/downloads/postgis20_cheatsheet.html