Преобразовать широту / долготу в пиксели и обратно - PullRequest
15 голосов
/ 05 августа 2010

Я использую карты Google в своем приложении, и у меня есть веб-сервер с базой данных, заполненной значениями широты / долготы.Я хочу отметить их на карте, но я также хочу сгруппировать их вместе, если они находятся на определенном расстоянии друг от друга в пикселях.

Я полагаю, что если я получу все свои точки из базы данных, мне следуетв состоянии сделать что-то вроде этого (псевдокод):

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?Правильно ли я думаю об этом или есть лучшие способы сделать это?Я даже не уверен, что искать, так что если его спросили раньше, извините.

Ответы [ 2 ]

12 голосов
/ 06 сентября 2015

Использование API Карт Google 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)];
8 голосов
/ 05 августа 2010

Существует пример JavaScript для этого на этой странице как часть документации для API Карт Google.Имейте в виду, что вам нужно посмотреть на исходный код страницы, чтобы увидеть его.Это не настоящая страница документации, а пример.

...