
이번 글을 통해 배워 갈 내용
- 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
How do I add PostGIS to PostgreSQL pgAdmin?
I've got PostgreSQL and pgAdmin installed, but I want to add a PostGIS server so I could work on a Geographic Informations System project. I'm following this tutorial, which assumes PostGIS is se...
stackoverflow.com
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/
Overview | Hibernate Spatial
Hibernate Spatial is a generic extension to Hibernate for handling geographic data. Hibernate Spatial is open source and licensed, like Hibernate, under the LGPL license. Hibernate Spatial allows you to deal with geographic data in a standardized way. It a
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
300년차 개발자의 좋은 코드 5계명 (Clean Code)
이번 글을 통해 배워갈 내용 좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋
codemasterkimc.tistory.com
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'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 |

이번 글을 통해 배워 갈 내용
- 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
How do I add PostGIS to PostgreSQL pgAdmin?
I've got PostgreSQL and pgAdmin installed, but I want to add a PostGIS server so I could work on a Geographic Informations System project. I'm following this tutorial, which assumes PostGIS is se...
stackoverflow.com
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/
Overview | Hibernate Spatial
Hibernate Spatial is a generic extension to Hibernate for handling geographic data. Hibernate Spatial is open source and licensed, like Hibernate, under the LGPL license. Hibernate Spatial allows you to deal with geographic data in a standardized way. It a
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
300년차 개발자의 좋은 코드 5계명 (Clean Code)
이번 글을 통해 배워갈 내용 좋은 코드(Clean Code)를 작성하기 위해 개발자로서 생각해볼 5가지 요소를 알아보겠습니다. 개요 좋은 코드란 무엇일까요? 저는 자원이 한정적인 컴퓨터 세상에서 좋
codemasterkimc.tistory.com
오늘도 즐거운 코딩 하시길 바랍니다 ~ :)
'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 |