2016-06-16 3 views
0

私はarc.jsで測地線を描画しようとしています。ポイントの経度の差が180未満の場合は正常に機能します。経度は179と-179であり、OpenLayersは最大距離で線を描画します。OpenLayers 3のマップエッジで測地線を描画するにはどうすればよいですか?

  1. 経度の差は(経度180または-180と一時点を見つける)180以上
  2. が必要なラインの交点を算出し、エッジマップであるかどうかの確認:

    はだから直線ための解決策を見つけました

  3. 配列[[firstPoint, temporaryPoint], [temporaryPoint, secondPoint]]
  4. ライン
と機能を作成して ol.geom.MultiLineStringを作成します

それは正常に動作します。しかし、arc.jsと測線のこのトリックを作るのはかなり複雑です。主な問題は交差点の計算です。

enter image description here

私はOpenLayersをマニュアルまたはexamplesで解決策を見つけることになったが、マップエッジ交差点とはどんな例がありません。

+0

オフトピック:なぜあなたの写真に敵意がありますか? –

+0

@JonatasWalkerはもうありません:) –

+0

Hahaha ..もっと良い:-) –

答えて

1

数時間の調査の後、解決策が見つかりました。それはトリックのように見えますが、うまくいきます。ここ

まず第一にarc.js documentationから元のコードです:

var start = { x: currentPoint.longitude, y: currentPoint.latitude }, 
    end = { x: nextPoint.longitude, y: nextPoint.latitude }, 
    generator = new arc.GreatCircle(start, end), 
    arcLine = generator.Arc(1000 ,{offset:10}); 

主な問題はarc.jsInternational Date Lineと交差するラインの座標を計算することはできませんです。だから私はGreat Circleを計算する前にポイントを1つのタイルに移動することに決めました。

私は、経度のオフセットを見つけなければならなかった:

var dateLineOffset = 180 - currentPoint.longitude; 

またnextPoint.longitudeである可能性があります。どの点が左に置かれているかによって異なります。

あなたは座標を生成するarc.jsを使用することができた後:

var start = { x: -180, y: currentPoint.latitude }, 
    end = { x: nextPoint.longitude + dateLineOffset, y: nextPoint.latitude }, 
    generator = new arc.GreatCircle(start, end), 
    arcLine = generator.Arc(1000 ,{offset:10}); 

その後、生成された座標を反復し、オフセットを修正する必要があります。私の場合は、マップを使用しました。

var coordinatesWithOffset = arcLine.geometries[0].coords, 
    geodesicLineCoordinates = coordinatesWithOffset.map(function(coord) { 
     return ol.proj.fromLonLat([coord[0] - dateLineOffset, coord[1]]); 
    }), 
    geodesicLine = ol.geom.LineString(geodesicLineCoordinates); 

これだけです。 geodesicLineには適切な座標が含まれます。

enter image description here

関連する問題