2010-08-04 7 views
11

J'utilise google maps dans mon application, et j'ai un serveur web avec une base de données remplie de valeurs lat/lon. Je veux les marquer sur la carte, mais je veux aussi les regrouper s'ils sont à une certaine distance de chaque pixel.Conversion lat/lon en pixels et retour

Je suppose que si je récupère tous mes points de la base de données, je devrais être capable de faire quelque chose comme ça (pseudo-code):

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

Quelle serait ma fonction pixelsToBB besoin de faire avec le zoomlevel? OU plutôt qu'est-ce que mes convertToXY, convertToLng et convertToLat doivent faire? Est-ce que j'y pense de la bonne façon ou y a-t-il de meilleures façons de le faire? Je ne suis même pas sûr de ce qu'il faut chercher, donc si on vous l'a demandé avant de m'excuser.

Répondre

7

Utilisation de l'API Google Maps 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

Il existe un exemple JavaScript pour faire cela sur this page dans le cadre de la documentation de l'API Google Maps. Gardez à l'esprit que vous devez regarder la source de la page pour le voir. Ce n'est pas une page de documentation mais plutôt un exemple.

Questions connexes