<?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>энтузиазм = 1/опыт © Старый Мавр</description>
	<lastBuildDate>Thu, 26 Jan 2012 10:34:13 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Aeromall</title>
		<link>http://mabp.kiev.ua/2011/06/22/aeromall/</link>
		<comments>http://mabp.kiev.ua/2011/06/22/aeromall/#comments</comments>
		<pubDate>Wed, 22 Jun 2011 12:28:58 +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=1371</guid>
		<description><![CDATA[Аэромолл наконец открыл свой сайт, на котором установлена моя карта. Плохо только то что маркеры повторяются по горизонтали, есть у кого идеи как исправить? Тайлы резал вот этим]]></description>
			<content:encoded><![CDATA[<p>Аэромолл наконец открыл свой сайт, на котором установлена моя <a href="http://aeromall.com.ua/ru/об-аэромолл/виртуальный-тур/" rel="external nofollow">карта</a>. Плохо только то что маркеры повторяются по горизонтали, есть у кого идеи как исправить?</p>

<p>Тайлы резал вот <a href="http://code.google.com/p/googletilecutter/">этим</a></p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2011/06/22/aeromall/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Кастомный контрол для гуглокарт</title>
		<link>http://mabp.kiev.ua/2011/05/04/custom-controll-for-google-maps/</link>
		<comments>http://mabp.kiev.ua/2011/05/04/custom-controll-for-google-maps/#comments</comments>
		<pubDate>Wed, 04 May 2011 21:18: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=1358</guid>
		<description><![CDATA[вот так легко и просто можно создать еще один вид оверлея для карт function MyControl(map) { this.map = map; this.button = document.createElement('DIV'); this.button.style.margin = "50px"; this.button.style.padding = "20px"; this.button.style.backgroundColor = "#fff"; this.button.style.fontSize = "25px"; this.button.style.cursor = "pointer"; this.button.appendChild(document.createTextNode("THIS IS SPARTAAA!!!")); this.div = document.createElement('DIV'); this.div.appendChild(this.button); var marker = new google.maps.Marker({ position : new google.maps.LatLng(37.074301,22.432584) }); google.maps.event.addDomListener(this.button, [...]]]></description>
			<content:encoded><![CDATA[<p>вот так легко и просто можно создать еще один вид оверлея для карт</p>
<span id="more-1358"></span>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="/content/js/custom-controll-for-google-maps.js"></script>

<pre><code class="javascript">
function MyControl(map) {
	this.map = map;	
	
	this.button = document.createElement('DIV');
	this.button.style.margin = "50px";
	this.button.style.padding = "20px";
	this.button.style.backgroundColor = "#fff";
	this.button.style.fontSize = "25px";
	this.button.style.cursor = "pointer";
	this.button.appendChild(document.createTextNode("THIS IS SPARTAAA!!!"));
	
	this.div = document.createElement('DIV');
	this.div.appendChild(this.button);

	var marker = new google.maps.Marker({
		position : new google.maps.LatLng(37.074301,22.432584)
	});
	
	google.maps.event.addDomListener(this.button, "click", function(e){
		if (marker.getMap()){
			marker.setMap(null); 
		} else {
			marker.setMap(map);
		}
	}); 
}

MyControl.prototype.getDiv = function() {
	return this.div;
};

MyControl.prototype.remove = function() {
	this.div.removeChild(this.button);
	this.div.parentNode.removeChild(this.div);
};

google.maps.event.addDomListener(window, 'load', function(){

    var map = new google.maps.Map(document.getElementById("map"), {
		zoom: 1,
		center: new google.maps.LatLng(0,0),
		mapTypeId: google.maps.MapTypeId.HYBRID,
    });
	
	var myControl = new MyControl(map);
	map.controls[google.maps.ControlPosition.TOP].push(myControl.getDiv());

});
</code></pre>

<div id="map" style="width:600px;height:400px;"></div>
  
 ]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2011/05/04/custom-controll-for-google-maps/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>polygonzo</title>
		<link>http://mabp.kiev.ua/2011/03/07/polygonzo/</link>
		<comments>http://mabp.kiev.ua/2011/03/07/polygonzo/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 19:37:11 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[IE]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1330</guid>
		<description><![CDATA[Долго и нервно подрачивал на эту красоту. Оказалась авторы сделали из нее открытый проект. Не буду дразнить, вот ссылка на проект. Кстати не успел его найти как уже поправил в нем баг, такой же как в rocon'e. Походу у всех проблемы с IE9]]></description>
			<content:encoded><![CDATA[<p>Долго и нервно подрачивал на <a href="http://maps.google.com/help/maps/elections/#primary_results" rel="external nofollow">эту</a> красоту. Оказалась авторы сделали из нее открытый проект.</p>
<span id="more-1330"></span>

<p>Не буду дразнить, вот <a href="http://code.google.com/p/polygonzo/" rel="external nofollow">ссылка</a> на проект. Кстати не успел его найти как уже поправил в нем баг, такой же как в <a href="http://mabp.kiev.ua/2011/03/03/rocon-fix/">rocon'e</a>. Походу у всех проблемы с IE9</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2011/03/07/polygonzo/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Embeded map</title>
		<link>http://mabp.kiev.ua/2010/11/11/embeded-map/</link>
		<comments>http://mabp.kiev.ua/2010/11/11/embeded-map/#comments</comments>
		<pubDate>Thu, 11 Nov 2010 09:54:32 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[Программирование]]></category>
		<category><![CDATA[Разное]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1293</guid>
		<description><![CDATA[Карту должно быть видно через ридер]]></description>
			<content:encoded><![CDATA[<p>Карту должно быть видно через ридер</p>

<span id="more-1293"></span>

<iframe marginheight="0" marginwidth="0" src="http://maps.google.com/maps/ms?hl=ru&#038;source=embed&#038;msa=0&#038;ll=50.440951,30.527181&#038;output=embed&#038;spn=0.1,0.1" scrolling="no" frameborder="0" height="350" width="600"></iframe>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/11/11/embeded-map/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Canvas Overlay</title>
		<link>http://mabp.kiev.ua/2010/11/05/canvas-overlay/</link>
		<comments>http://mabp.kiev.ua/2010/11/05/canvas-overlay/#comments</comments>
		<pubDate>Fri, 05 Nov 2010 14:56:35 +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=1291</guid>
		<description><![CDATA[Скуки ради решил сделать Canvas Overlay. В основе естественно Raphaël Overlay, но немного переделанный. Если все пойдет хорошо сделаю из них один. На самом деле показывать пока практически нечего. Надо еще сильно подумать над синхронизацией и выставлением интервалов. А пока пример:]]></description>
			<content:encoded><![CDATA[<p>Скуки ради решил сделать Canvas Overlay. В основе естественно <a href="http://mabp.kiev.ua/2010/09/10/raphael-overlay/">Raphaël Overlay</a>, но немного переделанный. Если все пойдет хорошо сделаю из них один.</p>
<span id="more-1291"></span>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="/content/source/googlemaps/CanvasOverlay-0.1.js"></script>
<script type="text/javascript" src="/content/js/canvas-overlay.js"></script>

<p>На самом деле показывать пока практически нечего. Надо еще сильно подумать над синхронизацией и выставлением интервалов. А пока пример:</p>



<div id="map" style="width:600px;height:400px;"></div>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/11/05/canvas-overlay/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>gRaphaël overlay</title>
		<link>http://mabp.kiev.ua/2010/10/29/graphael-overlay/</link>
		<comments>http://mabp.kiev.ua/2010/10/29/graphael-overlay/#comments</comments>
		<pubDate>Fri, 29 Oct 2010 20:20:03 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[2d]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[Raphaël]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1282</guid>
		<description><![CDATA[Я там давеча обмолвился что не буду больше развивать Raphaël Overlay - спиздел. Итак пролетая версию 0.8 в которой был добавлен логер прилетаем сразу к 0.9 а в ней возможность расовать графики при помощи gRaphaël Пирожки Столбики вертикально Столбики горизонтаьно Линии Точки, правда они еще не очень хорошо работают]]></description>
			<content:encoded><![CDATA[<p>Я там давеча обмолвился что не буду больше развивать <a href="http://mabp.kiev.ua/2010/09/10/raphael-overlay/">Raphaël Overlay</a> - спиздел.</p>

<span id="more-1282"></span>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="/content/source/raphael/raphael-1.5.2.js"></script>
<script type="text/javascript" src="/content/source/raphael/g.raphael.js"></script>
<script type="text/javascript" src="/content/source/raphael/g.pie.js"></script>
<script type="text/javascript" src="/content/source/raphael/g.line.js"></script>
<script type="text/javascript" src="/content/source/raphael/g.dot.js"></script>
<script type="text/javascript" src="/content/source/raphael/g.bar.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelOverlay-0.9.3.js"></script>
<script type="text/javascript" src="/content/js/graphael-overlay.js"></script>

<p>Итак пролетая версию 0.8 в которой был добавлен логер прилетаем сразу к 0.9 а в ней возможность расовать графики при помощи gRaphaël</p>

<p>Пирожки</p>
<div id="map1" style="width:600px;height:400px;"></div>

<p>Столбики вертикально</p>
<div id="map21" style="width:600px;height:400px;"></div>

<p>Столбики горизонтаьно</p>
<div id="map22" style="width:600px;height:400px;"></div>

<p>Линии</p>
<div id="map3" style="width:600px;height:400px;"></div>

<p>Точки, правда они еще не очень хорошо работают</p>
<div id="map4" style="width:600px;height:400px;"></div>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/10/29/graphael-overlay/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Карты генштаба 43 года</title>
		<link>http://mabp.kiev.ua/2010/10/28/maps-of-staff-43/</link>
		<comments>http://mabp.kiev.ua/2010/10/28/maps-of-staff-43/#comments</comments>
		<pubDate>Thu, 28 Oct 2010 18:12:24 +0000</pubDate>
		<dc:creator>CTAPbIu_MABP</dc:creator>
				<category><![CDATA[JavaScript]]></category>
		<category><![CDATA[Программирование]]></category>
		<category><![CDATA[canvas]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1281</guid>
		<description><![CDATA[Давно зрела идея о черно-белых картах, да все никак руки не доходили. И вот дошли... К сожалению заменить картинки на карте Земли не получилось бы по двум причинам: Я конечно не уверен, но мне кажется, это бы нарушило лицензионное соглашение. А я хоть и не мего законопослушный но делать этого в отношении гугла не хочу... [...]]]></description>
			<content:encoded><![CDATA[<p>Давно зрела идея о черно-белых картах, да все никак руки не доходили. И вот дошли...</p>
<span id="more-1281"></span>


<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/source/googlemaps/GrayscaleMapType.js"></script>
<script type="text/javascript" src="/content/js/maps-of-staff-43.js"></script>

<p>К сожалению заменить картинки на карте Земли не получилось бы по двум причинам:</p>
<p>Я конечно не уверен, но мне кажется, это бы нарушило лицензионное соглашение. А я хоть и не мего законопослушный но делать этого в отношении гугла не хочу... вот были бы это карты от микрософта...</p>
<p>Вторая причина загадочная </p>
<blockquote>Security error" code: "1000</blockquote>
<p>Прямиком из фаербага. По идеи она возникает тогда когда я хочу получить getImageData картинки со стороннего домена. В общем я это еще узнаю.</p>
<p>Но не смотря на все трудности я все же сделал черно-белую карту с этой гнусной рожей которая мне уже порядком надоела.</p>

<div id="map" style="width: 600px; height: 800px;"></div>

<p>Куда бы его на этот раз сунуть свои шаловливые рученьки?!</p>
]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/10/28/maps-of-staff-43/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<category><![CDATA[Raphaël]]></category>
		<category><![CDATA[SVG]]></category>

		<guid isPermaLink="false">http://mabp.kiev.ua/?p=1250</guid>
		<description><![CDATA[После недавних экспериментов я решил создать что-то, чем действительно можно пользоваться для рисования по картам. Ссылка для скачивания в самом низу страницы. Начал с примитивов - прямоугольников (картинок) и кругов (эллипсов). Дело совершенно не хитрое перевел координату в точки по карте и умножил сторону (радиус) на два в степени приближение. // рисуем круг из центра [...]]]></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>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="/content/source/raphael/raphael-1.5.2.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelOverlay-0.9.3.js"></script>
<script type="text/javascript" src="/content/js/raphael-overlay.js"></script>

<p>Ссылка для скачивания в самом низу страницы.</p>
<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;& j==1) {
					line[i].push(center.x - left + path[i][j]); // начальная точка по X
				} else if (i==0 &#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.9.3.js">DOWNLOAD LINK</a>. Вот и все, надеюсь будет хоть кому-то полезно!</p>]]></content:encoded>
			<wfw:commentRss>http://mabp.kiev.ua/2010/09/10/raphael-overlay/feed/</wfw:commentRss>
		<slash:comments>10</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[Google]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[SVG]]></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>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="/content/source/raphael/raphael-1.5.2.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/EuclideanProjection.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/CoordMapType.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelOverlay-0.1.js"></script>
<script type="text/javascript" src="/content/js/google-maps-v3-raphael-overlay.js"></script>

<p>На этот раз я довел <a href="http://mabp.kiev.ua/2010/08/16/custom-maptype-projection-in-google-map-api-v3/">Эвклидову проекцию</a> до ума, и теперь с ней действительно можно что-то рисовать. А так же накодил более менее сносную прокладку между Raphaël и Google Maps, теперь ею можно рисовать. Пожалуй вот сейчас этим и займемся.</p>

<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>


]]></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[2d]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[map]]></category>
		<category><![CDATA[Raphaël]]></category>
		<category><![CDATA[SVG]]></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>

<script type="text/javascript" src="http://maps.google.com/maps/api/js?sensor=false"></script>
<script type="text/javascript" src="/content/source/raphael/raphael-1.5.2.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/EuclideanProjection.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/CoordMapType.js"></script>
<script type="text/javascript" src="/content/source/googlemaps/RaphaelCircle.js"></script>
<script type="text/javascript" src="/content/js/google-maps-v3-raphael.js"></script>


<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>

<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>
	</channel>
</rss>

