【问题标题】:Draw polygon x meters around a point围绕一个点绘制多边形 x 米
【发布时间】:2010-01-28 01:17:28
【问题描述】:

如何围绕给定点(纬度/纬度)x 米围绕给定点创建一个多边形(在我的情况下只有一个正方形)。它只是地理围栏的视觉表示,但无论一个点是否在地理围栏之外,我都不需要所有计算。我尝试使用下面的代码,但它创建了一个矩形而不是一个正方形,我什至不确定 1000 米的边界是否被正确渲染。

var map = new GMap2(document.getElementById("map_canvas"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
map.addControl(new GSmallMapControl());
GEvent.addListener(map, 'click', function(overlay, latlng) {
    var lat = latlng.lat();
    var lng = latlng.lng();

    var height = 1000; //meters
    var width = 1000; //meters
    var polygon = new GPolygon(
        [
             new GLatLng(lat + height / 2 * 90 / 10000000, lng + width / 2 * 90 / 10000000 / Math.cos(lat)),
             new GLatLng(lat - height / 2 * 90 / 10000000, lng + width / 2 * 90 / 10000000 / Math.cos(lat)),
             new GLatLng(lat - height / 2 * 90 / 10000000, lng - width / 2 * 90 / 10000000 / Math.cos(lat)),
             new GLatLng(lat + height / 2 * 90 / 10000000, lng - width / 2 * 90 / 10000000 / Math.cos(lat)),
             new GLatLng(lat + height / 2 * 90 / 10000000, lng + width / 2 * 90 / 10000000 / Math.cos(lat))
        ], "#f33f00", 2, 1, "#ff0000", 0.2);
        map.addOverlay(polygon);
    });

【问题讨论】:

    标签: google-maps polygon


    【解决方案1】:

    我将此PHP function 移植到 Javascript 中,以计算距已知位置的任意距离和方位角:

    var EARTH_RADIUS_EQUATOR = 6378140.0;
    var RADIAN = 180 / Math.PI;
    
    function calcLatLong(longitude, lat, distance, bearing) 
    {
         var b = bearing / RADIAN;
         var lon = longitude / RADIAN;
         var lat = lat / RADIAN;
         var f = 1/298.257;
         var e = 0.08181922;
    
         var R = EARTH_RADIUS_EQUATOR * (1 - e * e) / Math.pow( (1 - e*e * Math.pow(Math.sin(lat),2)), 1.5);    
         var psi = distance/R;
         var phi = Math.PI/2 - lat;
         var arccos = Math.cos(psi) * Math.cos(phi) + Math.sin(psi) * Math.sin(phi) * Math.cos(b);
         var latA = (Math.PI/2 - Math.acos(arccos)) * RADIAN;
    
         var arcsin = Math.sin(b) * Math.sin(psi) / Math.sin(phi);
         var longA = (lon - Math.asin(arcsin)) * RADIAN;
    
         return new GLatLng (latA, longA);
    }
    

    我已经写了这个函数的working example,你可以看看(source)。

    我使用Pythagorean Theorem 将正方形的宽度转换为半径,如果您想使用距离中心 1000 米的简单半径,您可以这样做:

    // this
    var radius = 1000;
    // instead of this
    var radius = (Math.sqrt (2 * (width * width))) / 2;
    

    【讨论】:

    • f 从不使用正常吗?
    猜你喜欢
    • 2013-11-10
    • 2011-02-18
    • 2019-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2019-08-30
    相关资源
    最近更新 更多