【问题标题】:conversion latitude/longitude into distance将纬度/经度转换为距离
【发布时间】:2014-04-24 10:25:12
【问题描述】:

我的问题有点棘手,如果我的问题根本不清楚,请道歉。

我使用 googleMap v3 API。用户可以在地图上创建一个标记,如果他点击标记,我将纬度和经度信息输入一个信息窗口(完成并且没关系)

尝试做的事情:用户可以给出尺寸(公里/英里),我必须绘制一个给定大小的矩形(创建标记应该是区域的中间)。问题来自仅采用纬度和经度的纬度或界限。所以我尝试转换它。

这里是代码的主要部分。

//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 公里的正方形) (信息:var positionmarqueur = latLng; 上面的代码)

如果我看一下结果:第一个矩形看起来超过 50/20 公里。 (除法时我做错了吗?用 10 因子?我数学不是很好,但看起来是正确的)。

第二个......看起来就像一个 200*40 公里的矩形......

所以。问题出在哪里?公式错了吗?还是我很笨,我错过了什么?

瘦身。

【问题讨论】:

    标签: javascript google-maps coordinate-transformation


    【解决方案1】:

    要使用的算法是

      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 API 的 URL 更改为 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 方法所期望的

    【讨论】:

    • 如果你使用 Clermont-ferrand position (45.7581263,3.1317803) 有一个技巧。我将编辑 jsfiddle 和有效答案
    • 您确定公式吗?我的意思是,如果你画一个 100/100 公里,它真的不是正方形,它是一个矩形,它来自 javascript 近似值吗?还是因为地球倾斜,我在 googlemap 上看到这样的?
    • @ssbb 用更准确的解决方案更新了答案(使用谷歌方法进行转换
    • @GabrielePetrioli 当我使用球形边界并调用 LatLngBounds.getSouthWest()getNorthEast() 我得到西北和东南边界?这些反转发生了什么 - jsfiddle.net/mtpultz/dspqxLzr/24。我添加了控制台日志记录。
    • 如果我在等式中切换 0 和 180 似乎可以解决问题 - jsfiddle.net/mtpultz/dspqxLzr/29
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-18
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多