给定缩放级别,将长/ lat转换为像素x / y

时间:2009-10-20 00:42:08

标签: .net google-maps maps coordinates pixel

我正在尝试在ASP.NET中开发一个页面,它将充当Google Map的平铺服务器

它将从数据库中提取一组纬度/经度点,然后在给定缩放级别(默认值: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) ;
}

2 个答案:

答案 0 :(得分:9)

这是我正在使用的一些代码。它是在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);
}

基于this page的代码,由this guy撰写。

祝你好运!

更新: This map是了解Google广告素材在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);
}

答案 1 :(得分:2)

“如果它是墨卡托投影,你不必担心地球的曲率,因为所有的纬度/经度线都是等间距的”

也许您正在考虑地理(又名Plate Carree)投影?墨卡托投影确实具有相等间隔的经度线,但具有等间距的纬度线(lat = atan(sinh(y)),因此90°处于无穷远处。)

顺便说一下,球体上墨卡托投影的数学是here,但如果谷歌地图使用的是WGS84椭球,你需要准确地得到它,这会变得更加复杂。在那种情况下,我会看this,但要注意:这不适合胆小的人。