Consultas espaciales con PostGIS (Parte I)


En los tutoriales anteriores nos centramos en hacer consultas sobre bases de datos PostgreSql. Una vez ya tenemos incorporados estos conceptos de PostgreSql y del lenguaje SQL ya podemos comenzar a hacer consultas espaciales con PostGis, en este tutorial vamos a ver algunas funciones básicas de PostGis con las que podemos hacer diferentes consultas.


● ST_Distance

Esta función devuelve la distancia euclidiana entre dos geometrías puntuales en las unidades del sistema de coordenadas elegido.

En el caso de nuestra base de datos, calculamos la distancia entre los registros puntuales de la tabla lugares farmacia y estadio. La función ST_Distance recibe las geometrías de las entidades y guarda en el campo distancia la consulta.

Esta sería la consulta:

						
Select ST_Distance (p1.geom, p2.geom) as distancia from lugares p1, lugares p2 where p1.nombre = 'farmacia' and p2.nombre = 'estadio'
						
					

Como el sistema de coordenadas con el que definimos la tabla es el 4326, nos devolverá la distancia en fracciones de grado. Si queremos que nos devuelva la distancia en metros podemos hacer la conversión con la constante 111111.111 que resulta de dividir los 40.000km aprox. que tiene la Tierra de circunferencia entre 360°.

						
select ST_Distance (p1.geom, p2.geom) * 111111.111 as distancia from lugares p1, lugares p2 where p1.nombre = 'farmacia' and p2.nombre = 'estadio'
						
					

También podemos usar la función ST_Distance directamente sobre coordenadas dadas. Para esto podemos usar la función ST_GeomFromText la cual devuelve un objeto geométrico en base a una expresión en formato WKT (Well Known Text). Un ejemplo sería el siguiente usando coordenadas en la Proyección UTM ETRS89 Huso 30 N.

						
SELECT ST_DISTANCE (ST_GEOMFROMTEXT ('POINT(300000 4500000)',25830),ST_GEOMFROMTEXT ('POINT(300100 4500000)',25830)) as Distancia;
						
					

● ST_DistanceSphere

Si estamos trabajando con coordenadas geográficas (Latitud y Longitud) en escalas más grandes necesitaremos mayor exactitud. Podemos usar la función ST_DistanceSphere que aproxima la forma de La Tierra a una esfera.

						
Select ST_DistanceSphere (p1.geom, p2.geom) as distancia from lugares p1, lugares p2 where p1.nombre = 'farmacia' and p2.nombre = 'estadio'
						
					


● ST_DistanceSpheroid

O podemos utilizar la función ST_DistanceSpheroid que aproxima la forma de la Tierra a un elipsoide de las características que elijamos. Esta es más exacta pero tiene mayor tiempo de ejecución:

						
Select ST_DistanceSpheroid (p1.geom, p2.geom, 'SPHEROID["GRS_1980",6378137,298.257222]') as distancia from lugares p1, lugares p2 where p1.nombre = 'farmacia' and p2.nombre = 'estadio'
						
					


● ST_Length

La función ST_Length devuelve la longitud de una entidad lineal en las unidades del Sistema de coordenadas elegido.

Un ejemplo sería:

						
Select nombre, (ST_Length(geom)) as longitud from calles where nombre = ‘pacifico’
						
					

Seleccionamos la columna nombre y utilizamos la columna geom con la función ST_Length, de la tabla calles en el registro de nombre pacífico.


● ST_LengthSpheroid

Calcula la longitud o el perímetro de una geometría en un elipsoide. Esto es útil si las coordenadas de la geometría están en longitud / latitud y se desea una longitud sin reproyección. El esferoide se especifica mediante un valor de texto de la siguiente manera:

						
Select nombre, (ST_LengthSpheroid(geom, 'SPHEROID["GRS_1980",6378137,298.257222]')) as longitud from calles where nombre = ‘pacifico’
						
					


● ST_Perimeter

						
Select nombre,(ST_Perimeter(geom)) as Perimetro from barrios
						
					

Devuelve el perímetro de una geometría poligonal. Para los tipos de datos geométricos, se calcula un área cartesiana 2D (plana), con unidades especificadas por el SRID. Para los tipos de datos geográficos, las unidades de perímetro se calculan en metros. Si PostGIS se compila con PROJ versión 4.8.0 o posterior, el elipsoide lo especifica el SRID de la capa; de lo contrario, lo especifica al elipsoide WGS84. Si usamos le agregamos el parámetro use_spheroid = false, los cálculos se aproximarán a una esfera en lugar de un elipsoide. ST_Perimeter(geom, false)).


● ST_Area

						
Select nombre,(ST_Area(geom)) as Superficie from barrios
						
					

Devuelve el área de una geometría poligonal. De igual forma que la función anterior para los tipos de datos geométricos, se calcula un área cartesiana 2D (plana), con unidades especificadas por el SRID. Para los tipos de geografía, el área predeterminada se determina en un elipsoide con unidades en metros cuadrados. Para calcular el área usando el modelo esférico más rápido pero menos preciso puedes usar. ST_Area(geom, false)).




Sobre el Autor


Pedro Calás Blasco

Cartógrafo. Valenciano por el Mundo. He vivido en Mexico, Brasil y Argentina. Entusiasta de los mapas y las tecnologías Web Mapping. Fundador y coordinador de Mapearte. impulsamos y desarrollamos proyectos que contribuyan al desarrollo social a través de las tecnologías.


¿Eres desarrollador? Únete a la red