2014-04-24 2 views
2

내 질문에 전혀 문제가되지 않는다면 제 문제는 약간 까다 롭습니다. 사과하십시오.변환 위도/경도 거리로

저는 googleMap v3 API를 사용합니다. 사용자가지도를 클릭하여 표시를 만들 수 있습니다. 표시를 클릭하면 경도 정보가 & 인 infoWindow에 표시됩니다 (이 작업은 정상적으로 완료되었습니다).

시도 할 사항 : 사용자가 할 수있는 일 차원 (킬로미터/마일)을주고 주어진 크기의 직사각형을 그려야합니다 (마크를 생성하는 것은 영역의 중앙에 있음). 문제는 위도가 & 경도 인 위도 또는 경계에서만 발생합니다. 그래서 그것을 변환하려고합니다.

여기 코드의 주요 부분이 있습니다.

//latitude 
// 1°lat = 111,11 km 
//for me: 1km = 0.00900 . 

//longitude 
//1°lat = 111,11 km * cos latitude 
// for me : 1 km = ((1/Math.cos(latitude)) /111.11) 

var myBounds = new Array(); 

var longkm = 5; 
var largkm = 2; 
myBounds[0] = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat()-(0.009*longkm), positionmarqueur.lng()-(Math.abs(((1/Math.cos(positionmarqueur.lat()-(0.009*longkm))) /111.11))*largkm)), 
    new google.maps.LatLng(positionmarqueur.lat()+(0.009*longkm), positionmarqueur.lng()+(Math.abs(((1/Math.cos(positionmarqueur.lat()+(0.009*longkm))) /111.11))*largkm)) 
); 

var overlay1 = new google.maps.Rectangle({ 
    map: map, 
    bounds: myBounds[0], 
    strokeColor: "green", 
    strokeWeight: 1 
}); 

var longkm = 10; 
var largkm = 10; 
myBounds[1] = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat()-(0.009*longkm), positionmarqueur.lng()-(Math.abs(((1/Math.cos(positionmarqueur.lat()-(0.009*longkm))) /111.11))*largkm)), 
    new google.maps.LatLng(positionmarqueur.lat()+(0.009*longkm), positionmarqueur.lng()+(Math.abs(((1/Math.cos(positionmarqueur.lat()+(0.009*longkm))) /111.11))*largkm)) 
); 

var overlay2 = new google.maps.Rectangle({ 
    map: map, 
    bounds: myBounds[1], 
    strokeColor: "blue", 
    strokeWeight: 1 
}); 

이것은 5,2 rectanle와 10, 10 사각형 (음, 10km 광장) 그릴 갈까요 (정보를 원하시면을 = latLng를이 VAR를 positionmarqueur, 위의 코드에서)

내가 가지고가는 경우 결과보기 : 첫 번째 사각형은 50/20km 이상을 보입니다. (내가 실수 할 때 나는 10 가지 요소로 나누 었는가? 나는 수학적으로별로 좋지는 않지만 정확하다.)

seconde .... 그냥 .... 200 * 40km 사각형 모양

겠어요 - 문제는 어디에 있습니까? 공식이 잘못 되었습니까? 아니면 그냥 바보 일 뿐이야?

Thinqs. 사용

답변

2

알고리즘은

var largkm = 5, 
     longkm = 10; 

    var bounds = new google.maps.LatLngBounds(
    new google.maps.LatLng(positionmarqueur.lat() - ((largkm/2)/110.54), positionmarqueur.lng() - ((longkm/2)/(Math.cos(positionmarqueur.lat())*111.32))), 
    new google.maps.LatLng(positionmarqueur.lat() + ((largkm/2)/110.54), positionmarqueur.lng() + ((longkm/2)/(Math.cos(positionmarqueur.lat())*111.32))) 
); 

(참고 : 우리가 중심에서 경계를 정의하기 때문에 내가 2 사각형의 크기를 분할하고)이다http://jsfiddle.net/gaby/a5QVM/

에서

데모


업데이트

Google지도에서 사용하는 모든 투영법을 사용하는 Google 지오메트리 라이브러리를 사용해야 변환이 정확합니다.

보다 구체적인 당신이 google.maps.geometry.spherical.computeOffset 방법

var rectbounds = new google.maps.LatLngBounds(
    spherical.computeOffset(spherical.computeOffset(positionmarqueur, longkm*1000/2, -90),largkm*1000/2,0), 
    spherical.computeOffset(spherical.computeOffset(positionmarqueur, longkm*1000/2, 90), largkm*1000/2,180) 
); 
를 사용해야합니다 (당신은 http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false에 구글 API의 URL을 변경해야합니다)

http://jsfiddle.net/a5QVM/10/
합니다 (*1000가있다 에서 업데이트 데모 computeOffset 방법에서 예상되는 거리를 미터로 변환하십시오.

+0

Clermont-ferrand 위치 (45.7581263,3.1317803)를 사용하면 트릭이 발생합니다. 나는 jsfiddle & valid answer – ssbb

+0

수식을 편집 할 예정입니까? 내 말은, 만약 당신이 100/100km를 그린다면, 사각형이 아닌 trully이고 사각형 이니, 자바 스크립트 근사값에서 오는 것입니까? 아니면 지구의 성향으로 인해 googlemap에서 이와 같은 것을 볼 수 있습니까? – ssbb

+0

더 정확한 해결책으로 @ssbb 업데이트 답변 (* 변환을 위해 Google 메소드를 사용 *) –

관련 문제