SPRING :: NOTE

[ANDROID] LLH Degree를 ECEF 좌표료 변환 본문

Development Language/JAVA · ANDROID

[ANDROID] LLH Degree를 ECEF 좌표료 변환

RAYZIE 2023. 5. 24. 18:12
반응형

아래와 같이 안드로이드의 LatLng 객체를 입력으로 받아 ECEF 좌표를 배열로 출력하는 Java 코드의 예 이다.

본 코드는 수학적인 계산을 수행하므로 추가적인 외부 라이브러리는 필요하지 않다.

import android.location.Location;

public class LLHtoECEFConverter {

    public static double[] convertLLHtoECEF(Location location) {
        double lat = Math.toRadians(location.getLatitude());
        double lon = Math.toRadians(location.getLongitude());
        double alt = location.getAltitude() + 10.0; // 고도는 10m 추가 (가정)

        double a = 6378137.0; // 지구의 반경 (WGS84 타원체의 장축)
        double f = 1 / 298.257223563; // 타원체의 편평률

        double sinLat = Math.sin(lat);
        double cosLat = Math.cos(lat);
        double sinLon = Math.sin(lon);
        double cosLon = Math.cos(lon);

        double eSq = 2 * f - f * f; // 타원체의 이심률 제곱

        double N = a / Math.sqrt(1 - eSq * sinLat * sinLat); // 주요반경

        double x = (N + alt) * cosLat * cosLon;
        double y = (N + alt) * cosLat * sinLon;
        double z = (N * (1 - eSq) + alt) * sinLat;

        return new double[]{x, y, z};
    }

    public static void main(String[] args) {
        // 예시 위치
        Location location = new Location("dummyProvider");
        location.setLatitude(37.123456); // 위도
        location.setLongitude(127.123456); // 경도
        location.setAltitude(10.0); // 고도 (가정)

        double[] ecef = convertLLHtoECEF(location);

        System.out.println("ECEF X: " + ecef[0]);
        System.out.println("ECEF Y: " + ecef[1]);
        System.out.println("ECEF Z: " + ecef[2]);
    }
}

위 코드에서 convertLLHtoECEF 함수는 LatLng 객체를 입력으로 받아 ECEF 좌표를 double 배열로 반환한다.

LatLng 객체에서 경도(longitude)와 위도(latitude) 값을 가져와서 LLH 좌표로 사용합니다. ECEF 좌표의 높이(height)는 10m로 가정한다.

변환된 ECEF 좌표는 double 배열로 [x, y, z] 형태로 출력된다.

main 메소드에서는 예시로 LatLng 객체를 생성하고, 해당 객체를 이용하여 ECEF 좌표를 계산하여 출력

반응형
Comments