2012-04-05 176 views
0

首先给那些想评论我的低接受率的人...即时新的,给我一个休息。多边形的洞

我说从本网站这个多边形代码: http://www.geocodezip.com/v3_polygon_example_donut.html

有一个问题,虽然,半径是不准确的。所以,如果我测量两个城市之间的距离,然后画出这个圆圈,它就会离开,并且圆圈越大越差。

任何想法?

<script type="text/javascript"> 
function drawCircle(point, radius, dir) { 
var d2r = Math.PI/180; // degrees to radians 
var r2d = 180/Math.PI; // radians to degrees 
var earthsradius = 3959; // 3959 is the radius of the earth in SM 

    var points = 1000; 

    // find the raidus in lat/lon 
    var rlat = (radius/earthsradius) * r2d; 
    var rlng = rlat/Math.cos(point.lat() * d2r); 


    var extp = new Array(); 
    if (dir==1) {var start=0;var end=points+1} // one extra here makes sure we connect the 
    else  {var start=points+1;var end=0} 
    for (var i=start; (dir==1 ? i < end : i > end); i=i+dir) 
    { 
    var theta = Math.PI * (i/(points/2)); 
    ey = point.lng() + (rlng * Math.cos(theta)); // center a + radius x * cos(theta) 
    ex = point.lat() + (rlat * Math.sin(theta)); // center b + radius y * sin(theta) 
    extp.push(new google.maps.LatLng(ex, ey)); 
    bounds.extend(extp[extp.length-1]); 
    } 
    // alert(extp.length); 
    return extp; 
    } 

    var map = null; 
    var bounds = null; 

    function initialize() { 
    var myOptions = { 
    zoom: 10, 
    center: new google.maps.LatLng(29.10860062, -95.46209717), 
    mapTypeControl: true, 
    mapTypeControlOptions: {style: google.maps.MapTypeControlStyle.DROPDOWN_MENU}, 
    navigationControl: true, 
    mapTypeId: google.maps.MapTypeId.TERRAIN 
    } 
    map = new google.maps.Map(document.getElementById("map_canvas"), 
          myOptions); 

    bounds = new google.maps.LatLngBounds(); 

    var donut = new google.maps.Polygon({ 
      paths: [triangleCoords = [ 
         new google.maps.LatLng(-87, 120), 
         new google.maps.LatLng(-87, -87), 
         new google.maps.LatLng(-87, 0)], 
        drawCircle(new google.maps.LatLng(29.10860062, -95.46209717), 2000, -1)],"; 

      strokeColor: "#000000", 
      strokeOpacity: 0.6, 
      strokeWeight: 2, 
      fillColor: "#999999", 
      fillOpacity: 0.6 
}); 
donut.setMap(map); 

map.fitBounds(bounds); 


</script> 
+0

你是什么意思的“路”?你能提供一个演示链接吗?或者至少有一个截图? – 2012-04-05 12:41:18

+0

CYQX-EINN之间的距离是1715nm。当我输入CYQX @ 1715NM时,它的长度大约为200英里。我确实考虑了转换。当你检查像CYQX-CYJT(159nm)那样的较短距离时,距离它约3英里。问题是半径的公式存在缺陷。 – 2012-04-05 13:00:50

+0

因此,你在规约里程中使用地球半径并不相关? 1715NM是1973SM; 159NM是182SM。如果你正在绘制1715年的规约里程,它将会在距离1715NM约200英里的地方。 – 2012-04-05 13:06:17

回答

3

更好的圆绘制例程可以通过使用“点从轴承”的计算在http://www.movable-type.co.uk/scripts/latlong.html#destPoint

θ发现是轴承(以弧度为单位,从北顺时针); d/R是角距离(以弧度为单位),其中,d是所行进的距离,R是地球半径

var lat2 = Math.asin(Math.sin(lat1)*Math.cos(d/R) + 
       Math.cos(lat1)*Math.sin(d/R)*Math.cos(brng)); 
var lon2 = lon1 + Math.atan2(Math.sin(brng)*Math.sin(d/R)*Math.cos(lat1), 
        Math.cos(d/R)-Math.sin(lat1)*Math.sin(lat2)); 

转换一切为弧度,并确保d和R在相同的单位均表示,我们得到了一个圆圈绘制函数这样

function drawCircle(point, radius, dir, addtoBounds) { 
var d2r = Math.PI/180; // degrees to radians 
var r2d = 180/Math.PI; // radians to degrees 
var earthsradius = 6371000; // 3959 is the radius of the earth in SM 

    var points = 1000; 

    // find the raidus in lat/lon 
    var rlat = (radius/earthsradius) * r2d; 
    var rlng = rlat/Math.cos(point.lat() * d2r); 


    var extp = new Array(); 
    if (dir==1) {var start=0;var end=points+1} // one extra here makes sure we connect the 
    else  {var start=points+1;var end=0} 
    for (var i=start; (dir==1 ? i < end : i > end); i=i+dir) 
    { 
     var theta = Math.PI * (i/(points/2)); 
    var lat1=point.lat()*d2r; 
    var lon1=point.lng()*d2r; 
    var d=radius; 
    var R=earthsradius; 

    var ex = Math.asin(Math.sin(lat1)*Math.cos(d/R) + 
       Math.cos(lat1)*Math.sin(d/R)*Math.cos(theta)); 
    var ey = lon1 + Math.atan2(Math.sin(theta)*Math.sin(d/R)*Math.cos(lat1), 
        Math.cos(d/R)-Math.sin(lat1)*Math.sin(ex)); 
     extp.push(new google.maps.LatLng(ex*r2d, ey*r2d)); 
     if (addtoBounds) bounds.extend(extp[extp.length-1]); 
    } 
    // alert(extp.length); 
    return extp; 
    } 

我有一个例子,在http://www.acleach.me.uk/gmaps/v3/mapsearch.htm,其中中心在CYQX并有在EINN最近另一个标记和1715NM半径的圆(表示为3176180米)。其他圈已增加在500,1000,1500,2000和2500NM的半径。

我也在两点之间添加了测地线。如预期的那样,这以正确的角度交叉圆圈,这是对圆圈计算精度的检查。

+0

该孔需要将圆圈以与包含边界相反的方向绘制。将方向'-1'改为'1'。一旦你到达世界的另一边,奇怪的事情就会发生。实际上(用'1'),你在你的圆圈上画着阴影*从圆形的一侧穿过它到另一侧的盒子边界。如果距离超过地球四分之一的距离,您可能需要改变线的使用顺序[但我没有证实]。 – 2012-04-06 15:57:32

+0

这是完全有道理的。我试图看到结果。我灰色的问题取决于纬度和半径大小。我可以从PAOM得到11000nm,而MMSD只能得到6500nm;在它给我问题之前。我满足于你给我的东西,非常感谢你。 – 2012-04-07 11:49:00