Модераторы: Sardar, Aliance
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Универсальный геокодинг в Google Maps api v3 
:(
    Опции темы
DARKVovich
  Дата 3.3.2011, 15:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 3.3.2011

Репутация: нет
Всего: нет



Заранее извиняюсь, если не там задаю вопрос, но я не нашел у вас раздела по Гугл Картам, а этот более подходящий.

В общем у меня стоит задача сделать возможность добавления маркеров на карту гугл тремя способами:
1. Задавая адрес
2. Вводом координат
3. Перетаскиванием маркера вручную

Причем все они должны работать в связке, т.е. перетаскивание вручную должно работать при любом вводе.

Итак, что у меня имеется:
- форма для ввода
Код

Адрес: <input name="address" id="address" size="50" type="text" value="" onblur="if (this.value.length>0) {codeAddress(this.value);}" />
Координаты: <input name="lat" id="lat" type="text" value="" /> Широта
<input name="lng" id="lng" type="text" value="" onblur="if (this.value.length>0) {codeLatLng(this.value);}" /> Долгота
Карта: <div id="map_canvas" style="width: 100%; height: 300px"></div>

Т.е. при вводе адреса или ввода координат на карте должен появляться соответственный маркер.

- код
Код

var map;
var markersArray = [];
var geocoder;
// Создание карты
function initialize() {
    geocoder = new google.maps.Geocoder();
    var myLatlng = new google.maps.LatLng(-25.363882,131.044922);
    var myOptions = {
      zoom: 2,
      center: myLatlng,
      mapTypeId: google.maps.MapTypeId.ROADMAP
    }
    map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);
    // Задаем слой с OSM
    var openStreet = new google.maps.ImageMapType({
        getTileUrl: function(ll, z) {
            var X = ll.x % (1 << z);  // wrap
            return "http://tile.openstreetmap.org/" + z + "/" + X + "/" + ll.y + ".png";
        },
        tileSize: new google.maps.Size(256, 256),
        isPng: true,
        maxZoom: 18,
        name: "OSM",
        alt: "Слой с Open Streetmap"
    }); 
    //Добавляем слои к карте
    map.mapTypes.set('osm', openStreet);
    map.setMapTypeId('osm');
    map.setOptions({
        mapTypeControlOptions: {
            mapTypeIds: [
                'osm',
                google.maps.MapTypeId.ROADMAP,
                google.maps.MapTypeId.SATELLITE,
                google.maps.MapTypeId.HYBRID
            ],
            style: google.maps.MapTypeControlStyle.DROPDOWN_MENU
        }
    });
}
// Добавляем маркер
function addMarker(location) {
    marker = new google.maps.Marker({
        position: location,
        map: map,
        draggable:true
    });
    markersArray.push(marker);
}
// Очищаем оверлэй
function deleteOverlays() {
    if (markersArray) {
        for (i in markersArray) {
            markersArray[i].setMap(null);
        }
        markersArray.length = 0;
    }
}
// Определяем местоположение по адресу
function codeAddress() {
    deleteOverlays();
    var address = document.getElementById("address").value;
    geocoder.geocode( { 'address': address}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            map.setCenter(results[0].geometry.location);
            addMarker(results[0].geometry.location);
            // Определяем координаты перемещения маркера
            google.maps.event.addListener(
                marker,
                'drag',
                function() {
                    document.getElementById('lat').value = marker.position.lat();
                    document.getElementById('lng').value = marker.position.lng();
                }
            );
        } else {
            alert("Ошибка геокодера! Причина: " + status);
        }
    });
}

// Определяем местоположение по координатам
function codeLatLng() {
    var input = document.getElementById("lat").value;
    var input2 = document.getElementById("lng").value;
    var lat = parseFloat(input);
    var lng = parseFloat(input2);
    var latlng = new google.maps.LatLng(lat, lng);
    geocoder.geocode({'latLng': latlng}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            if (results[1]) {
            map.setZoom(11);
          marker = new google.maps.Marker({
              position: latlng, 
              map: map,
            draggable:true
          }); 
          infowindow.setContent(results[1].formatted_address);
          infowindow.open(map, marker);
        } else {
          alert("Ничего не найдено.");
        }
      } else {
        alert("Ошибка геокодера! Причина: " + status);
      }
    });
}


С чем не удается разобраться:

1. Нужно сделать очистку старых маркеров после каждого геокодинга и создание нового. Я сделал функцию как сказано в документации, но она работает не как нужно - очищает весь слой, даже новые маркеры.

2. Хочется сделать универсальный зум, чтобы при вводе города - зум до города, при вводе улицы - до улицы. Вообщем максимальный.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Форум для вопросов, которые имеются в справочниках, но их поиск вызвал затруднения, или для разработчика требуется совет или просьба отыскать ошибку. Напоминаем: 1) чётко формулируйте вопрос, 2) приведите пример того, что уже сделано, 3) укажите явно, нужен работающий пример или подсказка о том, где найти информацию.
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | JavaScript: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0394 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.