<?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>Flexmaniak.pl</title>
	<atom:link href="http://blog.flexmaniak.pl/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.flexmaniak.pl</link>
	<description>Flex, Papervision3D, PHP, Symfony</description>
	<lastBuildDate>Sat, 24 Jul 2010 18:34:40 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>FabricationConsole gotowe</title>
		<link>http://blog.flexmaniak.pl/flex/fabricationconsole-gotowe</link>
		<comments>http://blog.flexmaniak.pl/flex/fabricationconsole-gotowe#comments</comments>
		<pubDate>Sat, 24 Jul 2010 18:34:40 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[fabrication]]></category>
		<category><![CDATA[fabrication framework]]></category>
		<category><![CDATA[fabricationconsole]]></category>
		<category><![CDATA[konsola]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=888</guid>
		<description><![CDATA[Jakiś czas temu pisałem o TequilaConsole, która jest bardzo wygodnym narzędziem przeznaczonym dla frameworka Tequila. Ostatnio jednak Rafał Szemraj (autor Tequili) przejął kontrolę nad Fabrication i postanowił wchłonić do niego Tequilę. Niedługo musieliśmy czekać na FabricationConsole, która jest klonem poprzedniej konsoli przeznaczonym dla Fabrication.]]></description>
			<content:encoded><![CDATA[<p>Jakiś czas temu pisałem o TequilaConsole, która jest bardzo wygodnym narzędziem przeznaczonym dla frameworka Tequila.</p>
<p>Ostatnio jednak Rafał Szemraj (autor Tequili) przejął kontrolę nad Fabrication i postanowił wchłonić do niego Tequilę. </p>
<p>Niedługo musieliśmy czekać na <a href="http://code.google.com/p/fabrication/wiki/FabricationConsole">FabricationConsole</a>, która jest klonem poprzedniej konsoli przeznaczonym dla Fabrication.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/fabricationconsole-gotowe/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Zend_Amf + Symfony + Flex] Server with Logger</title>
		<link>http://blog.flexmaniak.pl/flex_i_php/zend_amf-symfony-flex-server-with-logger</link>
		<comments>http://blog.flexmaniak.pl/flex_i_php/zend_amf-symfony-flex-server-with-logger#comments</comments>
		<pubDate>Sun, 18 Jul 2010 19:50:57 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[Flex i PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[amf server]]></category>
		<category><![CDATA[logger]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[server]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[Zend_Amf]]></category>
		<category><![CDATA[zend_amf_server]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=878</guid>
		<description><![CDATA[After integrating Symfony with Flex through Zend_Amf, I had to debug it and I needed some logs on server side. Below I present my LoggedAmfServer extending Zend_Amf_Server, which logs all methods called by Flex and its&#8217; responses. You need to pass instance of sfLogger (ie. sfFileLogger) in the constructor. logger = $l; parent::__construct&#40;&#41;; &#125; protected [...]]]></description>
			<content:encoded><![CDATA[<p>After integrating Symfony with Flex through Zend_Amf, I had to debug it and I needed some logs on server side.<br />
Below I present my <strong>LoggedAmfServer</strong> extending Zend_Amf_Server, which logs all methods called by Flex and its&#8217; responses. You need to pass instance of sfLogger (ie. sfFileLogger) in the constructor.</p>
<p><span id="more-878"></span></p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:100%;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">logger <span style="color: #339933;">=</span> <span style="color: #000088;">$l</span><span style="color: #339933;">;</span><br />
parent<span style="color: #339933;">::</span>__construct<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">protected</span> <span style="color: #000000; font-weight: bold;">function</span> _handle<span style="color: #009900;">&#40;</span>Zend_Amf_Request <span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$responseBody</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$request</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAmfBodies</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$body</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/current"><span style="color: #990000;">current</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$responseBody</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$body</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$body</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span> instanceof Zend_Amf_Value_Messaging_RemotingMessage<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logger</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/sprintf"><span style="color: #990000;">sprintf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[Amf Request] CLIENT: [<span style="color: #009933; font-weight: bold;">%s</span>] OPERATION: [<span style="color: #009933; font-weight: bold;">%s</span>]. PARAMETERS: [<span style="color: #009933; font-weight: bold;">%s</span>].&quot;</span><span style="color: #339933;">,</span><br />
<span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clientId</span><span style="color: #339933;">,</span> <span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">operation</span><span style="color: #339933;">,</span> <a href="http://www.php.net/var_export"><span style="color: #990000;">var_export</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
parent<span style="color: #339933;">::</span>_handle<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> handle<span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span> <span style="color: #339933;">=</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$response</span> <span style="color: #339933;">=</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">handle</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$request</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000088;">$body</span> <span style="color: #339933;">=</span> <a href="http://www.php.net/current"><span style="color: #990000;">current</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$response</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getAmfBodies</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$body</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$data</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$body</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">getData</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">logger</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">log</span><span style="color: #009900;">&#40;</span><a href="http://www.php.net/sprintf"><span style="color: #990000;">sprintf</span></a><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;[Amf Response] CLIENT: [<span style="color: #009933; font-weight: bold;">%s</span>] RESPONSE: [<span style="color: #009933; font-weight: bold;">%s</span>]&quot;</span><span style="color: #339933;">,</span><br />
<span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">clientId</span><span style="color: #339933;">,</span> <a href="http://www.php.net/var_export"><span style="color: #990000;">var_export</span></a><span style="color: #009900;">&#40;</span><span style="color: #000088;">$data</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">body</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$response</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #009900;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex_i_php/zend_amf-symfony-flex-server-with-logger/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fabrication wchłania Tequile</title>
		<link>http://blog.flexmaniak.pl/flex/fabrication-wchlania-tequile</link>
		<comments>http://blog.flexmaniak.pl/flex/fabrication-wchlania-tequile#comments</comments>
		<pubDate>Wed, 07 Jul 2010 12:48:56 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[fabrication]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[tequila]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=874</guid>
		<description><![CDATA[Ostatnio pisałem o nowym ciekawym frameworku Tequila w tym poście. Jednakże jak się okazuje, jego autor (Rafał Szemraj) przejął pełną kontrolę (=)) nad projektem Fabrication. Od tej pory Fabrication będzie wchłaniało funkcjonalności Tequili, dlatego też praca nad Tequilą została zawieszona (komentarz Rafała w poście). Dodam tylko, że zauważyłem, że 2 dni temu została opublikowana najnowsza [...]]]></description>
			<content:encoded><![CDATA[<p>Ostatnio pisałem o nowym ciekawym frameworku Tequila w <a href="http://blog.flexmaniak.pl/aktualnosci/tequila-framework">tym</a> poście.</p>
<p>Jednakże jak się okazuje, jego autor (Rafał Szemraj) przejął pełną kontrolę (=)) nad projektem <strong>Fabrication</strong>.<br />
Od tej pory Fabrication będzie wchłaniało funkcjonalności Tequili, dlatego też praca nad Tequilą została zawieszona (komentarz Rafała w <a href="http://blog.flexmaniak.pl/aktualnosci/tequila-framework" title="Tequila framework">poście</a>).</p>
<p>Dodam tylko, że zauważyłem, że 2 dni temu została opublikowana najnowsza wersja Fabrication <strong>0.7.1</strong>.</p>
<p>Przydatke linki:<br />
<a href="http://code.google.com/p/fabrication/">http://code.google.com/p/fabrication/</a> &#8211; oficjalna stronka Fabrication<br />
<a href="http://blog.szemraj.eu">http://blog.szemraj.eu</a> &#8211; blog Rafała</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/fabrication-wchlania-tequile/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Overriding setter/getter in Symfony</title>
		<link>http://blog.flexmaniak.pl/flex_i_php/overriding-settergetter-in-symfony</link>
		<comments>http://blog.flexmaniak.pl/flex_i_php/overriding-settergetter-in-symfony#comments</comments>
		<pubDate>Fri, 02 Jul 2010 10:23:11 +0000</pubDate>
		<dc:creator>damian</dc:creator>
				<category><![CDATA[Flex i PHP]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[getter]]></category>
		<category><![CDATA[magic function]]></category>
		<category><![CDATA[setter]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[_set]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=851</guid>
		<description><![CDATA[Overriding methods should not be a problem, but it can make you confused if you don&#8217;t know how magic functions are used in Symfony 1.4 models. In this short article I will explain why usual overriding does not work in Symfony models and how to override methods handled by magic functions. Suppose, we have a [...]]]></description>
			<content:encoded><![CDATA[<p>Overriding methods should not be a problem, but it can make you confused if you don&#8217;t know how magic functions are used in Symfony 1.4 models.</p>
<p>In this short article I will explain why usual overriding does not work in Symfony models and how to override methods handled by magic functions.</p>
<p><span id="more-851"></span></p>
<p>Suppose, we have a base model class <strong>BaseTopic</strong>:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">abstract <span style="color: #000000; font-weight: bold;">class</span> BaseTopic <span style="color: #000000; font-weight: bold;">extends</span> sfDoctrineRecord<br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setTableDefinition<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">setTableName</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'topic'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
<span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'string'</span><span style="color: #339933;">,</span><br />
<span style="color: #0000ff;">'notnull'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #009900; font-weight: bold;">true</span><span style="color: #339933;">,</span><br />
<span style="color: #0000ff;">'length'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">255</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">hasColumn</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'updates_count'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span> <span style="color: #009900; font-weight: bold;">null</span><span style="color: #339933;">,</span> <a href="http://www.php.net/array"><span style="color: #990000;">array</span></a><span style="color: #009900;">&#40;</span><br />
<span style="color: #0000ff;">'type'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #0000ff;">'integer'</span><span style="color: #339933;">,</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>and our class:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Topic <span style="color: #000000; font-weight: bold;">extends</span> BaseTopic<br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Now we want to update <strong>updates_count</strong> field each time we modify <strong>name</strong> field.</p>
<p>First guess is to do the following:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Topic <span style="color: #000000; font-weight: bold;">extends</span> BaseTopic<br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">updates_count</span><span style="color: #339933;">++;</span><br />
<br />
<span style="color: #b1b100;">return</span> parent<span style="color: #339933;">::</span><span style="color: #004000;">setName</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>However it will not work unless you have declared method <strong>setName</strong> in <strong>BaseTopic</strong> literally (magical <strong>__call</strong> does not count).</p>
<p>Upper method will do the following:</p>
<ol>
<li>Increment <strong>updates_count</strong> field</li>
<li>Call <strong>setName </strong>method from <strong>BaseTopic</strong> (which does not exist literally) so it will look for this method in parents</li>
<li>Because there is no <strong>setName</strong> in any parent class, it will go to <strong>Doctrine_Record</strong> and call <strong>__call</strong> method which will find <strong>setName </strong>method in <strong>Topic</strong> class</li>
<li>Call <strong>setName </strong>from <strong>Topic </strong>class again</li>
</ol>
<p>To solve this problem you have to use <strong>_set</strong> function from <strong>Doctrine_Record</strong> class:</p>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> Topic <span style="color: #000000; font-weight: bold;">extends</span> BaseTopic<br />
<span style="color: #009900;">&#123;</span><br />
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">function</span> setName<span style="color: #009900;">&#40;</span><span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
<br />
<span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">updates_count</span><span style="color: #339933;">++;</span><br />
<br />
<span style="color: #b1b100;">return</span> <span style="color: #000088;">$this</span><span style="color: #339933;">-&gt;</span>_set<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'name'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$name</span><span style="color: #009900;">&#41;</span><br />
<br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #009900;">&#125;</span></div></div>
<p>Remember to use function <strong>_set()</strong>, not <strong>set().</strong></p>
<p>Of course there is no problem if you have defined <strong>setName</strong> method in any of <strong>Topic</strong>&#8216;s parent classes literally.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex_i_php/overriding-settergetter-in-symfony/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rysowanie gradientów w ActionScript</title>
		<link>http://blog.flexmaniak.pl/flex/rysowanie-gradientow-w-actionscript</link>
		<comments>http://blog.flexmaniak.pl/flex/rysowanie-gradientow-w-actionscript#comments</comments>
		<pubDate>Wed, 30 Jun 2010 13:59:43 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Flex]]></category>
		<category><![CDATA[beginGradientFill]]></category>
		<category><![CDATA[createGradientBox]]></category>
		<category><![CDATA[GradientType]]></category>
		<category><![CDATA[graphics]]></category>
		<category><![CDATA[InterpolationMethod]]></category>
		<category><![CDATA[Rysowanie gradientów]]></category>
		<category><![CDATA[SpreadMethod]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=789</guid>
		<description><![CDATA[Rysowanie gradientów jest procesem, na który wpływ ma stosunkowo wiele parametrów. Żeby być w pełni świadomym możliwości jakie w tej dziedzinie oferuje Flex sprawdzimy w jaki sposób każdy z nich oddziałuje na wygląd gradientu. Spis treści Aplikacja Wstęp do rysowania gradientu Parametry rysowania gradientu Aplikacja Poniższa aplikacja pozwala przetestować sposób w jaki poszczególne parametry rysowania [...]]]></description>
			<content:encoded><![CDATA[<p>Rysowanie gradientów jest procesem, na który wpływ ma stosunkowo wiele parametrów. Żeby być w pełni świadomym możliwości jakie w tej dziedzinie oferuje Flex sprawdzimy w jaki sposób każdy z nich oddziałuje na wygląd gradientu.<br />
<span id="more-789"></span></p>
<h3>Spis treści</h3>
<ul>
<li><a href="#aplikacja">Aplikacja</a></li>
<li><a href="#wstep">Wstęp do rysowania gradientu</a></li>
<li><a href="#parametry">Parametry rysowania gradientu</a></li>
</ul>
<h3><a name="aplikacja">Aplikacja</a></h3>
<p>Poniższa aplikacja pozwala przetestować sposób w jaki poszczególne parametry rysowania gradientu wpływają na jego wygląd.<br />
<a href="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/application/application.html" target="_blank" alt="Kliknij aby otworzyć aplikację w osobnym oknie"><img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/application_thumb.jpg" /></a></p>
<h3><a name="wstep">Wstęp do rysowania gradientu</a></h3>
<p>Gradient możemy narysować na dowolnym obiekcie dziedziczącym po klasie Sprite poprzez odwołanie się do jego pola <strong>graphics</strong>, wywołanie na nim metody <strong>beginGradientFill</strong> i narysowaniu kształtu, który będzie wypełniony gradientem.</p>
<p>Schemat rysowania gradientu na prostokącie:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">beginGradientFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #0066CC;">type</span>, colors, alphas, ratios, matrix, spreadMethod, interpolationMethod, focalPointRatio<span style="color: #66cc66;">&#41;</span>;<br />
sprite.<span style="color: #006600;">graphics</span>.<span style="color: #006600;">drawRect</span><span style="color: #66cc66;">&#40;</span>rectX, rectY, rectWidth, rectHeight<span style="color: #66cc66;">&#41;</span>;<br />
sprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Wszystkie parametry podane w powyższym schemacie należy zastąpić odpowiednimi wartościami, których opis znajduje się w dalszej części wpisu. Tylko cztery pierwsze parametry metody beginGradientFill są wymagane, pozostałe posiadają zdefiniowane wartości domyślne. Gradient zostanie narysowany na dowolnym kształcie geometrycznym opisanym pomiędzy wywołaniami metod beginGradientFill a endFill.</p>
<h3><a name="parametry">Parametry rysowania gradientu</a></h3>
<ul>
<li><strong>Typ gradientu</strong> (par. type)
<ul>
<li><strong>LINEAR</strong> &#8211; Gradient liniowy.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/linear.jpg" />
			</li>
<li><strong>RADIAL</strong> &#8211; Gradient promienisty.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/radial.jpg" />
			</li>
</ul>
</li>
<li><strong>Tablica kolorów</strong> (par. colors) &#8211; Określa kolory jakie zostaną użyte do narysowania gradientu. Dla gradientu liniowego podane kolory zostaną zastosowane od strony lewej do prawej natomiast w przypadku gradientu promienistego od wnętrza do zewnętrza.</li>
<li><strong>Tablica wartości alfa</strong> (par. alphas) &#8211; Określa stopień przeźroczystości kolorów zdefiniowanych w tablicy kolorów. Liczba elementów w tablicy wartości alfa musi być równa liczbie elementów w tablicy kolorów. Wartości alfa należą do przedziału <0,1>.</li>
<li><strong>Tablica proporcji</strong> (par. ratios) &#8211; Określa proporcje w jakich gradient osiągnie poszczególne kolory z tablicy kolorów. Liczba elementów w tablicy proporcji musi być równa liczbie elementów w tablicy kolorów. Wartości proporcji należą do przedziału <0,255>, gdzie 0 oznacza początek gradientu natomiast 255 jego koniec. Każda kolejna wartość w tablicy proporcji musi być większa lub równa wartości poprzedzającej ją.<br/><br/>
<p>Poniższy rysunek przedstawia trzy gradienty kolorów czarnego i białego narysowane z różnymi proporcjami.<br />
<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/ratios.jpg" />
</li>
<li><strong>Macierz transformacji</strong> (par. matrix) (wartość domyślna: null) &#8211; Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/geom/Matrix.html">Matrix</a>. Wywołujemy na nim metodę <strong>createGradientBox</strong> w celu określenia wyglądu gradientu. Metoda createGradientBox przyjmuje następujące parametry: </li>
<ul>
<li><strong>width</strong> &#8211; Szerokość gradientu.</li>
<li><strong>height</strong> &#8211; Wysokość gradientu.</li>
<li><strong>rotation</strong> &#8211; Obrót gradientu w radianach.</li>
<li><strong>tx</strong> &#8211; Poziome przesunięcie gradientu.</li>
<li><strong>ty</strong> &#8211; Pionowe przesunięcie gradientu.</li>
</ul>
<li><strong>Metoda rozprzestrzeniania gradientu</strong> (par. spreadMethod) (wartość domyślna: PAD) &#8211; Wymiary (szerokość i wysokość) gradientu określane są w macierzy transformacji, natomiast wymiary obszaru na jakim gradient zostanie narysowany określane są poprzez wymiary kształtu, który zostanie wypełniony gradientem. W przypadku kiedy wymiary gradientu są mniejsze od wymiarów kształtu, który wypełnia gradient sposób wypełnienia pustej przestrzeni określany jest przez parametr spreadMethod. <br/><br/>
<p>Poniższy rysunek przedstawia sposób rozprzestrzenienia gradientu za pomocą metody REPEAT w sytuacji, w której szerokość gradientu jest kilkukrotnie mniejsza niż szerokość wypełnionego nim prostokąta.</p>
<div style="width: 100%; text-align:center"><img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/matrix_rect_width.jpg" /></div>
<ul>
<li><strong>PAD</strong> &#8211; Pustą przestrzeń wypełniają krańcowe kolory gradientu.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/pad.jpg" />
			</li>
<li><strong>REFLECT</strong> &#8211; Pustą przestrzeń wypełniają kolejne wystąpienia gradientu z odwróconą kolejnością kolorów składowych.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/reflect.jpg" />
			</li>
<li><strong>REPEAT</strong> &#8211; Pustą przestrzeń wypełniają kolejne wystąpienia gradientu.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/repeat.jpg" />
			</li>
</ul>
</li>
<li><strong>Metoda interpolacji gradientu</strong> (par. interpolationMethod) (wartość domyślna: RGB) &#8211; Określa czy zmiana koloru będzie następować w sposób liniowy czy wykładniczy.
<ul>
<li><strong>RGB</strong> &#8211; Zmiana koloru w sposób wykładniczy.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/linear.jpg" />
			</li>
<li><strong>LINEAR_RGB</strong> &#8211; Zmiana koloru w sposób liniowy.<br />
				<img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/linear_rgb.jpg" />
			</li>
</ul>
</li>
<li><strong>Położenie ogniskowej gradientu</strong> (par. focalPointRatio) (wartość domyślna: 0) &#8211; Określa położenie ogniskowej gradientu. Wartości jakie przyjmuje ten parametr należą do zakresu od -1 do 1. Wartość 0 oznacza położenie ogniskowej na środku gradientu, natomiast wartości -1 i 1 oznaczają położenie ogniskowej na krawędziach gradientu.
<div style="width: 100%; text-align:center"><img src="http://blog.na14.pl/examples/2010-06-30_gradient_drawing/focalPointRatio.jpg" /></div>
</li>
</ul>
<p>Przykładowe narysowanie gradientu na obiekcie typu Sprite:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> matrix:Matrix = <span style="color: #000000; font-weight: bold;">new</span> Matrix;<br />
matrix.<span style="color: #006600;">createGradientBox</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
<br />
sprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">beginGradientFill</span><span style="color: #66cc66;">&#40;</span><br />
&nbsp; &nbsp; GradientType.<span style="color: #006600;">RADIAL</span>,<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span>0xffffff,0x000000<span style="color: #66cc66;">&#93;</span>,<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">1</span>,<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span>,<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#91;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">255</span><span style="color: #66cc66;">&#93;</span>,<br />
&nbsp; &nbsp; matrix,<br />
&nbsp; &nbsp; SpreadMethod.<span style="color: #006600;">REFLECT</span>,<br />
&nbsp; &nbsp; InterpolationMethod.<span style="color: #006600;">RGB</span>,<br />
&nbsp; &nbsp; <span style="color: #cc66cc;">1</span><br />
<span style="color: #66cc66;">&#41;</span>;<br />
sprite.<span style="color: #006600;">graphics</span>.<span style="color: #006600;">drawRect</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,<span style="color: #cc66cc;">0</span>,gradientGroup.<span style="color: #0066CC;">width</span>,gradientGroup.<span style="color: #0066CC;">height</span><span style="color: #66cc66;">&#41;</span>;<br />
sprite.<span style="color: #006600;">graphics</span>.<span style="color: #0066CC;">endFill</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/rysowanie-gradientow-w-actionscript/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex i Google Maps API</title>
		<link>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api</link>
		<comments>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:38:43 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Google Maps API]]></category>
		<category><![CDATA[ClientGeocoder]]></category>
		<category><![CDATA[InfoWindowOptions]]></category>
		<category><![CDATA[Marker]]></category>
		<category><![CDATA[MarkerOptions]]></category>

		<guid isPermaLink="false">http://blog.na14.pl/wordpress/?p=192</guid>
		<description><![CDATA[Google Maps API to zestaw narzędzi do wyświetlania i zarządzania mapami niemal wszystkich rejonów świata. Dzięki tej bibliotece będziemy mogli dodawać do mapy oznaczenia, okna informacyjne, obsługiwać zdarzenia interakcji z mapą, rysować po mapie własne kształty, geolokalizować obiekty architektoniczne, ulice, miasta, rejony geograficzne itd., wyznaczać trasy pomiędzy wybranymi lokacjami oraz korzystać różnych z innych funkcji [...]]]></description>
			<content:encoded><![CDATA[<p>Google Maps API to zestaw narzędzi do wyświetlania i zarządzania mapami niemal wszystkich rejonów świata. Dzięki tej bibliotece będziemy mogli dodawać do mapy oznaczenia, okna informacyjne, obsługiwać zdarzenia interakcji z mapą, rysować po mapie własne kształty, geolokalizować obiekty architektoniczne, ulice, miasta, rejony geograficzne itd., wyznaczać trasy pomiędzy wybranymi lokacjami oraz korzystać różnych z innych funkcji map Google.<br />
<span id="more-192"></span></p>
<h3>Spis treści</h3>
<ul>
<li><a href="http://blog.flexmaniak.pl/flex/flex-i-google-maps-api-wstep" target="_blank">Wstęp</a></li>
<li><a href="http://blog.flexmaniak.pl/flex/flex-i-google-maps-api-markery" target="_blank">Markery</a></li>
<li><a href="http://blog.flexmaniak.pl/flex/flex-i-google-maps-api-okna-informacjyne" target="_blank">Okna informacyjne</a></li>
<li><a href="http://blog.flexmaniak.pl/flex/flex-i-google-maps-api-rysowanie-po-mapie" target="_blank">Rysowanie po mapie</a></li>
<li><a href="http://blog.flexmaniak.pl/flex/flex-i-google-maps-api-geolokalizacja" target="_blank">Usługa geoloklizacji</a></li>
<li><a href="http://blog.flexmaniak.pl/flex/flex-i-goole-maps-api-wyznaczanie-trasy" target="_blank">Usługa wyznaczania tras</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Flex i Google Maps API &#8211; wyznaczanie trasy</title>
		<link>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-goole-maps-api-wyznaczanie-trasy</link>
		<comments>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-goole-maps-api-wyznaczanie-trasy#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:38:26 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Google Maps API]]></category>
		<category><![CDATA[Directions]]></category>
		<category><![CDATA[DirectionsOptions]]></category>
		<category><![CDATA[Driving Directions]]></category>
		<category><![CDATA[Wyznaczanie trasy]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=413</guid>
		<description><![CDATA[Wyznaczanie trasy pomiędzy dowolnymi lokacjami to jedna z usług do jakiej dostęp umożliwia Google Maps API. Dzięki niej ustalimy parametry wyznaczania trasy, odrysujemy na mapie trasę przebiegającą przez dowolną ilość lokacji oraz uzyskamy dostęp do wskazówek podróży, które pozwolą nam podążać wzdłuż określonej ścieżki. Spis treści Aplikacja Przygotowanie komunikacji z usługą Parametry wyznaczania trasy Wysłanie [...]]]></description>
			<content:encoded><![CDATA[<p>Wyznaczanie trasy pomiędzy dowolnymi lokacjami to jedna z usług do jakiej dostęp umożliwia Google Maps API. Dzięki niej ustalimy parametry wyznaczania trasy, odrysujemy na mapie trasę przebiegającą przez dowolną ilość lokacji oraz uzyskamy dostęp do wskazówek podróży, które pozwolą nam podążać wzdłuż określonej ścieżki.<br />
<span id="more-413"></span></p>
<h3>Spis treści</h3>
<ul>
<li><a href="#aplikacja">Aplikacja</a></li>
<li><a href="#przygotowanie">Przygotowanie komunikacji z usługą</a></li>
<li><a href="#parametry">Parametry wyznaczania trasy<a/></li>
<li><a href="#wysylanie">Wysłanie zapytania wyznaczenia trasy</a></li>
<li><a href="#odbieranie">Odebranie wyniku zapytania wyznaczenia trasy</a>
<ul>
<li><a href="#sukces">Wyznaczanie trasy zakończyło się sukcesem</a></li>
<li><a href="#blad">Wyznaczanie trasy zakończyło się błędem</a></li>
</ul>
</li>
</ul>
<h3><a name="aplikacja">Aplikacja</a></h3>
<p>Poniższa aplikacja demonstruje możliwości usługi <strong>Driving Directions</strong>: wyznaczania trasy pomiędzy dwiema lub trzema lokacjami, ustawiania parametrów wyznaczania trasy, odrysowywania trasy na mapie, przeglądania wskazówek podróżowania według wyznaczonej trasy. Dostęp do źródła można uzyskać poprzez kliknięcie prawym przyciskiem myszy w obszar aplikacji i wybranie opcji &#8222;View Source&#8221; z menu kontekstowego.<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/driving_directions/application/application.html" target="_blank" alt="Kliknij aby otworzyć aplikację w osobnym oknie"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/driving_directions/application_thumb.jpg" /></a></p>
<h3><a name="przygotowanie">Przygotowanie komunikacji z usługą</a></h3>
<p>W celu wyznaczenia trasy musimy posłużyć się obiektem klasy <strong>Directions</strong>. Za jego pośrednictwem ustawimy wszystkie parametry wyznaczania trasy, wyślemy zapytanie do serwera i odbierzemy jego wynik. Do obiektu klasy Directions dodajemy nasłuchiwanie na dwa zdarzenia: DirectionsEvent.DIRECTIONS_SUCCESS i DirectionsEvent.DIRECTIONS_FAILURE, które będą informować nas odpowiednio o pomyślnym lub niepomyślnym zakończeniu procesu wyznaczania trasy.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> directions:Directions = <span style="color: #000000; font-weight: bold;">new</span> Directions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; directions.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>DirectionsEvent.<span style="color: #006600;">DIRECTIONS_SUCCESS</span>, directions_DIRECTIONS_SUCCESS<span style="color: #66cc66;">&#41;</span>;<br />
&nbsp; &nbsp; directions.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>DirectionsEvent.<span style="color: #006600;">DIRECTIONS_FAILURE</span>, directions_DIRECTIONS_FAILURE<span style="color: #66cc66;">&#41;</span>;</div></div>
<h3><a name="parametry">Parametry wyznaczania trasy</a></h3>
<p>Parametry wyznaczania trasy określamy za pomocą obiektu klasy <strong>DirectionsOptions</strong>, który możemy przekazać do konstruktora klasy Directions lub ustawić ustawić w dowolnym momencie za pomocą metody setOptions klasy Directions. Określić możemy cztery parametry:</p>
<ul>
<li><strong>avoidHighways </strong>- Wartość logiczna określająca czy autostrady mają być brane pod uwagę podczas wyznaczania trasy. Domyślna wartość to true.</li>
<li><strong>countryCode </strong>- Oznaczenie kraju (&#8222;PL&#8221;,&#8221;EN&#8221; itp.) dla zapytania wyznaczania trasy. W przypadku nie ustawienia tego parametru zostanie użyta wartość zapisana w polu countryCode mapy (o ile sama została ustawiona). Nie zauważyłem żadnych zmian w działaniu aplikacji przy różnych ustawieniach tego parametru.</li>
<li><strong>language </strong>- Język (&#8222;en&#8221;, &#8222;pl&#8221; itd.) dla zapytania dla wyznaczania trasy. W przypadku nie ustawienia tego parametru zostanie użyta wartość zapisana w polu language mapy, a jeżeli i ta wartość nie jest ustawiona wtedy język zostanie ustalony na podstawie ustawień przeglądarki. Wartość tego parametru wpływa na język w jakim będą dostępne opisy kolejnych kroków trasy.</li>
<li><strong>travelMode </strong>- Rodzaj podróżowania dla jakiego zostanie wyznaczona trasa. Do wyboru mamy podróżowanie przy pomocy auta lub pieszo, dla których parametr powinien przyjąć odpowiednio wartości: TRAVEL_MODE_DRIVING lub TRAVEL_MODE_WALKING. Wartość domyślna to TRAVEL_MODE_DRIVING.</li>
</ul>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> options:DirectionsOptions = <span style="color: #000000; font-weight: bold;">new</span> DirectionsOptions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; avoidHighways: <span style="color: #000000; font-weight: bold;">true</span>,<br />
&nbsp; &nbsp; <span style="color: #0066CC;">language</span>: <span style="color: #ff0000;">'en'</span>,<br />
&nbsp; &nbsp; countryCode: <span style="color: #ff0000;">'US'</span>,<br />
&nbsp; &nbsp; travelMode: DirectionsOptions.<span style="color: #006600;">TRAVEL_MODE_WALKING</span><br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<h3><a name="wysylanie">Wysłanie zapytania wyznaczenia trasy</a></h3>
<p>Zapytanie wyznaczenia trasy wysyłamy za pomocą metody <strong>load</strong> klasy Directions, która jako parametr przyjmuje łańcuch opisujący lokacje przez jakie powinna przebiegać trasa.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">directions.<span style="color: #0066CC;">load</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;from: Lublin to: Warszawa to: Kraków&quot;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Minimalnie wystarczy podać jedna lokację po &#8222;from:&#8221; i jedną po &#8222;to:&#8221;. Jeżeli jednak chcemy wyznaczyć trasę przebiegającą przez jakieś konkretne lokacje wtedy podajemy je, w dowolnej ilości, po kolejnych  ciągach &#8222;to:&#8221;. Zamiast podawania nazw lokacji dopuszczalne jest podawanie ich współrzędnych geograficznych. Można w tym celu skorzystać z geolokaliztatora dostępnego np. w aplikacjach zamieszczonych we wpisach &#8222;Flex i Google Maps API &#8211; rysowanie po mapie&#8221; lub &#8222;Flex i Google Maps API &#8211; geolokalizacja&#8221;.</p>
<h3><a name="odbieranie">Odebranie wyniku zapytania wyznaczenia trasy</a></h3>
<p>Po wywołaniu metody load wykonany zostanie kod jednej z dwóch funkcji obsługujących zdarzenia pomyślnego i niepomyślnego zakończenia procesu wyznaczania trasy.</p>
<p><br/><strong><a name="sukces">Wyznaczanie trasy zakończyło się sukcesem</a></strong><br/><br />
Po pomyślnym wyznaczeniu trasy możemy odwołać się do obiektu directions w celu uzyskania różnych interesujących nas danych trasy takich jak:</p>
<ul>
<li>długość trasy,</li>
<li>przybliżony czas trwania podróży,</li>
<li>opis kolejnych kroków podróży,</li>
<li>graficzna reprezentacja trasy.</li>
</ul>
<p>Dostęp do trzech pierwszych uzyskujemy poprzez wywołanie metody <strong>getRoute</strong> obiektu directions, która jako parametr przyjmuje numer trasy. Jeżeli trasa została wyznaczona od punktu A do punktu B wtedy istnieje tylko jedna trasa. Jeżeli jednak wysłaliśmy zapytanie, w którym zdefiniowaliśmy np. dwie dodatkowe lokacje na drodze do punktu docelowego wtedy będziemy posiadali dostęp do trzech tras łączących odpowiednio punkty: A-B, B-C, C-D. Każda z tych tras będzie miała oddzielnie określoną długość, czas podróży oraz kolejne kroki podróży.</p>
<p>Przykładowe pobranie danych o długości trasy i czasie podróży:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">routeLengthTextArea.<span style="color: #0066CC;">htmlText</span> = directions.<span style="color: #006600;">getRoute</span><span style="color: #66cc66;">&#40;</span>routeIndex<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">distanceHtml</span>; <br />
travelTimeTextArea.<span style="color: #0066CC;">htmlText</span> = directions.<span style="color: #006600;">getRoute</span><span style="color: #66cc66;">&#40;</span>routeIndex<span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">durationHtml</span>;</div></div>
<p>Dostęp do poszczególnych kroków podróży uzyskujemy poprzez wywołanie metody <strong>getStep</strong> na wyniku zwróconym przez metodę getRoute. Metoda getStep zwraca obiekt klasy <strong>Step</strong>, który zawiera informacje o wybranym kroku podróży:</p>
<ul>
<li>opis,</li>
<li>czas wykonania,</li>
<li>współrzędne graficzne,</li>
<li>indeks pierwszego punktu tworzącego ten krok w graficznej reprezentacji trasy.</li>
</ul>
<p>Przykładowe pobranie opisu pierwszego kroku pierwszej trasy:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">stepTextArea.<span style="color: #0066CC;">htmlText</span> = directions.<span style="color: #006600;">getRoute</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">getStep</span><span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>.<span style="color: #006600;">descriptionHtml</span>;</div></div>
<p>Chcąc narysować na mapie kształt trasy wystarczy dodać jako warstwę rezultat wywołania metody <strong>createPolyline</strong>.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">map.<span style="color: #006600;">addOverlay</span><span style="color: #66cc66;">&#40;</span>directions.<span style="color: #006600;">createPolyline</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p><br/><strong><a name="blad">Wyznaczanie trasy zakończyło się błędem</a></strong><br/></p>
<p>W przypadku wystąpienia błędu podczas wyznaczania trasy wywołana zostanie funkcja obsługująca zdarzenie DirectionsEvent.DIRECTIONS_FAILURE. Żeby zidentyfikować przyczynę błędu pobieramy jego kod znajdujący się w polu status zdarzenia i sprawdzamy jego znaczenie w <a href="http://code.google.com/intl/pl/apis/maps/documentation/flash/reference.html#ServiceStatus" target="_blank">dokumentacji</a> lub poniżej:</p>
<ul>
<li>400: Zapytanie nie mogło zostać poprawnie przetworzone przez serwer</li>
<li>500: Wystąpiły problemy po stronie serwera geolokalizacji.</li>
<li>601: Nie podano adresu do geolokalizacji.</li>
<li>602: Nieznany lub nieprawidłowy adres.</li>
<li>603: Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.</li>
<li>604: Trasa nie może zostać wyznaczona.</li>
<li>620: Liczba dozwolonych zapytań w ciągu ostatnich 24 godzin została przekroczona.</li>
</ul>
<p>Przykładowa implementacja metody obsługującej zdarzenie niepomyślnego wyznaczenia trasy:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> directions_DIRECTIONS_FAILURE<span style="color: #66cc66;">&#40;</span>event:DirectionsEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> description:<span style="color: #0066CC;">String</span>;<br />
&nbsp; &nbsp; <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span>event.<span style="color: #006600;">directions</span>.<span style="color: #0066CC;">status</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">400</span>: description = <span style="color: #ff0000;">&quot;Zapytanie nie mogło zostać poprawnie przetworzone przez serwer.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">500</span>: description = <span style="color: #ff0000;">&quot;Wystąpiły problemy po stronie serwera geolokalizacji.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">601</span>: description = <span style="color: #ff0000;">&quot;Nie podano adresu do geolokalizacji.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">603</span>: description = <span style="color: #ff0000;">&quot;Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">602</span>: description = <span style="color: #ff0000;">&quot;Nieznany lub nieprawidłowy adres.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">603</span>: description = <span style="color: #ff0000;">&quot;Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">604</span>: description = <span style="color: #ff0000;">&quot;Trasa nie może zostać wyznaczona.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">620</span>: description = <span style="color: #ff0000;">&quot;Liczba dozwolonych zapytań w ciągu ostatnich 24 godzin została przekroczona.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">default</span>: description = <span style="color: #ff0000;">&quot;Nieobsługiwany błąd: &quot;</span>+event.<span style="color: #006600;">directions</span>.<span style="color: #0066CC;">status</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>description,<span style="color: #ff0000;">&quot;Błąd&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-goole-maps-api-wyznaczanie-trasy/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex i Google Maps API &#8211; geolokalizacja</title>
		<link>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-geolokalizacja</link>
		<comments>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-geolokalizacja#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:38:14 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Google Maps API]]></category>
		<category><![CDATA[ClientGeocoder]]></category>
		<category><![CDATA[ClientGeocoderOptions]]></category>
		<category><![CDATA[Geocoding]]></category>
		<category><![CDATA[GeocodingEvent]]></category>
		<category><![CDATA[Geolokalizacja]]></category>
		<category><![CDATA[Placemark]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=544</guid>
		<description><![CDATA[Geolokalizacja jest jedną z usług, z której możemy korzystać za pomocą Google Maps API. Dzięki niej posługując się odpowiednimi słowami kluczowymi odnajdziemy na mapie świata dowolną lokację: ulicę, miasto, państwo, obiekt architektoniczny czy krainę geograficzną. Spis treści Aplikacja Przygotowanie komunikacji z usługą Parametry geolokalizacji Wysłanie zapytania geolokalizacji Odebranie wyniku zapytania geolokalizacji Geolokalizacja zakończyła się sukcesem [...]]]></description>
			<content:encoded><![CDATA[<p>Geolokalizacja jest jedną z usług, z której możemy korzystać za pomocą Google Maps API. Dzięki niej posługując się odpowiednimi słowami kluczowymi odnajdziemy na mapie świata dowolną lokację: ulicę, miasto, państwo, obiekt architektoniczny czy krainę geograficzną.<br />
<span id="more-544"></span></p>
<h3>Spis treści</h3>
<ul>
<li><a href="#aplikacja">Aplikacja</a></li>
<li><a href="#przygotowanie">Przygotowanie komunikacji z usługą</a></li>
<li><a href="#parametry">Parametry geolokalizacji<a/></li>
<li><a href="#wysylanie">Wysłanie zapytania geolokalizacji</a></li>
<li><a href="#odbieranie">Odebranie wyniku zapytania geolokalizacji</a>
<ul>
<li><a href="#sukces">Geolokalizacja zakończyła się sukcesem</a></li>
<li><a href="#blad">Geolokalizacja zakończyła się błędem</a></li>
</ul>
</li>
</ul>
<h3><a name="aplikacja">Aplikacja</a></h3>
<p>Poniższa aplikacja demonstruje możliwości usługi <strong>Geocoding</strong>. Dodatkowo pokazuje wszystkie informacje zwrócone przez serwer po pomyślnym przetworzeniu zapytania. Dostęp do źródła można uzyskać poprzez kliknięcie prawym przyciskiem myszy w obszar aplikacji i wybranie opcji &#8222;View Source&#8221; z menu kontekstowego.<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/geocoding/application/application.html" target="_blank" alt="Kliknij aby otworzyć aplikację w osobnym oknie"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/geocoding/application_thumb.jpg" /></a></p>
<h3><a name="przygotowanie">Przygotowywania komunikacji z usługą</a></h3>
<p>Z usługi gelokalizacji będziemy korzystać za pomocą klasy <strong>ClientGeocoder</strong>. Jej konstruktor przyjmuje tylko jeden, opcjonalny parametr, którym jest obiekt klasy <strong>ClientGeocoderOptions</strong> definiujący parametry geolokalizowania.<br />
Po utworzeniu instancji klasy ClientGeocoder dodajemy do niej nasłuchiwanie zdarzeń: GeocodingEvent.GEOCODING_SUCCESS i GeocodingEvent.GEOCODING_FAILURE, które będą informować nas odpowiednio o pomyślnym lub niepomyślnym zakończeniu procesu geolokalizacji.</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> clientGeocoder:ClientGeocoder = <span style="color: #000000; font-weight: bold;">new</span> ClientGeocoder;<br />
clientGeocoder.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>GeocodingEvent.<span style="color: #006600;">GEOCODING_SUCCESS</span>, clientGeocoder_GEOCODING_SUCCESS<span style="color: #66cc66;">&#41;</span>;<br />
clientGeocoder.<span style="color: #006600;">addEventListener</span><span style="color: #66cc66;">&#40;</span>GeocodingEvent.<span style="color: #006600;">GEOCODING_FAILURE</span>, clientGeocoder_GEOCODING_FAILURE<span style="color: #66cc66;">&#41;</span>;</div></div>
<h3><a name="parametry">Parametry geolokalizacji</a></h3>
<p>Parametry geolokalizacji określamy za pomocą obiektu klasy ClientGeocoderOptions, który możemy przekazać do konstruktora klasy ClientGeocoder lub ustawić ustawić w dowolnym momencie za pomocą metody setOptions klasy ClientGeocoder. Określić możemy trzy parametry:</p>
<ul>
<li><strong>countryCode</strong>: Oznaczenie kraju (&#8222;PL&#8221;,&#8221;EN&#8221; itp.) dla zapytania geolokalizacji. W przypadku nie ustawienia tego parametru jego wartość zostanie ustalona na podstawie ustawień przeglądarki. Nie zauważyłem żadnych zmian w działaniu aplikacji przy różnych ustawieniach tego parametru.</li>
<li><strong>language</strong>: Język (&#8222;en&#8221;, &#8222;pl&#8221; itd.) dla zapytania dla geolokalizacji. W przypadku nie ustawienia tego parametru jego wartość zostanie ustalona na podstawie ustawień przeglądarki. Wartość tego parametru wpływa na język w jakim będą dostępne informacje o lokacji.</li>
<li><strong>viewport</strong>: Współrzędne wyznaczające obszar podwyższonego priorytetu w procesie geolokalizacji. Jeżeli w wyznaczonym obszarze znajdzie się lokacja pasująca do słów kluczowych wtedy wtedy zostanie zwrócona tylko ona, w przeciwnym razie zostaną zwrócone wszystkie odnalezione lokacje</li>
</ul>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> clientGeocoderOptions:ClientGeocoderOptions = <span style="color: #000000; font-weight: bold;">new</span> ClientGeocoderOptions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; countryCode: <span style="color: #ff0000;">&quot;EN&quot;</span>, <br />
&nbsp; &nbsp; <span style="color: #0066CC;">language</span>: <span style="color: #ff0000;">&quot;en&quot;</span>, <br />
&nbsp; &nbsp; viewport: <span style="color: #000000; font-weight: bold;">new</span> LatLngBounds<span style="color: #66cc66;">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51.00</span>,<span style="color: #cc66cc;">22.05</span><span style="color: #66cc66;">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51.53</span>,<span style="color: #cc66cc;">23.10</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<h3><a name="wysylanie">Wysłanie zapytania geolokalizacji</a></h3>
<p>Zapytanie geolokalizacji wysyłamy za pomocą metody <strong>geocode</strong> klasy ClientGeocoder, która jako parametr przyjmuje łańcuch opisujący szukaną lokację.</p>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">clientGeocoder.<span style="color: #006600;">geocode</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;stara wieś&quot;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<h3><a name="odbieranie">Odebranie zapytania geolokalizacji</a></h3>
<p>Po wywołaniu metody geocode wykonany zostanie kod jednej z dwóch funkcji obsługujących zdarzenia pomyślnego i niepomyślnego zakończenia procesu geolokalizacji.</p>
<p><br/><strong><a name="sukces">Geolokalizacja zakończyła się sukcesem</a></strong><br/></p>
<p>W przypadku pomyślnego zakończenia geolokalizacji wywołana zostanie funkcja obsługująca zdarzenie GeocodingEvent.GEOCODING_SUCCESS. W niej odwołujemy się kolejno do pól request i placermarks zdarzenia w celu uzyskania dostępu do danych wszystkich lokacji pasujących do klucza. Dane przechowywane są w tablicy ponieważ do jednego klucza może pasować wiele lokacji. Wystarczy np. zlecić geolokalizatorowi odnalezienie &#8222;starej wsi&#8221; aby przekonać się o tym, że jest ich w Polsce co najmniej dziesięć.</p>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> clientGeocoder_GEOCODING_SUCCESS<span style="color: #66cc66;">&#40;</span>event:GeocodingEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> placemarks:<span style="color: #0066CC;">Array</span> = event.<span style="color: #006600;">response</span>.<span style="color: #006600;">placemarks</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Tablica placemarks zawiera obiekty klasy <strong>Placemark</strong>, które przechowują dane o:</p>
<ul>
<li>adresie lokacji (typ: String),</li>
<li>szczegółach adresu lokacji (typ: Object),</li>
<li>współrzędnych geograficznych lokacji (typ: LatLng).</li>
</ul>
<p>Dostęp do powyższych danych uzyskujemy poprzez odwołanie się do następujących pól klasy Placemark:</p>
<table style="width: 580px;">
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>adres lokacji:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">address</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>kod kraju:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.CountryNameCode</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>nazwa kraju:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.CountryName</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>województwo:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.AdministrativeArea.AdministrativeAreaName</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>powiat:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.SubAdministrativeAreaName</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>miasto:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>ulica:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.Thoroughfare.ThoroughfareName</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>kod pocztowy:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>dokładność:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">AddressDetails.Accuracy</td>
</tr>
<tr>
<td style="font-size: 11px; text-align: right; padding: 4px;"><strong>współrzędne:</strong></td>
<td style="font-size: 9px; width: 100%; text-align: left; padding: 4px;">point</td>
</tr>
<table>
<p>Jedyną z powyższych informacji, która nie tłumaczy się sama jest dokładność. Dokładność przyjmuje wartości od 0 do 9 oznaczające stopień precyzji z jakim udało się wyznaczyć położenie danej lokacji.</p>
<p>Opis stopni precyzji:</p>
<ul>
<li><strong>0</strong>: nieokreślona,</li>
<li><strong>1</strong>: państwo,</li>
<li><strong>2</strong>: województwo,</li>
<li><strong>3</strong>: powiat,</li>
<li><strong>4</strong>: miasto,</li>
<li><strong>5</strong>: kod pocztowy,</li>
<li><strong>6</strong>: ulica,</li>
<li><strong>7</strong>: skrzyżowanie (ang. intersection),</li>
<li><strong>8</strong>: numer budynku,</li>
<li><strong>9</strong>: nazwa lokacji (budynku, posiadłości, uczelni, centrum handlowego).</li>
</ul>
<p>Ze wszystkich powyższych nie udało mi się jedynie uzyskać wyniku o stopniu dokładności równym 7 dlatego nie mam pewności co on tak naprawdę oznacza. Nie wydaje mi się żeby to było skrzyżowanie, ale też nie mam pomysłu co innego może oznaczać słowo <em>intersection</em>.</p>
<p><br/><strong><a name="blad">Geolokalizacja zakończyła się błędem</a></strong><br/><br />
W przypadku wystąpienia błędu podczas geolokalizacji wywołana zostanie funkcja obsługująca zdarzenie GeocodingEvent.GEOCODING_FAILURE. Żeby zidentyfikować przyczynę błędu pobieramy jego kod znajdujący się w polu status zdarzenia i sprawdzamy jego znaczenie w <a href="http://code.google.com/intl/pl/apis/maps/documentation/flash/reference.html#ServiceStatus" target="_blank">dokumentacji</a> lub poniżej:</p>
<ul>
<li><strong>400</strong>: Zapytanie nie mogło zostać poprawnie przetworzone przez serwer</li>
<li><strong>500</strong>: Wystąpiły problemy po stronie serwera geolokalizacji.</li>
<li><strong>601</strong>: Nie podano adresu do geolokalizacji.</li>
<li><strong>602</strong>: Nieznany lub nieprawidłowy adres.</li>
<li><strong>603</strong>: Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.</li>
<li><strong>620</strong>: Liczba dozwolonych zapytań w ciągu ostatnich 24 godzin została przekroczona.</li>
</ul>
<p>Przykładowa implementacja metody obsługującej zdarzenie niepomyślnego wyznaczenia trasy:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> <span style="color: #000000; font-weight: bold;">function</span> clientGeocoder_GEOCODING_FAILURE<span style="color: #66cc66;">&#40;</span>event:GeocodingEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">var</span> description:<span style="color: #0066CC;">String</span>;<br />
&nbsp; &nbsp; <span style="color: #b1b100;">switch</span> <span style="color: #66cc66;">&#40;</span>event.<span style="color: #006600;">directions</span>.<span style="color: #0066CC;">status</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">400</span>: description = <span style="color: #ff0000;">&quot;Zapytanie nie mogło zostać poprawnie przetworzone przez serwer.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">500</span>: description = <span style="color: #ff0000;">&quot;Wystąpiły problemy po stronie serwera geolokalizacji.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">601</span>: description = <span style="color: #ff0000;">&quot;Nie podano adresu do geolokalizacji.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">603</span>: description = <span style="color: #ff0000;">&quot;Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">602</span>: description = <span style="color: #ff0000;">&quot;Nieznany lub nieprawidłowy adres.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">603</span>: description = <span style="color: #ff0000;">&quot;Ze względów prawnych lub innych wynik zapytania nie może zostać zwrócony.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #b1b100;">case</span> <span style="color: #cc66cc;">620</span>: description = <span style="color: #ff0000;">&quot;Liczba dozwolonych zapytań w ciągu ostatnich 24 godzin została przekroczona.&quot;</span>; <span style="color: #b1b100;">break</span>;<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">default</span>: description = <span style="color: #ff0000;">&quot;Nieobsługiwany błąd: &quot;</span>+event.<span style="color: #006600;">directions</span>.<span style="color: #0066CC;">status</span>;<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><br />
&nbsp; &nbsp; Alert.<span style="color: #0066CC;">show</span><span style="color: #66cc66;">&#40;</span>description,<span style="color: #ff0000;">&quot;Błąd&quot;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-geolokalizacja/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex i Google Maps API &#8211; rysowanie po mapie</title>
		<link>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-rysowanie-po-mapie</link>
		<comments>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-rysowanie-po-mapie#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:38:03 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Google Maps API]]></category>
		<category><![CDATA[GroundOverlay]]></category>
		<category><![CDATA[GroundOverlayOptions]]></category>
		<category><![CDATA[Overlays]]></category>
		<category><![CDATA[Polygon]]></category>
		<category><![CDATA[PolygonOptions]]></category>
		<category><![CDATA[Polyline]]></category>
		<category><![CDATA[PolylineOptions]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=445</guid>
		<description><![CDATA[Google Maps API umożliwia dodawanie trzech rodzajów graficznych elementów do mapy: lini (łamanych), wielokątów, obiektów graficznych. Do powyższej listy można zaliczyć jeszcze markery i okna informacyjne, ale ponieważ są one czymś więcej niż tylko graficznymi elementami mapy zostały omówione w oddzielnych wpisach. Spis treści Aplikacja Rysowanie linii (łamanych) Rysowanie wielokątów Wstawianie obiektów graficznych Aplikacja Poniżej [...]]]></description>
			<content:encoded><![CDATA[<p>Google Maps API umożliwia dodawanie trzech rodzajów graficznych elementów do mapy:</p>
<ul>
<li>lini (łamanych),</li>
<li>wielokątów,</li>
<li>obiektów graficznych.</li>
</ul>
<p>Do powyższej listy można zaliczyć jeszcze markery i okna informacyjne, ale ponieważ są one czymś więcej niż tylko graficznymi elementami mapy zostały omówione w oddzielnych wpisach.<br />
<span id="more-445"></span></p>
<h3>Spis treści</h3>
<ul>
<li><a href="#aplikacja">Aplikacja</a></li>
<li><a href="#polyline">Rysowanie linii (łamanych)</a></li>
<li><a href="#polygon">Rysowanie wielokątów</a></li>
<li><a href="#groundoverlays">Wstawianie obiektów graficznych</a></li>
</ul>
<h3><a name="aplikacja">Aplikacja</a></h3>
<p>Poniżej zamieszczam link do aplikacji, która może okazać się pomocna podczas wyznaczania współrzędnych geograficznych punktów na mapie. Dostęp do źródła można uzyskać poprzez kliknięcie prawym przyciskiem myszy w obszar aplikacji i wybranie opcji &#8222;View Source&#8221; z menu kontekstowego.<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/application/application.html" target="_blank" alt="Kliknij aby otworzyć aplikację w osobnym oknie"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/application_thumb.jpg" /></a></p>
<h3><a name="polyline">Rysowanie linii (łamanych)</a></h3>
<p>Linię rysuje się za pomocą klasy <strong>Polyline</strong>, której konstruktor przyjmuje dwa parametry: tablicę współrzędnych geograficznych zawierającą wszystkie punkty, przez które będzie przechodzić linia oraz opcjonalny parametr będący obiektem klasy <strong>PolylineOptions</strong> definiujący właściwości rysowanej linii.</p>
<p>Za pomocą klasy PolylineOptions możemy zdefiniować dwa parametry rysowania linii:</p>
<ul>
<li><strong>geodesic</strong>: Określa czy podczas rysowania linii zostanie uwzględniona krzywizna kuli ziemskiej. Dla wartości <em>true</em> tego parametru kolejne punkty zostaną połączone za pomocą najkrótszej linii biegnącej po powierzchni Ziemi, w przeciwnym razie będzie to najkrótsza linia biegnąca po płaszczyźnie mapy. Domyślna wartość tego parametru to <em>false</em>.<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/geodesic.jpg" target="_blank"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/geodesic_thumb.jpg"></a><br />
Obie linie na powyższym rysunku łączą te same punkty. Różnice w kształcie wynikają z tego, że parametr geodesic czerwonej linii jest ustawiony na <em>true</em> a niebieskiej na <em>false</em>.
</li>
<li><strong>strokeStyle</strong>: Określa takie parametry linii jak: kolor, grubość i przeźroczystość. Kolor linii powinien zostać podany w formie szesnastkowej (np. 0xff0000). Domyślne parametry linii to: kolor: 0x0000ff, grubość: 5, przeźroczystość: 0.45.</li>
</ul>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> polyline:Polyline = <span style="color: #000000; font-weight: bold;">new</span> Polyline<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51.24</span>, <span style="color: #cc66cc;">22.56</span><span style="color: #66cc66;">&#41;</span>, <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">40.70</span>, -<span style="color: #cc66cc;">74.02</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>,<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> PolylineOptions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span> <br />
&nbsp; &nbsp; &nbsp; &nbsp; geodesic: <span style="color: #000000; font-weight: bold;">true</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; strokeStyle: <span style="color: #000000; font-weight: bold;">new</span> StrokeStyle<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">color</span>: 0xff0000,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thickness: <span style="color: #cc66cc;">4</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alpha: <span style="color: #cc66cc;">0.7</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Żeby linia pojawiła się na mapie należy dodać ją do warstw mapy za pomocą metody <strong>addOverlay</strong>:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">map.<span style="color: #006600;">addOverlay</span><span style="color: #66cc66;">&#40;</span>polyline<span style="color: #66cc66;">&#41;</span>;</div></div>
<p>W przypadku rysowania złożonych kształtów zaleca się kodowanie współrzędnych punktów tworzących linię za pomocą specjalnego algorytmu. Nie planuję o tym pisać dlatego zainteresowanych odsyłam do źródeł. Więcej o tworzeniu linii składających się z zakodowanych punktów można przeczytać <a href="http://code.google.com/intl/pl/apis/maps/documentation/flash/overlays.html#Encoded_Polylines" target="_blank">tu</a> a o samym algorytmie kodowaniu <a href="http://code.google.com/intl/pl/apis/maps/documentation/utilities/polylinealgorithm.html" target="_blank">tu</a>.</p>
<h3><a name="polygon">Rysowanie wielokątów</a></h3>
<p>Wielokąt rysuje się za pomocą klasy <strong>Polygon</strong>, której konstruktor przyjmuje dwa parametry: tablicę współrzędnych geograficznych zawierającą wszystkie wierzchołki wielokąta oraz opcjonalny parametr będący obiektem klasy <strong>PolygonOptions</strong> definiujący właściwości rysowanego wielokąta.</p>
<p>Przykładowy wielokąt narysowany na mapie:<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/polygon.jpg" target="_blank"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/polygon_thumb.jpg"></a></p>
<p>Zaleca się zamykanie wielokątów poprzez podawanie ostatniego punktu równego pierwszemu. Teoretycznie niezastosowanie się do tej reguły może powodować niepożądane efekty, jednak z moich kilku szybkich testów wynika, że wielokąty rysują się tak samo, niezależnie od tego czy ostatni wierzchołek pokrywa się z pierwszym czy nie.</p>
<p>Za pomocą klasy PolygonOptions możemy zdefiniować trzy parametry rysowania wielokątów:</p>
<ul>
<li><strong>fillStyle</strong>: Określa kolor i przeźroczystość wypełnienia wielokąta. Domyślne wartości wypełnienia to: kolor: 0x0055ff, przeźroczystość: 0.25.</li>
<li><strong>strokeStyle</strong>: Określa kolor, grubość i przeźroczystość obrysowania wielokąta. Domyślne wartości obrysowania to: kolor: 0x0000ff, grubość: 2, przeźroczystość: 0.45.</li>
<li><strong>tooltip</strong>: Informacja tekstowa wyświetlana po najechaniu kursorem myszy na wielokąt.</li>
</ul>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> polygon:Polygon = <span style="color: #000000; font-weight: bold;">new</span> Polygon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51.24</span>, <span style="color: #cc66cc;">22.56</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">52.23</span>, <span style="color: #cc66cc;">21.01</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51.76</span>, <span style="color: #cc66cc;">19.45</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">51.24</span>, <span style="color: #cc66cc;">22.56</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>, <br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> PolygonOptions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; strokeStyle: <span style="color: #000000; font-weight: bold;">new</span> StrokeStyle<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">color</span>: 0xff0000,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thickness: <span style="color: #cc66cc;">3</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alpha: <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>, <br />
&nbsp; &nbsp; &nbsp; &nbsp; fillStyle: <span style="color: #000000; font-weight: bold;">new</span> FillStyle<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">color</span>: 0x00ff00,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alpha: <span style="color: #cc66cc;">0.5</span><span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; tooltip: <span style="color: #ff0000;">&quot;Ten wielokąt ma czerwone obrysowanie.&quot;</span>,<br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Żeby wielokąt pojawił się na mapie należy dodać go do warstw mapy za pomocą metody <strong>addOverlay</strong>:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">map.<span style="color: #006600;">addOverlay</span><span style="color: #66cc66;">&#40;</span>polygon<span style="color: #66cc66;">&#41;</span>;</div></div>
<h3><a name="groundoverlays">Wstawianie obiektów graficznych</a></h3>
<p>Obiekt graficzny wstawia się za pomocą klasy <strong>GroundOverlay </strong>, której konstruktor przyjmuje trzy parametry: referencję do obiektu graficznego typu DisplayObject, współrzędne obszaru, na którym grafika zostanie wyświetlona oraz opcjonalny parametr będący obiektem klasy <strong>GroundOverlayOptions</strong> definiujący różne cechy wstawianej grafiki.</p>
<p>Przykładowy obiekt graficzny wstawiony na mapę:<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/ground_overlay.jpg" target="_blank"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/ground_overlay_thumb.jpg"></a></p>
<p>Za pomocą klasy GroundOverlayOptions możemy zdefiniować pięć parametrów:</p>
<ul>
<li><strong>applyProjection</strong>: Wartość logiczna określająca czy dany obiekt graficzny wymaga rzutowania. W przypadku ustawienia wartości <em>true</em> obiekt graficzny zostanie poddany rzutowaniu podczas renderowania jego warstwy (overlay), w przeciwnym razie zostanie założone, że obiekt został już poddany rzutowaniu. Domyślna wartość tego parametru to <em>false</em>. </li>
<li><strong>renderContent</strong>: Wartość logiczna określajaca czy dany obiekt graficzny będzie renderowany na mapie czy też wyświetlany na niej w zwyczajny sposób z zastosowaniem odpowiednich przekształceń geometrycznych. Domyślanie renderContent posiada wartość <em>true</em>. W przypadku zmiany wartości na <em>false</em> parametr applyProjection zostanie zignorowany, obiekt graficzny nie będzie poddawany wygładzaniu oraz straci wsparcie 3D.<br/><br />
Fragment obiektu graficznego z wygładzaniem i bez wygładzania:<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/renderContent_smooth.jpg" target="_blank"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/renderContent_smooth_thumb.jpg"></a>
</li>
<li><strong>rotation</strong>: Określa obrót obiektu graficznego podany w stopniach i wykonany zgodnie z ruchem wskazówek zegara. Sposób jaki obrót zostanie wykonany zależy od wartości parametru applyProjection. Jeżeli jego wartość to <em>false</em> wtedy zostanie uznane, że obiekt graficzny został już poddany rzutowaniu i wykonany zostanie obórt. W przeciwnym razie obiekt graficzny zostanie poddany rzutowaniu na powierzchnię sfery i dopiero wtedy obrócony czego konsekwencją będzie zniekształcenie obiektu graficznego zgodnie z krzywizną sfery.<br/><br />
Obrót obiektu graficznego o 180 stopni względem jego środka przy różnych wartościach parametru applyProjection:<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/rotation.jpg" target="_blank"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/overlays/rotation_thumb.jpg"></a>
</li>
<li><strong>rotationContentCenter</strong>: Współrzędne punktu, wokół którego obiekt graficzny będzie obracany. Domyślnie obrót nastąpi wokół środka obiektu graficznego.</li>
<li><strong>strokeStyle</strong>: Określa obrysowanie obiektu graficznego. Korzystanie z tego parametru wygląda tak samo jak w przypadku linii i wielokątów. Obrysowanie zadziałało u mnie dopiero po ustawieniu parametru renderContent na <em>false</em>, trudno powiedzieć dlaczego &#8211; w dokumentacji nie ma mowy o istnieniu takiej zależności.</li>
</ul>
<p>Przykład:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> groundOverlay:GroundOverlay = <span style="color: #000000; font-weight: bold;">new</span> GroundOverlay<span style="color: #66cc66;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> ShipIcon<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> as DisplayObject,<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> LatLngBounds<span style="color: #66cc66;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">54.48</span>,<span style="color: #cc66cc;">18.64</span><span style="color: #66cc66;">&#41;</span>, <span style="color: #000000; font-weight: bold;">new</span> LatLng<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">54.53</span>,<span style="color: #cc66cc;">18.88</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; <span style="color: #000000; font-weight: bold;">new</span> GroundOverlayOptions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; strokeStyle: <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">color</span>: 0xff0000,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; alpha: <span style="color: #cc66cc;">1</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thickness: <span style="color: #cc66cc;">3</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; rotation: <span style="color: #cc66cc;">180</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; rotationContentCenter: <span style="color: #000000; font-weight: bold;">new</span> Point<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">100</span>,<span style="color: #cc66cc;">100</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; applyProjection: <span style="color: #000000; font-weight: bold;">true</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; renderContent: <span style="color: #000000; font-weight: bold;">false</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span><br />
<span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Gdzie ShipIcon jest ikoną statku wkompilowaną w aplikację.<br/></p>
<p>Żeby obiekt graficzny pojawił się na mapie należy dodać go do warstw mapy za pomocą metody <strong>addOverlay</strong>:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">map.<span style="color: #006600;">addOverlay</span><span style="color: #66cc66;">&#40;</span>groundOverlay<span style="color: #66cc66;">&#41;</span>;</div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-rysowanie-po-mapie/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Flex i Google Maps API &#8211; okna informacjyne</title>
		<link>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-okna-informacjyne</link>
		<comments>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-okna-informacjyne#comments</comments>
		<pubDate>Wed, 09 Jun 2010 15:37:53 +0000</pubDate>
		<dc:creator>Piotr Wierzgała</dc:creator>
				<category><![CDATA[Google Maps API]]></category>
		<category><![CDATA[InfoWindow]]></category>
		<category><![CDATA[InfoWindowOptions]]></category>

		<guid isPermaLink="false">http://blog.flexmaniak.pl/?p=695</guid>
		<description><![CDATA[Okna informacyjne pozwalają wyświetlać dane w tak zwanych &#8222;dymkach&#8221; pojawiających na mapie po kliknięciu w marker. Spis treści Aplikacja Otwarcie okna informacyjnego Opcje okna informacyjnego Aplikacja Poniższa aplikacja pozwala na przetestowanie działania większości pól opcji okna informacyjnego. Dostęp do źródła można uzyskać poprzez kliknięcie prawym przyciskiem myszy w obszar aplikacji i wybranie opcji &#8222;View Source&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p>Okna informacyjne pozwalają wyświetlać dane w tak zwanych &#8222;dymkach&#8221; pojawiających na mapie po kliknięciu w marker.</p>
<div style="width: 100%; text-align:center"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/information_windows/information_window.jpg" alt="okno informacyjne"/></div>
<p><span id="more-695"></span></p>
<h3>Spis treści</h3>
<ul>
<li><a href="#aplikacja">Aplikacja</a></li>
<li><a href="#otwarcie">Otwarcie okna informacyjnego</a></li>
<li><a href="#opcje">Opcje okna informacyjnego</a></li>
</ul>
<h3><a name="aplikacja">Aplikacja</a></h3>
<p>Poniższa aplikacja pozwala na przetestowanie działania większości pól opcji okna informacyjnego. Dostęp do źródła można uzyskać poprzez kliknięcie prawym przyciskiem myszy w obszar aplikacji i wybranie opcji &#8222;View Source&#8221; z menu kontekstowego.<br />
<a href="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/information_windows/application/application.html" target="_blank" alt="Kliknij aby otworzyć aplikację w osobnym oknie"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/information_windows/application_thumb.jpg" /></a></p>
<h3><a name="otwarcie">Otwarcie okna informacyjnego</a></h3>
<p>Okno informacyjne nie posiada konstruktora. Jest tworzone jedynie poprzez wywołanie metody <strong>openInfoWindow</strong> klasy Marker. Na poniższym przykładzie przedstawiony jest sposób otwarcia okna informacyjnego w funkcji obsługującej zdarzenie kliknięcia w marker:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #0066CC;">private</span> &nbsp;<span style="color: #000000; font-weight: bold;">function</span> marker_CLICK<span style="color: #66cc66;">&#40;</span>event:MapEvent<span style="color: #66cc66;">&#41;</span>:<span style="color: #0066CC;">void</span> <span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; event.<span style="color: #0066CC;">target</span>.<span style="color: #006600;">openInfoWindow</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #66cc66;">&#125;</span></div></div>
<p>Metoda openInfoWindow przyjmuje dwa opcjonalne parametry:</p>
<ul>
<li><strong>options</strong>: Obiekt klasy <strong>InfoWindowOptions</strong> definiujący właściwości okna informacyjnego.</li>
<li><strong>useSeparatePane</strong>: Wartość logiczna określająca czy okno informacyjne zostanie wygenerowane na własnej warstwie. Podczas korzystania z mapy 3D domyślnie okno informacyjne generowane jest na tej samej warstwie co marker dzięki czemu jest umieszczane w tej samej odległości od obserwatora co marker. Ustawienie tego parametru na <em>true</em> w przypadku korzystania z mapy 3D wymusi wygenerowanie okna informacyjnego na oddzielnej warstwie tak jak ma to miejsce w przypadku korzystania z mapy 2D.</li>
</ul>
<h3><a name="opcje">Opcje okna informacyjnego</a></h3>
<p>Za pomocą obiektu klasy InfoWindowOptions możemy ustawić następujące właściwości okna informacyjnego:</p>
<ul>
<li><strong>content</strong>: Treść pojawiająca się w oknie informacyjnym.</li>
<li><strong>contentFormat</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/text/TextFormat.html">TextFormat</a> definiujący wygląd treści podanej w polu <em>content</em>.</li>
<li><strong>contentHTML</strong>: Treść pojawiająca się oknie informacyjnym zapisana w formacie HTML.</li>
<li><strong>contentStyleSheet</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/text/StyleSheet.html">StyleSheet</a> definiujący arkusz stylów treści okna informacyjnego.</li>
<li><strong>cornerRadius</strong>: Stopień zaokrąglenia narożników okna informacyjnego.</li>
<li><strong>customCloseRect</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/geom/Rectangle.html">Rectangle</a> określający obszar, w obrębie którego kliknięcie będzie zamykało okno informacyjne. W przypadku kiedy ustawiona jest własność <em>customContent</em> wtedy wyznaczony obszar zamykający okno nie będzie widoczny, ale pozostanie aktywny. Natomiast w przypadku kiedy własność <em>customContent</em> jest równa <em>null</em> wtedy obszar customCloseRect może zostać użyty do w celu narysowania przycisku zamykającego okno w wybranym miejscu.<br/><br/>
<p>		Poniższy rysunek pokazuje domyśle ustawienie przycisku zamykającego okno oraz jego przykładowe ustawienie za pomocą pola <em>customCloseRect</em>.</p>
<div style="width: 100%; text-align:center"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/information_windows/customCloseRect.jpg" alt="customCloseRect"/></div>
</li>
<li><strong>customContent</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/display/DisplayObject.html">DisplayObject</a>, który zostanie narysowany zamiast okna informacyjnego.
	</li>
<li><strong>customOffset</strong>: Obiekt typu Point określający przesunięcie obiektu zdefiniowanego w polu <em>customContent</em>. W przypadku kiedy pole <em>customContent</em> nie jest ustawione lub kiedy pole <em>drawDefaultFrame</em> posiada wartość <em>true</em> wtedy pole <em>customOffset</em> nie będzie brane pod uwagę podczas rysowania okna informacyjnego.</li>
<li><strong>drawDefaultFrame</strong>: Wartość logiczna określająca czy okno informacyjne mają być rysowane jako tło obiektu zdefiniowanego w polu <em>customContent</em>.<br/><br/>
<p>		Poniższy rysunek przedstawia zestawienie wyniku rysowania okna informacyjnego ze zdefiniowanym polem <em>customContent</em> przy włączonej i wyłączonej opcji <em>drawDefaultFrame</em>.</em>.</p>
<div style="width: 100%; text-align:center"><img src="http://blog.na14.pl/examples/GoogleMapsAPI/1.18/information_windows/drawDefaultFrame.jpg" alt="drawDefaultFrame"/></div>
</li>
<li><strong>fillStyle</strong>: Obiekt typu <a href="http://code.google.com/intl/pl/apis/maps/documentation/flash/reference.html#FillStyle">FillStyle</a> określający styl wypełnienia okna informacyjnego.</li>
<li><strong>hasCloseButton</strong>: Wartość logiczna określająca czy na oknie informacyjnym będzie rysowany przycisk zamykający.</li>
<li><strong>hasShadow</strong>: Wartość logiczna określająca czy okno informacyjne będzie rzucało cień na mapę.</li>
<li><strong>hasTail</strong>: Wartość logiczna określająca czy okno informacyjne będzie posiadać ogon.</li>
<li><strong>height</strong>: Wysokość okna informacyjnego.</li>
<li><strong>padding</strong>: Wielkość odstępu pomiędzy tytułem i treścią okna informacyjnego a jego obramowaniem.</li>
<li><strong>pointOffset</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/geom/Point.html">Point</a> określający przesunięcie okna informacyjnego.</li>
<li><strong>strokeStyle</strong>: Obiekt typu <a href="http://code.google.com/intl/pl/apis/maps/documentation/flash/reference.html#StrokeStyle">StrokeStyle</a> określający styl obrysowania okna informacyjnego.</li>
<li><strong>tailAlign</strong>: Wyrównanie ogona okna informacyjnego. Dostępne wartości tego pola to:
<ul>
<li><em>InfoWindowOptions.ALIGN_LEFT</em>,</li>
<li><em>InfoWindowOptions.ALIGN_CENTER</em>,</li>
<li><em>InfoWindowOptions.ALIGN_RIGHT</em>.</li>
</ul>
</li>
<li><strong>tailHeight</strong>: Wysokość ogona okna informacyjnego.</li>
<li><strong>tailOffset</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/geom/Point.html">Point</a> określający przesunięcie ogona okna informacyjnego.</li>
<li><strong>tailWidth</strong>: Szerokość ogona okna informacyjnego.</li>
<li><strong>title</strong>: Nagłówek okna informacyjnego.</li>
<li><strong>titleFormat</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/text/TextFormat.html">TextFormat</a> definiujący wygląd napisu podanego w polu <em>title</em>.</li>
<li><strong>titleHTML</strong>: Nagłówek okna informacyjnego zapisany w formacie HTML.</li>
<li><strong>titleStyleSheet</strong>: Obiekt typu <a href="http://livedocs.adobe.com/flex/3/langref/flash/text/StyleSheet.html">StyleSheet</a> definiujący arkusz stylów tytułu okna informacyjnego</li>
<li><strong>width</strong>: Szerokość okna informacyjnego.</li>
</ul>
<p>Przykładowe zastosowanie:</p>
<div class="codecolorer-container actionscript default" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:435px;height:100%;"><div class="actionscript codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000000; font-weight: bold;">var</span> infoWindowOptions:InfoWindowOptions = <span style="color: #000000; font-weight: bold;">new</span> InfoWindowOptions<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; fillStyle: <span style="color: #000000; font-weight: bold;">new</span> FillStyle<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">color</span>: 0xffffff, <br />
&nbsp; &nbsp; &nbsp; &nbsp; alpha: <span style="color: #cc66cc;">1</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; strokeStyle: <span style="color: #000000; font-weight: bold;">new</span> StrokeStyle<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #0066CC;">color</span>: 0x000000,<br />
&nbsp; &nbsp; &nbsp; &nbsp; alpha: <span style="color: #cc66cc;">1</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; thickness: <span style="color: #cc66cc;">2</span><br />
&nbsp; &nbsp; <span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; title: <span style="color: #ff0000;">&quot;Title&quot;</span>,<br />
&nbsp; &nbsp; hasTail: <span style="color: #000000; font-weight: bold;">true</span>,<br />
&nbsp; &nbsp; hasCloseButton: <span style="color: #000000; font-weight: bold;">true</span>,<br />
&nbsp; &nbsp; contentHTML: <span style="color: #ff0000;">&quot;&lt;b&gt;ContentHTML&lt;/b&gt;&quot;</span>,<br />
&nbsp; &nbsp; padding: <span style="color: #cc66cc;">10</span>,<br />
&nbsp; &nbsp; widht: <span style="color: #cc66cc;">320</span>,<br />
&nbsp; &nbsp; <span style="color: #0066CC;">height</span>: <span style="color: #cc66cc;">100</span>,<br />
&nbsp; &nbsp; tailOffset: <span style="color: #cc66cc;">20</span>,<br />
&nbsp; &nbsp; pointOffset: <span style="color: #000000; font-weight: bold;">new</span> Point<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>,-<span style="color: #cc66cc;">60</span><span style="color: #66cc66;">&#41;</span>,<br />
&nbsp; &nbsp; drawDefaultFrame: <span style="color: #000000; font-weight: bold;">false</span>,<br />
&nbsp; &nbsp; hasShadow: <span style="color: #000000; font-weight: bold;">false</span>,<br />
&nbsp; &nbsp; cornerRadius: <span style="color: #cc66cc;">20</span><br />
<span style="color: #66cc66;">&#125;</span><span style="color: #66cc66;">&#41;</span>;</div></div>
<p>Żeby zastosować tak stworzony obiekt klasy InfoWindowOptions przekazujemy go jako parametr metody <em>openInfoWindow</em> klasy Marker.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.flexmaniak.pl/flex/google-maps-api-flex/flex-i-google-maps-api-okna-informacjyne/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
