2013-02-27 7 views
2

이것은 구체적으로 Google 어스 API 질문이지만, 이에 맞게 조정할 수있는 일반 지리적 솔루션도 좋습니다.카메라를 특정 위도/경도로 바꾸기 (Google 어스 API)

Google 어스 API를 사용하여 장소 어딘가에 위치 표시를 동적으로 배치하고 있습니다. 모든 장소 표시와 마찬가지로 고정 위도와 경도를 갖습니다. 이 경우 고도는 기본적으로 항상 0입니다. 장소 표시를 배치 한 후 사용자가 카메라를 다른 곳으로 돌릴 수 있으며 장소 표시가 보이지 않을 수 있습니다.

카메라의 위치를 ​​변경하지 않고 원래 위치 표시 의 방향으로 자동으로 볼 수있게 해주는 버튼이 있습니다.. 구글 어스 API에서

는 사용자의 뷰포트는 위도와 경도뿐만 아니라을 향하고 (왼쪽에서 오른쪽으로 축) 및 (상하 경사가있는 카메라 객체로 표현된다 중심선).

그래서 질문을 줄일 수 있습니다 : 지구본에 (lat1, lng1, alt1)의 고정 점이있는 경우 (lat1, lng2, alt2)에서 카메라의 표제와 기울기를 계산하는 방법은 무엇입니까? 그 위치를 직면하고 있다고? 이 링크 여기 http://www.movable-type.co.uk/scripts/latlong.html

에서 '지지'섹션

답변

1

체크 아웃 그가 베어링을 계산 (또는 호)를 위해 제안하는 스크립트이다.

var y = Math.sin(lng1-lng2) * Math.cos(lat2); 
var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(lng1-lng2); 
var brng = Math.atan2(y, x).toDeg(); 
+0

고마워요! 이것은 어떤 이유로 든 여전히 효과가 없지만 도움이됩니다. (위의 오타가 있습니다. lng1-lng2와 같이 두 위치 모두에서 lng2-lng1이어야합니다.) 오류가 내 코드 또는 내 접근법 또는 Google 어스와 관련된 것인지 파악할 수 없습니다. 제목이 올바르게 정렬되지 않은 결과를 얻습니다. 이상한 점은 인터페이스에 같은 값을 붙여 넣으면 자바 코드와 다른 값을 얻을 수 있다는 것입니다. 실망! – nucleon

+0

다음은 현재 사용중인 기능입니다. var dLon = lng2-lng1; var y = Math.sin (dLon) * Math.cos (lat2); var x = Math.cos (lat1) * Math.sin (lat2) -Math.sin (lat1) * Math.cos (lat2) * Math.cos (dLon); var brng = Math.atan2 (y, x) .toDeg(); ... 작동해야합니다. 그러나 모든 십진수도를 사용하면 매번 약간의 잘못된 결과가 나옵니다. 음 ... – nucleon

+0

@nucleon - 계산을 수행하려면 십진수를 라디안으로 변환해야합니다. 즉'lat2-lat1 * Math.PI/180' – Fraser

1

여기에 임의의 고도의 또 다른 위도/LNG 지점을 향해 임의의 고도의 현재 카메라를 켤의 전체, 최종 구현입니다. 매우 아름답 지 않습니다 (라디안과 다른 카메라를 사용하고 있기 때문에 라트와 LNG를 두 번 얻습니다).하지만 작동하고 Google 어스 카메라가 원하는대로 얼굴을 마주 보게합니다.

//calculate heading/bearing 
var lat1 = parseFloat(camera.getLatitude())* Math.PI/180; 
var lng1 = parseFloat(camera.getLongitude())* Math.PI/180; 
var lat2 = parseFloat(target_lat)* Math.PI/180; 
var lng2 = parseFloat(target_lng)* Math.PI/180; 

var dLon = lng2-lng1; 
var y = Math.sin(dLon) * Math.cos(lat2); 
var x = Math.cos(lat1)*Math.sin(lat2) - Math.sin(lat1)*Math.cos(lat2)*Math.cos(dLon); 
var brng = Math.atan2(y, x).toDeg(); 

//calculate tilt 
lat1 = parseFloat(camera.getLatitude()); 
lng1 = parseFloat(camera.getLongitude()); 
lat2 = parseFloat(target_lat); 
lng2 = parseFloat(target_lng); 
var camera_alt = camera.getAltitude(); 
var target_alt = your_target_altitude; //meters! 

//this uses the distVincenty function and geo.js library here: http://www.movable-type.co.uk/scripts/latlong.html 
var distance = parseFloat(distVincenty(Geo.parseDMS(lat1),Geo.parseDMS(lng1),Geo.parseDMS(lat2),Geo.parseDMS(lng2))); 
var height_diff = (camera_alt-target_alt); 

if(height_diff<0) { //target is above camera, invert equation 
    height_diff = (target_alt-camera_alt); 
    var tilt = Math.atan(height_diff/distance).toDeg()+90; //the +90 is because of the way Google Earth calculates tilt in such circumstances 
} else { 
    var tilt = Math.atan(distance/height_diff).toDeg(); 
} 

camera.setTilt(tilt); 
camera.setHeading(brng);