我想开发一个ASP.NET页面,将作为拼贴服务器的谷歌地图
它会拉的纬度/经度点的集合从数据库中,然后使它们在一个透明的背景红色的小圆点,给定一个缩放级别(默认值: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) ;
}
“如果是墨卡托投影,你不应该需要担心,因为所有的纬度的地球曲率/经度线都以相等的间距”
也许你会想地理(又名Plate Carree)投影的? 墨卡托投影确实有经度的等距线,但不具有纬度的等间隔线(LAT = ATAN(双曲正弦(Y)),因此90°为无穷大)。
顺便说一句,对球体的墨卡托投影的数学是在这里 ,但如果谷歌地图使用WGS84椭球,你需要得到它的确切它变得更加复杂。 在这种情况下,我想看看这个 ,但要注意:它不是为微弱的心脏。
下面是我目前使用一些代码。 它在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);
}
基于从码这个页面 ,以书面这个家伙 。
祝好运!
更新: 这个地图是一个伟大的方式来帮助理解瓷砖在谷歌地图是如何工作的
编辑:这是一个等效的一组在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);
}