С этой заметки я начну рассказ о том, как можно организовать рисование полилинии на карте с использованием API Google Maps, а затем сохранить ее в базе данных MySQL для дальнейшего использования.
В этой заметке я расскажу, как можно создать полилинию.
Последовательно щелкая левой кнопкой мыши по карте, мы формируем полилинию красного цвета с маркерами в узловых точках.
Если щелкнуть по маркеру в любом из промежуточных узлов, то он удаляется и соседние маркеры, соединяются прямой.
Если щелкнуть по последнему маркеру, то кроме него удаляется и последний сегмент полилинии.
Приведу Вам исходный код, а затем дам к нему пояснение.
Исходный код:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>API Google Maps рисуем полилинии</title> <style type="text/css"> v:* { /* Only for IE */ behavior:url(#default#VML); } body { height: 600px; } #map { position: absolute; top: 50px; left: 15px; width: 550px; height: 400px; } #descr { position: absolute; left: 580px; top: 50px; margin-right: 40px; } .tooltip { text-align: center; opacity: .70; -moz-opacity:.70; filter:Alpha(opacity=70); white-space: nowrap; margin: 0; padding: 2px 0.5ex; border: 1px solid #000; font-weight: bold; font-size: 9pt; font-family: Verdana; background-color: #fff; } </style> <script src="http://maps.google.com/maps?file=api&v=2&key=ABQIAAAACHCJdlgAEGcD_flKUFEmVhQlAYd20Yeej0MiKNuYPUGBnCwDThQlwUCPtCqtX3RC7LUKE-JYan3T4g" type="text/javascript"></script> </head> <body onload="buildMap()" onunload="GUnload()"> <div id="map"></div> <div id="descr">Нажмите на карту, чтобы установить маркеры в узлах полилинии.<br> Чтобы удалить существующий маркер, нажмите на маркер снова. <p><a href="#" onclick="showPoints()">Сохранить линию</a></p> <div id="route"><p><strong>Координаты вершин полилинии:</strong></p></div> </div> <script type="text/javascript"> //<![CDATA[ // Глобальные переменные var mapdiv = document.getElementById("map"); var map; var polylines = new Array(); var count = 0; var points = new Array(); var markers = new Array(); var icon_url ="http://labs.google.com/ridefinder/images/"; var tooltip; function addIcon(icon) { // Определяем значки для маркеров icon.shadow= icon_url + "mm_20_shadow.png"; icon.iconSize = new GSize(12, 20); icon.shadowSize = new GSize(22, 20); icon.iconAnchor = new GPoint(6, 20); icon.infoWindowAnchor = new GPoint(5, 1); } function showTooltip(marker) { // показываем подсказки (tooltip) tooltip.innerHTML = marker.tooltip; tooltip.style.display = "block"; // Tooltip transparency specially for IE if(typeof(tooltip.style.filter) == "string") { tooltip.style.filter = "alpha(opacity:70)"; } var currtype = map.getCurrentMapType().getProjection(); var point= currtype.fromLatLngToPixel(map.fromDivPixelToLatLng(new GPoint(0,0),true),map.getZoom()); var offset= currtype.fromLatLngToPixel(marker.getLatLng(),map.getZoom()); var anchor = marker.getIcon().iconAnchor; var width = marker.getIcon().iconSize.width + 6; // var height = tooltip.clientHeight +18; var height = 10; var pos = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(offset.x - point.x - anchor.x + width, offset.y - point.y -anchor.y - height)); pos.apply(tooltip); } function buildMap() { map = new GMap2((mapdiv), {draggableCursor:"auto", draggingCursor:"move"}); // Добавляем слушатель события для белых маркеров GEvent.bind(map, "click", this, this.leftClick); // Добавляем div элемент для toolips tooltip = document.createElement("div"); tooltip.className="tooltip"; map.getPane(G_MAP_MARKER_PANE).appendChild(tooltip); // Определяем карту и добавляем элементы управления map.setCenter(new GLatLng(56.2980387, 43.9123535), 13); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); map.disableDoubleClickZoom(); } function leftClick(overlay, point) { if(point) { // Иконка для белого маркера var icon = new GIcon(); icon.image = icon_url +"mm_20_white.png"; addIcon(icon); count++; var w_marker = new GMarker(point, icon); map.addOverlay(w_marker); w_marker.content = count; markers.push(w_marker); points.push(point); w_marker.tooltip = "Точка "+ count; GEvent.addListener(w_marker, "mouseover", function() { showTooltip(w_marker); }); GEvent.addListener(w_marker, "mouseout", function() { tooltip.style.display = "none"; }); if(markers.length > 1) { // Рисуем красную полилинию var poly = new GPolyline(points, "#ff0000", 2, 1); map.addOverlay(poly); polylines.push(poly); } // Слушаем событие удаление маркера GEvent.addListener(w_marker, "click", function() { tooltip.style.display = "none"; // Удаляем все полилинии, прежде чем делать более короткий путь for(var m= 0; m < polylines.length; m++) { map.removeOverlay(polylines[m]); } polylines.length = 0; // Удаляем маркер for(var n = 0; n < markers.length; n++) { if(markers[n] == w_marker) { map.removeOverlay(markers[n]); break; } } // Уменьшаем массив маркеров и точек и настраиваем счетчик markers.splice(n, 1); points.splice(n, 1); if(markers.length == 0) { count = 0; } else { count = markers[markers.length-1].content; } // Рисуем короткий путь var newpoly = new GPolyline(points, "#ff0000", 2, 1); map.addOverlay(newpoly); polylines.push(newpoly); }); } } //Выводим координаты маркеров при клике на ссылку Сохранить линию function showPoints() { for (var n = 0 ; n < points.length ; n++ ) { document.getElementById("route").innerHTML += points[n]+'<br>'; } } //]]> </script> </body> </html> |
С начала мы определяем глобальные переменные: для объекта карты — map и mapdiv, значение счетчика count = 0, массивы для хранения координат меток points, маркеров и полилиний, путь до папки со значками icon_url и переменную для пояснений tooltip
Функция addIcon определяет значки для маркеров.
Следующая функция служит для создания и отображения подсказок при наведении курсора мыши на конкретный маркер.
Функция buildMap отвечает за формирование окна карты с элементами управления.
Функция leftClick наиболее интересна, т.к выполняет основной функционал по созданию и редактированию полилинии.
Рассмотрим ее подробнее.
Она вызывается при клике по карте, в точку щелчка помещается маркер с подсказкой (tooltip) и счетчик count увеличивается на единицу.
Если количество маркеров больше одного, то между предыдущим и последним рисуем отрезок линии.
В этой же функции отслеживается событие щелочек по маркеру GEvent.addListener.
При этом удаляются все подсказки (tooltip) и вся полилиния с карты.
Удаляется необходимый маркер из массива markers, а затем уменьшается массив маркеров и настраивается счетчик.
После этого рисуем новую, короткую полилинию.
Последняя функция showPoints выводит координаты узлов полилинии на страницу с картой после строки Координаты вершин полилинии:, когда мы щелкаем по ссылке Сохранить линию
В следующей части мы рассмотрим, как сохранить нашу полилинию в базе данных MySQL, а затем вывести ее снова на карту.
огромное спасибо!
Теперь ждем эту же сатать только для Яндек Карт
Ждем про сохранение и воспроизведение ) . Штука полезная
Ну когда же будет следующая? Дайте пожалуйста-а-а-а-а. Нужно для завершения дипломной работы. Сроки горят. Заранее спасибо.
В понедельник 24 мая
а можно в воскресенье, а? пожалуйста. Или подскажите, где найти похожую информацию на русском.
ну где же продолжение???? так жду….
http://webmap-blog.ru/?p=562
используя ваш код я добился того, что подписи отбражаются постоянно, снизу маркера. при изменении зума, маркеры перерисовываются, а подписи нет. каким образом можно этого добится?