Вам наверно известно, что на сайте API Яндекс.Карт существует инструмент для определения координат.
Но с выходом версии API Яндекс.Карт 2.х использовать его стало не очень удобно, т.к изменился порядок записи координат, полученное значение необходимо предварительно куда-то скопировать и поменять местами значения.
Я решил сделать свой инструмент для определения координат с API Яндекс.Карт 2.х
А за одно рассказать о том как это сделать.
На этом примере мы разберем работу с событиями и передачу значений в форму на карте.
Посмотреть его работу можно здесь.
Перейдя по ссылке, мы увидим карту с элементами управления и формой для вывода значений координат метки, масштаба и центра карты.
В центре карты расположена метка, которая показывает необходимое местоположение.
Определить координаты можно введя адрес в строку поиска, переместить метку в то место координаты которого Вы хотите узнать или кликнув по карте левой кнопкой мыши в нужном месте.
Координаты будут показаны в форме на карте в строке «Координаты метки», кроме того там показываются текущий уровень масштаба и координаты центра карты.
Теперь рассмотрим код примера.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Инструмент для определения координат - API Яндекс.Карт 2.0</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<script src="http://api-maps.yandex.ru/2.0/?load=package.full&lang=ru-RU" type="text/javascript"></script>
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
<link href="/examples/add-users-ymapsapi2/css/bootstrap.min.css" rel="stylesheet" />
<style>
html, body, #YMapsID {
margin: 0;
padding: 0;
height: 100%;
}
#coord_form{
position: absolute;
z-index: 1000;
background: none repeat scroll 0% 0% rgb(255, 255, 255);
list-style: none outside none;
padding: 10px;
margin: 0px;
right: 10px;
top: 50px;
}
</style>
<script type="text/javascript">
var myMap, myPlacemark, coords;
ymaps.ready(init);
function init () {
//Определяем начальные параметры карты
myMap = new ymaps.Map('YMapsID', {
center: [56.326944, 44.0075],
zoom: 10
});
//Определяем элемент управления поиск по карте
var SearchControl = new ymaps.control.SearchControl({noPlacemark:true});
//Добавляем элементы управления на карту
myMap.controls
.add(SearchControl)
.add('zoomControl')
.add('typeSelector')
.add('mapTools');
coords = [56.326944, 44.0075];
//Определяем метку и добавляем ее на карту
myPlacemark = new ymaps.Placemark([56.326944, 44.0075],{}, {preset: "twirl#redIcon", draggable: true});
myMap.geoObjects.add(myPlacemark);
//Отслеживаем событие перемещения метки
myPlacemark.events.add("dragend", function (e) {
coords = this.geometry.getCoordinates();
savecoordinats();
}, myPlacemark);
//Отслеживаем событие щелчка по карте
myMap.events.add('click', function (e) {
coords = e.get('coordPosition');
savecoordinats();
});
//Отслеживаем событие выбора результата поиска
SearchControl.events.add("resultselect", function (e) {
coords = SearchControl.getResultsArray()[0].geometry.getCoordinates();
savecoordinats();
});
//Ослеживаем событие изменения области просмотра карты - масштаб и центр карты
myMap.events.add('boundschange', function (event) {
if (event.get('newZoom') != event.get('oldZoom')) {
savecoordinats();
}
if (event.get('newCenter') != event.get('oldCenter')) {
savecoordinats();
}
});
}
//Функция для передачи полученных значений в форму
function savecoordinats (){
var new_coords = [coords[0].toFixed(4), coords[1].toFixed(4)];
myPlacemark.getOverlay().getData().geometry.setCoordinates(new_coords);
document.getElementById("latlongmet").value = new_coords;
document.getElementById("mapzoom").value = myMap.getZoom();
var center = myMap.getCenter();
var new_center = [center[0].toFixed(4), center[1].toFixed(4)];
document.getElementById("latlongcenter").value = new_center;
}
</script>
</head>
<body>
<div id="YMapsID"></div>
<div id="coord_form">
<p><label>Координаты метки: </label><input id="latlongmet" class="input-medium" name="icon_text" /><br/>
<label>Масштаб: </label><input id="mapzoom" class="input-medium" name="icon_text" /></p>
<p><label>Центр карты: </label><input id="latlongcenter" class="input-medium" name="icon_text" /></p>
</div>
</body>
</html> |
В начале мы определяем параметры нашей карты — центр, масштаб и добавляем метку в центр карты.
Далее мы должны отслеживать различные события.
Перемещение метки — dragend:
myPlacemark.events.add("dragend", function (e) {
coords = this.geometry.getCoordinates();
savecoordinats();
}, myPlacemark); |
Если оно произошло, мы получаем новые координаты и вызываем функцию savecoordinats.
Код функции savecoordinats:
function savecoordinats (){
var new_coords = [coords[0].toFixed(4), coords[1].toFixed(4)];
myPlacemark.getOverlay().getData().geometry.setCoordinates(new_coords);
document.getElementById("latlongmet").value = new_coords;
document.getElementById("mapzoom").value = myMap.getZoom();
var center = myMap.getCenter();
var new_center = [center[0].toFixed(4), center[1].toFixed(4)];
document.getElementById("latlongcenter").value = new_center;
} |
В начале мы преобразуем значения координат оставляя только четыре знака после запятой.
Затем передаем новые координаты нашей метке.
Передаем значения координат элементу формы с id= latlongmet, уровень масштаба карты элементу —
id = mapzoom.
Получаем координаты центра карты и после преобразования предаем элементу формы с id = latlongcenter.
Следующее отслеживаемое событие — клик по карте.
За это отвечает код:
myMap.events.add('click', function (e) {
coords = e.get('coordPosition');
savecoordinats();
}); |
Нам нужно определить событие выбора результата поиска и перенести метку в эту точку.
SearchControl.events.add("resultselect", function (e) {
coords = SearchControl.getResultsArray()[0].geometry.getCoordinates();
savecoordinats();
}); |
И последнее событие — это изменения области просмотра карты при изменении масштаба или перемещении карты.
За это отвечает код:
myMap.events.add('boundschange', function (event) {
if (event.get('newZoom') != event.get('oldZoom')) {
savecoordinats();
}
if (event.get('newCenter') != event.get('oldCenter')) {
savecoordinats();
}
}); |
Надеюсь данный инструмент Вам понравиться.

Что уж очень подтормаживает на моей Xubuntu…
При нажатии на кнопку «Схема» — выпадающее меню прячется под блоком с координатами
Поправил, сместил форму в левую сторону
Здравствуйте, подскажите, как адаптировать этот код, для вставки в модуль? Спасибо!
В какой модуль Вы хотите вставлять код примера?
Модуль для вставки произвольного HTML кода для Joomla
Большое спасибо! Очень пригодилось.
Еще добавила сюда
behaviors: [«default», «scrollZoom»]
чтобы карта реагировала на прокручивание колесика мышки.
Добрый вечер! Подскажите пжл как теперь полученный переменные перевести в php и через форму отправить в базу данных для сохранения?
Спс. разобрался))) Тупил просто)))
Очень помог данный инструмент, даже не знаю, что бы я делал без него. Потратил бы кучу времени. Спасибо!
Спасибо за урок и пример, можно задать вопрос, как сделать чтобы по клику балун перемещался в нужное место?
Есть пример в документации — События карты
Admin, я не смог разабратся. могу вам заплотить за реализацию данного функционаламоя почта php84@bk.ru
Доброго дня.
Помогите пожалуйста в решении задачки:
Прокладываю с помощью «ymaps.route(..)» путь.
Возможно ли найти приблизительную середину пути для того, что-ты вставить туда метку с величиной расстояние между пунктами. Вот так вот:
http://rghost.ru/46345843/image.png
Заранее благодарю.
Добрый день! А не подскажите как еще в строку при клике отслеживать и выводить(как координаты) полный адрес метки?)))
Мое знание js оставляет желать лучшего((( 3 день мучаюсь(((
Благодарю, все отлично раюотает!
Павел, у меня такая же задача, подскажите как сделали, пожалуйста.
Отлично, только нужно в событие выбора результата поиска подправить не coords = SearchControl.getResultsArray()[0].geometry.getCoordinates();
а coords = SearchControl.getResultsArray()[e.get(‘resultIndex’)].geometry.getCoordinates();
так как у вас при любом выборе из списка поиска возвращаются координаты первого элемента(индекс 0)