2010.07.27 10:57
넹 주석은 귀찮습니당!

results라는 플롯배열은 3번까지 지정하면 다른 값을 볼 수있습니다.

0번배열에 거리가 나옵니다. (meter)
1번배열에 베어링 뭐가 나온대요
2번배열에도 베어링 뭐가 나온대요

베어링은 인터넷 검색해보니까 뭐 차축돌리는거라 나오는데 이거랑 다른거 같은데 전 잘 모르겠네요 (-_-;;



					GeoPoint topleft = mapView.getProjection().fromPixels(0, 0);
					GeoPoint topright = mapView.getProjection().fromPixels(mapView.getWidth(), 0);
					GeoPoint bottomleft = mapView.getProjection().fromPixels(0, mapView.getHeight());
					
					Log.w("start" , ""+topleft.getLatitudeE6()/1E6 +":"+topleft.getLongitudeE6()/1E6);
					Log.w("end" , ""+topright.getLatitudeE6()/1E6 +":"+topright.getLongitudeE6()/1E6);
					float[] results = new float[1];
					
					Location.distanceBetween(topleft.getLatitudeE6()/1E6, topleft.getLongitudeE6()/1E6, topright.getLatitudeE6()/1E6, topright.getLongitudeE6()/1E6, results);
					for ( int i = 0 ; i < results.length ; i++)
						Log.w("MapView.width meter : " + i ," : " +  results[i] );
					Location.distanceBetween(topleft.getLatitudeE6()/1E6, topleft.getLongitudeE6()/1E6, bottomleft.getLatitudeE6()/1E6, bottomleft.getLongitudeE6()/1E6, results);
					for ( int i = 0 ; i < results.length ; i++)
						Log.w("MapView.height meter : " + i ," : " +  results[i] );




저작자 표시 비영리
신고
Posted by conetpark
2010.07.21 22:46

출처 : 대전 패러글라이딩 카페 (http://cafe.naver.com/djpara.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=398)

위도는 적도의 위도를 0˚, 북극점을 북위 90˚, 남극점을 남위 90˚로 하고, 북위와 남위를 각각 90˚로 나누어 도(˚)분(′)초(˝)를 사용하여 표시합니다. 반면 경도는 그 점을 지나는 자오선을 포함하는 평면(자오면)과 런던의 그리니치천문대를 지나는 본초자오선(本初子午線;경도 0˚)을 포함하는 평면이 이루는 각도로 정의되며, 본초자오선을 경도 0˚로 하고 본초자오선에서 동서로 각각 나누어 동경 180˚, 서경 180˚까지 구분한 것으로 그 모양이 마치 귤과 같습니다.

따라서 위도는 그 간격이 일정하지만 경도 사이의 간격은 위도에 따라서 달라집니다. 다음 그림을 참조하시면 이해가 쉬울 것입니다.

 


참고로 지구의 둘레는 약 48,000 km 입니다. 위도의 경우 지구 둘레의 절반을 남북으로 180 등분한 것이므로 위도 1도 사이의 거리는 48,000 ÷ 360 = 133.33 km 이며 1 도는 3600 초이므로 1초 사이의 거리는 0.037 km = 37 m 입니다. 한편 경도의 경우는 적도에서는 지구 둘레인 48,000 km 를 360 등분한 것이므로 위도와 마찬가지로 1도 사이의 거리는 133.33 km, 1초 사이이의 거리는 37 m 이지만 적도에서는 모든 경선이 만나기 때문에 그 사이의 거리가 모두 0 이 되며 그 중간 지역에서는 1도 사이의 거리는 133.33 × cos(해당 지역의 위도) km, 1초 사이의 거리는  37 × cos(해당 지역의 위도) m 의 식으로 구할 수 있습니다.

그러나 이것도 완전한 것은 아닙니다. 왜냐하면 지구는 완벽한 구형이 아니라 적도 부근이 약간 부풀어 오른 타원형인 데다가 지구의 표면은 완전한 구면이 아니라 울퉁불퉁하기 때문입니다.

2) 위도와 경도를 표시할 때 도(˚)분(′)초(˝)는 시간과 마찬가지로 60진법을 사용하지만 그 아래의 작은 단위는 초에 대한 10진수로 소숫점 아래의 숫자를 표시합니다. 예를 들어 북위 37˚35′35.35˝ 와 같은 식입니다. 1초 사이의 거리가 대략 37 m 보다 작으니 만큼 0.1 초 사이의 거리는 최대 3.7 m 이고 0.01 초 사이의 거리는 0.37 m = 37 cm 이니만큼 방안에 놓인 TV 리모컨의 위치까지도 추적이 가능한 해상도라고 할 수 있겠군요. 따라서 이보다 더 작은 구분은 굳이 필요 없을 듯 합니다.

한편 GPS 로 정확한 위치를 알기 위해서는 당연한 일이지만 비용이 증가하게 됩니다. 현재 휴대폰 위치 추적이나 GPS 와 같은 위치 정보 서비스는 대략 3 곳에서 목표물의 위치를 파악합니다. 즉, 휴대폰의 경우는 목표물에서 가장 가까운(전파 수신 감도가 가장 좋은) 기지국 3 곳을 기준으로, GPS 의 경우는 가장 가까운 위성 3 개를 기준으로 그 위치를 식별하고 있습니다. 더 정밀한 위치 추적을 위해서는 더 많은 기지국이나 위성이 동원되어야 하며 그러기 위해서는 무엇보다도 비용이 중요한 변수로 작용하기 때문입니다.


< 위도별 경도의 길이 >

위도 (° )

위도 1도의 길이(km)

경도 1도의 길이 (km)

0
5
10
15
20
25
30
35
40
45
50
55
60
65
70
75
80
85
90

110.569
110.578
110.603
110.644
110.701
110.770
110.850
110.941
111.034
111.132
111.230
111.327
111.415
111.497
111.567
111.625
111.666
111.692
111.700

111.322
110.902
109.643
117.553
114.650
100.953
96.490
91.290
85.397
78.850
71.700
63.997
55.803
47.178
38.188
28.904
19.394
9.735
0.000


A 지점과 B 지점의 경도와 위도를 가지고 거리 계산을 하려고 합니다.
A지점 북위 35.523 동경 126.532
B지점 북위 35.050 동경 127.143

삼차원 직교좌표를 이용하여 거리 계산을 하려고 합니다..
아시는 분 있으시면 자세한 설명부탁드립니다..
다른 방법을 아시는 분들도...

 

아마 경도를 보면 맨 뒤부분의 단위가 초가 아니라 분 단위의 소수점인듯 합니다.
만약 초 단위라면 60보다 클 수 없습니다.
즉, E127도 26.643초 가 되겠죠.

어떤 평면상에서 두 점 사이의 거리는
r=root(dx^2 + dy^2)으로 주어집니다.

먼저 경도차와 위도차를 각도로 바꾸죠.
경도차 dθ= 10.977분 = 0.18295도 = 0.00319308 라디안
위도차 dφ= 3.553분 = 0.059216667도 = 0.001033526 라디안

dx=R*cos φ * dθ (여기서 R은 지구의 반지름, φ는 위도)
= 6,370 km * cos (35.21도) * 0.00319308
= 16.6 km

dy = R * dφ= 6.58 km

r= 17.86 km 가량 되는군요.


저작자 표시 비영리
신고

'Project > Nearyou' 카테고리의 다른 글

위도 경도 거리 산출법  (0) 2010.07.21
Posted by conetpark
2010.07.21 21:12


줌 레벨이 바뀌거나 맵의 상태변화를 감지하기 위해서 줌 리스너를 활용 할 수 있습니다.
사용법은 아래와 같이 간단합니다.
주의 해야 할점은 이 기능이 Android API Level 4 부터 적용이 된다는 점 이구요. onZoom 메서드를 오버라이드했을때에는 zoom버튼 이벤트에 대해 기본적인 처리가 되어 있지 않은 상태입니다. 이건.. 구글이 일부러그랬는지 아닌지는 모르겠네요
하여간 이 부분에 대해서 이전과 같이 사용하고 싶다면 zoonIn 변수의 값을 체크해서 맵컨트롤러로 이벤트에 대한처리를 해주면 됩니다.
onVisibilityChanged 메서드는 제가 테스트 해본결과 맵의 상태변화를 감지하는군요.. 맵의 이동이나 확대등의 움직임 자체를 감지하고 visible 변수를 통해서 visible한 상태의 움직임혹은 확대였는지 invisible한 상태의 움직임이었는지를 체크해줍니다.
저 같은 경우에는 invisible한 경우에 이벤트 처리가 필요하기에 저러한 식으로 테스트해보았습니다.
invisible한 상태라는것은 맵이 다 로딩 되지 않은 부분으로 이동하거나 확대하였을때를 뜻 합니다.

	MapView mapView = (MapView)findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        MapController zoomController = mapView.getZoomButtonsController();      
        ZoomButtonsController mapController = mapView.getController();

		zoomController.setOnZoomListener(new OnZoomListener() {
			@Override
			public void onZoom(boolean zoomIn) {
				if(zoomIn)
					mapController.zoomIn();
				else
					mapController.zoomOut();
			}	
			
			@Override
			public void onVisibilityChanged(boolean visible) {
				if(!visible)
					Toast.makeText(MapViewer.this, mapView.getZoomLevel()+"", Toast.LENGTH_SHORT).show();
				
			}
		});


저작자 표시 비영리
신고
Posted by conetpark

티스토리 툴바