2010-01-28 3 views
2

Как создать многоугольник (только квадрат в моем случае) вокруг данной точки (lat/lang) x метров вокруг данной точки. Это просто визуальное представление геообъекта, но мне не нужны все вычисления, находится ли точка за пределами геозонности или нет. Я попытался использовать код ниже, но вместо этого создал прямоугольник вместо квадрата, и я даже не уверен, правильно ли обработаны 1000-метровые часы.Нарисуйте многоугольник x метров вокруг точки

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); 
    }); 

ответ

7

я портировал эту 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; 
+0

Это нормально, что е никогда не используется? –

Смежные вопросы