Кластер одинаковой широты/долготы gmaps v3

На моем веб-сайте у меня есть форма, которая позволяет пользователям регистрироваться. Он просит пользователей указать свой город, штат и страну. У меня также есть карта, которая отбрасывает маркер для каждого пользователя на основе широты и долготы, взятых из этой комбинации города, штата и страны ($ location).

Поскольку я не очень конкретен (например, я не прошу их ДЕЙСТВИТЕЛЬНЫЙ адрес), у меня есть несколько пользователей с одинаковыми широтой/долготой. И это создает проблему при попытке просмотреть маркеры на моей карте.

Должен ли я использовать службу кластеризации? Если да, то есть ли у вас предложения?? Как я уже сказал, информация поступает из базы данных mySQL --> XML --> PHP.

Если это так, он будет сгруппирован на самом увеличенном уровне (как я уже сказал, та же широта/долгота). В результате мне понадобится информационное окно, которое позволит мне выбрать каждого пользователя в этом конкретном месте.

Идеи? Предложения??? Очень признателен!!!

Джереми


person jthespartan    schedule 19.11.2010    source источник


Ответы (2)


MarkerClusterer: http://gmaps-utility-library.googlecode.com/svn/trunk/markerclusterer/1.0/docs/examples.html

Или вручную (примерно - только пример кода!)

        var latlng = new google.maps.LatLng(-33.8671390, 151.2071140);
        var myOptions = {
            zoom: 8,
            center: latlng,
            mapTypeId: google.maps.MapTypeId.ROADMAP
        };
        var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

        var markers = [];
        var newmarkers = [];

        for(var j=0; j<5; j++) {
            markers.push({lat:-33.8671390, lng:151.2071140, title:'This is marker #' + i });

            if(j==0) newmarkers.push(markers[j]);
            for(var i=0; i<newmarkers.length; i++) {
                if(newmarkers[i].lat == markers[j].lat && newmarkers[i].lng == markers[j].lng) {
                    newmarkers[i].title += ' AND ' + markers[j].title;
                    continue;
                }
                newmarkers.push(markers[j]);
            }
        }

        for(var i=0; i<newmarkers.length; i++) {
            var mkr = new google.maps.Marker({
                position: new google.maps.LatLng(newmarkers[i].lat, newmarkers[i].lng), 
                map: map, 
                title: newmarkers[i].title
            });
        }
person Jonathan    schedule 19.11.2010
comment
Джонатан: взглянул на эту ссылку. Спасибо, что прислали. Я не уверен, что это делает то, что мне нужно. Похоже, что большинство маркеров взяты из разных наборов широты и долготы. В то время как многие мои будут такими же. Предложения??? - person jthespartan; 19.11.2010
comment
Эта библиотека выполняет квадратную кластеризацию. Это означает, что вы устанавливаете расстояние в пикселях, и все, что находится внутри поля, сгруппировано. Таким образом, вы можете попробовать установить небольшое значение расстояния. В противном случае вам нужно будет проанализировать свою коллекцию местоположений и добавить ее в другую коллекцию, сравнив каждое местоположение с теми, что есть в новой коллекции. - person Jonathan; 19.11.2010
comment
У меня есть несколько человек, которые указали авиабазу Вэнс, штат Оклахома, США, в качестве своего местонахождения. Широта/долгота для этого: lat=36.343071 lng=-97.907806. Так вы говорите, что когда я ввожу эту информацию в свою базу данных, я должен каждый раз преобразовывать эту последнюю цифру? Это может быть круто... иметь несколько маркеров в маленьком пространстве. Тогда пользователям просто нужно будет увеличить масштаб, чтобы увидеть, кто там. Эта карта в основном предназначена для создания эффектов. Сортируемая база данных предоставляет всю реальную информацию. - person jthespartan; 20.11.2010

Думал, что вставлю свой код:

function load() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map")); map.addControl(new GSmallMapControl()); map.addControl(new GMapTypeControl()); map.setCenter(new GLatLng(47.614495, -122.341861), 2); map.enableScrollWheelZoom();

GDownloadUrl("world_xml.php", function(data) { var xml = GXml.parse(data); var markers = xml.documentElement.getElementsByTagName("marker"); for (var i = 0; i < markers.length; i++) { var first_name = markers[i].getAttribute("first_name"); var last_name = markers[i].getAttribute("last_name"); var email = markers[i].getAttribute("email"); var affiliation = markers[i].getAttribute("affiliation"); var status = markers[i].getAttribute("status"); var service = markers[i].getAttribute("service"); var rank = markers[i].getAttribute("rank"); var specialty = markers[i].getAttribute("specialty"); var city = markers[i].getAttribute("city"); var state = markers[i].getAttribute("state"); var country = markers[i].getAttribute("country"); var point = new GLatLng(parseFloat(markers[i].getAttribute("lat")), parseFloat(markers[i].getAttribute("lng"))); var marker = createMarker(point, rank, first_name, last_name, email, affiliation, status, service, specialty, city, state, country); map.addOverlay(marker); } });

} }

function createMarker(point, rank, first_name, last_name, email, affiliation, status, service, speciality, city, state, country) { var marker = new GMarker(point); var html = "" + ранг + " " + имя + " " + фамилия + "
" + услуга + ", " + статус + "
" + специальность + "
" + принадлежность + "
" + город + ", " + штат + " " + страна + "
" + электронная почта + "
" + " "; GEvent.addListener(marker, 'click', function() { marker.openInfoWindowHtml(html); }); маркер возврата; }

person jthespartan    schedule 20.11.2010