<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>CTAPbIu_MABP&#039;s BLOG &#187; Google</title>
	<atom:link href="http://mabp.kiev.ua/tag/google/feed/" rel="self" type="application/rss+xml" />
	<link>http://mabp.kiev.ua</link>
	<description>Не вижу проблем, кроме лени! &#169; Старый Мавр</description>
	<lastBuildDate>Fri, 10 Sep 2010 00:35:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Raphaël Overlay</title>
		<link>http://mabp.kiev.ua/2010/09/10/raphael-overlay/</link>
		<comments>http://mabp.kiev.ua/2010/09/10/raphael-overlay/#comments</comments>
		<pubDate>Fri, 10 Sep 2010 00:20:16 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[2d]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1250</guid>
		<description><![CDATA[После недавних
экспериментов я решил создать что-то, чем действительно можно пользоваться для рисования по картам.


Ссылка для скачивания в самом низу страницы.










Начал с примитивов - прямоугольников (картинок) и кругов (эллипсов). Дело совершенно не хитрое перевел координату в точки по карте и умножил сторону (радиус) на два в степени приближение.





// рисуем круг из центра координат с радиусом


Overlay.prototype.onAdd = [...]]]></description>
			<content:encoded><![CDATA[<p>После <a href="http://mabp.kiev.ua/2010/08/22/google-maps-v3-and-raphael/">недавних</a>
<a href="http://mabp.kiev.ua/2010/09/04/google-maps-v3-raphael-overlay/">экспериментов</a> я решил создать что-то, чем действительно можно пользоваться для рисования по картам.</p>
<span id="more-1250">
</span>
<p>Ссылка для скачивания в самом низу страницы.</p>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript" src="/content/source/raphael-1.5.0.min.js">
</script>
<script type="text/javascript" src="/content/source/googlemaps/EuclideanProjection.js">
</script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelOverlay-0.5.js">
</script>
<script type="text/javascript" src="/content/examples/raphael-overlay.js">
</script>
<p>Начал с примитивов - прямоугольников (картинок) и кругов (эллипсов). Дело совершенно не хитрое перевел координату в точки по карте и умножил сторону (радиус) на два в степени приближение.</p>
<pre>
<code class="javascript">



// рисуем круг из центра координат с радиусом


Overlay.prototype.onAdd = function() {


	var center = this.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(0,0)), // центр мира
		worldWidth = this.getProjection().getWorldWidth(); // длина мира


	this.div = document.createElement('div'); // наш слой
	this.div.style.border = 'none';
	this.div.style.position = 'absolute';
	this.div.style.overflow = 'visible';
	this.div.style.left = center.x - worldWidth / 2 + 'px'; // от левого края карты
	this.div.style.top = center.y - worldWidth / 2 + 'px'; // от верха карты
	this.div.style.width = worldWidth+'px'; // шириной в карту
	this.div.style.height = worldWidth+'px'; // высотой в карту


	// таким образом див полностью перекрывает одну (центральную) секцию карты
	// заметте, карта повторяеться горизонтально 
	// но этот слой лежит только поверх одной секции не перекрывая соседние


	this.getPanes().overlayImage.appendChild(this.div); // добавляем слой на карту
	this.canvas = Raphael(this.div); // делаем из слоя холст для рисования


};


Overlay.prototype.draw = function() {
	var center = this.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(0,0)), // центр круга
		worldWidth = this.getProjection().getWorldWidth(), // длина карты
		left = center.x - worldWidth / 2, // край карты
		top = center.y - worldWidth / 2, // край карты
		scale = 1 &lt;&lt; this.getMap().getZoom(), // увеличение ( Math.pow(2, zoom))
		r = scale * radius, // реальный радиус
		x = center.x - left, // координата по слою
		y = center.y - top; // координата по слою


		this.canvas.clear(); // чистим холст от старых картинок
		this.canvas.circle(x, y, r); // рисуем круг


}



</code>
</pre>
<p>Вот собственно простейший пример и готов. Но мне же этого мало! А что если круг нарисовать с радиусом больше чем worldWidth/2? Тогда он будет вылазить за рамки слоя и будет обрезан по краям. Но это же не кошерно (или не по фен-шую :) ). Что же делать? Надо расширить слой. Слой расширяется в четырех направлениях так как он выпирает за границы слоя со всех четырех сторон. просто расширить слой не достаточно потому как див перестанет выпирать только справа и снизу, надо еще сместить див влево и вверх, но если сместили див надо поправить координаты круга. Для тех кто не дружит с математикой как я все страшно запутано поэтому показываю на примере.</p>
<pre>
<code class="javascript">



// r > worldWidth / 2 по условию


Overlay.prototype.draw = function() {
	var center = this.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(0,0)), // центр круга
		worldWidth = this.getProjection().getWorldWidth(), // длина карты
		left = center.x - worldWidth / 2, // край карты
		top = center.y - worldWidth / 2, // край карты
		scale = 1 &lt;&lt; this.getMap().getZoom(), // увеличение ( Math.pow(2, zoom))
		r = scale * radius, // реальный радиус
		x = center.x - left, // координата по слою
		y = center.y - top, // координата по слою


		// отступы
		offsetLeft = r - x,
		offsetTop = r - y,
		offsetRight = r + x - worldWidth,
		offsetBottom = r + y - worldWidth,


		// длина и высота учитывая отступы
		fullWorkdWidth = offsetLeft + worldWidth + offsetRight,
		fullWorkdHeight = offsetTop + worldWidth + offsetBottom;


		// изменяем положение слоя и размеры холста
		this.div.style.left = left - offsetLeft + 'px';
		this.div.style.top = top - offsetTop + 'px';
		this.div.style.width = fullWorkdWidth + 'px';
		this.div.style.height = fullWorkdHeight + 'px';
		this.canvas.setSize(fullWorkdWidth, fullWorkdHeight);


		this.canvas.clear();
		this.canvas.circle(x, y, r); // рисуем круг


}



</code>
</pre>
<p>В результате получаеться где-то такая фигура</p>
<div id="map1" style="width:600px;height:400px;">
</div>
<p>Примерно так же рассчитываться прямоугольники, но показывать их просто так не интересно, интересно станет когда фигур на карте будет больше одной и выпирать они будут за края карты с разных сторон и на разную длину. В этом случаи надо сначала просчитать все фигуры, найти максимальные отступы, подвинуть слой, сместить фигуры и только потом что-то рисовать. Пробуем:</p>
<div id="map2" style="width:600px;height:400px;">
</div>
<p>Походу с примитивами разобрались, Но кому нужны эти примитивы? Все хотят отмечать на карте разного рода кривые и полигоны (многогранники), что же, нужно и это реализовать. Возьмем пример которым пользуется Dmitry Baranovskiy, автор RaphaelJS - это <a href="http://ru.wikipedia.org/wiki/Лист_Мёбиуса" rel="nofollow external">петля Мёбиуса</a>, знак бесконечности или просто перевернутая восьмерка для людей без воображения. Задаётся она вот такими координатами <span style="color:#107020;font-weight:bold;">M100,100c0,50 100-50 100,0c0,50 -100-50 -100,0z</span>. Координаты как вы ведите относительные (это видно из маленьких "с"), но даже если бы они были абсолютными это было бы не страшно. Первое что делаем переводим абсолютные в относительные, потом смещаем первую точку куда нам надо и умножаем все остальные точки по известной формуле.</p>
<pre>
<code class="javascript">



Overlay.prototype.draw = function() {
	var center = this.getProjection().fromLatLngToDivPixel(new google.maps.LatLng(0,0)), // точка смещения
		worldWidth = this.getProjection().getWorldWidth(), // длина карты
		left = center.x - worldWidth / 2, // край карты
		top = center.y - worldWidth / 2, // край карты
		scale = 1 &lt;&lt; this.getMap().getZoom(), // увеличение ( Math.pow(2, zoom))
		path = Raphael.pathToRelative(Raphael.parsePathString("M100,100c0,50 100-50 100,0c0,50 -100-50 -100,0z"));
		line = [];


		for (var i in path) {
			for (var j in path[i]) {
				if (j == 0) {
					line[i] = [path[i][j]]; // буква
				} else if (i==0 &#038;&#038; j==1) {
					line[i].push(center.x - left + path[i][j]); // начальная точка по X
				} else if (i==0 &#038;&#038; j==2) {
					line[i].push(center.y - top + path[i][j]); // начальная точка по Y
				} else {
					line[i].push(path[i][j] * scale);  // все остальные точки
				}
			}
		}


		this.canvas.clear();
		this.canvas.path(line);


}



</code>
</pre>
<div id="map3" style="width:600px;height:400px;">
</div>
<p>Единственный минус рисования кривой (как и текста), это то что пока не нарисуешь не узнаешь размеров, конечно можно долго высчитывать их по координатам но по моему это того не стоит, особенно если координаты относительные. С другой стороны узнать размер можно после рисования, вытереть и сместить все что нужно и нарисовать по новой, но по моему это требует еще больше усилий, хотя формулой для этого я не поделиться не могу.</p>
<pre>
<code class="javascript">



	// для кривой (рисуеться с левого верхнего края)
	var path = this.canvas.path(line),
		width = path.getBBox().width,
		height = path.getBBox().height,
		x = point.x - left,
		y = point.y - top;


	// для текста (рисуеться из центра)
	var text = this.canvas.text(point.x, point.y, text),
		width = text.getBBox().width,
		height = text.getBBox().height,
		x = point.x - width / 2 - left,
		y = point.y - height / 2 - top;



</code>
</pre>
<p>С основными возможностями и трудностями рисования разобрались переходим к конкретным примерам</p>
<p>Прямоугольники</p>
<p>Есть пять разный вариантов нарисовать прямоугольник</p>
<ul>
<li>Ограничить область на карте с помощью границ (LatLngBounds)</li>
<li>Нарисовать как во всех графических редакторах из верхнего левого угла с привязкой к координате</li>
<li>Нарисовать как круг указав координату центра</li>
<li>Нарисовать от левого верхнего угла в определенной точке на карте, при этом надо знать размер дива с картой и сам прямоугольник не будет менять позиции про движении карты, а уедет за край видимой области</li>
<li>То же что и предыдущий, только из центра</li>
</ul>
<pre>
<code class="javascript">



	var map = new google.maps.Map(document.getElementById("map"), {
		zoom: 0,
		center: new google.maps.LatLng(0,0),
		mapTypeId: google.maps.MapTypeId.SATELLITE
	});


	new RaphaelOverlay({
		map:map,
		shapes : [{
			// прямоугольник ограниченный парой координат
			// может пропадать при движении карты
			// из-за отрицательной длинны
			position : new google.maps.LatLngBounds(
				// верхний првым угол (north-east)
				new google.maps.LatLng(50, -100), 
				// нижний левый угол (south-west)
				new google.maps.LatLng(-50, 100)
			),
			type: "rect",
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#00f', 
				"fill-opacity": 0.3
			}
		},{
			// обычный прямоугольник нарисованный 
			// из верхнего левого угла
			// от координат 
			position : new google.maps.LatLng(85, -175),
			// и имеющий размеры 100x100
			size : new google.maps.Size(100, 100),
			type: "rect",
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#0f0', 
				"fill-opacity": 0.3
			}
		},{
			// прямоугольник нарисованный 
			// из центра
			// от координат
			center : new google.maps.LatLng(-85, 175),
			// и имеющий размеры 100x100
			size : new google.maps.Size(100, 100),
			type: "rect",
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		},{
			// прямоугольник нарисованный 
			// из верхнего левого угла
			// от верхнего левого угла карты
			// такой прямоугольник не меняет позиции 
			// при движении карты
			position : new google.maps.Point(300, 100),
			size : new google.maps.Size(100, 100),
			type: "rect",
			// скругление углов
			radius: 10,
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#ff0', 
				"fill-opacity": 0.3
			}
		},{
			// такой же как предыдущий, только 
			// из центра 
			center : new google.maps.Point(300, 100),
			size : new google.maps.Size(100, 100),
			type: "rect",
			// скругление углов
			radius: 10,
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f0f', 
				"fill-opacity": 0.3
			}
		}]
	});



</code>
</pre>
<div id="map4" style="width:600px;height:400px;">
</div>
<p>Картинки</p>
<p>По большому счету ничем не отличаются от прямоугольников, кроме того что имеют ссылку на картинку и не имеют скругления углов</p>
<pre>
<code class="javascript">



	new RaphaelOverlay({
		map:map,
		shapes : [{
			// ссылка на картинку
			src : "http://upload.wikimedia.org/wikipedia/commons/d/d6/Wikipedia-logo-v2-en.png",
			position : new google.maps.LatLng(85, -175),
			size : new google.maps.Size(135, 155),
			type: "image"
		}]
	});



</code>
</pre>
<div id="map5" style="width:600px;height:400px;">
</div>
<p>Круги и овалы</p>
<pre>
<code class="javascript">



	new RaphaelOverlay({
		map:map,
		shapes : [{
			// у круга центр совпадает с позицией
			// но центр приоритетнее
			center: new google.maps.LatLng(85, 175),
			type: "circle",
			radius: 100,
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#0f0', 
				"fill-opacity": 0.3
			}
		},{
			// как и квадрат круг и овал можно рисовать
			// из фиксированной точки
			position: new google.maps.Point(300, 100),
			type: "circle",
			radius: 100,
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		},{
			// овал отличается от круга двумя радиусами
			position: new google.maps.LatLng(-85, -175),
			type: "ellipse",
			rx: 100,
			ry: 50,
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#00f', 
				"fill-opacity": 0.3
			}
		}]
	});



</code>
</pre>
<div id="map6" style="width:600px;height:400px;">
</div>
<p>Кривые и полигоны</p>
<pre>
<code class="javascript">



	new RaphaelOverlay({
		map:map,
		shapes : [{
			// Фигура нарисованная по координатам
			// может менять ширину при движении карты
			position : [
				new google.maps.LatLng(84, -175),
				new google.maps.LatLng(84, 175),
				new google.maps.LatLng(0, 0)
			],
			type: "polygon",
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		},{
			// Фигура нарисованная по кривой 
			// с абсолютными координатами
			position: new google.maps.LatLng(85, -175),
			path: "M 0 0 L 200 0 L 100 200 z",
			type: "path",
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		},{
			// Фигура нарисованная по кривой 
			// с относительными координатами
			position: new google.maps.LatLng(85, -175),
			path: "M100,100c0,50 100-50 100,0c0,50 -100-50 -100,0z",
			type: "path",
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		}]
	});



</code>
</pre>
<div id="map7" style="width:600px;height:400px;">
</div>
<p>Текст</p>
<pre>
<code class="javascript">



	new RaphaelOverlay({
		map:map,
		shapes : [{
			position: new google.maps.LatLng(0, 0),
			text : "CTAPbIu_MABP",
			type: "text",
			attr : {
				fill: '#fff', 
				"font-size" : 20
			}
		}]
	});



</code>
</pre>
<div id="map8" style="width:600px;height:400px;">
</div>
<p>Похоже это все, забыл только сказать что есть еще настройка приближения. Поскольку во всех примерах приближение поставлено минимальное, то при приближении хотя бы 10 все фигуры распадутся и будет очень некрасиво. Это происходит по разным причинам - кривизна SVG или VML или переполнение int32 в параметре ширины или высоты. Поэтому я сделал поправку на приближение. Первых два пункта интуитивно понятны это минимальное и максимальное приближение на котором видно фигуру, а третий пункт это приближение на котором заданы координаты кривых. То есть фигуру видно с 3 по 5 приближение, но координаты были рассчитаны при нулевом то можно это указать, иначе считается что они были заданы по меньшему из видимых. Смотрите пример с 3 по 5 приближение возле маркера.</p>
<pre>
<code class="javascript">



	new RaphaelOverlay({
		map:map,
		shapes : [{
			position: new google.maps.LatLng(0, 0),
			path: "M0,0c0,50 100-50 100,0c0,50 -100-50 -100,0z",
			type: "path",
			zoom : {
				min : 3,
				max : 5,
			},
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		},{
			position: new google.maps.LatLng(0, 0),
			path: "M0,0c0,50 100-50 100,0c0,50 -100-50 -100,0z",
			type: "path",
			zoom : {
				min : 3,
				max : 5,
				adjusted : 0
			},
			attr : {
				stroke: '#fff', 
				"stroke-width":2, 
				fill: '#f00', 
				"fill-opacity": 0.3
			}
		}]
	});



</code>
</pre>
<div id="map9" style="width:600px;height:400px;">
</div>
<p> Скачать скрипт можно тут <a href="http://mabp.kiev.ua/content/source/googlemaps/RaphaelOverlay-0.5.js">DOWNLOAD LINK</a>. Вот и все, надеюсь будет хоть кому-то полезно!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/09/10/raphael-overlay/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Google Maps v3 &amp; Raphaël Overlay</title>
		<link>http://mabp.kiev.ua/2010/09/04/google-maps-v3-raphael-overlay/</link>
		<comments>http://mabp.kiev.ua/2010/09/04/google-maps-v3-raphael-overlay/#comments</comments>
		<pubDate>Sat, 04 Sep 2010 21:51:43 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[2d]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1248</guid>
		<description><![CDATA[Прошлый раз была небольшая заметочка о том как рисовать при помощи Raphaël на гуглокартах. На этот раз будет статья посерьезнее.


На этот раз я довел Эвклидову проекцию до ума, и теперь с ней действительно можно что-то рисовать. А так же накодил более менее сносную прокладку между Raphaël и Google Maps, теперь ею можно рисовать. Пожалуй вот [...]]]></description>
			<content:encoded><![CDATA[<p>Прошлый раз была <a href="http://mabp.kiev.ua/2010/08/22/google-maps-v3-and-raphael/">небольшая заметочка</a> о том как рисовать при помощи Raphaël на гуглокартах. На этот раз будет статья посерьезнее.</p>
<span id="more-1248">
</span>
<p>На этот раз я довел <a href="http://mabp.kiev.ua/2010/08/16/custom-maptype-projection-in-google-map-api-v3/">Эвклидову проекцию</a> до ума, и теперь с ней действительно можно что-то рисовать. А так же накодил более менее сносную прокладку между Raphaël и Google Maps, теперь ею можно рисовать. Пожалуй вот сейчас этим и займемся.</p>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript" src="/content/source/raphael-1.5.0.min.js">
</script>
<script type="text/javascript" src="/content/source/googlemaps/EuclideanProjection.js">
</script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelOverlay-0.1.js">
</script>
<script type="text/javascript" src="/content/examples/google-maps-v3-raphael-overlay.js">
</script>
<div id="map" style="width:300px; height:400px;margin:auto;">
</div>
<p>Код прокладки еще сырой и выкладывать его пока не буду, чтобы потом по 10 раз не править. Но если кто хочет посмотреть то он может посмотреть его <a href="http://mabp.kiev.ua/content/source/googlemaps/RaphaelOverlay-0.1.js">тут</a>. А я пока прокомментирую. Для того чтобы нарисовать что-либо поверх карты рисуется див во всю ширину и высоту. Да-да вы правильно поняли если взять гуглокарту и приблизить уровень так на десятый, чтобы стало видно города, то ширина дива будет несколько тысяч пикселей. Потом в этом диве Raphaël уже рисует свои фигуры. Передаваемые параметры считаются за первый уровень приближения, дальше масштабируются по простой формуле [width = width * (1 << zoom)]. У меня на практике такой образ отрисовки совсем не тормозил, не смотря на космические цифры (Core2 2.33, RAM 4, FF 3.6.8), расскажите в каментах как быстро рисуеться у вас.</p>
<p>Из видимых недостатков только один - если подвигать карту чуть-чуть вправо-влево то видно что четвертушка круга рисуется то в правом, то в левом верхнем углу. И там и там она рисуется правильно, но еще правильнее было бы ели бы рисовался полный круг выходя за края карты, но поскольку див (соответственно и область рисования svg или vml) имеет ширину и высоту карты, то вылезти за его рамки не представляется возможным и фигура остается усеченной. Надо будет попробовать задавать размеры диву при отрисовке каждой новой фигуры.</p>
<p>А теперь я пожалуй  покажу  как этим добром пользоваться, думаю что при добавлении новых возможностей вид передаваемых данных не измениться</p>
<pre>
<code class="javascript">

function initialize() {


	// для всяких недобраузеров или отключенного фаербага
	if (!("console" in window)){
		window.console = {log:alert};
	}


	// я использую Эвклидову проекцию но можно брать и обычные карты
	var map = new google.maps.Map(document.getElementById("map"), {
		zoom : 0,
		center : new google.maps.LatLng(0,0),
		mapTypeControlOptions : {
			mapTypeIds: ['myCustomMap']
		}
	});


	map.mapTypes.set('myCustomMap', new CoordMapType());
	map.setMapTypeId('myCustomMap');


	// маркер для того чтобы проверить координату
	var marker = new google.maps.Marker({
		position : new google.maps.LatLng(0, 0),
		map : map,
		draggable : true
	});


	google.maps.event.addListener(marker, 'dragend', function() {
		console.log(this.getPosition());
	});


	// а вот и новый слой
	new RaphaelOverlay({
		map : map,
		figures : [{
			position : new google.maps.LatLng(85, 175),
			type : "circle",
			radius : 100,
			attr : {
				"stroke" : "#fff", 
				"stroke-width" : 2, 
				"fill" : '#000', 
				"fill-opacity" : 0.3
			}
		},{
			position: new google.maps.LatLng(85, -175),
			type: "rect",
			width: 100,
			height: 100,
			attr : {
				"stroke" : "#fff", 
				"stroke-width" : 2, 
				"fill" : '#000', 
				"fill-opacity" : 0.3
			}
		},{
			position : new google.maps.LatLng(0, 0),
			type : "ellipse",
			rx : 100,
			ry : 50,
			attr : {
				"stroke" : "#fff", 
				"stroke-width" : 2, 
				"fill" : "#000", 
				"fill-opacity" : 0.3
			}
		},{
			position : new google.maps.LatLng(0, 0),
			src : "http://upload.wikimedia.org/wikipedia/commons/d/d6/Wikipedia-logo-v2-en.png",
			type : "image",
			width : 135,
			height : 155
		},{
			position : new google.maps.LatLng(0, 0),
			text : "CTAPbIu_MABP",
			type : "text",
			attr : {
				"fill" : "#fff", 
				"font-size" : 20
			}
		}]
	});


}


google.maps.event.addDomListener(window, 'load', initialize);

</code>
</pre>
<p>Самое сложное во всем этом было пожалуй пересчет координат из широты-долготы в пиксели по карте, но по моему получилось весьма неплохо. В ближайшее время думаю добавить еще пару функций и довести код до приличного вида.</p>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/09/04/google-maps-v3-raphael-overlay/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Maps v3 &amp; Raphaël</title>
		<link>http://mabp.kiev.ua/2010/08/22/google-maps-v3-and-raphael/</link>
		<comments>http://mabp.kiev.ua/2010/08/22/google-maps-v3-and-raphael/#comments</comments>
		<pubDate>Sun, 22 Aug 2010 13:31:59 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[Raphaël]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1240</guid>
		<description><![CDATA[Совсем коротенький пост о том как подружить Google Maps v3 и Raphaël


Я упомянул в прошлом посте, что я хотел нарисовать десяточку на улыбке Моны Лизы, но из-за стечения обстоятельств так этого и не сделал. И не сделаю сегодня ;) Но покажу куда копать.
В третьей (3.1 если быть точнее) версии API появились встроенные объекты, попробуем их [...]]]></description>
			<content:encoded><![CDATA[<p>Совсем коротенький пост о том как подружить Google Maps v3 и Raphaël</p>
<span id="more-1240">
</span>
<p>Я упомянул в прошлом <a href="http://mabp.kiev.ua/2010/08/16/custom-maptype-projection-in-google-map-api-v3/">посте</a>, что я хотел нарисовать десяточку на улыбке Моны Лизы, но из-за стечения обстоятельств так этого и не сделал. И не сделаю сегодня ;) Но покажу куда копать.</p>
<p>В третьей (3.1 если быть точнее) версии API появились встроенные объекты, попробуем их использовать для рисования.</p>
<pre>
<code class="javascript">

	for (var i=0,j=11;i&ly;j;i++){
		new google.maps.Circle({
			strokeWeight: 2,
			strokeColor : "#ffffff",
			map : map,
			center : new google.maps.LatLng(0, 0),
			radius : i*1000000
		});
	}

</code>
</pre>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript" src="/content/source/raphael-1.5.0.min.js">
</script>
<script type="text/javascript" src="/content/source/googlemaps/EuclideanProjection.js">
</script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelCircle.js">
</script>
<script type="text/javascript" src="/content/examples/google-maps-v3-raphael.js">
</script>
<div id="map1" style="width:300px; height:400px;margin:auto;">
</div>
<p>
<strong>Updated 04.09.10</strong> после небольшой коррекции реализации Эвклидовой проекции, круги перестали правильно рисоваться, так что в этом примере проекция немного подхачена, чтобы вернуть кругу былую квадратность.</p>
<p>В рот мне ноги! Да это же квадратичный круг! Не-не-не Дэвид Блэйн ты нас не проведешь!</p>
<p>Вобщем вы поняли что это лажа и при больших радиусах круг становиться не очень круглым. Хотя идея хороша.</p>
<p>Ну думаю самое время перейти к рисованию кругов при помощи Raphaël</p>
<pre>
<code class="javascript">

function RaphaelCircle(options) {
	this.options = options;
	this.setMap(options.map);
}


RaphaelCircle.prototype = new google.maps.OverlayView();


RaphaelCircle.prototype.onAdd = function() {
	this.div = document.createElement('DIV');
	this.div.style.border = '0px solid';
	this.div.style.position = 'absolute';
	this.div.style.overflow = 'visible';


	this.getPanes().overlayImage.appendChild(this.div);
	this.canvas = Raphael(this.div, 100, 100);
};


RaphaelCircle.prototype.draw = function() {


	var radius = (1 << this.getMap().getZoom()) * this.options.radius,
		center = this.getProjection().fromLatLngToDivPixel(this.options.position);
	this.div.style.left = center.x - radius / 2 + 'px';
	this.div.style.top = center.y - radius / 2 + 'px';
	this.div.style.width = radius + 'px';
	this.div.style.height = radius + 'px';
	this.canvas.setSize(radius, radius);
	if (this.circle) {
		this.circle.remove();
	}
	this.circle = this.canvas.circle(radius / 2, radius / 2, radius / 2)
	this.circle.attr({stroke: '#fff', "stroke-width":2, fill: '#000', "fill-opacity": 0.3});


};


RaphaelCircle.prototype.onRemove = function() {
	this.circle.remove();
	this.div.parentNode.removeChild(this.div);
};

</code>
</pre>
<p>Если забить на то как я обошёлся с опциями при создании объекта, то в принципе все нормально. Можно запускать!</p>
<div id="map2" style="width:300px; height:400px;margin:auto;">
</div>
<p>С таким подходом можно создать новый overlay который будет рисовать не просто круг а сразу всю десяточку. Успехов!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/08/22/google-maps-v3-and-raphael/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Custom MapType &amp; Projection in Google Map API v3</title>
		<link>http://mabp.kiev.ua/2010/08/16/custom-maptype-projection-in-google-map-api-v3/</link>
		<comments>http://mabp.kiev.ua/2010/08/16/custom-maptype-projection-in-google-map-api-v3/#comments</comments>
		<pubDate>Mon, 16 Aug 2010 21:52:26 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1233</guid>
		<description><![CDATA[Сегодня я бы хотел продолжить начатый ранее разговор о гуглокартах. Сегодня будет сложный урок с большой долей теории и не смотря на выпитые два литра пива я все равно намереваюсь это сделать.


На самом деле я искал репродукцию Моны Лизы для того чтобы нарисовать мишень (десяточку) на ее улыбке, но в галереи этой репродукции не было. [...]]]></description>
			<content:encoded><![CDATA[<p>Сегодня я бы хотел продолжить начатый ранее <a href="http://mabp.kiev.ua/tag/map/">разговор о гуглокартах</a>. Сегодня будет сложный урок с большой долей теории и не смотря на выпитые два литра пива я все равно намереваюсь это сделать.</p>
<span id="more-1233">
</span>
<p>На самом деле я искал репродукцию Моны Лизы для того чтобы нарисовать мишень (десяточку) на ее улыбке, но в галереи этой репродукции не было. Да и вообще к тому времени как я при помощи своего гуглоридера (сколько раз мама говорила - ставь звездочки) нашел эту галерею, я уже об этом не думал. Кстати о галерее - <a href="http://www.thekremercollection.com/art/">The Kremer Collection</a>! Очень уж она хороша, в плане того, что ребята  не заебались и отсканили какие-то каляки-маляки. Но видимо в силу своей <a href="http://lurkmore.ru/Быдло">неграмотности, убогости и непросвещенности</a> я ни одной знакомой фамилии художника так и не заметил.</p>
<p>
<strong>Upadte 17.08.10</strong> ShadowX уже уличил меня в том, что я незаметил Рембранта.</p>
<p>Так, хватит болтать не по теме. С десяточкой не вышло, а вот галерея как мне показалось работает не по феншую. Мало того что работает на выходных и без обеденного перерыва так еще и на Google Map API v2. Простите за ключевики но такова природа блога что его должны находить через поисковик. И задумал я коварное, а точнее перевести ее на Google Map API v3. И вооружился для этого мануалом, но тот не помог мне, потому что глуп я и в системах координат, да и вообще в математике не шарю. И стал я читать умную литературу... вру! Кароче, нагуглил я реализацию трех систем координат (про две из них я уже <a href="http://mabp.kiev.ua/2009/12/29/mercator_detected/">писал</a>) <a href="http://code.google.com/apis/maps/documentation/javascript/examples/map-coordinates.html">Меркатора</a>, <a href="http://code.google.com/apis/maps/documentation/javascript/examples/map-projection-simple.html">Гэлла и Питерса</a> и та что мне была нужна - <a href="http://library.ucf.edu/testing/Systems/Library_Maps_Google/ProjectionTest.html">Эвклидова</a>
</p>
<p>Вот с ней то я дальше и игрался, переписав код как мне больше нравилось и применив функцию создания имени картинки, честно стыренную из галереи, я сообразил вот это:</p>
<pre>
<code class="javascript">

// Эвклидова Проекция
var EuclideanProjection = function (){
	// Ширина, она же высота одного кусочка картинки
	var EUCLIDEAN_RANGE = 256; 
	// Центр этой самой картинки
	this.pixelOrigin = new google.maps.Point(EUCLIDEAN_RANGE / 2, EUCLIDEAN_RANGE / 2);
	// Количество градусов в одном пикселе картинки
	this.pixelsPerLonDegree = EUCLIDEAN_RANGE / 360;
	// Количество радиан в одном пикселе картинки
	this.pixelsPerLonRadian = EUCLIDEAN_RANGE / (2 * Math.PI);
};


// Эти два метода надо реализовать в классе проекции
// http://code.google.com/apis/maps/documentation/javascript/maptypes.html#Projections
EuclideanProjection.prototype = {
	pixelOrigin : new google.maps.Point(0,0),
	pixelsPerLonDegree : 0,
	pixelsPerLonRadian : 0,


	// код взят из 
	// http://library.ucf.edu/Web/JS/Maps.js
	// в работе можно глянуть тут
	// http://library.ucf.edu/Administration/Maps/
	// страна должна знать героев в лицо
	fromLatLngToPoint : function(latLng, opt_point) {
		var point = opt_point || new google.maps.Point(0, 0);
		point.x = this.pixelOrigin.x + latLng.lng() * this.pixelsPerLonDegree;
		point.y = this.pixelOrigin.y + (-1 * latLng.lat()) * this.pixelsPerLonDegree;
		//console.log("fromLatLngToPoint", latLng, point);
		return point;
	},


	fromPointToLatLng : function(point) {
		var lng = (point.x - this.pixelOrigin.x) / this.pixelsPerLonDegree,
			lat = -1 * (point.y - this.pixelOrigin.y) / this.pixelsPerLonDegree;
		//console.log("fromPointToLatLng", point, new google.maps.LatLng(lat , lng, true));
		return new google.maps.LatLng(lat , lng, true);
	}
};


// Новый тип карты CoordMapType
// http://code.google.com/apis/maps/documentation/javascript/maptypes.html#MapTypeInterface
var CoordMapType = function (){};
CoordMapType.prototype = {
	name : "Custom Map Type",
	alt : "Tile Coordinate Map Type",
	minZoom : 0,
	maxZoom : 5,
	tileSize : new google.maps.Size(256,256),
	projection : new EuclideanProjection(),
	// Эта функция взята из галереи The Kremer Collection
	// http://www.thekremercollection.com/art/artists/Adriaen-Thomasz-Key-%28formerly-attributed-to%29/Portrait-of-a-Spanish-grande/detail/
	// и испотльзуеться только для составления имен картинок эток конкретной галереи
	getTile : function(coord, zoom, ownerDocument) {
		var div = ownerDocument.createElement('DIV'),
		c = 1 &lt;&lt; zoom,
		x = coord.x,
		y = coord.y;


		if (y &lt; 0 || y &gt;= c || x &lt; 0 || x &gt;= c || zoom &gt; 4) {
			div.style.height = '256px';
			div.style.width = '256px';
			div.style.backgroundColor = '#fcf8ed';
			div.style.fontSize = '9';
			div.style.textAlign = 'center';
			div.innerHTML = zoom &gt; 4 ? 'Sorry, we have no map &lt;br /&gt; images for this zoom level.' : '';
			return div;
		}


		for (var g = 0, f = "t"; g &lt; zoom; g++) {
			c = c / 2;
			if (y &lt; c) {
				if (x &lt; c) {
					f += "q"
				} else {
					f += "r";
					x -= c
				}
			} else {
				if (x &lt; c) {
					f += "t";
					y -= c
				} else {
					f += "s";
					x -= c;
					y -= c
				}
			}
		}


		div.innerHTML = "&lt;img src=\"http://www.thekremercollection.com/art/img/paintings/zoom/portrait_of_a_spanish_grande_tiles_14/" + f + ".jpg\" alt=\"\" width=\"256\" height=\"256\" /&gt;";


		return div;
	}
};


function initialize() {


    var map = new google.maps.Map(document.getElementById("map"), {
		zoom: 0,
		center: new google.maps.LatLng(0,0),
		mapTypeControlOptions: {
			mapTypeIds: ['myCustomMap']
		}
    });


    map.mapTypes.set('myCustomMap', new CoordMapType());
    map.setMapTypeId('myCustomMap');	
}
google.maps.event.addDomListener(window, 'load', initialize);

</code>
</pre>
<p>Ну и конечно можете пощупать в живую</p>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript" src="/content/source/googlemaps/EuclideanProjection.js">
</script>
<script type="text/javascript" src="/content/examples/custom-maptype-projection-in-google-map-api-v3.js">
</script>
<div id="map" style="width:600px; height:800px;">
</div>
<p>PS Совсем забыл сказать что последний уровень увеличения не работает умышленно, хотел показать как сделать обработку несуществующих данных.</p>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/08/16/custom-maptype-projection-in-google-map-api-v3/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Multiple InfoWindow</title>
		<link>http://mabp.kiev.ua/2010/08/15/multiple-infowindow/</link>
		<comments>http://mabp.kiev.ua/2010/08/15/multiple-infowindow/#comments</comments>
		<pubDate>Sun, 15 Aug 2010 12:55:23 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1231</guid>
		<description><![CDATA[Давненько я не писал о гуглокартах. Но это скорее потому что мой проект для BetterPlace закончился фэйлом, сайт в продакшн не пошел, хотя он и был для внутреннего пользования. Единственное что стоящее осталось от этого проекта это Google Map API v3 Marker Manager, который я сегодня по случаю обновил.
Но поговорить я хотел не о картах, [...]]]></description>
			<content:encoded><![CDATA[<p>Давненько я не писал о <a href="http://mabp.kiev.ua/tag/map/">гуглокартах</a>. Но это скорее потому что мой проект для BetterPlace закончился фэйлом, сайт в продакшн не пошел, хотя он и был для внутреннего пользования. Единственное что стоящее осталось от этого проекта это <a href="http://mabp.kiev.ua/2010/03/01/google-map-api-v3-marker-manager/">Google Map API v3 Marker Manager</a>, который я сегодня по случаю обновил.</p>
<p>Но поговорить я хотел не о картах, и не о маркерах а о InfoWindow. Забавно то что на всех картах и во всех примерах InfoWindow всегда один, при нажатии на маркер он просто меняет якорь (маркер) и текст. Никто и никогда не подозревал, что люди хотят сравнить два или больше маркера (я говорю маркера потому что без дополнительного кода google.maps.InfoWindow цепляется только к google.maps.Marker) по параметрам открыв их InfoWindow.</p>
<span id="more-1231">
</span>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false">
</script>
<script type="text/javascript" src="/content/source/marker-manager-v3.js">
</script>
<script type="text/javascript" src="/content/examples/multiple-infowindow.js">
</script>
<p>Итак задача: открывать для каждого маркера свой InfoWindow. На самом деле может показаться что все очень просто:</p>
<pre>
<code class="javascript">

var map = new google.maps.Map(document.getElementById("map1"), {
	zoom: 5,
	center: new google.maps.LatLng(50.440951, 30.527181),
	mapTypeId: google.maps.MapTypeId.HYBRID
});
var marker = new google.maps.Marker({
	map: map,
	position : new google.maps.LatLng(50.440951, 30.527181),
	draggable : false
});
google.maps.event.addListener(marker, "click", function(e){
	map.setCenter(this.getPosition());
	new google.maps.InfoWindow({
		content: this.getPosition().toString()
	}).open(map, this);
});

</code>
</pre>
<div id="map1" style="width:600px; height:500px;">
</div>
<p>Но нет, таким способом при каждом клике на маркер будет открываться новое InfoWindow и они будут наслаиваться. Значит надо иметь ссылки на все объекты InfoWindow. </p>
<p>В этом примере я уже использую MarkerManager, с ним как-то удобнее ;)</p>
<pre>
<code class="javascript">

var myMarkerManager = new MarkerManager(
	new google.maps.Map(document.getElementById("map2"), {
		zoom: 5,
		center: new google.maps.LatLng(50, 27),
		mapTypeId: google.maps.MapTypeId.HYBRID
	})
);
myMarkerManager.createMarker(new google.maps.LatLng(50.440951, 30.527181));
myMarkerManager.createMarker(new google.maps.LatLng(49.836944, 24.005000));


var windows = [];
function createInfoWindow(marker){
	var window = new google.maps.InfoWindow({
		content: marker.getPosition().toString()
	})
	google.maps.event.addListener(window, "closeclick", function(e){
		windows.splice(MarkerManager.prototype.inArray(marker, windows), 1);
	});
	window.open(myMarkerManager.map, marker);
	windows.push(window);
}


for (var i in myMarkerManager.markers){
	google.maps.event.addListener(myMarkerManager.markers[i], "click", function(e){
		myMarkerManager.map.setCenter(this.getPosition());


		for (var i=0, length=windows.length; i&lt;length; i++){
			if (windows[i].getContent()==this.getPosition().toString()) {
				return;
			}
		}
		createInfoWindow(this);
	})
}

</code>
</pre>
<div id="map2" style="width:600px; height:500px;">
</div>
<p>Но и этот способ не айс. Смотрите что происходит: нужно иметь список всех InfoWindow, но никакого метода для их получения не существует. Я очень надеялся найти что-то вроде </p>
<pre>
<code class="javascript">

// fake code!
var overlays = google.maps.Map.getOverlays();
for (var i in overlays ){
	if (overlays[i] instanceof google.maps.InfoWindow){
		// do staff
	}
}

</code>
</pre>
<p>Но ничего подобного не существует. Более того если InfoWindow был прицеплен к маркеру то у него нет позиции</p>
<pre>
<code class="javascript">

google.maps.event.addListener(marker, "click", function(e){
	var window = new google.maps.InfoWindow({
		content: this.getPosition().toString()
	}).open(map, this);
	console.log(window.getPosition()) // undefined
});


google.maps.event.addListener(marker, "click", function(e){
	var window = new google.maps.InfoWindow({
		content: this.getPosition().toString(),
		position : this.getPosition()
	}).open(map, this);
	console.log(window.getPosition()) // position
});

</code>
</pre>
<p>Но во втором варианте проблема в том что InfoWindow будет относиться не к маркеру (стрелочка указывает на центр верха маркера), а к точке к которой относиться маркер.</p>
<p>Поскольку InfoWindow не имеет позиции, то сравнивать приходиться не позиции а содержимое, это мало того что не удобно так еще и черевато всякими косяками. в общем этот вариант тоже не вариант.</p>
<p>Если все методы перепробованы а результата нет - прочтите инструкцию. Вооружившись этой самой инструкцией мы начинаем хачить класс google.maps.Marker</p>
<pre>
<code class="javascript">

google.maps.Marker.prototype.openInfoWindow = function(content){
	if (!(this.InfoWindow &#038;&#038; this.InfoWindow.getContent() == content)){ 
		this.InfoWindow = new google.maps.InfoWindow({
			content: content
		});
	}
	this.InfoWindow.open(this.map, this);
}


var myMarkerManager = new MarkerManager(
	new google.maps.Map(document.getElementById("map3"), {
		zoom: 5,
		center: new google.maps.LatLng(50, 27),
		mapTypeId: google.maps.MapTypeId.HYBRID
	})
);


myMarkerManager.createMarker(new google.maps.LatLng(50.440951, 30.527181));
myMarkerManager.createMarker(new google.maps.LatLng(49.836944, 24.005000));


for (var i in myMarkerManager.markers){
	google.maps.event.addListener(myMarkerManager.markers[i], "click", function(e){
		myMarkerManager.map.setCenter(this.getPosition());
		this.openInfoWindow(this.getPosition().toString());
	});
}

</code>
</pre>
<div id="map3" style="width:600px; height:500px;">
</div>
<p>Вот так все легко и просто :)</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/08/15/multiple-infowindow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google Map API v3 Marker Manager</title>
		<link>http://mabp.kiev.ua/2010/03/01/google-map-api-v3-marker-manager/</link>
		<comments>http://mabp.kiev.ua/2010/03/01/google-map-api-v3-marker-manager/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 14:33:00 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1215</guid>
		<description><![CDATA[Что-то я в последние время сильно расслабился. возможно это потому что я играю в линейку, а возможно потому что просто лентяй. В любом случаи у меня закончился проект для Better Place и я хочу выложить остатки моего экспиринса. Не так давно я писал про замечательный проект jMaps который я недавно послал к хуям. В общемто [...]]]></description>
			<content:encoded><![CDATA[<p>Что-то я в последние время сильно расслабился. возможно это потому что я играю в линейку, а возможно потому что просто лентяй. В любом случаи у меня закончился проект для <a href="http://mabp.kiev.ua/2010/02/01/better-place/">Better Place</a> и я хочу выложить остатки моего экспиринса. Не так давно я писал про замечательный проект <a href="http://mabp.kiev.ua/2010/01/19/jmaps/">jMaps</a> который я недавно послал к хуям. В общемто перейти на Google Map API v3 мне мешало только отсутствие нормального Marker Manager'a и вот я его написал. Он конечно не идельный но покрывал все нужды проекта. Самая не идеальная его часть это метод createMarker, который я думаю, стоит писать каждому под себя. Встречайте Marker Manager для Google Map API v3:</p>
<span id="more-1215">
</span>
<pre>
<code class="javascript">

var MarkerManager = function(map){
	/*
	 * @author CTAPbIu_MABP
	 * @email CTAPbIuMABP@gmail.com
	 * @link http://mabp.kiev.ua/2010/03/01/google-map-api-v3-marker-manager/
	 * @license GPL
	 */
	this.setMap(map);
}
MarkerManager.prototype = {


	markers : [],
	map : null,


	/**
	 * Set the map
	 * @access private
	 * @param {HTMLElement} map Div with map
	 */
	setMap : function(map){
		this.map = map;
	},


	/**
	 * Add new marker to the map
	 * @access public
	 * @param {google.maps.Marker} marker Marker to add
	 */
	addMarker : function(marker){
		this.markers.push(marker);
	},


	/**
	 * Add new markers to the map
	 * @access public
	 * @param {Array of google.maps.Marker} markers Array of markers to add
	 */
	addMarkers : function(markers){
		this.markers.concat(markers);
	},


	/**
	 * Get markers with latitude &#038; longitude
	 * @access public
	 * @param {google.maps.LatLng} latlng Coordinates
	 * @return {Array of google.maps.Marker} Array of markers
	 */
	getMarkers : function(latlng){
		var array = [];
		for (var i in this.markers)
			if (this.markers[i].getPosition().equals(latlng))
				array.push(this.markers[i]);
		return array;
	},


	/**
	 * Remove marker
	 * @access public
	 * @param {google.maps.Marker} marker Marker to remove
	 * @return {google.maps.Marker} Removed marker
	 */
	removeMarker : function(marker){
		var index = this.inArray(marker, this.markers), current;
		if (index > -1){
			current = this.markers.splice(index,1);
			current[0].setMap(null);
		}
		return marker;
	},


	/**
	 * Remove all marker
	 * @access public
	 */
	clearMarkers : function(){
		// this.map.clearOverlays();
		for (var i in this.markers)
			this.markers[i].setMap(null);
		this.markers = [];
	},


	/**
	 * @access public
	 * @return {int} Count of markers on the map
	 */
	getMarkerCount : function(){
		return this.markers.length;
	},


	/**
	 * @access public
	 * @return {Array of google.maps.Marker} Return Array of visible markers
	 */
	getVisibleMarkers : function(){
		var array = [];
		for (var i in this.markers){
			if (this.isVisible(this.markers[i].getPosition()))
				array.push(this.markers[i]);
		}
		return array;
	},


	/**
	 * For more information about getBounds look at google groups discussion
	 * http://code.google.com/apis/maps/documentation/javascript/events.html#EventListeners
	 * @access public
	 * @param {google.maps.LatLng} latlng Coordinates of point
	 * @return {boolean} is point visible
	 */
	isVisible : function(latlng){
		try {
			return this.map.getBounds().contains(latlng);
		} catch (e){
			this.thowExcwprion('Map is not loaded yet'); 
		}
	},


	/**
	 * Create a new marker and add it to map
	 * Not the best implementation
	 * It seems you should write your own
	 * @access public
	 * @param {google.maps.LatLng} position Coordinates
	 * @param {string} color Marker color [red,black,grey,orange,white,yellow,purple,green]
	 * @param {boolean} draggable Is marker draggable
	 * @return {google.maps.Marker} created marker
	 */
	createMarker : function(position, color, draggable){
		var marker = new google.maps.Marker({
			map: this.map,
			position : position,
			draggable : !!draggable,
			icon : new google.maps.MarkerImage('http://maps.google.com/mapfiles/marker'+(color=="red"||!color?"":"_"+color)+'.png',
				new google.maps.Size(20, 34),
				new google.maps.Point(0,0),
				new google.maps.Point(8, 32)),
			shadow : new google.maps.MarkerImage('http://maps.google.com/mapfiles/shadow50.png',
				new google.maps.Size(37, 34),
				new google.maps.Point(0,0),
				new google.maps.Point(10, 32)),
			shape : {
				coord: [9,0,6,1,4,2,2,4,0,8,0,12,1,14,2,16,5,19,7,23,8,26,9,30,9,34,11,34,11,30,12,26,13,24,14,21,16,18,18,16,20,12,20,8,18,4,16,2,15,1,13,0],
				type: 'poly'
			}
		});
		this.addMarker(marker);
		return marker;
	},


	/**
	 * Fires when bounds are ready
	 * @access public
	 * @param {Function} callback function
	 */
	onBoundsReady : function(fn){
		google.maps.event.addListenerOnce(this.map, 'bounds_changed', fn);
	},


	/**
	 * Search for item in array
	 * @access public
	 * @param {mixed} elem needle
	 * @param {array} array haystack
	 * @return {int} Index of item
	 */
	inArray : function(elem, array) {
		if (array.indexOf) {
			return array.indexOf(elem);
		}


		for (var i=0, length=array.length; i&lt;length; i++){
			if (array[i]===elem) {
				return i;
			}
		}


		return -1;
	},


	/**
	 * Throw an exception
	 * @access private
	 * @param {String} message
	 */
	thowExcwprion : function(e){
		throw e; 
	}
}

</code>
</pre>
<p>Я думаю что он очень прост в использовании, поэтому покажу только один пример</p>
<pre>
<code class="javascript">

var map = new google.maps.Map(document.getElementById("map"), {
    zoom: 1,
    center: new google.maps.LatLng(0, 0),
    mapTypeId: google.maps.MapTypeId.HYBRID
});
var myMarkerManager = new MarkerManager(map);
var kiev = myMarkerManager.createMarker(new google.maps.LatLng(50.440951, 30.527181)); // добавлю маркер Киева
myMarkerManager.addMarkers([kiev,kiev]); // всего уже три маркера в одной точке
var markers = myMarkerManager.getMarkers(new google.maps.LatLng(50.440951, 30.527181)); // нашел все три
myMarkerManager.removeMarker(markers[0]); // удяляю первый
myMarkerManager.clearMarkers(); // удаляю все

</code>
</pre>
<p>Скачать можно тут <a href="http://mabp.kiev.ua/content/source/marker-manager-v3.js">DOWNLOAD LINK</a>
</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/03/01/google-map-api-v3-marker-manager/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Google Chrome 5</title>
		<link>http://mabp.kiev.ua/2010/01/31/google-chrome-5/</link>
		<comments>http://mabp.kiev.ua/2010/01/31/google-chrome-5/#comments</comments>
		<pubDate>Sun, 31 Jan 2010 10:50:43 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[Новости]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1193</guid>
		<description><![CDATA[Оказывается позавчера вышел Chrome 5. Судя по всему Google явно решил перегнать Opera по номеру версии.






Спойлер : ждите сегодня большую статью ;)]]></description>
			<content:encoded><![CDATA[<p>Оказывается позавчера вышел <a href="http://dev.chromium.org/getting-involved/dev-channel" rel="nofollow external">Chrome 5</a>. Судя по всему Google явно решил перегнать Opera по номеру версии.</p>
<span id="more-1193">
</span>
<div style="text-align:center;">
<img src="http://mabp.kiev.ua/content/img/chrome.png" alt="Google Chrome"/>
</div>
<p>
<strong>Спойлер :</strong> ждите сегодня большую статью ;)</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/01/31/google-chrome-5/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>jMaps</title>
		<link>http://mabp.kiev.ua/2010/01/19/jmaps/</link>
		<comments>http://mabp.kiev.ua/2010/01/19/jmaps/#comments</comments>
		<pubDate>Tue, 19 Jan 2010 00:04:36 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[plugin]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1180</guid>
		<description><![CDATA[Я вообще стараюсь не писать о том что морально устарело или больше не поддерживается, но сегодня именно такой случай. Я хочу рассказать вам об одном очень хорошем плагине для работы с гуглокартами под названием jMaps. Его исходники доступны на жыдхабе, но к сожелению их никто не обновлял с 17 сентября 2009 года. Один из авторов [...]]]></description>
			<content:encoded><![CDATA[<p>Я вообще стараюсь не писать о том что морально устарело или больше не поддерживается, но сегодня именно такой случай. Я хочу рассказать вам об одном очень хорошем плагине для работы с гуглокартами под названием jMaps. Его исходники доступны на <a href="http://wiki.github.com/digitalspaghetti/jmaps" rel="nofollow external">жыдхабе</a>, но к сожелению их никто не обновлял с 17 сентября 2009 года. Один из авторов <a href="http://digitalspaghetti.me.uk/" rel="nofollow external">digitalspaghetti</a> тоже пропал с сентября. В общем жыдхаб это единственная живая ссылка на проект, не считая репозитория плагинов <a href="http://plugins.jquery.com/project/jmaps" rel="nofollow external">jquery</a> :( Если кто-то располагает хоть какими-то знаниями относительно более свежих версий очень прошу в каменты. А пока я буду рассказывать о том чего я накопал в коде.</p>
<span id="more-1180">
</span>
<p>А накопал я много чего интересного. Оказывается, сам по себе плагин составляет три с половиной строки кода вокруг объекта Mapifies</p>
<pre>
<code class="javascript">

(function($){
	$.fn.jmap = function(method, options, callback) {
		return this.each(function(){
			if (method == 'init' &#038;&#038; typeof options == 'undefined') {
				new Mapifies.Initialise(this, {}, null);
			} else if (method == 'init' &#038;&#038; typeof options == 'object') {
				new Mapifies.Initialise(this, options, callback);
			} else if (method == 'init' &#038;&#038; typeof options == 'function') {
				new Mapifies.Initialise(this, {}, options);
			} else if (typeof method == 'object' || method == null) {
				new Mapifies.Initialise(this, method, options);
			} else {
				try {
					new Mapifies[method](this, options, callback);
				} catch(err) {
					throw Error('Mapifies Function Does Not Exist');
				}
			}
		});
	}
})(jQuery);

</code>
</pre>
<p>Что сказать, хорошо сделанная обертка, кроме одной меленькой детали. Все методы объекта Mapifies за редким исключением получают три параметра element (карта), options (опции), callback (функция), а возвращает результат работы callback(map). И вот как вы думаете как вы получите результат работы хоть какой-нибудь функции если обертка не предполагает возврата данных?!</p>
<p>Уже только по этому я решил отказаться от использования обертки и дальше работал с Mapifies напрямую. Документация по плагину крайне бедная, но код очень хорошо документирован, поэтому не составляет труда в нем разобраться. Продемонстрирую несколько простейших функций:</p>
<p>Создание резиновой карты, растягивается за нижний правый угол. Осторожно если сильно потянуть вправо то потом ее обратно уже не сжать, зато в любой момент можно растянуть вниз на практически любую длину.</p>
<pre>
<code class="javascript">

jQuery(document).ready(function($){
    var $map = $("#map1"),
    GMap = Mapifies.Initialise(
         $map.get(0),  {
            // описание всех параметров смотрите в коде плагина
            // http://github.com/digitalspaghetti/jmaps/blob/master/dist/jquery.jmap.js#L100
            language: 'en',
            mapType: G_HYBRID_MAP,
            mapCenter: [50.440951,30.527181],
            mapZoom: 10,
            mapControl: 'large',
            mapEnableDragging: true,
            mapEnableScrollZoom: true,
            mapShowjMapsIcon: false
        }, function(thisMap){
            return thisMap;
    });


    $map.resizable({
        stop: function(event, ui) {
            Mapifies.CheckResize($map);
        }
    });
});

</code>
</pre>
<script type="text/javascript" src="http://maps.google.com/maps?file=api&amp;v=2&amp;key=ABQIAAAAhZYAzYrXPwUDjxsHSuaBzRROkIKc1AeUaEtpre4S8pXwOdxbIxQ7FwgQCh5LqtMSHrBMiLBIe5m16A">
</script>
<script type="text/javascript" src="/content/source/jquery.jmap.js">
</script>
<script type="text/javascript">

jQuery(document).ready(function($){
    var $map = $("#map1"),
    GMap = Mapifies.Initialise(
         $map.get(0),  {
            language: 'en',
            mapType: G_HYBRID_MAP,
            mapCenter: [50.440951,30.527181],
            mapZoom: 10,
            mapControl: 'large',
            mapEnableDragging: true,
            mapEnableScrollZoom: true,
            mapShowjMapsIcon: false
        }, function(thisMap){
            return thisMap;
    });


    $map.resizable({
        stop: function(event, ui) {
            Mapifies.CheckResize($map);
        }
    });
});

</script>
<div id="map1" style="height:400px;width:600px;">
</div>
<p>Теперь покажу как добавить маркер</p>
<pre>
<code class="javascript">

jQuery(document).ready(function($){
    var $map = $("#map2");
    Mapifies.Initialise(
         $map.get(0),  {
            // описание всех параметров смотрите в коде плагина
            // http://github.com/digitalspaghetti/jmaps/blob/master/dist/jquery.jmap.js#L100
            language: 'en',
            mapType: G_HYBRID_MAP,
            mapCenter: [50.440951,30.527181],
            mapZoom: 10,
            mapControl: 'large',
            mapEnableDragging: true,
            mapEnableScrollZoom: true,
            mapShowjMapsIcon: false
    });
    Mapifies.CreateMarkerManager($map,{markerManager: 'MarkerManager'});
    Mapifies.AddMarker($map,{
        // описание всех параметров смотрите в коде плагина
        // http://github.com/digitalspaghetti/jmaps/blob/master/dist/jquery.jmap.js#L704
        pointTitle : 'Tooltip',
        pointLatLng: [50.440951,30.527181],
        pointHTML: '&lt;strong&gt;description&lt;/strong&gt;',
        pointOpenHTMLEvent: 'click',
        pointIsDraggable: true,
        pointMinZoom: 0,
        pointMaxZoom: 17,
        pointIcon:Mapifies.createIcon({
            // описание картинок смотрите в моей прошлой статье
            // http://mabp.kiev.ua/2010/01/12/google-map-markers/
            iconImage: 'http://maps.google.com/mapfiles/arrow.png',
            iconShadow: 'http://maps.google.com/mapfiles/arrowshadow.png',
            iconSize: new GSize(39,34),
            iconShadowSize: new GSize(39,34),
            iconPrintImage: 'http://maps.google.com/mapfiles/arrowie.png',
            iconMozPrintImage: 'http://maps.google.com/mapfiles/arrowff.png',
            iconTransparent: 'http://maps.google.com/mapfiles/arrowtransparent.png'
        })
    });
});

</code>
</pre>
<script type="text/javascript" src="http://gmaps-utility-library.googlecode.com/svn/trunk/markermanager/1.1/src/markermanager.js">
</script>
<script type="text/javascript">

jQuery(document).ready(function($){
    var $map = $("#map2");
    Mapifies.Initialise(
         $map.get(0),  {
            language: 'en',
            mapType: G_HYBRID_MAP,
            mapCenter: [50.440951,30.527181],
            mapZoom: 10,
            mapControl: 'large',
            mapEnableDragging: true,
            mapEnableScrollZoom: true,
            mapShowjMapsIcon: false
    });
    Mapifies.CreateMarkerManager($map,{markerManager: 'MarkerManager'});
    Mapifies.AddMarker($map,{
        pointTitle : 'Tooltip',
        pointLatLng: [50.440951,30.527181],
        pointHTML: '<strong>description</strong>',
        pointOpenHTMLEvent: 'click',
        pointIsDraggable: true,
        pointMinZoom: 0,
        pointMaxZoom: 17,
        pointIcon:Mapifies.createIcon({
            iconImage: 'http://maps.google.com/mapfiles/arrow.png',
            iconShadow: 'http://maps.google.com/mapfiles/arrowshadow.png',
            iconSize: new GSize(39,34),
            iconShadowSize: new GSize(39,34),
            iconPrintImage: 'http://maps.google.com/mapfiles/arrowie.png',
            iconMozPrintImage: 'http://maps.google.com/mapfiles/arrowff.png',
            iconTransparent: 'http://maps.google.com/mapfiles/arrowtransparent.png'
        })
    });
    $("#remove1").click(function(){
        var manager = Mapifies.MapObjects.Get($map).MarkerManager;
        Mapifies.RemoveMarker($map,manager.getMarker(50.440951,30.527181,1))
    });
    $("#remove2").click(function(){
        var manager =  Mapifies.MapObjects.Get($map).MarkerManager;
        manager.removeMarker(manager.getMarker(50.440951,30.527181,1));
    });
});

</script>
<div id="map2" style="height:400px;width:600px;">
</div>
<p>С этим примером тоже почти все хорошо кроме двух вещей. </p>
<p>Первая это нельзя заменить крест под маркером (во время перетаскивания). Он немного не по размеру этому маркеру (чуть чуть левее чем надо), но чтобы заменить его нужно отказаться от метода createIcon и создать маркер вручную.</p>
<p>Вторая... Если посмотреть код страницы видно что я подключил скрипт markermanager.js, он помогает при работе с маркерами, довольно неплохая вещь. Плагин умеет его использовать и если он подключен создает маркеры с его помощью. Но создавать создает а удалять забыват ;( Тоесть чтобы удалить маркер нужно вместо </p>
<pre>
<code class="javascript">

    $("#remove1").click(function(){
        var manager = Mapifies.MapObjects.Get($map).MarkerManager;
        Mapifies.RemoveMarker($map,manager.getMarker(50.440951,30.527181,1))
    });

</code>
</pre>
<input type="button" id="remove1" value="удалить первым способом"/>
<p>Написать</p>
<pre>
<code class="javascript">

    $("#remove2").click(function(){
        var manager =  Mapifies.MapObjects.Get($map).MarkerManager;
        manager.removeMarker(manager.getMarker(50.440951,30.527181,1));
    });

</code>
</pre>
<input type="button" id="remove2" value="удалить вторым способом"/>
<p>Ага, вот сейчас вы нажали первую кнопку и подумали что я вас обманываю, нет попробуйте позумить, маркер никуда не пропал. Зато если нажать на вторую кнопку маркер пропадает начисто.</p>
<p>Я думаю на сегодня все. кто знает что-то об авторе, свежих версиях, документации и тд и тп пишите в каменты.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/01/19/jmaps/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Google map markers</title>
		<link>http://mabp.kiev.ua/2010/01/12/google-map-markers/</link>
		<comments>http://mabp.kiev.ua/2010/01/12/google-map-markers/#comments</comments>
		<pubDate>Tue, 12 Jan 2010 09:40:09 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1178</guid>
		<description><![CDATA[Надо по немногу отходить от празднывания нового года, а то он начался 25го и закончился буквально вчера. Или 23го?! Ну неважно. Вот для затравачки я выложу картинки для гуглокарт.


Контролы

Слайдер (обычный размер)

 - http://maps.google.com/intl/en_us/mapfiles/lmc.png
 - http://maps.google.com/intl/en_us/mapfiles/lmc-bottom.png
 - http://maps.google.com/mapfiles/center.png
 - http://maps.google.com/mapfiles/east.png
 - http://maps.google.com/mapfiles/west.png
 - http://maps.google.com/mapfiles/north.png
 - http://maps.google.com/mapfiles/south.png
 - http://maps.google.com/mapfiles/panshadow.png
 - http://maps.google.com/mapfiles/dslidertop.png
 - http://maps.google.com/mapfiles/dsliderbar.png
 - http://maps.google.com/mapfiles/dsliderbottom.png
 - http://maps.google.com/mapfiles/dslidertopshadow.png
 [...]]]></description>
			<content:encoded><![CDATA[<p>Надо по немногу отходить от празднывания нового года, а то он начался 25го и закончился буквально вчера. Или 23го?! Ну неважно. Вот для затравачки я выложу картинки для гуглокарт.</p>
<span id="more-1178">
</span>
<h3>Контролы</h3>
<p>
<strong>Слайдер (обычный размер)</strong>
</p>
<img src="http://maps.google.com/intl/en_us/mapfiles/lmc.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/lmc.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/lmc-bottom.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/lmc-bottom.png<br/>
<img src="http://maps.google.com/mapfiles/center.png" alt="" /> - http://maps.google.com/mapfiles/center.png<br/>
<img src="http://maps.google.com/mapfiles/east.png" alt="" /> - http://maps.google.com/mapfiles/east.png<br/>
<img src="http://maps.google.com/mapfiles/west.png" alt="" /> - http://maps.google.com/mapfiles/west.png<br/>
<img src="http://maps.google.com/mapfiles/north.png" alt="" /> - http://maps.google.com/mapfiles/north.png<br/>
<img src="http://maps.google.com/mapfiles/south.png" alt="" /> - http://maps.google.com/mapfiles/south.png<br/>
<img src="http://maps.google.com/mapfiles/panshadow.png" alt="" /> - http://maps.google.com/mapfiles/panshadow.png<br/>
<img src="http://maps.google.com/mapfiles/dslidertop.png" alt="" /> - http://maps.google.com/mapfiles/dslidertop.png<br/>
<img src="http://maps.google.com/mapfiles/dsliderbar.png" alt="" /> - http://maps.google.com/mapfiles/dsliderbar.png<br/>
<img src="http://maps.google.com/mapfiles/dsliderbottom.png" alt="" /> - http://maps.google.com/mapfiles/dsliderbottom.png<br/>
<img src="http://maps.google.com/mapfiles/dslidertopshadow.png" alt="" /> - http://maps.google.com/mapfiles/dslidertopshadow.png<br/>
<img src="http://maps.google.com/mapfiles/dsliderbarshadow.png" alt="" /> - http://maps.google.com/mapfiles/dsliderbarshadow.png<br/>
<img src="http://maps.google.com/mapfiles/dsliderbottomshadow.png" alt="" /> - http://maps.google.com/mapfiles/dsliderbottomshadow.png<br/>
<img src="http://maps.google.com/mapfiles/zoom-plus.png" alt="" /> - http://maps.google.com/mapfiles/zoom-plus.png<br/>
<img src="http://maps.google.com/mapfiles/zoom-minus.png" alt="" /> - http://maps.google.com/mapfiles/zoom-minus.png<br/>
<img src="http://maps.google.com/mapfiles/slider.png" alt="" /> - http://maps.google.com/mapfiles/slider.png<br/>
<br/>
<p>
<strong>Слайдер  (маленький размер)</strong>
</p>
<img src="http://maps.google.com/intl/en_us/mapfiles/smc.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/smc.png<br/>
<img src="http://maps.google.com/mapfiles/east-mini.png" alt="" /> - http://maps.google.com/mapfiles/east-mini.png<br/>
<img src="http://maps.google.com/mapfiles/west-mini.png" alt="" /> - http://maps.google.com/mapfiles/west-mini.png<br/>
<img src="http://maps.google.com/mapfiles/north-mini.png" alt="" /> - http://maps.google.com/mapfiles/north-mini.png<br/>
<img src="http://maps.google.com/mapfiles/south-mini.png" alt="" /> - http://maps.google.com/mapfiles/south-mini.png<br/>
<img src="http://maps.google.com/mapfiles/zoom-plus-mini.png" alt="" /> - http://maps.google.com/mapfiles/zoom-plus-mini.png<br/>
<img src="http://maps.google.com/mapfiles/zoom-minus-mini.png" alt="" /> - http://maps.google.com/mapfiles/zoom-minus-mini.png<br/>
<br/>
<p>
<strong>Вспомогательные картинки для калибровки</strong>
</p>
<img src="http://maps.google.com/mapfiles/leftbar.png" alt="" /> - http://maps.google.com/mapfiles/leftbar.png<br/>
<img src="http://maps.google.com/mapfiles/topbar.png" alt="" /> - http://maps.google.com/mapfiles/topbar.png<br/>
<img src="http://maps.google.com/mapfiles/bottombar.png" alt="" /> - http://maps.google.com/mapfiles/bottombar.png<br/>
<img src="http://maps.google.com/mapfiles/horibarcap.png" alt="" /> - http://maps.google.com/mapfiles/horibarcap.png<br/>
<img src="http://maps.google.com/mapfiles/horibar400.png" alt="" />
<br/> - http://maps.google.com/mapfiles/horibar400.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/scale.png" alt="" />
<br/> - http://maps.google.com/intl/en_us/mapfiles/scale.png<br/>
<br/>
<p>Честно говоря я не представляю себе случая, когда надо будет полностью переделать управления картами включая контролы, хотя вполне допускаю использование этих картинок в каком-нибудь другом пректе.</p>
<br/>
<h3>Markers</h3>
<p>Это пожалуй самая нужная и полезная часть поста, поскольку в маломальском проекте нужно несколько видов маркеров, отличающихся хотябы цветом. не говоря уже про форму и версию для печати.</p>
<br/>
<p>
<strong>Обычные маркеры для всех локалей (20x34)</strong>
</p>
<img src="http://maps.google.com/mapfiles/marker.png" alt="" /> - http://maps.google.com/mapfiles/marker.png<br/>
<img src="http://maps.google.com/mapfiles/marker_black.png" alt="" /> - http://maps.google.com/mapfiles/marker_black.png<br/>
<img src="http://maps.google.com/mapfiles/marker_grey.png" alt="" /> - http://maps.google.com/mapfiles/marker_grey.png<br/>
<img src="http://maps.google.com/mapfiles/marker_orange.png" alt="" /> - http://maps.google.com/mapfiles/marker_orange.png<br/>
<img src="http://maps.google.com/mapfiles/marker_white.png" alt="" /> - http://maps.google.com/mapfiles/marker_white.png<br/>
<img src="http://maps.google.com/mapfiles/marker_yellow.png" alt="" /> - http://maps.google.com/mapfiles/marker_yellow.png<br/>
<img src="http://maps.google.com/mapfiles/marker_purple.png" alt="" /> - http://maps.google.com/mapfiles/marker_purple.png<br/>
<img src="http://maps.google.com/mapfiles/marker_green.png" alt="" /> - http://maps.google.com/mapfiles/marker_green.png<br/>
<img src="http://maps.google.com/mapfiles/shadow50.png" alt="" /> - http://maps.google.com/mapfiles/shadow50.png<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/drag_cross_67_16.png" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/drag_cross_67_16.png<br/>
<br/>
<p>
<strong>Маркеры для печати</strong>
</p>
<img src="http://maps.google.com/mapfiles/markerie.gif" alt="" /> - http://maps.google.com/mapfiles/markerie.gif<br/>
<img src="http://maps.google.com/mapfiles/markerff.gif" alt="" /> - http://maps.google.com/mapfiles/markerff.gif<br/>
<img src="http://maps.google.com/mapfiles/dithshadow.gif" alt="" /> - http://maps.google.com/mapfiles/dithshadow.gif<br/>
<img src="http://maps.google.com/mapfiles/markerTransparent.png" alt="" /> - http://maps.google.com/mapfiles/markerTransparent.png<br/>
<br/>
<p>
<strong>Еще обычные маркеры для каждой локали свои (например ru_RU), некоторых цветов нехватает (32x32)</strong>
</p>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/purple-dot.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/purple-dot.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/yellow-dot.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/yellow-dot.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/blue-dot.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/green-dot.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/green-dot.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/red-dot.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/red-dot.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/orange-dot.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/orange-dot.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/purple.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/purple.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/yellow.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/yellow.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/blue.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/blue.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/green.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/green.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/red.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/red.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/orange.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/orange.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/msmarker.shadow.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/msmarker.shadow.png<br/>
<br/>
<p>
<strong>Маленькие маркеры (12x20)</strong>
</p>
<img src="http://labs.google.com/ridefinder/images/mm_20_purple.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_purple.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_yellow.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_yellow.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_blue.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_blue.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_white.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_white.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_green.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_green.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_red.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_red.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_black.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_black.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_orange.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_orange.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_gray.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_gray.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_brown.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_brown.png<br/>
<img src="http://labs.google.com/ridefinder/images/mm_20_shadow.png" alt="" /> - http://labs.google.com/ridefinder/images/mm_20_shadow.png<br/>
<br/>
<p>
<strong>Маркеры со стрелочками</strong>
</p>
<img src="http://maps.google.com/mapfiles/dd-start.png" alt="" /> - http://maps.google.com/mapfiles/dd-start.png<br/>
<img src="http://maps.google.com/mapfiles/dd-end.png" alt="" /> - http://maps.google.com/mapfiles/dd-end.png<br/>
<br/>
<p>
<strong>Маркеры со стрелочками версия для печати</strong>
</p>
<img src="http://maps.google.com/mapfiles/dd-startff.gif" alt="" /> - http://maps.google.com/mapfiles/dd-startff.gif<br/>
<img src="http://maps.google.com/mapfiles/dd-endff.gif" alt="" /> - http://maps.google.com/mapfiles/dd-endff.gif<br/>
<img src="http://maps.google.com/mapfiles/dd-startie.gif" alt="" /> - http://maps.google.com/mapfiles/dd-startie.gif<br/>
<img src="http://maps.google.com/mapfiles/dd-endie.gif" alt="" /> - http://maps.google.com/mapfiles/dd-endie.gif<br/>
<br/>
<p>
<strong>Маркеры с буквами (от A до Z), можно подставлять цвета [а голубого нету :(]</strong>
</p>
<img src="http://maps.google.com/mapfiles/markerA.png" alt="" /> - http://maps.google.com/mapfiles/markerA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_blackA.png" alt="" /> - http://maps.google.com/mapfiles/marker_blackA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_brownA.png" alt="" /> - http://maps.google.com/mapfiles/marker_brownA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_greenA.png" alt="" /> - http://maps.google.com/mapfiles/marker_greenA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_purpleA.png" alt="" /> - http://maps.google.com/mapfiles/marker_purpleA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_yellowA.png" alt="" /> - http://maps.google.com/mapfiles/marker_yellowA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_greyA.png" alt="" /> - http://maps.google.com/mapfiles/marker_greyA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_orangeA.png" alt="" /> - http://maps.google.com/mapfiles/marker_orangeA.png<br/>
<img src="http://maps.google.com/mapfiles/marker_whiteA.png" alt="" /> - http://maps.google.com/mapfiles/marker_whiteA.png<br/>
<br/>
<p>
<strong>Маркер стрелочка</strong>
</p>
<img src="http://maps.google.com/mapfiles/arrow.png" alt="" /> - http://maps.google.com/mapfiles/arrow.png<br/>
<img src="http://maps.google.com/mapfiles/arrowshadow.png" alt="" /> - http://maps.google.com/mapfiles/arrowshadow.png<br/>
<p>
<strong>Маркер стрелочка версия для печати</strong>
</p>
<img src="http://maps.google.com/mapfiles/arrowtransparent.png" alt="" /> - http://maps.google.com/mapfiles/arrowtransparent.png<br/>
<img src="http://maps.google.com/mapfiles/arrowff.gif" alt="" /> - http://maps.google.com/mapfiles/arrowff.png<br/>
<img src="http://maps.google.com/mapfiles/arrowie.gif " alt="" /> - http://maps.google.com/mapfiles/arrowie.png<br/>
<br/>
<p>
<strong>Всякие значки</strong>
</p>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/tree.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/tree.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/tree.shadow.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/tree.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/lodging.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/lodging.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/lodging.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/lodging.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/bar.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/bar.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/bar.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/bar.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/restaurant.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/restaurant.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/restaurant.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/restaurant.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/horsebackriding.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/horsebackriding.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/horsebackriding.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/horsebackriding.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/convienancestore.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/convienancestore.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/convienancestore.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/convienancestore.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/hiker.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/hiker.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/hiker.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/hiker.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/swimming.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/swimming.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/swimming.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/swimming.shadow.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/fishing.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/fishing.png<br/>
<img src="http://maps.google.com/mapfiles/ms/micons/fishing.shadow.png" alt="" /> - http://maps.google.com/mapfiles/ms/micons/fishing.shadow.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/golfer.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/golfer.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/golfer.shadow.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/golfer.shadow.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/sportvenue.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/sportvenue.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/ms/micons/sportvenue.shadow.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/ms/micons/sportvenue.shadow.png<br/>
<br/>
<h3>Мнформационное окно</h3>
<p>
<strong>Пузырь</strong>
</p>
<img src="http://maps.google.com/mapfiles/iw_n.png" alt="" /> - http://maps.google.com/mapfiles/iw_n.png<br/>
<img src="http://maps.google.com/mapfiles/iw_e.png" alt="" /> - http://maps.google.com/mapfiles/iw_e.png<br/>
<img src="http://maps.google.com/mapfiles/iw_s.png" alt="" /> - http://maps.google.com/mapfiles/iw_s.png<br/>
<img src="http://maps.google.com/mapfiles/iw_w.png" alt="" /> - http://maps.google.com/mapfiles/iw_w.png<br/>
<img src="http://maps.google.com/mapfiles/iw_c.png" alt="" /> - http://maps.google.com/mapfiles/iw_c.png<br/>
<img src="http://maps.google.com/mapfiles/iw_nw.png" alt="" /> - http://maps.google.com/mapfiles/iw_nw.png<br/>
<img src="http://maps.google.com/mapfiles/iw_ne.png" alt="" /> - http://maps.google.com/mapfiles/iw_ne.png<br/>
<img src="http://maps.google.com/mapfiles/iw_sw.png" alt="" /> - http://maps.google.com/mapfiles/iw_sw.png<br/>
<img src="http://maps.google.com/mapfiles/iw_se.png" alt="" /> - http://maps.google.com/mapfiles/iw_se.png<br/>
<img src="http://maps.google.com/mapfiles/iw_tap.png" alt="" /> - http://maps.google.com/mapfiles/iw_tap.png<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw1.png" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw1.png<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw2.png" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw2.png<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw3.png" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw3.png<br/>
<img src="http://maps.google.com/mapfiles/close.gif" alt="" /> - http://maps.google.com/mapfiles/close.gif<br/>
<br/>
<p>
<strong>Тень</strong>
</p>
<img src="http://maps.google.com/mapfiles/iws_n.png" alt="" /> - http://maps.google.com/mapfiles/iws_n.png<br/>
<img src="http://maps.google.com/mapfiles/iws_e.png" alt="" /> - http://maps.google.com/mapfiles/iws_e.png<br/>
<img src="http://maps.google.com/mapfiles/iws_w.png" alt="" /> - http://maps.google.com/mapfiles/iws_w.png<br/>
<img src="http://maps.google.com/mapfiles/iws_s.png" alt="" /> - http://maps.google.com/mapfiles/iws_s.png<br/>
<img src="http://maps.google.com/mapfiles/iws_c.png" alt="" /> - http://maps.google.com/mapfiles/iws_c.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/iws1.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/iws1.png<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/iws2.png" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/iws2.png<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iws3.png" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iws3.png<br/>
<img src="http://maps.google.com/mapfiles/iws_nw.png" alt="" /> - http://maps.google.com/mapfiles/iws_nw.png<br/>
<img src="http://maps.google.com/mapfiles/iws_ne.png" alt="" /> - http://maps.google.com/mapfiles/iws_ne.png<br/>
<img src="http://maps.google.com/mapfiles/iws_sw.png" alt="" /> - http://maps.google.com/mapfiles/iws_sw.png<br/>
<img src="http://maps.google.com/mapfiles/iws_se.png" alt="" /> - http://maps.google.com/mapfiles/iws_se.png<br/>
<img src="http://maps.google.com/mapfiles/iws_tap.png" alt="" /> - http://maps.google.com/mapfiles/iws_tap.png<br/>
<br/>
<h3>Разное</h3>
<p>
<strong>Блоки для текста</strong>
</p>
<img src="http://maps.google.com/mapfiles/l1.png" alt="" /> - http://maps.google.com/mapfiles/l1.png<br/>
<img src="http://maps.google.com/mapfiles/m1.png" alt="" /> - http://maps.google.com/mapfiles/m1.png<br/>
<img src="http://maps.google.com/mapfiles/r1.png" alt="" /> - http://maps.google.com/mapfiles/r1.png<br/>
<img src="http://maps.google.com/mapfiles/l5.png" alt="" /> - http://maps.google.com/mapfiles/l5.png<br/>
<img src="http://maps.google.com/mapfiles/m5.png" alt="" /> - http://maps.google.com/mapfiles/m5.png<br/>
<img src="http://maps.google.com/mapfiles/r5.png" alt="" /> - http://maps.google.com/mapfiles/r5.png<br/>
<img src="http://maps.google.com/mapfiles/l1e.png" alt="" /> - http://maps.google.com/mapfiles/l1e.png<br/>
<img src="http://maps.google.com/mapfiles/m1e.png" alt="" /> - http://maps.google.com/mapfiles/m1e.png<br/>
<img src="http://maps.google.com/mapfiles/r1e.png" alt="" /> - http://maps.google.com/mapfiles/r1e.png<br/>
<img src="http://maps.google.com/mapfiles/l5e.png" alt="" /> - http://maps.google.com/mapfiles/l5e.png<br/>
<img src="http://maps.google.com/mapfiles/m5e.png" alt="" /> - http://maps.google.com/mapfiles/m5e.png<br/>
<img src="http://maps.google.com/mapfiles/r5e.png" alt="" /> - http://maps.google.com/mapfiles/r5e.png<br/>
<br/>
<p>
<strong>Иконки</strong>
</p>
<img src="http://maps.google.com/mapfiles/print_icon.gif" alt="" /> - http://maps.google.com/mapfiles/print_icon.gif<br/>
<img src="http://maps.google.com/mapfiles/email_icon.gif" alt="" /> - http://maps.google.com/mapfiles/email_icon.gif<br/>
<img src="http://maps.google.com/mapfiles/link_icon.gif" alt="" /> - http://maps.google.com/mapfiles/link_icon.gif<br/>
<img src="http://maps.google.com/mapfiles/show-arrow.png" alt="" /> - http://maps.google.com/mapfiles/show-arrow.png<br/>
<img src="http://maps.google.com/mapfiles/hide-arrow.png" alt="" /> - http://maps.google.com/mapfiles/hide-arrow.png<br/>
<img src="http://maps.google.com/mapfiles/ddirflip.gif" alt="" /> - http://maps.google.com/mapfiles/ddirflip.gif<br/>
<img src="http://maps.google.com/mapfiles/bar_icon_print_2.gif" alt="" /> - http://maps.google.com/mapfiles/bar_icon_print_2.gif<br/>
<img src="http://maps.google.com/mapfiles/bar_icon_link.gif" alt="" /> - http://maps.google.com/mapfiles/bar_icon_link.gif<br/>
<img src="http://maps.google.com/mapfiles/bar_icon_email_2.gif" alt="" /> - http://maps.google.com/mapfiles/bar_icon_email_2.gif<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_close.gif" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_close.gif<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_plus.gif" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_plus.gif<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_minus.gif" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_minus.gif<br/>
<img src="http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_fullscreen.gif" alt="" /> - http://maps.gstatic.com/intl/en_ALL/mapfiles/iw_fullscreen.gif<br/>
<img src="http://maps.google.com/mapfiles/green_arrow_empty.gif" alt="" /> - http://maps.google.com/mapfiles/green_arrow_empty.gif<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/restore.gif" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/restore.gif<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/close.gif" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/close.gif<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/overcontract.gif" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/overcontract.gif<br/>
<img src="http://maps.google.com/intl/en_us/mapfiles/maximize.gif" alt="" /> - http://maps.google.com/intl/en_us/mapfiles/maximize.gif<br/>
<br/>
<p>
<strong>Индикаторы направления, градуся от 0 до 117, если надо больше то формула ~~(X%120/3) , где X это нужное количество градусов</strong>
</p>
<img src="http://maps.google.com/mapfiles/dir_0.png" alt="" /> - http://maps.google.com/mapfiles/dir_0.png<br/>
<img src="http://maps.google.com/mapfiles/dir_117.png" alt="" /> - http://maps.google.com/mapfiles/dir_117.png<br/>
<img src="http://maps.google.com/mapfiles/dir_walk_0.png" alt="" /> - http://maps.google.com/mapfiles/dir_walk_0.png<br/>
<img src="http://maps.google.com/mapfiles/dir_walk_117.png" alt="" /> - http://maps.google.com/mapfiles/dir_walk_117.png<br/>
<br/>
<p>
<strong>Другое</strong>
</p>
<img src="http://maps.google.com/mapfiles/transparent.gif" alt="" /> - http://maps.google.com/mapfiles/transparent.gif<br/>
<img src="http://maps.google.com/mapfiles/water.gif" alt="" /> - http://maps.google.com/mapfiles/water.gif<br/>
<img src="http://maps.google.com/mapfiles/poweredby.png" alt="" /> - http://maps.google.com/mapfiles/poweredby.png <br/>
<h3>Иконки из Google Earth</h3>
<p>Только мне кажеться что они повторяються?!</p>
<style>

.nopadding,
.nopadding td {
    padding:0 !important;
    border:none !important;
}

</style>
<table class="nopadding">
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon0.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon1.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon2.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon3.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon4.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon5.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon6.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon7.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon0s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon1s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon2s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon3s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon4s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon5s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon6s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon7s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon8.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon9.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon10.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon11.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon12.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon13.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon14.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon15.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon8s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon9s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon10s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon11s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon12s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon13s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon14s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon15s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon16.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon17.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon18.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon19.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon20.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon21.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon22.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon23.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon16s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon17s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon18s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon19s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon20s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon21s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon22s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon23s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon24.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon25.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon26.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon27.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon28.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon29.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon30.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon31.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon24s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon25s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon26s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon27s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon28s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon29s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon30s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon31s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon32.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon33.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon34.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon35.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon36.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon37.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon38.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon39.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon32s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon33s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon34s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon35s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon36s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon37s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon38s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon39s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon40.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon41.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon42.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon43.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon44.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon45.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon46.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon47.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon40s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon41s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon42s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon43s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon44s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon45s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon46s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon47s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon48.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon49.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon50.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon51.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon52.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon53.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon54.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon55.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon48s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon49s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon50s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon51s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon52s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon53s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon54s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon55s.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon56.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon57.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon58.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon59.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon60.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon61.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon62.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon63.png" alt="" />
</td>
</tr>
<tr>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon56s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon57s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon58s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon59s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon60s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon61s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon62s.png" alt="" />
</td>
<td>
<img src="http://maps.google.com/mapfiles/kml/pal2/icon63s.png" alt="" />
</td>
</tr>
</table>
<br />
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/01/12/google-map-markers/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Меркатор детектед!</title>
		<link>http://mabp.kiev.ua/2009/12/29/mercator_detected/</link>
		<comments>http://mabp.kiev.ua/2009/12/29/mercator_detected/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 17:01:24 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Голоса в голове]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1175</guid>
		<description><![CDATA[В последние время очень много работаю с гугло-картами и очень раздражает один момент, на карте Гренландия больше Австралии. Спецально для вас, мапплет, можете сравнить не уходя с сайта. Очень надеюсь что найдете оба объекта без подсказки ;)








var myLatlng = new google.maps.LatLng(35,0);
var myOptions = {
  zoom: 1,
  center: myLatlng,
  mapTypeId: google.maps.MapTypeId.HYBRID
};
var map = [...]]]></description>
			<content:encoded><![CDATA[<p>В последние время очень много работаю с гугло-картами и очень раздражает один момент, на карте Гренландия больше Австралии. Спецально для вас, мапплет, можете сравнить не уходя с сайта. Очень надеюсь что найдете оба объекта без подсказки ;)</p>
<span id="more-1175">
</span>
<div id="map_canvas" style="width: 600px; height: 400px;margin:auto;">
</div>
<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false&#038;key=ABQIAAAAhZYAzYrXPwUDjxsHSuaBzRROkIKc1AeUaEtpre4S8pXwOdxbIxQ7FwgQCh5LqtMSHrBMiLBIe5m16A">
</script>
<script >

var myLatlng = new google.maps.LatLng(35,0);
var myOptions = {
  zoom: 1,
  center: myLatlng,
  mapTypeId: google.maps.MapTypeId.HYBRID
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

</script>
<p>Для тех кто еще не понял почему я кипишую, площаль Австралии - 7 692 024 км², площадь Гренландии - 2 166 086 км². Тоесть по площади Австралия в три раза больше, а по карте - Гренландия во столько же. Более того мне уже подсказывают что она больше Южной Америки и где-то такая же как Африка.</p>
<p>Для тех кому интересно почему так в картинках смотрим у <a href="http://earth.google.com/intl/ru/userguide/v4/ug_importdata.html#note" rel="nofollow external">гугла</a> и немного текстовочки на <a href="http://ru.wikipedia.org/wiki/Проекция_Меркатора" rel="nofollow external">вики</a>
</p>
<p>
<strong>Updated 16.08.10</strong>
</p>
<p>А вот новое интересное дополнение к сабжу. Недавно нарыл гуглокарту (всеголишь демку) в проекции <a href="http://en.wikipedia.org/wiki/Gall–Peters_projection">Гэлла и Питерса</a>, выглядит она немного <a href="http://code.google.com/apis/maps/documentation/javascript/examples/map-projection-simple.html">необычно</a>.</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2009/12/29/mercator_detected/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
	</channel>
</rss>
