Podemos aprovechar la potencia de PostgreSQL y PostGIS para realizar operaciones de búsqueda geoespacial (medir distancias entre coordenadas, areas, longitud de una carretera, etc) mediante el sistema de coordenadas geográficas WGS84 que proporciona PostGIS.
Seremos capaces de hacer todo tipo de cálculos, no sólo geográficos sino también geométricos utilizando la notación estándar WKT, definida por la Open Geospatial Consortium.
Vamos a ver un ejemplo sencillo de cómo integrarlo en Spring Boot utilizando el driver postgis-java/jdbc y crear una pequeña lista de ciudades con el atributo “Point” en el que se establecen las coordenadas en las que se ubica.

Crear estructura básica de la aplicación

Vamos a descargar la estructura básica de nuestra aplicación en Spring initializr, seleccionando las siguientes librerías:

  • Spring Starter
  • PostgreSQL Driver

Añadiremos además el driver postgis-jdbc:

<dependency>
	<groupId>org.postgis</groupId>
	<artifactId>postgis-jdbc</artifactId>
	<version>1.3.3</version>
</dependency>

Conectar con base de datos PostgreSQL

Doy por hecho que contáis con una base de datos PostgreSQL con el plugin PostGIS instalado.
Si no es así, podéis seguir la guía de instalación de PostgreSQL y de PostGIS o utilizar un contenedor de Docker.
En mi caso particular voy a optar por Docker, y en concreto un contenedor que ya dispone de PostgreSQL + PostGIS.

Una vez instalado PostgreSQL, y conectados mediante el cliente psql o la herramienta WEB pgadmin , ejecutaremos las siguientes sentencias SQL para crear nuestra tabla “City”:

CREATE TABLE IF NOT EXISTS CITY (id SERIAL PRIMARY KEY, name varchar(255), location GEOGRAPHY(Point,4326));

Comprobaremos la correcta instalación con la sentencia:

CREATE EXTENSION postgis;

Crear servicio para búsquedas

Tras instalar la base de datos y crear la tabla, creamos el servicio “GeoService”.
Estableceremos una conexión similar a cualquier otro driver JDBC, con la peculiaridad de que añadiremos los tipos geográficos a nuestra conexión:

private void connect() throws SQLException {
	try {
		Class.forName("org.postgresql.Driver");
		String url = "jdbc:postgresql://127.0.0.1:5432/postgres";
		conn = DriverManager.getConnection(url, "postgres", "postgres");
		((org.postgresql.PGConnection) conn).addDataType("geometry", Class.forName("org.postgis.PGgeometry"));
	} catch (Exception e) {
		conn.close();
	}
}

Insertar datos de prueba

Una vez establecida la conexión ya podemos ejecutar sentencias SQL aprovechando toda la potencia de PostGIS.

@Override
public void insertCity(City city) throws SQLException {
	try {
		connect();

		StringBuilder query = new StringBuilder();
		query.append("INSERT INTO CITY (name, location) VALUES ('");
		query.append(city.getName());
		query.append("', ST_GeographyFromText('SRID=4326;");
		query.append(city.getLocation());
		query.append("'));");

		s = conn.createStatement();
		s.execute(query.toString());
	} catch (Exception e) {
		logger.error("Error while trying to insert a city");
	} finally {
		s.close();
		conn.close();
	}
}

Conclusión

A pesar de ser mas común el uso de tecnologías como Python con geo django o node.js para crear una interfaz con PostGIS, podemos utilizarlo también desde nuestra aplicación Spring Boot.
Si la opción de postgis-jdbc os parece muy “espartana”, disponemos también de hibernate spatial, aunque su funcionalidad es algo limitada aún y no cuenta con clases para representar todos los tipos de datos con los que cuenta PostGIS.

Podéis ver el código de ejemplo aquí.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *