如果我的问题根本不明确,我的问题有点棘手,道歉。
我使用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。
答案 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
方法所期望的)