PHP + GDLibを使用して地図上に座標を描画する

私のサービスの結果として、私は地理検索に携わっています。 多くの場合、分析を行うために、地図上にユーザーの座標を表示する必要があります。 この目的のために、特定の時間まで、私はGoogleマップを正常に使用しましたが、一度だけ、1600万を少し超える座標をマップに配置する必要がなくなりました。



どうやってこれをやったの?



DynamicDataDisplayライブラリーがすぐに思い浮かびました 。 しかし、残念ながら、Linuxサーバーにマップを描画する必要がありました。 はい、そして一般に、たとえLinux上で実行できたとしても、これを行うことは非常に問題になります。 私は完成したものを探すのではなく、私が長年やりたいことを同時に見つけ出すことを決めました。



そのため、PHP、GDLib、および最小の百科事典知識が必要になります。



ウィキペディアで知識を求めています。 簡単に理論を教えてください。



地球は丸く、モニターは平らです。 モニターで地球を見ることができるようにするために、飛行機に地球を投影する方法があります。

これらの方法の1つ-ジェラルドメルカトルの投影法では、球体を柱の周りに引っ張って円柱にし、その円柱を180子午線に沿って切断し、平らな画像にします。



マップは極の周りに非常に引き伸ばされていることが判明したため、マップの上部と下部で小さな断片が切り取られます(緯度の範囲は約-85°〜85°のままです)。 結果はそのようなカードです:







ウィキペディアでは、描画するメルカトル図法の高解像度マップをダウンロードできます。



さて、この地図上に与えられた座標でポイントを表示する方法は?

メルカトル図法の経度は歪んでいません。 したがって、マップ上のポイントXを見つけるには、経度にマップのスケールをXで乗算し、結果の数値をマップの中央を示すポイントに追加するだけです。



緯度はより複雑です。 スケールは、赤道から極に向かって増加します。 赤道から離れるほど、歪みが大きくなります。

スケールは、次の式によって増加します。







ここで、φは緯度(ラジアン単位)、yは歪み係数です。

これを知って、Yに沿ったスケールと歪み係数を緯度に掛けます。



例として、地図上にポイントを描画する小さなスクリプトを作成しました。 使用例がいくつかあります。

このスクリプトを使用すると、約2分で1600万の座標をマップにプロットできました。 およそ次のことが判明しました。







ご清聴ありがとうございました。



UPD:コメントでユーザーaxshavan中間投影に 等しいことについて話しました。

スクリプトを少し完成させ、このプロジェクションのサポートを追加しました。



メルカトル図法との簡単な違い:



投影はそれぞれ緯度において歪んでいません。 緯度は経度と同じと見なされます。

この投影法を使用することにはいくつかの利点があります。第1に、緯度の範囲がわずかに増加し、第2に、ポイントの計算が多少速くなります。 数学的な操作は原始的です。

ただし、マイナーマイナスが1つあります。カードは垂直方向に少し「圧迫」されています。



スクリプトリンク:

GeoMap.tgz(ドロップボックス)

GeoMap.tgz(Googleドライブ)



All Articles