2009-10-20 37 views
7

我想开发一个ASP.NET页面,将作为拼贴服务器的谷歌地图转换经度/纬度像素X/Y,给定一个缩放级别

它会拉从数据库中收集纬度/经度点,然后在给定缩放级别(默认值:15)的情况下,将它们呈现为透明背景上的小红点。

它将然后返回结果为GIF型图像。

已经开发的任何算法或库,允许我借此集纬度/经度并将其转换为一组二维像素坐标的,给定一个缩放级别?

(这是所有正在做服务器端,所以我不能使用谷歌地图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

“如果这是一个墨卡托投影,你不应该需要,因为所有的经/纬度线的担心地球的曲率是相等的间距”

也许你会想的地理(又名板卡里)投影?墨卡托投影具有等距的经线,但是而不是具有等距的纬线(lat = atan(sinh(y)),所以90°在无穷远处)。

顺便说一句,球面上的墨卡托投影数学公式为here,但如果谷歌地图使用WGS84椭圆体,并且您需要准确得出它,那么它会变得更加复杂。在那种情况下,我会看看this,但要小心:它不适合心脏不好的人。

+0

啊,是的,你是正确的。我会删除我的答案。 – 2009-10-21 13:03:40

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是一个伟大的方式来帮助理解瓷砖在谷歌地图是如何工作的

编辑:下面是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); 
} 
+0

+½ - 虽然原来的问题是为了一个。NET解决方案,这是一个优秀且易于实现的解决方案,读者将其转换为C#或VB.NET应该是微不足道的。 – 2012-07-23 15:18:28