2009-10-20 35 views
7

Tôi đang cố gắng phát triển một trang trong ASP.NET sẽ hoạt động như một máy chủ lát cho Google MapChuyển đổi dài/vĩ độ sang pixel x/y, được cung cấp mức thu phóng

Nó sẽ kéo thu thập các điểm vĩ độ/kinh độ từ cơ sở dữ liệu, sau đó hiển thị chúng dưới dạng các chấm đỏ nhỏ trên nền trong suốt, được cung cấp mức thu phóng (mặc định: 15).

Sau đó, nó sẽ trả lại kết quả dưới dạng hình ảnh loại GIF.

Có bất kỳ thuật toán hoặc thư viện nào được phát triển cho phép tôi thực hiện bộ vĩ độ/kinh độ này và chuyển đổi chúng thành một tập hợp các tọa độ 2D pixel, với mức thu phóng không?

(Điều này là tất cả được thực hiện phía máy chủ, vì vậy tôi không thể sử dụng API của Google Maps.)


Cập nhật: Tìm thấy một mã mẫu trong Perl rằng làm điều gì đó tương tự:

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

Rắc rối là, tôi không biết Perl, và không thực sự có thời gian để mở một cuốn sách và tìm hiểu nó.

Có ai có thể giúp tôi giải mã những gì đang diễn ra trong chức năng này không?

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) ; 
} 

Trả lời

2

"Nếu nó là một phép chiếu Mercator, bạn không cần phải lo lắng về độ cong của trái đất vì tất cả các lat/lon dòng đang ở khoảng cách bình đẳng"

Có lẽ bạn đang nghĩ hình chiếu địa lý (còn gọi là Plate Carree)? Phép chiếu Mercator có các đường kinh độ đều nhau, nhưng không có các khoảng cách đều nhau (lat = atan (sinh (y)), vì vậy 90 ° là vô cùng).

BTW, phép tính cho phép chiếu Mercator trên hình cầu là here, nhưng nếu Google Maps đang sử dụng ellipsoid WGS84 và bạn cần làm cho nó chính xác thì phức tạp hơn. Trong trường hợp đó, tôi sẽ xem this, nhưng hãy cẩn thận: nó không dành cho những người yếu tim.

+0

Có, bạn là chính xác. Tôi sẽ xóa câu trả lời của tôi. –

9

Đây là một số mã tôi hiện đang sử dụng. Nó bằng 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); 
} 

Dựa trên mã từ this page, được viết bởi this guy.

Chúc may mắn!

Cập nhật:This map là một cách tuyệt vời để giúp hiểu cách gạch hoạt động trong Google Maps

Edit: Dưới đây là một bộ tương đương với chức năng trong 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 

Và trong 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

+ ½ - mặc dù câu hỏi ban đầu dành cho a.NET giải pháp, đây là một giải pháp tuyệt vời và dễ thực hiện, và nó sẽ là tầm thường cho người đọc để chuyển đổi này thành C# hoặc VB.NET. –

Các vấn đề liên quan