2010-08-04 18 views
11

Estoy usando google maps en mi aplicación, y tengo un servidor web con un databse lleno de valores lat/lon. Quiero marcarlos en el mapa, pero también quiero agruparlos si están dentro de una cierta distancia de píxel entre sí.Convertir lat/lon a píxeles y volver

Creo que si puedo recuperar todos mis puntos de la base de datos, debería ser capaz de hacer algo como esto (pseudocódigo):

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

¿Qué mi función necesidad pixelsToBB que ver con la zoomLevel? O mejor dicho, ¿qué tendrían que hacer mis convertToXY, convertToLng y convertToLat? ¿Estoy pensando en esto de la manera correcta, o hay mejores formas de hacerlo? Ni siquiera estoy seguro de qué buscar, por lo que si se me ha preguntado antes, lo siento.

Respuesta

7

Uso de 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

Hay un ejemplo de JavaScript para hacer esto en this page como parte de la documentación de la API de Google Maps. Tenga en cuenta que necesita mirar la fuente de la página para verla. No es una página de documentación real sino más bien un ejemplo.

Cuestiones relacionadas