2009-09-02 14 views

答えて

8

緯度と経度の2つのペアの間の距離の計算については、インターネット上に多くの情報があります。私たちは公開ウェブサイトでこれらの計算を使用していますが、理解する/議論するのは簡単ではありません(ここではそれらをカバーするつもりはありません)。つまり、実装が簡単です。

距離を返す関数があると、コーナー間の距離の点でマップの幅と高さを計算できるはずです。

次に、左上隅からポイントの水平距離と垂直距離を計算できます。

ここでは、マップの幅のどの比率が左側とポイントの間の距離で表されるかを調べ、その比率をピクセル幅に適用し、左側とポイントの間のピクセル数を取得します。 y軸に対して繰り返します。

(ピクセル左側から)=(ピクセル単位の合計幅)*(左側と右側との間(左とあなたのポイントとの間のジオコード距離)/(ジオコード距離))

(上からピクセル)= (頂点と地点の間のジオコード距離)/(ジオコード距離の上限と下限)

EDIT:これをさらに調査すると、いくつかのソリューションではより正確な結果が表示されますあなたが球面上の2点間の距離を近似し、それを平らな面にマッピングしていることが原因です。距離が大きくなると精度が低下します。あなたに最良のアドバイスは、最初にそれを試し、それがあなたのニーズを満たすかどうかを確認することです。

+0

マップはへの私達の3Dを投写2D表面。あなたが球に完全に正方形をラップすることはできないので、ほぼ正しい結果を得るにはさまざまな投影方法があります。特定のマップ上の距離は非線形であるため、数式は近似値に過ぎません。 –

+0

近似はほとんどの距離で機能します。しかし、私はポストでそれを明確にする必要があります。 – Mayo

+0

あなたのマップをズームインするほど、結果はより正確になります。都市レベルの地図ではほとんど差異が見えませんが、州レベルまたはそれ以上の地図では目立つようになります。 –

5

多くの異なる地図投影方式があります。あなたはどのマップがあなたの地図で使用されているか知る必要があります。

地図投影アルゴリズムと順方向/逆方向マッピングの詳細については、this linkを参照してください。これは、数多くの一般的な予測の式を提供します。

+0

私は多くの精度が必要なので、おそらく以下の解決策で十分です。そうでない場合は、どのように変換されますか?それらのprojectinoスキームはどちらですか?これまで私は見ました: UTM 横メルカトル メルカトル 経度/緯度 – Jorge

+0

BTW。また、Lat/LonとUTMの間で変換するための公式をコード化しました。 Lat/LonからUTMに変換し、適切な方法でソリューションを適用していますか(少なくともUTM予測の場合)? – Jorge

+0

マップはメルカトルを使用していますか?適切な投影を選ぶ前に、マップがどのようにコード化されているかを知る必要があります。ジオコーディングされた距離が正しく設定されると、mmayoの式によって地図上の正しいピクセルが得られます。 –

9

ここでは、Equidistant Cylindrical Projection type mapを使用すると、あなたが何をする必要があるかである場合:

  1. はここにあなたの場所のチュートリアルの緯度と経度を探す:その情報
    http://lifehacker.com/267361/how-to-find-latitude-and-longitude
  2. 入力し、次の式に:
    x =(イメージの全幅×px)*(180 +緯度)/ 360
    y =(イメージの全高さ)*(90 - 経度)/ 180

    注:負の経度を使用する場合は、必ず負の数を加算または減算してください。+( - 92)または - ( - 35)、実際にあなたが今、あなたのイメージにプロットするために、あなたのXとYを持って

    詳しい情報は、この式とについて見つけることができ-92と+35


  3. だろうここでは、マップタイプ:
    http://www.progonos.com/furuti/MapProj/Dither/CartHow/HowER_W12/howER_W12.html#DeductionEquirectangular
+0

X、YからLat lonに戻って計算する方法を教えてもらえますか? – colin

17

はここでそんなにBSせずに、私のために働いたものです。

int x = (int) ((MAP_WIDTH/360.0) * (180 + lon)); 
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat)); 

緯度、経度座標はAndroid搭載端末から私に与えられました。したがって、それらはすべてのGoogle Earth/Map製品で使用されている標準と同じである必要があります。

+0

今x、yを表示する方法。 xとyがそれを表示するためにどのメソッドを使うべきかを意味します。 – sns

+0

@NaeemShah canvas.drawCircle(x、y、r、mPaint); –

+1

これは古い質問だと思いますが、地図のオフセットと縮尺についての答えはありません。また、このMAP_WIDTH/HEIGHTの度数(つまり経度と緯度のデルタ)またはピクセル値は?スケーリングはどこで行われるべきですか? – OzBarry

7

これはかなり単純で単純です。その可能性を説明しましょう。

緯度と経度は、地球上に描かれた想像線で、世界中のどの位置を正確に特定できるようになっています。単にそれらを平面のX座標とY座標とします。 Latitudeは北から南へ90度、南極で-90度の垂直線です。

経度は、西から-180度、東から180度の東から南までの水平線です。

あなたはhtmlコンテナの幅が世界の幅であり、同じことが高さに当てはまると仮定してlatLngをピクセル座標に変換できます。

式 - 経度 - ピクセル360度の総経度

式-Latitudeある

(givenLng*widthOfContainerElement)/360 

から180である画素

(givenLat*heightOfContainerElement)/180 

合計lあなたはここで、この式の作業の実装を見つけることができます

//Height is calculated from the bottom 

度のatitudeは、私のウェブサイト上の

http://www.learntby.me/javascript/latLngconversion.php

あなたはまだ任意のが必要な場合は私に知らせて(それだけではJavaScriptを使用しています)明確化。

+0

ここに必要な開示を追加しました –

0

ただ、この(メルカトル図法マップ用)を作る:

extension UIView 
{ 
    func addLocation(coordinate: CLLocationCoordinate2D) 
    { 
     // max MKMapPoint values 
     let maxY = Double(267995781) 
     let maxX = Double(268435456) 

     let mapPoint = MKMapPointForCoordinate(coordinate) 

     let normalizatePointX = CGFloat(mapPoint.x/maxX) 
     let normalizatePointY = CGFloat(mapPoint.y/maxY) 

     let pointView = UIView(frame: CGRectMake(0, 0, 5, 5)) 
     pointView.center = CGPointMake(normalizatePointX * frame.width, normalizatePointY * frame.height) 

     pointView.backgroundColor = UIColor.blueColor() 

     addSubview(pointView) 
    } 
} 

のUIView上の座標を追加するための私の単純なプロジェクト:https://github.com/Glechik/MapCoordinateDrawer

1

<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<style> 
 
#point{font-face:Arial; font-size:18px; color:#FFFF00; width:12px; height:12px;text-shadow: 2px 2px #000000} 
 
#canvas {position: absolute; top: 0px; left: 0px; z-index: -2} 
 
     html, 
 
     body, 
 
     #canvas { 
 
      width: 100%; 
 
      height: 100%; 
 
      overflow: hidden; 
 
      margin: 0 
 
     } 
 
</style> 
 
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.2/jquery.min.js"></script> 
 
<script> 
 
$(window).on("load resize",function(e){ 
 

 
var w = $("#canvas").width(); 
 
var h = $("#canvas").height(); 
 
// New York, NY (https://maps.googleapis.com/maps/api/geocode/json?address=New%20York,%20NY) 
 
       var lat = 40.91525559999999; 
 
       var long = -73.70027209999999; 
 

 

 
var x = ((w/360) * (180 + long)) - 9; 
 
var y = ((h/180) * (90 - lat)) - 18; 
 

 
$("#text").text('X:'+x+', Y:'+y); 
 
$("#point").offset({ top: y, left: x }); 
 

 
}); 
 
</script> 
 
</head> 
 
<body> 
 
<div id="text"></div> 
 
<div id="point">▼</div> 
 
<img id="canvas" border="0" src="http://friday.westnet.com/~crywalt/dymaxion_2003/earthmap10k.reduced.jpg"> 
 

 
</body> 
 
</html>

関連する問題