将纬度/经度转换为距离

时间:2014-04-24 10:25:12

标签: javascript google-maps coordinate-transformation

如果我的问题根本不明确,我的问题有点棘手,道歉。

我使用googleMap v3 API。用户可以在地图上集团创建标记,如果他点击标记,我会给出纬度&经度信息到infoWindow(这已经完成,没关系)

尝试做的事情:用户可以给出尺寸(km / miles),我必须绘制给定尺寸的矩形(创建标记应该是区域的中间)。这个问题来自只接受纬度和经度的latlng或bounds。经度。所以我试着转换它。

这是代码的主要部分。

//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矩形和一个10,10矩形(好,一个10平方公里) (对于info:var positionmarqueur = latLng;代码中的上方)

如果我看看结果:第一个矩形看起来超过50/20公里。 (当我分裂时,我做了一个错误吗?有10个因素?我在数学方面不是很好,但它看起来不错。)

seconde ....看起来像一个200 * 40公里的矩形......

因此。问题出在哪里?这个公式错了吗?或者我只是愚蠢而我想念一些东西?

Thinqs。

1 个答案:

答案 0 :(得分: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 API的网址更改为http://maps.googleapis.com/maps/api/js?libraries=geometry&sensor=false

更具体地说,您应该使用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://jsfiddle.net/a5QVM/10/的演示版 ( *1000是将距离转换为米,因为这是computeOffset方法所期望的