2012-02-16 16 views
3

すでにタイトルで述べたように、ミラー円柱投影の緯度/経度をx/y座標に変換する助けが必要です。私は現在、都市リストを入力として取得し、Yahoo Placefinderから各都市の緯度/経度を取得するアプリをJavaで作成しています。私はコード内にtheseの公式を使用しました。私が得るもののHere is an example。 (画像は参照用であり、私が使用するものではありません)。 Xポジションがわずか2〜3ピクセルしかないことがわかるように、このマップでは私の子午線シフト(CENTRAL_MERIDIAN_OFFSET)の計算に問題があります。しかし、主な問題は誤ったY座標です。画像のx/y座標への緯度/経度変換(ミラー円柱投影)

はここに私のコードです(更新 - 赤道のための34px補償オフセット):

public final double W = 6343; 
public final double H = 4767 - 34; 

protected Point toMillerXY(double lon, double lat) 
{ 
    double x, y; 

    lon = Utils.degToRad(lon); 
    lat = Utils.degToRad(lat); 

    x = lon - CENTRAL_MERIDIAN_OFFSET; 
    y = 1.25 * Math.log(Math.tan(0.25 * Math.PI + 0.4 * lat)); 

    x = (W/2) + (W/(2 * Math.PI)) * x; 
    y = (H/2) - (H/(2 * 2.303412543)) * y; 

    y += 34; 

    return new Point(x, y); 
} 

Output: 
Fetching data with: http://where.yahooapis.com/geocode?location=Buenos+Aires,Argentina 
Latitude: -34.608521, longitude: -58.373539 
--- 
Fetching data with: http://where.yahooapis.com/geocode?location=Tokyo,Japan 
Latitude: 35.670479, longitude: 139.740921 
--- 
Fetching data with: http://where.yahooapis.com/geocode?location=Cape+Town,CAR 
Latitude: -33.919060, longitude: 18.421961 
--- 
Fetching data with: http://where.yahooapis.com/geocode?location=Rome,Italy 
Latitude: 41.903110, longitude: 12.495760 
--- 
Total cities: 4 
Result for Buenos Aires: 1964.598428, 3046.740995 
Result for Tokyo: 5455.265150, 1732.669551 
Result for Cape Town: 3317.692474, 3032.814395 
Result for Rome: 3213.276105, 1602.176163 

は明らかに、何かがY座標計算が間違っています。私は5.6が本当に正しい値になるべきかどうか分からないが、Millers投影の垂直範囲は私が読んだ参照の1つで-2.3 .. + 2.3と言われていた。

+0

'ここに私が得るものの例があります。それはどこですか? – Cheery

+0

画像を追加するのを忘れた、それを修正しました。 – Varnius

+0

http://gis.stackexchange.comはこの質問のより良い場所かもしれません - その視聴者はこの種の問題にもっと焦点を当てています – tomfumb

答えて

2

Millers projection was said to be -2.3..+2.3近似値です。画像のサイズに基づいて、あなたは、それが上からy = 1.089472895と、私が使用される画像の高さに基づいて、y' = 1499/2 - (1499/ (2 * 2.303412543)) * 1.089472895 = 395ピクセルを与える55.7522222としてモスクワの緯度についてより正確な値、例えば2.303412543

を必要とするかもしれません正しいです(私はxについて気にしませんでした)。

これを確認して、マップに赤い点を付けました。 http://img7.imageshack.us/img7/9892/mapue.jpg

おそらく、画像の途中に赤道がありません。数式にシフトを加えることで数学的に固定できますが、赤道の位置を見つけなければなりません。

+0

私は[this](http://upload.wikimedia.org/wikipedia/commons/5/5d/World_map_%28Miller_cylindrical_projection%2C_blank%29.svg)SVGマップを使用していました。そして本当に、赤道は少し離れているようですが、私は前にそれに気づいていませんでした。私はそれをチェックして、実際にはあなたの答えを受け入れるでしょう。 – Varnius

+0

@Varnius Equatorはほぼ正しい場所にあります。とにかく、作業している画像の高さを確認してください。数式は正しいですし、あなたの例での位置のシフトによって、私は画像の間違った高さが計算に使用されたと仮定します。 – Cheery

+0

前の例で都市をマークしている間に私はいくつかの間違いをしたかもしれません。とにかく、私はちょうどそのSVGの非常に大きな6343x4767バージョンを取り、このイメージの34pxオフセットを補正するために私のコードを更新しました。私が今得するのは、南半球のための良い地位と、北半球のための悪い地位です。両方の半球(この画像の中の)(http://img217.imageshack.us/img217/2420/milleroriginal.png)について、いくつかの都市(上記のコードの出力も追加)の結果をマークしました。私は何かを逃したと確信していますが、何も分からないだけです。 :〜 – Varnius

関連する問題