이번 글을 통해 배워 갈 내용
- Ubuntu 환경에 PostGIS 설치
- 스프링에 PostGIS 연동
- 스프링에 PostGIS 실행
PostGIS는 PostgreSql의 extension으로서
지도상에 거리 계산 및 지도상에 좌표, 선, 면을 다룰 때 PostGIS는 매우 빠르고 쉬우며 유용합니다
1. Ubuntu에 설치
먼저 Linux 환경에 Posgresql이 설치된 곳에
POSTGIS를 설치합니다
```
sudo apt install postgis
sudo -u postgres psql
\c DB이름
CREATE EXTENSION postgis;
```
추가로 궁금하신 분은 여기 참조
https://stackoverflow.com/questions/24981784/how-do-i-add-postgis-to-postgresql-pgadmin
2.
스프링에 연동
2-1
gradle에 build.gradle.kts에 아래와 같이 설치했습니다
maven의 경우 아래 링크에서 동일한 방법으로 진행해주시면 되며
(스프링 부트 3.0부터는 hibernate 경로가 바뀌기 때문에 최신 버전으로 바꿔주시면 됩니다.)
(맵핑 라이브러리들은 다 오래된 것들만 있어서 Jackson 관련 라이브러리를 추가하지는 않았습니다)
// https://mvnrepository.com/artifact/org.hibernate.orm/hibernate-spatial
// Integrate support for Spatial/GIS data into Hibernate O/RM
// Version may cause problems
// https://mvnrepository.com/artifact/org.hibernate/hibernate-spatial
implementation("org.hibernate:hibernate-spatial:5.6.14.Final")
// https://mvnrepository.com/artifact/org.locationtech.jts/jts-core
// Java library for creating and manipulating vector geometry
implementation("org.locationtech.jts:jts-core:1.18.2")
2-2
application.properties를 아래와 같이 추가했습니다
spring.jpa.database-platform=org.hibernate.spatial.dialect.postgis.PostgisDialect
2-3
geometry 관련 entity를 추가했습니다
import org.locationtech.jts.geom.Point
import javax.persistence.*
import javax.validation.constraints.NotNull
import javax.validation.constraints.Size
@Entity
@Table(name = "pin")
data class Pin(
@Id
@Column(name = "idx")
@GeneratedValue(strategy = GenerationType.IDENTITY)
var idx: Long? = null,
@Column(name = "geometry")
var geo: Point? = null,
) {
}
DB에 객체를 추가
val latitude = 36.24553
val longitude = 159.014525
val geomFactory = GeometryFactory(PrecisionModel(), 4326)
val gemPoint1: Point = geomFactory.createPoint(Coordinate(longitude + 1, latitude + 2))
val pin1 = Pin(geo = gemPoint1)
pinRepository.saveAndFlush(pin1)
DB에 객체 하나 조회
@Query(
value = "SELECT idx, ST_AsText(geometry) from Pin pin where pin.idx = :idx",
nativeQuery = true
)
fun findPinByIdx(idx: Long): Map<String, Any>
해당 범위 내에 객체 조회
@Query(
value = "SELECT idx, ST_AsText(geometry) from Pin pin where ST_DistanceSphere(pin.geometry, ST_GeomFromText('POINT(159.014525 36.24553)', 4326)) < :distanceM",
nativeQuery = true
)
fun findPinsTest(distanceM: Int): List<Map<String, Any>>
Controller, Service는 편하신 방법으로 작성해주시면 됩니다
3.
포스트맨으로 테스트하였습니다.
잘 작동합니다
참조 및 인용
https://stackoverflow.com/questions/27624940/map-a-postgis-geometry-point-field-with-hibernate-on-spring-boot
https://github.com/locationtech/jts
https://mvnrepository.com/artifact/com.graphhopper.external/jackson-datatype-jts
https://stackoverflow.com/questions/59291785/error-de-serializing-geometry-with-jackson
http://www.hibernatespatial.org/
혹시 JSON이 아니고 GEOJSON이 필요하신 분들은 아래와 같이 필드 조회도 가능합니다
SELECT jsonb_build_object(
'type', 'FeatureCollection',
'features', jsonb_agg(feature)
)
FROM (
SELECT jsonb_build_object(
'type', 'Feature',
'id', idx,
'geometry', ST_AsGeoJSON(geometry)::jsonb,
'properties', to_jsonb(row) - 'gid' - 'geom'
) AS feature
FROM (SELECT * FROM pin) row) features;
블로그 추천 포스트
https://codemasterkimc.tistory.com/50
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'Spring' 카테고리의 다른 글
Spring 3.0에서 profiles 를 이용해 Local, Develop, Production 등에 맞게 이용해보기 (0) | 2023.02.04 |
---|---|
Spring Boot 3.0.0 으로 Migration 해보는 한가지 방법 (0) | 2022.12.11 |
Kotlin Spring @Valid 가 적용이 안될때 시도해볼 방법 (2) | 2022.11.17 |
Spring Boot jasypt를 통한 Credentials 암호화 (0) | 2022.11.05 |
mssql spring boot pagination사용시java.lang.UnsupportedOperationException: query result offset is not supported 에러 해결하는 한가지 방법 (0) | 2022.11.03 |