Spring

Spring Boot PostgreSql PostGIS 설치 및 사용

kimc 2022. 12. 10. 15:03
반응형

 

이번 글을 통해 배워 갈 내용

  1. Ubuntu 환경에 PostGIS 설치
  2. 스프링에 PostGIS 연동
  3. 스프링에 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

 

 

오늘도 즐거운 코딩 하시길 바랍니다 ~ :)

 


 

반응형