Google Maps — добавление меток на карту пользователями.
В нескольких заметках на этом блоге я уже рассказывал о том, как реализовать возможность добавления меток пользователями на Яндекс.Карту (см. заметки: "Яндекс.Карта на Вашем сайте с возможностью добавления меток пользователями", "Яндекс.Карта на Вашем сайте с возможностью добавления меток пользователями – Продолжение" и "Яндекс.Карта на Вашем сайте с возможностью добавления меток пользователями – Продолжение-2").
В этой заметке я хочу описать, как реализовать тоже самое для карт Google.
Для записи значений мы будем использовать язык PHP, а для хранения базу данных MySQL.
В начале, в базе данных, мы должны будем создать таблицу markers,в которой будем хранить информацию о метках введенную пользователями.
Это можно сделать, используя утилиту PhpMyAdmin выполнив следующий SQL-код:
CREATE TABLE `markers` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 255 ) NOT NULL , `address` VARCHAR( 255 ) NOT NULL , `lat` FLOAT( 10, 6 ) NOT NULL , `lng` FLOAT( 10, 6 ) NOT NULL , `type` VARCHAR( 255 ) NOT NULL ) ENGINE = MYISAM DEFAULT CHARSET=utf8; |
Здесь, id – уникальный идентификатор записи, name – служит для хранения названия метки, address – адрес метки, поля lat и lng – служат для хранения значений широты и долготы соответственно, type – тип объекта.
После этого мы создадим два файла на языке PHP — phpsqlinfo_dbinfo.php для соединения с базой данных и phpsqlinfo_addrow.php для добавления введенной информации в таблицу markers.
Код файла phpsqlinfo_dbinfo.php:
<?php
<?php $sdb_name = "localhost"; $user_name = "usergmap"; $user_password = "gmap123"; $db_name = "gmap_bd"; // соединение с сервером базы данных if(!$link = mysql_connect($sdb_name, $user_name, $user_password)) { echo "<br>Не могу соединиться с сервером базы данных<br>"; exit(); } // выбираем базу данных if(!mysql_select_db($db_name, $link)) { echo "<br>Не могу выбрать базу данных<br>"; exit(); } mysql_query('SET NAMES utf8'); ?> |
Код файла phpsqlinfo_addrow.php:
<?php require("phpsqlinfo_dbinfo.php"); function utf8_urldecode($str) { $str = preg_replace("/%u([0-9a-f]{3,4})/i","&#x\1;",urldecode($str)); return html_entity_decode($str,null,'UTF-8'); } // Gets data from URL parameters $name = utf8_urldecode($_GET['name']); $address = utf8_urldecode($_GET['address']); $lat = $_GET['lat']; $lng = $_GET['lng']; $type = $_GET['type']; // Insert new row with user data $query = sprintf("INSERT INTO markers " . " (id, name, address, lat, lng, type ) " . " VALUES (NULL, '%s', '%s', '%s', '%s', '%s');", mysql_real_escape_string($name), mysql_real_escape_string($address), mysql_real_escape_string($lat), mysql_real_escape_string($lng), mysql_real_escape_string($type)); $result = mysql_query($query); if (!$result) { die('Invalid query: ' . mysql_error()); } ?> |
После того, как серверные функции написаны, переходим к созданию карты и интерфейса добавления меток.
Файл будет носить название phpsqlinfo_add.html
В начале, мы создаем карту и задаем ее центр, также добавляем элементы управления на карту.
Затем добавляем две функции, функция слушателя событий GEvent.addListener и функция записи данных saveData.
Подробнее о событиях можно узнать здесь.
В функции обратного вызова GEvent.addListener по событию click создается маркер с координатами, в точке клика. Свойство перетаскивания маркера draggable, устанавливается в состояние true.
После этого, устанавливаем слушатель для маркера, по щелчку по которому открывается форма для ввода значений.
Форма имеет следующие поля: наименование, адрес, тип и кнопку «Сохранить».
По нажатию на кнопку «Сохранить» вызывается функция saveData.
В ней сохраняем все значения полей и координаты точки.
Формируем URL ссылки с параметрами.
Помещаем новый URL в качестве первого параметра функции GDownloadUrl.
Проверяем, что статус-код, возвращенный функцией GDowloadUrl, равен 200. Это означает, что все данные были успешно переданы.
Проверяем длину получившейся строки с данными. Если все нормально, то выводится сообщение о том, что информация добавлена.
Код файла phpsqlinfo_add.html:
<!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"> <head> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>Google Maps - добавление меток пользователями</title> <script src="http://maps.google.com/maps?file=api&v=2.x&key=ABQIAAAACHCJdlgAEGcD_flKUFEmVhT2yXp_ZAY8_ufC3CFXhHIE1NvwkxTeukKcKHF3ezmjTB0q6gzSBmoIUQ" type="text/javascript"></script> <script type="text/javascript"> var marker; function initialize() { if (GBrowserIsCompatible()) { var map = new GMap2(document.getElementById("map_canvas")); var map = new GMap2(document.getElementById("map_canvas")); map.setCenter(new GLatLng(56.32811,44.0), 15); map.addControl(new GLargeMapControl()); map.addControl(new GMapTypeControl()); GEvent.addListener(map, "click", function(overlay, latlng) { if (latlng) { marker = new GMarker(latlng, {draggable:true}); GEvent.addListener(marker, "click", function() { var html = "<table>" + "<tr><td>Наименование:</td> <td><input type='text' id='name'/> </td> </tr>" + "<tr><td>Адрес:</td> <td><input type='text' id='address'/></td> </tr>" + "<tr><td>Тип:</td> <td><select id='type'>" + "<option value='bar' SELECTED>Бар</option>" + "<option value='restaurant'>Ресторан</option>" + "<option value='cafe'>Кафе</option>" + "</select> </td></tr>" + "<tr><td></td><td><input type='button' value='Сохранить' onclick='saveData()'/></td></tr></form>"; marker.openInfoWindow(html); }); map.addOverlay(marker); } }); } } function saveData() { var name = escape(document.getElementById("name").value); var address = escape(document.getElementById("address").value); var type = document.getElementById("type").value; var latlng = marker.getLatLng(); var lat = latlng.lat(); var lng = latlng.lng(); var url = "phpsqlinfo_addrow.php?name=" + name + "&address=" + address + "&type=" + type + "&lat=" + lat + "&lng=" + lng; GDownloadUrl(url, function(data, responseCode) { if (responseCode == 200 && data.length <= 1) { marker.closeInfoWindow(); document.getElementById("message").innerHTML = "Данные добавлены."; } }); } </script> </head> <body onload="initialize()" onunload="GUnload()"> <div id="map_canvas" style="width: 800px; height: 600px"></div> <div id="message"></div> </body> </html> |
Посмотреть пример в действии можно здесь.
При написании этой заметки использовались следующие источники:
«ОТ ИНФО-ОКНА К БАЗЕ ДАННЫХ: СОХРАНЯЕМ ИНФОРМАЦИЮ, ВВЕДЕННУЮ ПОЛЬЗОВАТЕЛЕМ»
«From Info Windows to a Database: Saving User-Added Form Data»
В продолжении данной заметки мы научимся выводить данные из базы на карту.
Где продолжение??? требую продолжение!!!
Спасибо, отличная информация по картам
не работает, при клиеке не высвечивается форма с добавлением имени, адрес и т.д. ?
все равботает. немного подифицировал чтобы окно открывалось сразу после дропа маркера
настройки базы в файле …dbinfo.php тоже забыл вначале сделать
скопировала все ваши файл на локалхост — не работает…
и в вашей версии, при нажатии на маркер (уже когда добавлено) — ничего не происходит.. так должно быть?
или должны быть показаны данные, что находится на этом месте?
Метка просто добавляется в базу данных. Вы на локальном компьютере таблицу создали в базе данных?
да, на localhost
при точной копии ваших файлов
у меня не работает кнопка «сохранить»…
я поняла! на localhost не работает!
на хостинге все ок.
спасибо.
А как можно реализовать загрузку файла изображения в балуне? Чтобы еще и изображение ресторана или кафе могли пользователи грузить…
С html все понятно, нужно поле file, но что писать в action для формы…
Добрый день
Как реализовать добавление только одной метки (т.е. вновьпоставленная метка отменяет ранее уставнленную, если она конечно не сохранена) а не нескольких, и чтобы форма сразу появлялась при уставовке метки, а не после уставки и последующем клике на метку?
Добрый день.
А куда загружать созданные файлы? И можно ли использовать эти наработки в карте доски объявлений AdsManager?
Для использования нужно модифицировать плагин Google Maps для компонента AdsManager
Не пойму подскажите, что есть что:
$user_name = «usergmap»;
$user_password = «gmap123»;
$db_name = «gmap_bd»;
Это переменные для соединения с базой данных MySQL: $db_name — имя базы данных, $user_name — имя пользователя (логин), $user_password — пароль
Здравствуйте! Подскажите — не могу понять, где подвох. При полной копии ваших файлов, на форме и в title выводит кракозябры. Если указать вместо русского на английском — все ok. Я понимаю, что что-то с кодировкой, но где?
Нужно проверить в какой кодировке сохранены файлы, надо в UTF-8.
И еще иногда, особенно на локальном компьютере, при передачи данных из php-скрипта неверно распознается кодировка.
Для исправления нужно в самом начале php-скрипта добавить код:
передать заголовок с кодировкой
Спасибо, отличная информация.
Если добавить несколько маркеров, то при открытии infowindow для любого маркера открывается infowindow последнего добавленного маркера, а не того для которого открываем.
Исправил это установкой marker.set(«id», index);
а при клике на infowindow получал var id = this.get(«id»);
и по этому индексу ставил уже
arrInfoWindows[id].open(map, arrMarkers[id]);
Здравствуйте я пытаюсь на свой сайт http://fs-messi.do.am/ добавить гугл мап,чтобы там была возможность пометок, получил ключ…скопировал ваш последний код сохранил попросило ключ…заменил ваш на свой…сохранил,ключ не попросило,но ничего не появляется
Уважаемый ADMIN, сделал все по вашейй статье. Но возникла проблема.
Карта грузится, только через 4-5 секунд какбы перегружается , и ничего больше не показывает. данные в БД заносятся.
Здравствуйте, не могли бы вы подсказать, как можно реализовать автоматически приближение карты при клике на маркер?
Головой понимаю, что надо связать событие клика с действием, но что-то не могу разобраться как конкретно…