2

m having little trouble finding a relation between the movement at centre and edge of a circle, I世界地図のパンを行う場合、私の地図の範囲は 180,89:-180,-89 です。私の地図は、中央ではなくその範囲に change(dx,dY) を追加することによってパンします。地図を特定の中心に移動しなければならない状況が発生しました。経度の変化を計算するのは非常に簡単で簡単ですが、緯度の変化が問題を引き起こしています。マップの centerY の変化は mapY の端の変化よりも大きいようです。または単にマップの中心を 0long,0lat から 73long,33lat に移動する必要がある場合、dX の場合は単純に 73 になりますが、dY の場合は明らかに33 に見えますが、89 であるマップの上部に 33 を追加すると、緯度が 90 と -90 の間にあるため、122 になります。2D 平面上の円の射影では、円の端が角度によって後方に移動しているため、変化が少なく、中心がより変化している場合のようです。これら2つの要因の間に関係はありますか?OriginY と destinationY の差をラジアンに変換してから Map の Top と Bottom に追加しようとしましたが、うまくいきませんでした。マップは、幅が 256 から始まり 256*2^z ずつ増加する仮想キャンバス上に投影されていることに注意してください。z=0 がデフォルトであり、キャンバスのその範囲で全世界が表示されます。

public void moveMapTo(double destinationLongitude,double destinationLattitude) // moves map to the new centre
        {
            double dXLong=destinationLongitude-centreLongitude; // centreLongitude and centreLattitude are centre of current map position
            double atanhsinO = atanh(Math.sin(destinationLattitude * Math.PI / 180.00));
            double atanhsinD = atanh(Math.sin(centreLatitude * Math.PI / 180.00));
            double atanhCentre = (atanhsinD + atanhsinO) / 2;
            double latitudeSpan =destinationLattitude - centreLatitude;
            double radianOfCentreLatitude = Math.atan(Math.sinh(atanhCentre));
            double dXLat=latitudeSpan / Math.cos(radianOfCentreLatitude);
            dXLat*=getLattitudeSpan()*(Math.PI/180); //<--- HERE IS THE PORBLEM

            System.out.println("dxLong:"+dXLong+"_dxLat:"+dXLat);
    //map left.right.top,bottom are current extents of map
            mapLeft+=dXLong;
            mapRight+=dXLong;
                         mapTop+=dXLat;
            mapBottom+=dXLat;




    }
    private double getLattitudeSpan()
    {

            double latitudeSpan = mapTop - mapBottom;
            latitudeSpan = latitudeSpan / Math.cos(radianOfCentreLatitude);
            return Math.abs(latitudeSpan);

    } 
4

2 に答える 2

1

少し前に同様の問題を解決したので、ヒントを提供できるかもしれません。

スケーリングされた経度または緯度を追加することによる 4 方向すべてのパンは、メルカトル図法でのみ機能します。これはあなたが持っているものですか?もしそうなら、良い。

北と南にパンするには、北にパンした場合、極の北に白い (空の) 背景を表示するしかないと思います。つまり、マップの表示を減らします。

東西にパンするには、画面外に出た世界の一部を反対側のラップアラウンド エッジに置き換える必要があります。

次のようなマップを作成すると、コードが非常に単純になることがわかりました。

ws ws ws ws ws ws ws ws
eu po PO NA EU PO po na
af po PO SA AF PO po sa
ws ws ws ws ws ws ws ws

中央の大文字部分はオリジナルの世界地図です。NA、SA、EU、AF はそれぞれ北米、南米、ヨーロッパ、アフリカを表しています (ここでは非常に簡略化された地図)。POは太平洋です。その元の地図の周りに、別の地図のコピーを水平方向に、余白 (ws) を垂直方向に貼り付けました。

最初は、ビューの中心は 0/0、つまり NA/SA と EU/AF の間であり、そこから北と南、東と西に 90°、両方向で合計 180° を示すようにクリップされます。そこから、東または西に最大 180 度パンしても、同じ量の世界を見ることができます。たとえば、東に 180 度パンして国際日付変更線 (太平洋) に移動すると、左側にヨーロッパとアフリカ、右側に南北アメリカが見えます。

上下に 90° パンすることもできます。ここではラップアラウンドは意味がないため、ビューの一部は空白になります。

これの欠点は、マップ イメージの圧縮ファイル サイズが約 2 倍になり、ピクセル サイズが 4 倍になることです。コードをつなぎ合わせることで同じ効果を得ることができますが、特大サイズの世界地図を使用する方がかなり簡単です。

于 2010-03-11T06:08:07.123 に答える
0

これは、元の地球画像の地図投影に大きく依存します。使用している特定の投影法を知らなければ、画像上の xy ピクセル距離を緯度と経度の数値にマッピングする (およびその逆) 方程式を作成することは不可能です。

Gall-Petersのような正積図法を使用する、適用する方程式がないため、時間と労力を大幅に節約できます。ピクセル距離は、緯度と経度の数値に直線的に関係します。

幸運を!

于 2010-03-11T05:48:41.417 に答える