10

Googleマップのタイルサーバーとして機能するASP.NETでページを開発しようとしています

データベースから緯度/経度のポイントのコレクションを取得し、ズームレベル(デフォルト:15)を指定して、透明な背景に小さな赤い点としてレンダリングします。

その後、結果をGIFタイプの画像として返します。

この緯度/経度のセットを取得して、ズームレベルを指定して2Dピクセル座標のセットに変換できるアルゴリズムまたはライブラリが開発されていますか?

(これはすべてサーバー側で行われているため、Google Maps APIを使用できません。)


更新:Perlで同様のことを行うコードサンプルを見つけました:

http://blog.barros.ws/2009/03/06/convert-lat-lng-and-zoom-values-to-pixel-xy-on-a-map/

問題は、私はPerlを知らないので、本を開いてそれを学ぶ時間が本当にないということです。

この関数で何が起こっているのかを解読するのを誰かが助けてくれますか?

sub Google_Coord_to_Pix
{
    my $value   = shift ;
    my $lat = shift ;
    my $lng = shift ;
    my @d       = ( ) ; 
    my $e       = 0 ;

    $d[1] = sprintf("%0.0f", $$value{'bmO'} + $lng * $$value{'pixLngDeg'} ) ;

    $e = sin($lat * $$value{'Wa'}) ;

    if( $e > 0.99999 )
    {
        $e = 0.99999 ;
    }

    if( $e < -0.99999 )
    {
        $e = -0.99999 ;
    }

    $d[0] = sprintf("%0.0f", $$value{'bmO'} + 0.5 * log((1 + $e) / (1 - $e)) * (-1) * $$value{'pixLngRad'} ) ;

    return (@d) ;
}
4

2 に答える 2

10

これが私が現在使用しているコードです。PHPです。

// Returns longitude in pixels at a certain zoom level
function lonToX($lon, $zoom) {
    $offset = 256 << ($zoom-1);
    return round($offset + ($offset * $lon / 180));
}
// Returns latitude in pixels at a certain zoom level
function latToY($lat, $zoom) {
    $offset = 256 << ($zoom-1);
    return round($offset - $offset/pi() * log((1 + sin($lat * pi() / 180)) / (1 - sin($lat * pi() / 180))) / 2);
}

このページのコードに基づいて、この男によって書かれました。

幸運を!

更新: このマップは、Googleマップでタイルがどのように機能するかを理解するのに役立つ優れた方法です

編集: VB.NETの同等の関数セットは次のとおりです。

Public Function LonToX(Lon As Double, Zoom as UInteger) As UInteger
    Dim Offset = 256 << (Zoom - 1)
    Return Math.Round(Offset + (Offset * Lon / 180))
End Function

Public Function LatToY(Lat As Double, Zoom as UInteger) As UInteger
    Dim Offset = 256 << (Zoom - 1)
    Return Math.Round(Offset - Offset / Math.Pi * Math.Log((1 + Math.Sin(Lat * Math.Pi / 180)) / (1 - Math.Sin(Lat * Math.Pi / 180))) / 2)
End Function

そしてC#では:

public uint lonToX(double lon, uint zoom) {
    uint offset = 256 << (zoom - 1);
    return Math.Round(offset + (offset * lon / 180));
}

public uint latToY(double lat, uint zoom) {
    uint offset = 256 << (zoom - 1);
    return Math.Round(offset - offset / Math.Pi * Math.Log((1 + Math.Sin(lat * Math.Pi / 180)) / (1 - Math.Sin(lat * Math.Pi / 180))) / 2);
}
于 2009-10-21T18:12:23.427 に答える
2

「メルカトル図法の場合、すべての緯度/経度線が等間隔にあるため、地球の曲率について心配する必要はありません。」

おそらく、地理(別名プレートキャリー)投影法について考えていますか?メルカトル図法には等間隔の経度線がありますが、等間隔の緯度線はありませ(lat = atan(sinh(y))なので、90°は無限大です)。

ところで、球へのメルカトル図法の計算はここにありますが、GoogleマップがWGS84楕円体を使用していて、正確に取得する必要がある場合は、さらに複雑になります。その場合、私はこれを見ますが、注意してください:それは心の弱い人のためではありません。

于 2009-10-21T00:27:13.003 に答える