2

回転した地図 (div) で緯度/経度座標をピクセルに変換するにはどうすればよいですか?

ひねりを加えたのは、地図が北を向いているのではなく、10 度傾いていることです...そして、私の高校の数学は私に失敗しています!

here を指す北向きの地図で変換を行う他のいくつかの質問を見つけました。

ただし、マップを回転させたときにどうすればよいかは完全にはわかりません。

このマップは、ロンドンのある場所の 3*3km のマップです。

私はjavascriptを使用していますが、どの言語でも構いません:-)

4

1 に答える 1

2

2つのマップがあります。現実は緯度と経度で測定され、描画している地図は(私が推測する)ピクセルで測定されます。あるものから別のものに変換する必要があります。これをベクトル計算で行い、3つのステップで行います。

1.)原点からマップしたいポイントまでの元のベクトルを見つけます。

let O = <Ox, Oy>; 
(the origin in lat and long of your map).

let M = <Mx, My>; 
(the point in lat/long that you want to convert to a pixel on your drawn map)

let V := M - O = <Mx - Ox, My - Oy>; 
(This is a vector from origin to the point you want to convert.)

ベクトルとして、方向と大きさの2つの数学的な量が含まれています。これらの量の両方を緯度経度座標系から新しいピクセル座標系に変換する必要があります。

2.)ファーストスケール。

スケールは倍数です。それが何であるかを理解し、ベクトルにそれを掛けます。基本的には、緯度/経度の1度あたりのピクセル数の倍数です。

let c = our 'zoom' multiple. 

Scaling is as easy as multiplying our vector by our scalar.

cV = <cVx, cVy>;

3.)次に回転します

回転は三角関数です。回転したベクトルのXはsin(t)|V|に等しい 回転したベクトルのYはcos(t)|V|に等しくなります。ここで、tは回転量です(cos / sin関数の定義方法に応じて度またはラジアン)。

注:スケールと回転は線形関数です。つまり、回転または回転してから拡大縮小する際にこれを行う順序は重要ではありません。同じ答えです。

一度にすべてを実行すると、次のようになります。

ベクトル表記:

let O := the origin 
let M := the point you want to map. 
let R(V,t) := a function to rotate vector V by t. 
let c := or zoom or scale multiple. 

solve for P.

P = c * R(M-O, t). (Or since R and c are linear R(c(M-O), t);  )

順序対表記:

let O := <Ox, Oy>

let M := <Mx, My>

let R(V,t) = < cos(t) * ((Mx - Ox)^2 + (My - Oy)^2)^.5
               sin(t) * ((Mx - Ox)^2 + (My - Oy)^2)^.5 >

Note : |M - O| = ((Mx - Ox)^2 + (My - Oy)^2)^.5

solve for P.

<Px, Py> = < c * cos(t) * ((Mx - Ox)^2 + (My - Oy)^2)^.5
             c*  sin(t) * ((Mx - Ox)^2 + (My - Oy)^2)^.5 >
于 2013-01-10T21:39:58.703 に答える