Маркеры в Google Maps

Маркеры в Google Maps

Привет, ребята и девчата!

Когда-то давно я написал статью о том, как я делал «карточную» часть сайта точек wi-fi. Так вот, там я все описал вкратце — думал, что материала в сети и так много и вроде все не так сложно (за исключением нескольких моментов ;-). Оказывается, что это не так, и судя по вашим комментариям (статья стала чуть ли не самой комментируемой на сайте), было бы неплохо раскрыть тему более подробно.

В общем, с этой статьи я начну раскрытие вопроса. Сегодня я покажу, как добавлять маркеры на карту учитывая адрес, как этот маркер перетаскивать и как работать с координатами.

Воспоминания

Напомню для начала, что у нас есть такое понятие как маркер. Маркер делается вот так (не считая оформления):

var marker = new GMarker(точка, { прочие параметры }); // объявление
map.addOverlay(marker); // вывод на карту

Теперь точка. Это просто пара широта-долгота. Где ее взять? Либо прописать вручную (например, из базы), либо получить из других функция апишки. В частности, для работы с адресами (строками типа «страна, город, адрес») есть замечательный объект geocoder. Его и рассмотрим.

Работа с адресами

Сегодня мы рассмотрим простейший вариант, в котором в ответ на предоставляемый адрес возвращаются соответствующие координаты, либо выводится ошибка, что адрес не верен.

Давайте представим себе такую ситуацию (это всегдя проще и удобнее, чем делать что-то абстрактное). У нас есть поле, где пользователь указывает свой адрес. Мы же хотим вывести этот адрес на карту и сохранить его потом куда-то (в базу, файл, куки, еще что-то). Верстка будет какой-то такой:

<body onload="initialize()" onunload="GUnload()">
<h1>Выставление маркера на карте по адресу места</h1>
<p>Реализация простейшего применения объекта <code>geocoder</code> — пользователь указывает адрес, скрипт ставит маркер на карте в соответствующем месте.</p>
<form action="#" onsubmit="showAddress(this.address.value); return false">
<p>
<input type="text" size="60" name="address" value="Россия, Санкт-Петербург, Невский пр., д. 15" />
<input type="submit" value="Показать на карте" />
</p>
<div id="map_canvas" style="width: 500px; height: 300px"></div>
<p>
<input type="text" name="lat" id="spot-lat" value="" />
<input type="text" name="longi" id="spot-longi" value="" />
</p>
</form>

</body>

Теперь самое интересное — javascript.

<script type="text/javascript">
// объявление переменных
var map = null; // карта
var geocoder = null; // объект геокодинга

// инициализация карты
function initialize() {
if (GBrowserIsCompatible()) {
map = new GMap2(document.getElementById("map_canvas")); // делаем карту в таком диве
map.setCenter(new GLatLng(59.94, 30.3), 13); // устанавливаем центр карты и приближение
geocoder = new GClientGeocoder(); // создаем объект геокодера
}
}

// функция, выводящая маркер,
// соответсвующий указанному адресу
// ее аргумент — адрес места
function showAddress(address) {
if (geocoder) {
geocoder.getLatLng(
address, // сообщаем объекту адрес
function(point) { // объект вызывает функцию, аргумент которой точка, соответствующая адресу
if (!point) { // если точка не определена (то есть адрес не правильный или Гугл не нашел его)
alert(address + " не найден"); // выводим ошибку
} else { // если же все круто, то
map.setCenter(point, 15); // центром карты делаем эту точку
var marker = new GMarker(point); // создаем в ней маркер
map.addOverlay(marker); // и добавляем его на карту
marker.openInfoWindowHtml(address); // открываем у него инфоокно
document.getElementById('spot-lat').value = point.y; // и добавляем в поля широту
document.getElementById('spot-longi').value = point.x; // и долготу
}
}
);
}
}
</script>

Смотрим примерчик. Как мы видим, при клике на кнопку «Показать на карте» мы спрашиваем у гугла координаты этого адреса, если все замечательно, то выводим их на карту и записываем координаты в соответствующие поля формы (для дальнейшего сохранения). Классно? А то. Просто? Конечно.

Теперь немного усложним себе жизнь и дадим пользователю возможность этот маркер перетаскивать — а вдруг он в другом подъезде живет? Собственно, исходный код будет различаться лишь дополнительными событиями для маркера. Вот их и рассмотрим более подробно:

<script type="text/javascript"> ...
var marker = new GMarker(point, {draggable: true}); // создаем в ней маркер (с перетаскиванием)
GEvent.addListener(marker, "dragend", function() { // как только перетащили
document.getElementById('spot-lat').value = marker.getPoint().lat(); // переписываем широту
document.getElementById('spot-longi').value = marker.getPoint().lng(); // и долготу
}); ...
</script>

Опять же, пробуем и смотрим. Как видно, координаты в полях меняются.

Теперь обратимся к вопросу сохранения этих координат. Это уже зависит от вашего серверного решения, но, думаю, что сохранение полей формы ни у кого не должно вызвать проблем.

О том, как выводить маркеры на карту по их координатам мы поговорим в следующий раз, а заодно более подробно рассмотрим вывод большого количества маркеров.

Все ваши вопросы можно (даже нужно) оставлять в вопросах и ответах. Замечания по статье пишите в комментарии. До встречи!

Расскажите друзьям

Оцените статью:
  • 1
  • 2
  • 3
  • 4
  • 5

Комментарии — 9

Сашко
Ну наконец-то :))) Это мои наверное комментарии рейтинг статьи подняли на первое место )))))
p.s. Паш, ты крутой чел, но некоторым до тебя еще надо рости ))))
Сашко
где лучше сохранять данные о точке: в xml файле или через mysql?
В первом случае любой юзер может посмотреть html код (либо javascript), затем открыть xml и скопировать точки себе. А это не гуд, может у меня сайт секретный и на этом тока держится :)))
Grin
Ну в Мускуле в любом случае удобнее. Насчет секретности — как я уже говорил в одном из вопросов, все данные, которые приходят и обрабатываются на клиента (в браузере) потенциально можно прочесть. То есть если даже сделать какой-то свой алгоритм шифрования координат, то точки все равно можно прочесть.
Ariana
Теперь точка. Это просто пара широта-долгота. Где ее взять? Либо прописать вручную (например, из базы), либо получить из других функция апишки.


А на Яндекс картах можно узнать широту и долготу конкретного объекта?
Я нигде не смогла найти эту информацию((
Su
Отлично, спасибо за столь полезную информацию по картам!
#
Su
Сергей
А какое событие повесить вместо "click", чтобы инфоокно появлялось сразу, а не после щелчка на маркере? Спасибо.
#
Сергей
xabaz
Был бы очень рад вашему мастер-классу по сохранению/выдергиванию точек из базы данных :-[
Andrey
http://code.google.com/intl/en/apis/maps/documentation/javascript/examples/places-autocomplete.html
#
Andrey

Новый комментарий

как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть
как выглядит какой тег
жирный текст <b>жирный текст</b>
курсивный тект <i>курсивный тект</i>
зачеркнутый текст <s>зачеркнутый текст</s>
подчеркнутый текст <u>подчеркнутый текст</u>
ссылка <a href="адрес">ссылка</a>
function foo() { ... }
<pre><code>function foo() { ... } </code></pre>
разрешенные теги или посмотреть как будет выглядеть

metin2 pvp metin2 pvp serverler pvp serverler