Skip to main content

Kotlin 으로 지구 타원체 활용하기

· 4 min read
Haril Song
Owner, Software Engineer at 42dot

Background

earth image reference1

지구는 평평하지도 완벽한 구형(Sphere)도 아닌 비표준 타원체(Ellipsoid)임을 고려하면 서로 다른 경도 및 위도 위치에 있는 두 점 사이의 거리를 빠르고 정확하게 계산하는 완벽한 공식은 없습니다.

그래도 geotools 라이브러리를 사용하면 수학적으로 보정된 근사치를 꽤나 간단하게 얻어낼 수 있습니다.

의존성 추가

geotools 의 지구 타원체를 사용하기 위해서는 관련 라이브러리 의존성이 필요합니다.

repositories {
maven { url "https://repo.osgeo.org/repository/release/" }
maven { url "https://download.osgeo.org/webdav/geotools/" }
mavenCentral()
}

dependencies {
...
implementation 'org.geotools:gt-referencing:26.2'
...
}

코드 작성

먼저 서울과 부산의 좌표를 enum class 로 작성해줍니다.

enum class City(val latitude: Double, val longitude: Double) {
SEOUL(37.5642135, 127.0016985),
BUSAN(35.1104, 129.0431);
}

그리고 테스트 코드를 통해 간단한 사용법을 살펴보겠습니다.

class EllipsoidTest {

@Test
internal fun createEllipsoid() {
val ellipsoid = DefaultEllipsoid.WGS84 // GPS 시스템에서 사용하고 있는 WGS84 측량법을 활용하여 지구에 최대한 가까운 타원체를 만들어 준다

val isSphere = ellipsoid.isSphere // 구형인지 타원체인지 판단
val semiMajorAxis = ellipsoid.semiMajorAxis // 장축(적도 반지름), 타원체에서 긴 쪽의 반지름
val semiMinorAxis = ellipsoid.semiMinorAxis // 단축(극 반지름), 타원체에서 짧은 쪽의 반지름
val eccentricity = ellipsoid.eccentricity // 이심률, 해당 타원체가 얼마나 구형에 가까운지를 나타냄
val inverseFlattening = ellipsoid.inverseFlattening // 역평탄화 수치
val ivfDefinitive = ellipsoid.isIvfDefinitive // 역평탄화가 이 타원체에 결정적일 수 있는지

// 직교 거리
val orthodromicDistance = ellipsoid.orthodromicDistance(
City.SEOUL.longitude,
City.SEOUL.latitude,
City.BUSAN.longitude,
City.BUSAN.latitude
)

println("isSphere = $isSphere")
println("semiMajorAxis = $semiMajorAxis")
println("semiMinorAxis = $semiMinorAxis")
println("eccentricity = $eccentricity")
println("inverseFlattening = $inverseFlattening")
println("ivfDefinitive = $ivfDefinitive")
println("orthodromicDistance = $orthodromicDistance")
}
}
isSphere = false
semiMajorAxis = 6378137.0
semiMinorAxis = 6356752.314245179
eccentricity = 0.08181919084262128
inverseFlattening = 298.257223563
ivfDefinitive = true
orthodromicDistance = 328199.9794919944

DefaultEllipsoid.WGS84 로 지구 타원체를 생성할 수 있습니다. 만약 WGS84 가 아닌 SPHERE 를 사용하면 타원이 아닌 반지름 6371km 의 구체가 만들어집니다.

distance 의 결과는 미터(m) 로 출력되므로 km 로 변환해보면 328km 가 나오는 것을 확인할 수 있습니다. 실제 구글에 검색해보면 325km 가 나오니 제가 임의로 선정한 좌표와 구글이 선정한 좌표에 차이가 있을 수 있음을 감안해보면 나쁘지 않은 수치입니다.

이 외에도 다양한 기능이 존재하는데요. 이 포스팅에서 모두 다루기에는 너무 방대해서 필요하다면 다른 포스팅에서 다뤄보겠습니다.

info

오차의 범위는 비즈니스 요구사항에 따라서 만족스럽지 못할 수 있기 때문에 실제 적용하시기 전에 geotools 의 다른 method 들도 충분히 테스트해보시기 바랍니다.


Footnotes

  1. An Overview of SRID and Coordinate System