
PostGIS es un software de código abierto que agrega soporte para características geográficas a la base de datos relacional PostgreSQL.
Este breve artículo discutirá su uso en Java. En particular, la tarea de encontrar objetos geográficos por sus coordenadas.
PostGIS fue creado en 2001. Es una buena solución gratuita para almacenar datos de mapas en la base de datos. Pero el artículo no trata exclusivamente de él, sino solo de un caso especial: trabajo conveniente con PostGIS utilizando herramientas JPA.
Dependencias
Las siguientes bibliotecas son importantes para nuestra tarea:
- Hibernate 5.3.7
- hibernate-espacial - misma versión. Teóricamente, puedes usar los más viejos. Comenzando en quinto, hibernate-espacial es lo mismo que hibernate. Anteriormente: Hibernate Spatial 1.1.x para Hibernate 3.6.x, Hibernate Spatial 1.0 para Hibernate 3.2.x - 3.5.x.
- postgresql 42.2.4. Esta versión fue tomada, porque las más nuevas reforzaron los requisitos de SSL. Elija la versión del controlador que coincida con la versión de la base de datos.
Bueno, todo lo que necesitas para JPA es Spring o un contenedor.
Dialectos
Hibernate Spatial proporciona
abstracciones geométricas para trabajar con bases espaciales. Como en JPA, como primera aproximación, no estamos interesados en qué base de datos se utiliza en el servidor.
Oficialmente compatible con PostgresSQL, Oracle, MySQL, MS SQLServer, GeoDB (H2), DB2.
Características detalles de soporte . El músculo puede parecer un extraño. Pero en la versión 8, el soporte de datos espaciales se
mejora decentemente.
Usamos Postgres. Pero debe especificar el dialecto de Hibernate
"org.hibernate.spatial.dialect.postgis.PostgisDialect"
lugar del estándar post-griego.
Es hora de codificar
Una tabla en PostGIS puede tener cualquier campo. Simplemente estándar, uno de ellos será de tipo geometría. Y hay geografía (no compatible ahora en Hibernate). Si no le enseña a Java a trabajar con este tipo, se interpretará como un blob o cadena de la forma "01010000207B7F0000188D594CC9B22541BC4E56674F2C5541".
Por supuesto, puede trabajar con PostGis en un JBDC puro.
Un ejemplo Pero esto requiere un trabajo minucioso por separado con
org.postgis.PGgeometry
. Estas no son las clases sobre las que tratará el artículo. Y ya no habrá tolerancia.
Vamos a JPA y creamos una clase simple:
@Entity public class AdressBuilding implements Serializable { @Id private Integer id; private Point geom; ...
Se omiten los campos restantes (un objeto geográfico puede almacenar cualquier información). Nada inusual aquí: la clase de entidad estándar. Solo un objeto de clase Point es interesante: un punto de espacio tridimensional.
En lo sucesivo, se utilizan las clases del paquete com.vividsolutions.jts.geom.
JTS se ha convertido en el estándar de facto para representar datos geoespaciales. Implementa la especificación de funciones
simples / especificación de
acceso a funciones simples creada por OpenGIS en los años 90.
Aclaracion El punto hereda de la clase de geometría abstracta. Contiene los siguientes campos no estáticos:
protected Envelope envelope; protected final GeometryFactory factory; protected int SRID; private Object userData;
Sobre es el cuadro de límite mínimo para esta geometría. Pero puede volver en forma de geometría. Y luego tendrás un intento interminable de serialización.
SRID: número del sistema de coordenadas. Hay muchos de ellos. Las principales diferencias: el formato de coordenadas (metros, grados ...), el punto de referencia y la forma de la Tierra (la Tierra no es redonda). PostGis conoce muchos sistemas de coordenadas y puede transformarlos.
Como dije, tenemos un tipo de geometría en la base de datos. Inmediatamente utilicé la clase Point concreta por conveniencia, porque en esta tabla solo tengo objetos point. Pero PostGIS teórico puede almacenar varios tipos de geometría a la vez. Solo en cada geometría se indica su tipo:
"geometry":{"type":"MultiPolygon","coordinates":...
Según StackOverflow, el uso de múltiples geometrías en la misma tabla ralentiza las consultas. Las geometrías también se pueden anidar. Tipos:

Consultas de bases de datos
Con la implementación de la clase resuelta. ahora es el momento de sacarlos de la base. Nuestros puntos son casas, o más bien sus direcciones. Puede hacer consultas SQL familiares: obtenga casas por id, número, número de abuelas ...
Ahora estamos interesados en consultas espaciales. Por ejemplo, encuentre una casa por coordenadas. Deje que las coordenadas deseadas x, y y + -delta sean el área de búsqueda deseada. Las consultas principales en STS se realizan sobre la relación de geometrías. Por lo tanto, necesitamos crearlo:
Coordinate c1 = new Coordinate(x - delta, y - delta); ... Coordinate[] coordinates = new Coordinate[]{c1, c2, c3, c4, c1}; GeometryFactory GEOMETRY_FACTORY = new GeometryFactory();
Si no especificamos un sistema de coordenadas, PostGis se negará a compararlos. Conoces el código de tu sistema o lo obtienes desde cualquier lugar con el código
.getGeom().getSRID()
.
A continuación enviamos una solicitud del formulario:
"select a " + "from AdressBuilding a " + "where within(a.geom, :window) = true"
Una consulta dentro significa verificar si la geometría está dentro de otra. No se alarme si su IDE dice que no puede haber tal solicitud en el JPA. Hibernate Spatial lo convierte a:
where st_within(adressbuil0_.geom, ?)=true
Donde
st_within
ya es una función PostGis.
Hay varias opciones sobre cómo obtener el mismo resultado: el punto cayó en un cuadrado.
contains(:window, a.geom) / intersects(a.geom, :window)...

Una descripción detallada de las especificaciones está
aquí .
Epílogo
Tenemos los puntos, ahora haz lo que quieras con ellos.
Probé el caso de una pequeña base de datos en un servidor con una cantidad relativamente grande de RAM. Si carga al máximo y se olvida de los índices, la tarea de búsqueda se ejecutará en el procesador.
Postgres tiene muchos índices diferentes.
Y algunos de ellos ayudan a Postgis . El estudio mostró que solo GIST (?) Es adecuado para
puntos CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
Pero con mayor frecuencia, cuando importa datos en PostGis, los índices se crean automáticamente ...
Aclaraciones e información adicional son bienvenidas.
Manual utilizado:
Para hibernar 5Para hibernar 4