4

Google Maps API V3 を使用して、デフォルトの開始点から距離を指定して特定の方向に線を引こうとしています。たとえば、デフォルトの出発点がサンフランシスコで、ユーザーが距離を入力したとします。その入力距離に基づいて、米国を横切って東に向かう直線を描画できるようにしたいと考えています。ベアリングと呼ばれるものに出くわしましたが、正しく使用する方法がわかりません。ここに私が取り組んでいるコードがあります:

function initializeMap(){

var mapOptions = {
center: new google.maps.LatLng(36.033036, -93.8655744),
zoom: 4,
mapTypeId: google.maps.MapTypeId.ROADMAP
};   

var map = new google.maps.Map(document.getElementById("map-canvas"), mapOptions);

var R = 6378137;
var dis = parseInt(document.form['input']['val'].value);
var bearing = 80; 
var lat2 = Math.asin(   Math.sin(37.470625)*Math.cos(dis/R)+Math.cos(37.470625)*Math.sin(dis/R)*Math.cos(bearing) );
var lon2 = -122.266823 + Math.atan2(Math.sin(bearing)*Math.sin(dis/R)*Math.cos(37.470625),Math.cos(dis/R)-Math.sin(37.470625)*Math.sin(-122.266823));


var impactP = new google.maps.Polyline({
  path: new google.maps.LatLng(lat2,lon2), 
              strokeColor: "#FF0000",
  strokeOpacity: 1.0,
          strokeWeight: 2
        });
impactP.setMap(map);
}

誰か助けてください。私は本当にこれを機能させたいと思っています。

4

3 に答える 3

3

数学はすべてここで説明されています: http://www.movable-type.co.uk/scripts/latlong.html#destPoint

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

lat1,lon1(始点) とlat2,lon2(終点) は度ではなくラジアンであることに注意してください。d移動距離とR地球の半径です。これらは、両方が同じ単位である限り、任意の単位にすることができます。

ラジアンで作業すると、質問のコードが機能するようです。

北半球で 90° の方位から始めた場合、最終的には少し南に向かいます (最終的な方位は 90° 以上になります)。球面幾何学は素晴らしいものです!

方位角が一定の線が必要な場合、つまり 90° の線が地図上で直線で水平になるようにするには、Rhumb 線が必要です: http://www.movable-type.co.uk/scripts/latlong.html#rhumblines。これはもっと複雑ですが、このページでも距離と方位からエンドポイントを計算でき、必要な数学と Javascript について説明しています。


同じページでは、Number にメソッドを追加して、度からラジアンに変換し、再び元に戻すことを提案しています。

/** Converts numeric degrees to radians */
if (typeof(Number.prototype.toRad) === "undefined") {
  Number.prototype.toRad = function() {
    return this * Math.PI / 180;
  }
}

/** Converts radians to numeric (signed) degrees */
if (typeof(Number.prototype.toDeg) === "undefined") {
  Number.prototype.toDeg = function() {
    return this * 180 / Math.PI;
  }
}

(78).toRad()です1.3613568。_

于 2012-04-19T15:45:41.667 に答える
0

Google マップの足場http://jsfiddle.net/khwLd/を配置しましたが、私の数学はオフです :( 線が南に曲がっているのがわかります。 python 関数を変換してチェックしましたが、まだ期待どおりの結果が得られません。

方位と距離から座標を計算する

あなたがする必要があるのは、最初にすべての数学を修正して、次のようにすることです。

getDestination(origin_lat, origin_lng, bearing, distance) 戻り値 google.maps.LatLng(destination_lat, destination_lng)

申し訳ありませんが、完全に機能するソリューションを作成できませんでした:(

于 2012-04-19T15:29:20.193 に答える