ポリラインを世界中にラップするにはどうすればよいですか?


14

私が使用していリーフレット世界一周挑戦の表現を作成するマップを。東京から東に向かい、地図上で南アメリカの西に表示されるポリラインを追加したいのですが、代わりに、地図と反対方向に交差する線が表示されます(黄色の線を参照)。

ここに画像の説明を入力してください

これはおそらく日付変更線や座標系に関連していると思いますが、詳細については少し大ざっぱです。誰も私がこれを機能させるために必要なことの背後にある理論を説明できますか?私はNasaからのbluemarbleプロジェクションを使用しています:

var bluemarble = new L.TileLayer.WMS("http://demo.opengeo.org/geoserver/wms", {
layers: 'bluemarble',
attribution: "Data © NASA Blue Marble, image service by OpenGeo",
minZoom: 2,
maxZoom: 5
});

2
ポリラインを+ -180度の子午線で分割する必要があります。これには、ポリラインがその子午線と交差する緯度を見つける必要があります。GISには、おそらく破壊を行う方法があります。そうでない場合は、関連するスレッドに示されているコードから簡単な解決策を導き出すことができます。プラットフォームでこのようなコードを実行できますか?
whuber

私はwhuberに同意します。ポリゴンが+ -180を超える場合、同様のタスクを実行する必要がありました。+-180を超えるたびに、複数のポリライン/ポリゴンに分割する必要があります。
スティーブ

回答:


13

ポリラインを+ -180度の子午線で分割する必要があります。 これには、ポリラインがその子午線と交差する緯度を見つける必要があります。GISには、おそらく破壊を行う方法があります。そうでない場合は、関連するスレッドに示されているコードから簡単な解決策を導き出すことができます。詳細を次に示します。

  • ポリラインは、-180 <= lon <= 180で、それぞれが(lat、lon)形式で与えられる一連の頂点として表されます。+-180子午線と交差するかどうかを確認するには、連続する各ペアをチェックする必要があります。簡単なテストがあります。経度の差の絶対値が180以上の場合、交差があります。

  • + -180子午線を交差する各セグメント(lat0、lon0)->(lat1、lon1)内で、ポリラインを交差する2つの部分に分割する必要があります。

重要なのは、適切な精度でブレークポイントの緯度を見つけることです。 これは、球体地球モデルで最も簡単に実行できます。(より正確な楕円体モデルと比較した)誤差は、気づくには小さすぎます。

問題のセグメントを(lat0、lon0)のポイント0から(lat1、lon1)のポイント1に移動させます。ブレークポイントは、デカルト座標で表される2つのポイント間で3Dで直線セグメントを実行し、y座標がゼロである場所を見つけることで見つけることができます。デカルト座標であります

(x0, y0, z0) = (cos(lon0)*sin(lat0), sin(lon0)*sin(lat0), cos(lat0))

そして、ポイント1に対して(x1、y1、z1)を与える同様の式

t * y0 + (1-t) * y1 = 0

t あれは、

t = y1 / (y1 - y0).

したがって、交差点の座標は

(x, y, z) = (t * x0 + (1-t) * x1, 0, t * z0 + (1-t) * z1)

このポイント(+ -180子午線のどこかにある地球の表面の下にあります)の緯度は次のとおりです。

lat2 = ATan(z/x).

ブレークポイントは2つの方法で表す必要があります。 壊れたポリラインの最初の部分を終了するために(lat0、lon0)の後にアタッチする場合、lon0が負の場合は(lat2、-180)を使用し、それ以外の場合は(lat2、180)を使用します。壊れたポリラインの2番目の部分を開始する前に(lat1、lon1)をアタッチする場合、同様のルールに従います。

例外的な場合、ポイント0とポイント1の一方または両方が+ -180子午線上にある場合があります。この手順に従うと、作成するポリラインピースの1つに長さゼロのセグメントを配置できます。これによりGISに問題が発生する可能性がある場合は、この状態をテストしてください。

ポリラインがこの子午線を複数回通過できることに注意してください。したがって、最初の切れ目を見つけてポリラインを2つの部分に分けた後、同じ方法で2番目の部分を処理する必要があります。


1
whuberが言ったことは大丈夫ですが、私は次の文にタイプミスがあると思います:それ以外の場合は(lat2、180)を使用します。>使用(LAT2、-180)場合:私はそれがでなければならないと思うlon0が負であり、そうでなければ(LAT2、180)を使用
ゲオルギ

@Georgiキャッチしてくれてありがとう。私はあなたが正しいと思うし、私は変更を行います。
whuber

Leaflet.jsでこれを実装する必要がありました。ここに私のコードがあります。gist.github.com
Mike Atlas

ありがとう、@マイク。私はジグザグのイラストが大好きです。それはまさに、この答えを書いている間に想像していたような状況です。非常に厳しいテストが必要な場合は、+-180度の子午線に沿って走る(そして両極を横切る)ポリラインに何が起こるかを確認してください!
whuber

@whuber私はそれを試す必要があるかもしれません:/結果を投稿します
Mike Atlas 14年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.