サイズがsizeX、sizeYのjpegマップがある場合
マップ上のいくつかのキャリブレーションポイント(X、Y、Lon、Lat)
与えられた経度/緯度のペアでマップ内の対応するXYポイントを計算するためのアルゴリズムは何でしょうか?
これは、それほど多くのbsなしで私のために働いたものです。
int x = (int) ((MAP_WIDTH/360.0) * (180 + lon));
int y = (int) ((MAP_HEIGHT/180.0) * (90 - lat));
緯度と経度の座標は、Android=デバイスによって提供されたものです。したがって、すべてのGoogle Earth/Map製品で使用されているものと同じ標準である必要があります。
Equidistant Cylindrical Projection type map を使用する場合、次のことを行う必要があります。
緯度と経度の2つのペアの間の距離の計算については、インターネット上に多くの情報があります。私たちは公開ウェブサイトでこれらの計算を使用しており、それらを理解/議論することは簡単ではありません(したがって、ここではそれらを取り上げようとはしません)。とはいえ、実装は簡単です。
距離を返す関数を作成したら、コーナー間の距離に関してマップの幅と高さを計算できるはずです。
次に、左上隅からのポイントの水平距離と垂直距離を計算できます。
これで、マップの幅の比率が左側とポイント間の距離で表されていることがわかり、その比率をピクセル幅に適用すると、左側とポイント間のピクセル数がわかります。 y軸についても繰り返します。
(左側からのピクセル)=(ピクセル単位の合計幅)*((左側とあなたのポイント間のジオコード距離)/(左側と右側間のジオコード距離))
(上からのピクセル数)=(ピクセル単位の高さの合計)*((上端からポイントまでのジオコード距離)/(上端から下端までのジオコード距離))
編集:これをさらに調査すると、球面上の2点間の距離を概算し、平面上にそれをマッピングしているため、一部の解決策は他の解決策よりも正確な結果を示すことに注意してください。距離が長くなると、精度が低下します。あなたへの最良のアドバイスは、最初にそれを試してみて、それがあなたのニーズを満たしているかどうかを確認することです。
これはかなり単純明快で簡単です。それがどのように可能かを説明しましょう。
緯度と経度は、地球上の任意の場所を正確に特定できるように、地球上に描かれた架空の線です。簡単に言えば、それらは平面のX座標とY座標です。緯度は、北極から南極へと伸びる垂直線で、北極で90度、南極で-90度です。
一方、経度は東から南に伸びる水平線で、西は-180度、東は180度です。
htmlコンテナの幅が世界の幅であり、高さにも同じことが当てはまると想定することで、latLngをピクセル座標に変換できます。
式-経度-ピクセル
(givenLng*widthOfContainerElement)/360
ここで、360は経度の合計(度)です
式-Latitude-pixel
(givenLat*heightOfContainerElement)/180
ここで、180は緯度の合計です
//Height is calculated from the bottom
あなたはこの式の実用的な実装をここに見つけることができます、私のウェブサイト(それはJavaScriptのみを使用しています)
http://www.learntby.me/javascript/latLngconversion.php
それでも説明が必要な場合はお知らせください。
多くの異なるマップ投影スキームがあります。マップで使用されているものを知る必要があります。
マップ投影アルゴリズムとフォワード/リバースマッピングの詳細については、 このリンク を確認してください。これは、多くの一般的な予測の式を提供します。
これを作るだけです(メルカトル図法マップの場合):
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
<!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>