10

我正在尝试在 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

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

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

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

于 2009-10-21T00:27:13.003 回答