これを行うには、単一の緯度/経度ペアよりも多くの情報が必要です。
この段階では、提供された情報には次の 2 つの情報が不足しています。
- 画像がカバーする領域の広さ (緯度/経度)? あなたが提供した内容に基づいて、画像が幅 1 メートルの領域を示しているのか、幅 1 キロメートルの領域を示しているのかわかりません。
- 参照座標 (-37.803134, 145.132377) は、画像のどのスポットを参照していますか? 角の一つですか?どっか真ん中?
また、画像が南北に配置されていると仮定します。たとえば、北が左上隅を向いていません。それは物事を複雑にする傾向があります。
最も簡単な方法は、(0, 0) ピクセルと (1017, 915) ピクセルに対応する緯度/経度座標を正確に把握することです。次に、補間により、指定された緯度/経度座標に対応するピクセルを把握できます。
そのプロセスの概要を簡単に説明すると、(-37.803134, 145.132377) 緯度/経度が (0, 0) ピクセルに対応し、(1017, 915) ピクセルが緯度/経度 (- 37.798917、145.138535)。左下隅にピクセル (0, 0) を配置する通常の規則を仮定すると、これは北が画像の上にあることを意味します。
次に、ターゲット座標 (-37.801465, 145.134984) に関心がある場合は、次のように画像の対応するピクセル数を計算できます。
pixelY = ((targetLat - minLat) / (maxLat - minLat)) * (maxYPixel - minYPixel)
= ((-37.801465 - -37.803134) / (-37.798917 - -37.803134)) * (915 - 0)
= 362.138
つまり、対応するピクセルは画像の下から 362 ピクセルです。その後、水平方向のピクセル配置についてもまったく同じことができますが、代わりに経度と X ピクセルを使用します。
このパーツ((targetLat - minLat) / (maxLat - minLat))
は、2 つの参照座標間の距離を計算し、最初の座標にいることを示す 0、2 番目の座標にいることを示す 1、およびその間の位置を示す間の数字を示します。したがって、たとえば、2 つの参照座標間で 25% 北にいることを示すには 0.25 が生成されます。最後のビットは、それを同等のピクセルに変換します。
チッ!
編集OK、あなたのコメントに基づいて、もう少し具体的にすることができます。左上隅を主な基準点として使用しているように見えるので、次の定義を使用します。
minLat = -37.803134
maxLat = -37.806232
MAP_HEIGHT = 916
次に、(-37.804465, 145.134984) の座標の例を使用すると、対応するピクセルの Y 座標は、左上隅を基準にして次のようになります。
pixelY = ((targetLat - minLat) / (maxLat - minLat)) * (MAP_HEIGHT - 1)
= ((-37.804465 - -37.803134) / (-37.806232 - -37.803134)) * 915
= 393.11
したがって、対応するピクセルは上から 393 ピクセル下になります。水平方向に相当するものを自分で考えてみましょう。基本的には同じです。注:-1
が付いているのMAP_HEIGHT
は、ゼロから開始すると、最大ピクセル数が 916 ではなく 915 になるためです。
編集:この機会に指摘したいことの 1 つは、これは概算であるということです。実際には、緯度と経度の座標と他の形式のデカルト座標の間に単純な線形関係はありません。これには、地図を作成する際に使用される投影法や、地球が完全な球体ではないという事実など、さまざまな理由があります。小さな領域では、この近似値は十分に近く、大きな違いはありませんが、大きなスケールでは不一致が明らかになる場合があります。あなたのニーズに応じて、YMMV. (以下の回答で、これが事実であることを思い出させてくれたurayに感謝します)。