2010-01-28 134 views
2

如何在給定點周圍給定點(緯度/經度)x米周圍創建多邊形(僅在我的情況下爲正方形)。這只是一個地理圍欄的視覺表示,但我不需要計算一個點是否在地理圍欄之外。我嘗試使用下面的代碼,但它創建一個矩形,而不是一個正方形,我甚至不知道如果1000米badaries正在渲染正確。圍繞點繪製多邊形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 examplesource )。

我用Pythagorean Theorem從廣場的寬度轉換爲半徑,如果你想使用從中心一個簡單千米半徑你可以這樣做,而不是:

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

這是正常使f從未使用? – 2012-12-24 15:39:36