2017-09-04 9 views
1

世界の地図を含むUIImageに地球上のいくつかの座標をプロットしようとしています。あなたはそれがかなりうまく働いていますが、座標とX Yからのマッピングが間違っている見たようワールドマップでuiimageviewのスウィフトプロット座標

World map

は、以下の以下のUIImageViewの例を参照してください(私はマップを使用する必要はありません)!

Amsterdamの座標は、(52.36666489,4.83333206)であり、Centerは(0,0)です。

私はこれを実現するためにしようとする、次のことをやったが、残念ながら、これはワークアウトされていません。

  1. を緯度が-90から90の範囲にあるので、私は「正規化」に最初の座標を試してみました緯度は-180180です。これは、「正規化」バージョンをyiels実際の経度に実緯度及び180に90を加えることにより行われる:

let normalizedLat = location.coordinate.latitude + 90.0. let normalizedLng = location.coordinate.longitude + 180.0

Iを算出したこと後
  • normalizedLatnormalizedLngは合わせて拡張すべきスケールファクタ:その後
  • let heightScaleFactor = mapImageView.frame.height/180.0 let widthScaleFActor = mapImageView.frame.width/360.0

    そして3.私はスケーリングFACを持っていますTORSは、私は最終的により座標を計算することができます

    let x = Double(widthScaleFActor * CGFloat(normalizedLng)) let y = Double(heightScaleFactor * CGFloat(normalizedLat)) dot.frame = CGRect(x: x, y: y, width: Double(dot.frame.width), height: Double(dot.frame.height))

    しかし、いくつかの奇妙な理由のためにアムステルダムは、アムステルダムの場ではなく、センターは、センターの場ではありません。

    私の計算が間違っていると確信しています。何か案は?

    答えて

    0

    iOSでは、原点は左下にあり、左下にはありません。正のyは上がらずに下がります。あなたはでそれを考慮する必要があります。

    dot.frame = CGRect(x: x, y: mapImageView.frame.height - y, width: Double(dot.frame.width), height: Double(dot.frame.height)) 
    

    はまた、あなたのイメージでは赤道が中央ではないことに注意してください。イメージの赤道のオフセットに基づいて、y値の計算に追加のオフセットを追加する必要があるため、イメージがより小さくなります。

    dot.frame = CGRect(x: x, y: mapImageView.frame.height - y + equatorOffset, width: Double(dot.frame.width), height: Double(dot.frame.height)) 
    

    マッププロジェクションには単純な線形緯度スケールはありません。 0〜10度は12ピクセル、10〜20度は11ピクセルなど、80〜90ピクセルは3ピクセル(またはそれに関係なく)です。

    +0

    ああ、まあまあ、 'mapImageView.frame.height-y'がトリックをしました!地図はすでに今のところ良く見えます。しかしオフセットはまだ少し間違っています。見ていただけますか? http://imgur.com/a/EGvN8 –

    +0

    赤道は画像の中心を通っていません。それは少し低いです。赤道オフセットを調整するために、別のファジーファクターを 'y'値に追加する必要があります。 – rmaddy

    +0

    私は見る!どうもありがとうございました! –

    関連する問題