четверг, 25 сентября 2008 г.

Google Maps API - введение

Решил изучить немного Google Maps API. Ну и задокументировать чтобы потом мог легко вспомнить. Авось и не только мне пригодится.

Google Maps API позволяет использовать карты Google для Ваших сайтов. Имеется конечно и официальная документация (пока что вся на Английском).

http://code.google.com/intl/ru/apis/maps/documentation/

Начнемс…
Сначала необходимо зарегистрировать свой сайт и получить ключ. Это можно сделать тут:

http://code.google.com/apis/maps/signup.html

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



Как можно легко догадаться, этот ключик используется при подключении библиотеки, вот так:


<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;
key=ABQIAAAAqYpqANy2ZhPGgzZQGir01BTif9xST6-
EmBWoJN14Z8KLoR80XBTf_F2pFIKVTQmZq4YaGqQz66pNAg"
type="text/javascript"></script>




А вот код самой просто странички



<!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 JavaScript API Example</title>
<script src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIA"
type="text/javascript"></script>

<script type="text/javascript">

//<![CDATA[

function load() {
if (GBrowserIsCompatible()) {
var map = new GMap2(document.getElementById("map"));
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
}
}

//]]>
</script>
</head>

<body onload="load()" onunload="GUnload()">
<div id="map" style="width: 500px; height: 300px"></div>
</body>
</html>



А в теге body необходимо размещение обьекта с id=’map’

Теперь немного о функциях управления картой.

1) map.setCenter(new GLatLng(37.4419, -122.1419), 13);
Функция задает центр карты. Т.е. при открытии страницы с картой, она будет отцентрована по заданным координатам (необходимые координаты можно получить зайдя на maps.google.com и найдя нужное место).

2) setMapType() – задает отображаемый тип карты, которых на данный момент существует 3 штуки

a. Спутник - map.setMapType(G_NORMAL_MAP);
b. Нормальная - map.setMapType(G_SATELLITE_MAP);
c. Смешанная - map.setMapType(G_HYBRID_MAP);

3) Также можно добавить элементы управления картой

map.addControl(new GSmallMapControl()); - зумирование, и стрелочки перемещения.
map.addControl(new GLargeMapControl()); - аналогично предыдущему, но отображается и шкала зумирования
map.addControl(new GSmallZoomControl()); - отображается исключительно кнопки «+» и «-»
map.addControl(new GMapTypeControl()); - кнопки переключения между режимами карты
map.addControl(new GOverviewMapControl()); - отображение миникарты в правом нижнем углу

4) Ну и самое интересное это размещение меток на карте.

var marker = new GMarker(new GLatLng(37.4419, -122.1419));
map.addOverlay(marker);

И подписи к ним:

var html="Тут что-то расположено";
marker.openInfoWindowHtml(html);


5) map.panTo(new GLatLng(37.4569, -122.1569)) – автоматическое передвижение карты. Т.е. можно поставить прерывание например функцией window.setTimeout, и потом переместить карту в какую-либо точку.

6) Данный пример реагирует на перемещение карты и отображает новые координаты центра:

map.setCenter(new GLatLng(37.4419, -122.1419), 13);
GEvent.addListener(map, "moveend", function() {
var center = map.getCenter();
document.getElementById("message").innerHTML = center.toString();
});


7) Вывод окна сообщения без установки метки.

map.openInfoWindow(map.getCenter(), document.createTextNode
("Привет!"));

8) А данный код рисует произвольную ломанную через 5 точек

var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() - southWest.lng();
var latSpan = northEast.lat() - southWest.lat();
var points = [];
for (var i = 0; i < 5; i++) {
points.push(new GLatLng(southWest.lat() + latSpan *
Math.random(), southWest.lng() + lngSpan * Math.random()));
}
points.sort(function(p1, p2) {
return p1.lng() - p2.lng();
});
map.addOverlay(new GPolyline(points));





9) Перехват щелчков по карте. При перехвате события «click» (щелчок) мы получаем два параметра:
• щелкнут маркер;
• координаты щелчка.
Если щелкнут не маркер (а карта), то первый параметр равен нулю.

В листинге 1 пользователь щелкает по карте и по координатам щелчка появляется маркер. Когда пользователь щелкает по маркеру, маркер удаляется.

Листинг 1.

var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
GEvent.addListener(map, "click", function(marker, point) {
if (marker) {
map.removeOverlay(marker);
} else {
map.addOverlay(new GMarker(point));
}
});

10) Вывод инфоокон над маркерами. В следующем коде мы перехватываем клик и показываем окно над маркером. Здесь используются замыкания JavaScript для создания контента инфоокна для каждого маркера.

// Создаем маркер с номером point, заданным и текстом label


function createMarker(point, number) {
var marker = new GMarker(point);
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowHtml("Marker #" + number + "");
});
return marker;
}
// Размещаем 10 маркеров по случайным координатам
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() — southWest.lng();
var latSpan = northEast.lat() — southWest.lat();
for (var i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan *
Math.random(), southWest.lng() + lngSpan * Math.random());
map.addOverlay(createMarker(point, i + 1));
}





11) Информационные окна с закладками. Вторая версия Google Maps API дает нам классы openInfoWindowTabs() и GinfoWindowTab, поддерживающие закладки, которым можно присваивать отдельные имена. Пример в листинге 2 показывает простое окно с закладками над маркером.

Листинг 2.
 
var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
// Содержимое инфоокна
var infoTabs = [
new GInfoWindowTab("Закладка #1", "Содержимое закладки #1"),
new GInfoWindowTab(" Закладка #2", "Содержимое закладки #2")
];
// Размещает маркер в центре окна автоматически.
var marker = new GMarker(map.getCenter());
GEvent.addListener(marker, "click", function() {
marker.openInfoWindowTabsHtml(infoTabs);
});
map.addOverlay(marker);
marker.openInfoWindowTabsHtml(infoTabs);

12) Создание пользовательских пиктограмм. Пример в листинге 3 показывает мини-маркеры. Создавая новую пиктограмму, мы должны определить изображение переднего плана, теневое изображение и его координаты.


var map = new GMap2(document.getElementById("map"));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
// Создание пиктограммы для "маленького" маркера
var icon = new GIcon();
icon.image = "http://labs.google.com/ridefinder/images/mm_20_red.png";
icon.shadow = "http://labs.google.com/ridefinder/images/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);
// "Разбрасываем" 10 маркеров по случайным координатам
var bounds = map.getBounds();
var southWest = bounds.getSouthWest();
var northEast = bounds.getNorthEast();
var lngSpan = northEast.lng() — southWest.lng();
var latSpan = northEast.lat() — southWest.lat();
for (var i = 0; i < 10; i++) {
var point = new GLatLng(southWest.lat() + latSpan *
Math.random(), southWest.lng() + lngSpan * Math.random());
map.addOverlay(new GMarker(point, icon));
}




13) Перемещаемые маркеры.
Маркеры — интерактивные объекты, которые (если это необходимо) могут перемещаться пользователем посредством мыши. В приведенном примере мы перемещаем маркер по карте, это сделано благодаря нескольким перехватываемым простым событиям. Перемещаемый маркер поддерживает четыре события:
• щелчок (click);
• начало перетаскивания (dragstart);
• перетаскивание (drag);
• отпускание (dragend).
По умолчанию маркеры доступны только для кликов и недоступны для «таскания», но эта возможность очень просто реализуется добавлением дополнительного параметра. У перемещаемых маркеров есть также параметр «бодрость» (bouncy). Если он выставлен как true (по умолчанию), то при подхватывании и отпускании маркер весело подпрыгивает. Если вам не нравится такое «безрассудное» поведение маркера — просто выставьте bouncy=false при создании маркера, и он будет приземляться изящно (см. листинг).


var map = new GMap2(document.getElementById("map"));
var center = new GLatLng(37.4419, -122.1419);
map.setCenter(center, 13);
var marker = new GMarker(center, {draggable: true});
GEvent.addListener(marker, "dragstart", function() {map.closeInfoWindow();});
GEvent.addListener(marker, "dragend", function() {marker.openInfoWindowHtml("Веселый, бодрый маркер");});
map.addOverlay(marker);

14) Использование XML и асинхронного HTTP на картах. Пожалуй, одна из самых интересных возможностей Google Maps API. Пример в листинге загружает с сервера указанный XML-файл с координатами и размещает по ним маркеры.

Содержимое data.xml:





Листинг.
var map = new GMap2(document.getElementById(«map»));
map.addControl(new GSmallMapControl());
map.addControl(new GMapTypeControl());
map.setCenter(new GLatLng(37.4419, -122.1419), 13);
GDownloadUrl(«data.xml», function(data, responseCode) {
var xml = GXml.parse(data);
var markers = xml.documentElement.getElementsByTagName(«marker»);
for (var i = 0; i < point =" new" id="10869" href="http://code.google.com/intl/ru/apis/maps/documentation/">http://code.google.com/intl/ru/apis/maps/documentation/

Номер:)

Отдыхал летом на море и зафотал такой номер.
Думаю большинство меня поймет.

1е четыре цифры наверное номер релиза:)

воскресенье, 21 сентября 2008 г.

Интересная книженция

Зашел на днях в книжный магазин, просто так, без всякой цели... Сам не думал что выйду оттуда с новой покупкой.
И очень этой самой покупкой доволен. Правда читая (или скорее листая) главы про функции или как объявлять переменные не очень добавит знаний, но все же даже в таких главах находится чтото новое:). Вобщем всем советую.

Вот эту самую книжку я купил:



Тим Конверс, Джойс Парк, Кларк Морган
PHP 5 and MySQL Bible
Tim Converse, Joyce Park, Clark Morgan
книга "PHP 5 и MySQL. Библия пользователя. PHP5"



В книге приведены исчерпывающие сведения по созданию динамических Web-узлов на основе программных средств, предоставляемых бесплатно в общее пользование (языка PHP, сервера Apache и СУБД MySQL), а также показано, как обеспечить бесперебойную эксплуатацию таких узлов под управлением операционной системы Windows или Linux. Многочисленные сценарии и готовые программы, представленные в книге, подробно описаны, тщательно прокомментированы и составляют основу практически значимых приложений. Книга дополняет оперативную документацию, содержит все необходимые справочные данные и рассчитана на широкий круг читателей.

Оглавление
Предисловие 30
ЧАСТЬ I. ОСНОВЫ ЯЗЫКА PHP 39
Глава 1. Преимущества системы PHP и СУБД MySQL 41
Глава 2. Создание серверных сценариев для Web 63
Глава 3. Подготовка к работе с системой PHP 79
Глава 4. Включение кода PHP в код HTML 103
Глава 5. Синтаксические конструкции и переменные 111
Глава 6. Средства управления и функции 141
Глава 7. Передача информации между страницами 183
Глава 8. Строки 203
Глава 9. Массивы и функции для работы с массивами 227
Глава 10. Обработка числовых данных 261
Глава 11. Основные секреты отладки кода PHP 279
ЧАСТЬ II. PHP И MYSQL 307
Глава 12. Выбор базы данных для PHP 309
Глава 13. Основные сведения о языке SQL 327
Глава 14. Администрирование базы данных MySQL 345
Глава 15. Функции PHP для работы с СУБД MySQL 371
Глава 16. Отображение результатов запросов в таблицах 391
Глава 17. Создание форм на основе запросов 407
Глава 18. Эффективность PHP и MySQL 431
Глава 19. Нарушения в работе совместно используемых средств PHP и MySQL 449
ЧАСТЬ III. РАСШИРЕННЫЕ СРЕДСТВА И МЕТОДЫ 465
Глава 20. Средства объектно-ориентированного программирования языка PHP 467
Глава 21. Расширенные функции для работы с массивами 515
Глава 22. Функции для работы со строками и регулярными выражениями 529
Глава 23. Функции для работы с файловой системой и системные функции 551
Глава 24. Сеансы, cookie-файлы и протокол HTTP 573
Глава 25. Типы и преобразования типов 603
Глава 26. Усовершенствованные способы использования функций 613
Глава 27. Выполнение математических расчетов 625
Глава 28. Репозитарий PEAR 643
Глава 29. Защита данных 657
Глава 30. Конфигурация 685
Глава 31. Исключительные ситуации и обработка ошибок 705
Глава 32. Отладка 719
Глава 33. Стиль 737
ЧАСТЬ IV. ВЗАИМОДЕЙСТВИЕ PHP С ДРУГИМИ СИСТЕМАМИ 765
Глава 34. СУБД PostgreSQL 767
Глава 35. СУБД Oracle 785
Глава 36. Функции PEAR для работы с базами данных 817
Глава 37. Электронная почта 831
Глава 38. Языки PHP и JavaScript 855
Глава 39. Языки PHP и Java 871
Глава 40. Языки PHP и XML 885
Глава 41. Web-службы 915
Глава 42. Графика 937
ЧАСТЬ V. УЧЕБНЫЕ ПРОЕКТЫ 963
Глава 43. Web-журналы 965
Глава 44. Аутентификация пользователей 983
Глава 45. Система рейтинговых оценок 1021
Глава 46. Несложная игра 1037
Глава 47. Преобразование статических HTML-узлов 1079
Глава 48. Визуализация данных с помощью диаграмм Венна 1111
Приложение А. Краткие сведения о языке PHP для программистов, работающих на языке C 1135
Приложение Б. Краткие сведения о языке PHP для программистов, работающих на языке Perl 1141
Приложение В. Краткие сведения о языке PHP для программистов, использующих язык HTML 1149
Приложение Г. Информационные ресурсы PHP 1161
Предметный указатель 1176

суббота, 20 сентября 2008 г.

Приятные воспоминания

Сегодня шел, слушал плеер и нахлынули воспоминания.
Был этим летом в Германии. Вокруг вне не наше, немецкое. Как люди, так и музыка.
Помню поехали на экскурсию, по прошествии 3х недель пребывания там. И я включил в плеере эту песню (см ниже), и на меня навалилось...., настолько поднялось настроение.., я готов был слушать эту песню еще раз и еще раз...., и я понял насколько дома все таки лучше. Музыка в тот момент стала частичкой дома.