2010-08-04 76 views
11

我在我的應用程序中使用谷歌地圖,並且我有一個帶有經緯度值的數據庫的網絡服務器。我想在地圖上標記它們,但是如果它們在彼此的某個像素距離內,我也想將它們聚類在一起。將緯度/經度轉換爲像素並返回

我想,如果我從數據庫中檢索我所有的點,我應該可以做這樣的事情(僞):

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

什麼會我pixelsToBB功能需要做的縮放級別?或者,而是我的convertToXY,convertToLng和convertToLat需要做什麼?我是否正確地思考這個問題,還是有更好的方法來做到這一點? 我甚至不確定要搜索什麼,所以如果在對不起之前詢問它。

回答

7

使用谷歌地圖API第3版:

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

作爲Google Maps API文檔的一部分,在this page上有一個JavaScript示例。請記住,您需要查看頁面源以查看它。這不是一個實際的文檔頁面,而是一個例子。