2010-08-04 16 views
11

Tôi đang sử dụng bản đồ google trong ứng dụng của mình và tôi có máy chủ web có dữ liệu được chứa đầy giá trị lat/lon. Tôi muốn đánh dấu chúng trên bản đồ, nhưng tôi cũng muốn nhóm chúng lại với nhau nếu chúng nằm trong một khoảng cách pixel nhất định của eachother.Chuyển đổi lat/lon thành pixel và quay lại

Tôi hình dung nếu tôi lấy tất cả các điểm của tôi từ cơ sở dữ liệu, tôi sẽ có thể làm điều gì đó như thế này (giả):

clusters[]; 
while(count(points)) { 
    cluster[]; 
    point = points.pop(); 
    boundingbox = pixelsToBB(point, pixeldistance, zoomlevel); 
    query = "select * from database where lat > boundingbox.minlat 
      and lat < boundingbox.maxlat and lng > boundingbox.minlng 
      and lng < boundingbox.maxlng"; 
    for (result in executedquery) { 
     cluster[] += result; 
     points.remove(result); 
    } 
    clusters[] += cluster; 
} 

pixelsToBB(point, distance, zoomlevel) { 
    center = convertXY(point, zoomlevel); 
    maxlng = convertToLng(center.X, distance, zoomlevel); 
    minlng = convertToLng(center.X, -distance, zoomlevel); 
    minlat = convertToLat(center.Y, -distance, zoomlevel); 
    maxlat = convertToLat(center.Y, distance, zoomlevel); 
    return boundingbox(maxlng, maxlat, minlng, minlat); 
} 

Điều gì sẽ pixelsToBB chức năng của tôi cần phải làm với các zoomlevel? Hoặc thay vì những gì sẽ convertToXY của tôi, convertToLng và convertToLat cần phải làm gì? Tôi có nghĩ về điều này đúng không, hoặc có cách nào tốt hơn để làm điều đó không? Tôi thậm chí không chắc chắn những gì để tìm kiếm, vì vậy nếu nó được hỏi trước khi tôi xin lỗi.

Trả lời

7

Sử dụng Google Maps API v3:

var latLng = // your position object here 
var projection = map.getProjection(); 
var bounds = map.getBounds(); 
var topRight = projection.fromLatLngToPoint(bounds.getNorthEast()); 
var bottomLeft = projection.fromLatLngToPoint(bounds.getSouthWest()); 
var scale = Math.pow(2, map.getZoom()); 
var worldPoint = projection.fromLatLngToPoint(latLng); 
return [Math.floor((worldPoint.x - bottomLeft.x) * scale), Math.floor((worldPoint.y - topRight.y) * scale)]; 
7

Có một ví dụ JavaScript để làm điều này trên this page như một phần của tài liệu hướng dẫn cho API Google Maps. Ghi nhớ bạn cần xem xét nguồn trang để xem nó. Nó không phải là một trang tài liệu thực tế mà là một ví dụ.