2

これは私が手動で行う方法です...

私はこれらの3つの座標を持っています:

var coordinateOne   = [-72.642883, 42.201343];
var coordinateTwo   = [-72.639532, 42.200784];
var coordinateThree = [-72.637823, 42.199687];

最初の座標を中心としたこのマップがあります。

var map = new mapboxgl.Map({
  container: 'map',
  style: 'mapbox://styles/mapbox/streets-v8',
  center: coordinateOne,
  zoom: 19
});

次の座標が (正確ではありませんが、この例では十分に近い) 真っ直ぐになるように手動で方位を設定できます。

map.easeTo({ bearing:109, pitch:60, zoom:19 });

次に、その 2 番目の座標までまっすぐ飛ぶことができます。

map.flyTo({ center:coordinateTwo, zoom: 19 });

次に、3 番目の座標をまっすぐ前に置き、方位を手動で再度設定します。

map.easeTo({ bearing:130, pitch:60, zoom:19 });

次に、その 3 番目の座標までまっすぐ飛ぶことができます。

map.flyTo({ center:coordinateThree, zoom: 19 });

flyToそれぞれが常に直進するように、その方位の値を毎回自動的に計算する方法はありますか?


Java でこのアイデアをカバーしているthis questionを見つけました。そこにあるコードに基づいて、私は次のコードを思いつきました。これは、次のポイントをまっすぐ前に合わせるのではなく、それに近いが、より垂直な角度を持っています。

function bearing(lat1, lon1, lat2, lon2) {
  var longDiff = lon2 - lon1;
  var y        = Math.sin(longDiff) * Math.cos(lat2);
  var x        = Math.cos(lat1) * Math.sin(lat2) - Math.sin(lat1) * Math.cos(lat2) * Math.cos(longDiff);

  return ( toDegrees( Math.atan2( y, x ) ) + 360 ) % 360;
}

function toDegrees (angle) {
  return angle * (180 / Math.PI);
}
4

1 に答える 1

3

TurfJSには方位測定が含まれていることがわかったので、それを使用しています。

この関数を組み合わせて、2 点間の方位を返します。

function bearingBetween(coordinate1, coordinate2) {
  var point1 = {
    "type": "Feature",
    "geometry": {
      "type": "Point",
      "coordinates": [coordinate1[0], coordinate1[1]]
    }
  };
  var point2 = {
    "type": "Feature",
    "geometry": {
      "type": "Point",
      "coordinates": [coordinate2[0], coordinate2[1]]
    }
  };
  return turf.bearing(point1, point2);
}

私はそれを私のeaseTo行で使用します:

map.easeTo({ bearing: bearingBetween(coordinateOne, coordinateTwo), pitch: 60, zoom: 19 });

これを計算するために TurfJS が使用するコードは、packages/turf-bearing/index.jsファイルにあります。

于 2016-03-19T17:10:22.527 に答える