블로그 이미지
Kanais
Researcher & Developer 퍼즐을 완성하려면 퍼즐 조각들을 하나 둘씩 맞춰나가야 한다. 인생의 퍼즐 조각들을 하나 둘씩 맞춰나가다 보면 인생이란 퍼즐도 완성되는 날이 오려나...?

calendar

1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

Notice

2016. 1. 5. 11:30 Programming/Android

운영체제 : Windows 8.1 64bit

Android Studio Version : 5.0.1

Android Develop Tool : Eclipse Luna

작성날짜 : 2016-01-05



다음지도에서 모바일 화면 영역의 상단왼쪽 좌표를 구하는 방법


다음지도 API에서 찾아보려했으나... 구글링에서도 찾지 못하여 직접 구현해보았다.


위도와 경도 근사값은 대략으로 정한 것으로... 틀릴 수도 있음을 유의.




      Display display = getWindowManager().getDefaultDisplay();    // 모바일 화면의 디스플레이 영역의 크기를 가져옴

double init_lat = 0.0000005;                       // 디스플레이 크기 1당 다음지도 위도 크기 근사값

double init_lon = 0.0000008;                    // 디스플레이 크기 1당 다음지도 경도 크기 근사값

int zoomlevel = mapview.getZoomLevel();     // 지도 줌레벨에 따라 디스플레이 크기 1당 위도, 경도 값이 달라지니까 구함.

double range = Math.pow(2, zoomlevel + 1); //  지도 줌레벨에 따라 축척이 변화하므로 축척에 따른 값을 구함

MapPoint mp = mapview.getMapCenterPoint();  // 다음지도 맵뷰의 가운데 값을 구함

MapPoint.GeoCoordinate gc = mp.getMapPointGeoCoord();  // 맵포인드를 WCONG 평면좌표계의 좌표값으로 변환

       // 중앙 좌표에서 왼쪽상단 좌표를 구하기 위한 연산

double top_lat = gc.latitude + (init_lat * display.getHeight() * 1.5 * range);   

double top_lon = gc.longitude - (init_lon * display.getWidth() * 1.5 * range);





Top(x, y)를 구하기 위해서 Center(x,y)를 이용하였다.


위도는 가로축이고, 경도는 세로축이니까.


위도는 왼쪽으로 갈 수록 값이 낮아지고, 오른쪽으로 갈 수록 값이 높아진다.


경도는 위로 갈 수록 값이 높아지고, 아래로 갈 수록 값이 낮아진다.


그래서, Top(x, y)를 구하는 식은.


Top(latitude) = Center(latitude) + (디스플레이 1당 좌표값 * 축척 초기값 * 2^(ZoomLevel + 1)

               = Center(latitude) + (0.0000005 * 1.5 * 2^(ZoomLevel +1))    

                 // 여기서 ZoomLevel 에 1을 더해주는 이유는 다음지도의 경우 최하 줌레벨은 -2부터 시작하기 때문임.

                 // 그리고 2인 이유는 축척이 거의 2배씩 증가하기 때문이고.

Top(longitude) = Center(longitude) + (디스플레이 1당 좌표값 * 축척 초기값 * 2^(ZoomLevel + 1)

                 = Center(longitude) + (0.0000008 * 1.5 * 2^(ZoomLevel +1))


여기서 Top(x,y)를 구한후 Bottom(x,y) 구하는건 쉽다.


Bottom(latitude) = Center(latitude) - (Top(latitude) - Center(latitude))

Bottom(longitude) = (Center(longitude) - Top(longitude) + Center(longitude)


그리고.. 특정 좌표가 화면 영역내에 존재하는지 유무를 알려면, 아래의 두 조건을 만족하여야 한다.


Top(x) <= Temp(x) && Temp(x) <= Bottom(x)

Top(y) >= Temp(y) && Temp(y) >= Bottom(y) 




posted by Kanais