Нарисуйте многоугольник х метров вокруг точки - PullRequest
2 голосов
/ 28 января 2010

Как я могу создать многоугольник (только квадрат в моем случае) вокруг заданной точки (широта / долгота) х метров вокруг заданной точки. Это просто визуальное представление геозоны, но мне не нужны все вычисления вне зависимости от того, находится ли точка вне геозоны или нет. Я попытался использовать приведенный ниже код, но он создает прямоугольник вместо квадрата, и я даже не уверен, правильно ли отображаются 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);
    });

1 Ответ

7 голосов
/ 29 января 2010

Я перенес эту PHP-функцию , чтобы вычислить местоположение на произвольное расстояние и направление от известного местоположения до 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);
}

Я написал рабочий пример этой функции, который вы можете проверить ( source ).

Я использую теорему Пифагора , чтобы перевести ширину квадрата в радиус, если вы хотите использовать простой радиус 1000 метров от центра, вы можете сделать это вместо этого:

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