<?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>HavlenaBlog &#187; MySQL</title>
	<atom:link href="http://www.havlena.net/blog/category/mysql/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.havlena.net/blog</link>
	<description>... o všem a všelijak</description>
	<lastBuildDate>Wed, 26 May 2010 00:18:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>cs</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Hledání vzdálenosti GPS souřadnic v MySQL a PHP</title>
		<link>http://www.havlena.net/blog/hledani-vzdalenosti-gps-souradnic-v-mysql-a-php/</link>
		<comments>http://www.havlena.net/blog/hledani-vzdalenosti-gps-souradnic-v-mysql-a-php/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 14:01:09 +0000</pubDate>
		<dc:creator>Matouš Havlena</dc:creator>
				<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PHP 5]]></category>
		<category><![CDATA[Tipy a triky]]></category>

		<guid isPermaLink="false">http://www.havlena.net/blog/?p=860</guid>
		<description><![CDATA[Máte v DB uložené objekty s GPS souřadnicemi (pokud ne, GPS souřadnice můžete získat jednoduše) a chcete mezi němi vyhledávat na základě vzájemných vzdáleností? Tak právě vám by se mohla hodit následující MySQL procedura, kterou jsem upravil/opravil a připravil na použití s metrickým systémem.

Tak jdeme na to&#8230;
Ukázka bude pracovat s nádledující tabulkou:
CREATE &#160;TABLE IF NOT [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-full wp-image-917" title="GPS souřadnice - ukázka na Google Maps" src="http://www.havlena.net/blog/wp-content/2009/11/gps-coordinates.jpg" alt="GPS souřadnice - ukázka na Google Maps" width="199" height="164" />Máte v DB uložené <strong>objekty s GPS souřadnicemi</strong> (pokud ne, <a href="http://www.havlena.net/blog/php-a-google-maps-jak-ziskat-gps-souradnice-pro-adresu/">GPS souřadnice můžete získat jednoduše</a>) a chcete mezi němi <strong>vyhledávat na základě vzájemných vzdáleností</strong>? Tak právě vám by se mohla hodit následující <strong>MySQL procedura</strong>, kterou jsem upravil/opravil a připravil na použití s metrickým systémem.</p>
<p><span id="more-860"></span></p>
<h3>Tak jdeme na to&#8230;</h3>
<p>Ukázka bude pracovat s nádledující tabulkou:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> &nbsp;<span style="color: #993333; font-weight: bold;">TABLE</span> <span style="color: #993333; font-weight: bold;">IF</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">EXISTS</span> <span style="color: #ff0000;">`buildings`</span> <span style="color: #66cc66;">&#40;</span><br />
<span style="color: #ff0000;">`building_id`</span> INT <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AUTO_INCREMENT</span> <span style="color: #66cc66;">,</span><br />
<span style="color: #ff0000;">`building_street`</span> VARCHAR<span style="color: #66cc66;">&#40;</span>200<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">,</span><br />
<span style="color: #ff0000;">`building_street_nr`</span> VARCHAR<span style="color: #66cc66;">&#40;</span>20<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">,</span><br />
<span style="color: #ff0000;">`building_city`</span> VARCHAR<span style="color: #66cc66;">&#40;</span>200<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">,</span><br />
<span style="color: #ff0000;">`building_latitude`</span> VARCHAR<span style="color: #66cc66;">&#40;</span>30<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">,</span><br />
<span style="color: #ff0000;">`building_longitude`</span> VARCHAR<span style="color: #66cc66;">&#40;</span>30<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #66cc66;">,</span><br />
<span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">`building_id`</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span></div></div>
<p>Vytvoříme si proceduru s názvem <code class="codecolorer text default"><span class="text">gpsdistance</span></code> a dvěma vstupními čísly <code class="codecolorer text default"><span class="text">mybuilding_id</span></code> a <code class="codecolorer text default"><span class="text">mydistance</span></code>.</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">CREATE</span> PROCEDURE <span style="color: #ff0000;">`gpsdistance`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IN</span> mybuilding_id int<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">IN</span> mydistance int<span style="color: #66cc66;">&#41;</span></div></div>
<p><code class="codecolorer text default"><span class="text">mybuilding_id</span></code> představuje ID číslo výchozí budovy, v jejímž okolí budeme hlegpdat další budovy, které se k ní nacházejí ve vzdálenosti předávané v druhém parametru <code class="codecolorer text default"><span class="text">mydistance</span></code> (v kilometrech!).</p>
<p>Následně si deklarujeme tyto vnitřní proměnné:</p>
<ul>
<li><code class="codecolorer text default"><span class="text">mylon</span></code> &#8211; zeměpisná délka naší výchozí budovy (longitude)</li>
<li><code class="codecolorer text default"><span class="text">mylat</span></code> &#8211; zeměpisná šířka naší výchozí budovy (latitude)</li>
<li><code class="codecolorer text default"><span class="text">lon1</span></code> &#8211; 1. hranice zeměpisné délky</li>
<li><code class="codecolorer text default"><span class="text">lon2</span></code> &#8211; 2. hranice zeměpisné délky</li>
<li><code class="codecolorer text default"><span class="text">lat1</span></code> &#8211; 1. hranice zeměpisné šířky</li>
<li><code class="codecolorer text default"><span class="text">lat2</span></code> &#8211; 2. hranice zeměpisné šířky</li>
</ul>
<p>Další příkaz načítá aktuální hodnoty naší výchozí budovy do proměnných <code class="codecolorer text default"><span class="text">mylon</span></code> a <code class="codecolorer text default"><span class="text">mylat</span></code>:</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> building_latitude<span style="color: #66cc66;">,</span> building_longitude <span style="color: #993333; font-weight: bold;">INTO</span> mylat<span style="color: #66cc66;">,</span> mylon <span style="color: #993333; font-weight: bold;">FROM</span> buildings <span style="color: #993333; font-weight: bold;">WHERE</span> building_id <span style="color: #66cc66;">=</span> mybuilding_id;</div></div>
<p>A následuje vypočítání hraničních souřadnic na základě vzdálenosti zadané v kilometrech ve vstupní hodnotě <code class="codecolorer text default"><span class="text">mydistance</span></code>. Číslo 111 představuje kolik kilometrů měří přibližně jeden stupeň (1°) zeměpisné šířky (pro míle je to 69). Význam vzorců si můžete dohledat v originálním anglickém dokumentu (odkaz níže).</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SET</span> lon1 <span style="color: #66cc66;">=</span> mylon<span style="color: #66cc66;">-</span>mydistance<span style="color: #66cc66;">/</span>abs<span style="color: #66cc66;">&#40;</span>cos<span style="color: #66cc66;">&#40;</span>radians<span style="color: #66cc66;">&#40;</span>mylat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">SET</span> lon2 <span style="color: #66cc66;">=</span> mylon<span style="color: #66cc66;">+</span>mydistance<span style="color: #66cc66;">/</span>abs<span style="color: #66cc66;">&#40;</span>cos<span style="color: #66cc66;">&#40;</span>radians<span style="color: #66cc66;">&#40;</span>mylat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">SET</span> lat1 <span style="color: #66cc66;">=</span> mylat<span style="color: #66cc66;">-</span><span style="color: #66cc66;">&#40;</span>mydistance<span style="color: #66cc66;">/</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">SET</span> lat2 <span style="color: #66cc66;">=</span> mylat<span style="color: #66cc66;">+</span><span style="color: #66cc66;">&#40;</span>mydistance<span style="color: #66cc66;">/</span>111<span style="color: #66cc66;">&#41;</span>;</div></div>
<p>A motorem celého příkladu je hlavní select vyhledávající budovy, které se nacházejí od výchozí budovy ve vzdálenosti do hodnoty <code class="codecolorer text default"><span class="text">mydistance</span></code>. Tento skript navíc vrací sloupec s názvem <code class="codecolorer text default"><span class="text">distance</span></code>, který představuje skutečnou vzdálenost (v kilometrech) od výchozí budovy. Číslo 6372.795 je poloměr země (pro míle by to bylo 3956). Pokud vás zajímá podrobnější význam použitých vzorců, opět vás odkáži na originální dokument (odkaz níže).</p>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #993333; font-weight: bold;">SELECT</span> buildings<span style="color: #66cc66;">.*,</span> 6372<span style="color: #66cc66;">.</span>795 <span style="color: #66cc66;">*</span> 2 <span style="color: #66cc66;">*</span> ASIN<span style="color: #66cc66;">&#40;</span>SQRT<span style="color: #66cc66;">&#40;</span>POWER<span style="color: #66cc66;">&#40;</span>SIN<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mylat<span style="color: #66cc66;">-</span>ABS<span style="color: #66cc66;">&#40;</span>building_latitude<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180<span style="color: #66cc66;">/</span>2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> 2<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span><br />
COS<span style="color: #66cc66;">&#40;</span>mylat <span style="color: #66cc66;">*</span> pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> COS<span style="color: #66cc66;">&#40;</span>ABS<span style="color: #66cc66;">&#40;</span>building_latitude<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> POWER<span style="color: #66cc66;">&#40;</span>SIN<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mylon <span style="color: #66cc66;">-</span> building_longitude<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180 <span style="color: #66cc66;">/</span> 2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> 2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> distance<br />
<span style="color: #993333; font-weight: bold;">FROM</span> buildings <span style="color: #993333; font-weight: bold;">WHERE</span> building_latitude <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AND</span> building_longitude <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AND</span><br />
building_longitude <span style="color: #993333; font-weight: bold;">BETWEEN</span> lon1 <span style="color: #993333; font-weight: bold;">AND</span> lon2 <span style="color: #993333; font-weight: bold;">AND</span> building_latitude <span style="color: #993333; font-weight: bold;">BETWEEN</span> lat1 <span style="color: #993333; font-weight: bold;">AND</span> lat2 <span style="color: #993333; font-weight: bold;">HAVING</span> distance <span style="color: #66cc66;">&lt;</span> mydistance <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> distance <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">50</span>;</div></div>
<h3>Hotová MySQL procedura</h3>
<p>Příkaz <code class="codecolorer text default"><span class="text">DELIMITER //</span></code> nastavuje oddělovač SQL příkazů na dvě lomítka. Děje se tak proto, že implicitně je jako oddělovač nastaven středník. Středníky se však objevují uvnitř procedury, což by způsobilo chybu při vytváření procedury. Proto pozor, pokud budete vytvářet proceduru v phpMyAdmin (budete si muset pod polem pro SQL příkaz nastavit jiný oddělovač než právě defaultní středník).</p>
<pre>
<div class="codecolorer-container sql default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br /></div></td><td><div class="sql codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">DELIMITER <span style="color: #66cc66;">//</span><br />
<span style="color: #993333; font-weight: bold;">CREATE</span> PROCEDURE <span style="color: #ff0000;">`gpsdistance`</span> <span style="color: #66cc66;">&#40;</span><span style="color: #993333; font-weight: bold;">IN</span> mybuilding_id int<span style="color: #66cc66;">,</span> <span style="color: #993333; font-weight: bold;">IN</span> mydistance int<span style="color: #66cc66;">&#41;</span><br />
BEGIN<br />
declare mylon double;<br />
declare mylat double;<br />
declare lon1 float;<br />
declare lon2 float;<br />
declare lat1 float;<br />
declare lat2 float;<br />
<br />
<span style="color: #993333; font-weight: bold;">SELECT</span> building_latitude<span style="color: #66cc66;">,</span> building_longitude <span style="color: #993333; font-weight: bold;">INTO</span> mylat<span style="color: #66cc66;">,</span> mylon <span style="color: #993333; font-weight: bold;">FROM</span> buildings <span style="color: #993333; font-weight: bold;">WHERE</span> building_id <span style="color: #66cc66;">=</span> mybuilding_id;<br />
<br />
<span style="color: #993333; font-weight: bold;">SET</span> lon1 <span style="color: #66cc66;">=</span> mylon<span style="color: #66cc66;">-</span>mydistance<span style="color: #66cc66;">/</span>abs<span style="color: #66cc66;">&#40;</span>cos<span style="color: #66cc66;">&#40;</span>radians<span style="color: #66cc66;">&#40;</span>mylat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">SET</span> lon2 <span style="color: #66cc66;">=</span> mylon<span style="color: #66cc66;">+</span>mydistance<span style="color: #66cc66;">/</span>abs<span style="color: #66cc66;">&#40;</span>cos<span style="color: #66cc66;">&#40;</span>radians<span style="color: #66cc66;">&#40;</span>mylat<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">SET</span> lat1 <span style="color: #66cc66;">=</span> mylat<span style="color: #66cc66;">-</span><span style="color: #66cc66;">&#40;</span>mydistance<span style="color: #66cc66;">/</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<span style="color: #993333; font-weight: bold;">SET</span> lat2 <span style="color: #66cc66;">=</span> mylat<span style="color: #66cc66;">+</span><span style="color: #66cc66;">&#40;</span>mydistance<span style="color: #66cc66;">/</span>111<span style="color: #66cc66;">&#41;</span>;<br />
<br />
<span style="color: #993333; font-weight: bold;">SELECT</span> buildings<span style="color: #66cc66;">.*,</span> 6372<span style="color: #66cc66;">.</span>795 <span style="color: #66cc66;">*</span> 2 <span style="color: #66cc66;">*</span> ASIN<span style="color: #66cc66;">&#40;</span>SQRT<span style="color: #66cc66;">&#40;</span>POWER<span style="color: #66cc66;">&#40;</span>SIN<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mylat<span style="color: #66cc66;">-</span>ABS<span style="color: #66cc66;">&#40;</span>building_latitude<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">*</span>pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180<span style="color: #66cc66;">/</span>2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> 2<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">+</span><br />
COS<span style="color: #66cc66;">&#40;</span>mylat <span style="color: #66cc66;">*</span> pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> COS<span style="color: #66cc66;">&#40;</span>ABS<span style="color: #66cc66;">&#40;</span>building_latitude<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> POWER<span style="color: #66cc66;">&#40;</span>SIN<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mylon <span style="color: #66cc66;">-</span> building_longitude<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">*</span> pi<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">/</span>180 <span style="color: #66cc66;">/</span> 2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">,</span> 2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">AS</span> distance<br />
<span style="color: #993333; font-weight: bold;">FROM</span> buildings <span style="color: #993333; font-weight: bold;">WHERE</span> building_latitude <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AND</span> building_longitude <span style="color: #993333; font-weight: bold;">IS</span> <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">NULL</span> <span style="color: #993333; font-weight: bold;">AND</span><br />
building_longitude <span style="color: #993333; font-weight: bold;">BETWEEN</span> lon1 <span style="color: #993333; font-weight: bold;">AND</span> lon2 <span style="color: #993333; font-weight: bold;">AND</span> building_latitude <span style="color: #993333; font-weight: bold;">BETWEEN</span> lat1 <span style="color: #993333; font-weight: bold;">AND</span> lat2 <span style="color: #993333; font-weight: bold;">HAVING</span> distance <span style="color: #66cc66;">&lt;</span> mydistance <span style="color: #993333; font-weight: bold;">ORDER</span> <span style="color: #993333; font-weight: bold;">BY</span> distance <span style="color: #993333; font-weight: bold;">LIMIT</span> <span style="color: #cc66cc;">50</span>;<br />
<br />
END<span style="color: #66cc66;">//</span></div></td></tr></tbody></table></div>
</pre>
<h3>Volání procedury v PHP</h3>
<p><strong>Velmi důležité</strong> je vědět, že volat procedury můžete <strong>pouze přes vrstvu MySQLi</strong> (která je již objektově orientovaná). Samotná procedura se volá SQL příkazem <code class="codecolorer sql default"><span class="sql">call gpsdistance<span style="color: #66cc66;">&#40;</span>$mybuilding_id<span style="color: #66cc66;">,</span> $mydistance<span style="color: #66cc66;">&#41;</span></span></code>. Zde je krátká ukázka:</p>
<pre>
<div class="codecolorer-container php default" style="overflow:auto;white-space:nowrap;border: 1px solid #9F9F9F;width:435px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$link</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysqli_connect</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'localhost'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'db'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'user'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'passwd'</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: #339933;">!</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #990000;">printf</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Can't connect to MySQL Server. Errorcode: <span style="color: #009933; font-weight: bold;">%s</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">,</span> <span style="color: #990000;">mysqli_connect_error</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 />
&nbsp; &nbsp; <span style="color: #990000;">exit</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span><br />
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysqli_query</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;call gpsdistance(<span style="color: #006699; font-weight: bold;">$mybuilding_id</span>, 5)&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #b1b100;">while</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$row</span> <span style="color: #339933;">=</span> <span style="color: #990000;">mysqli_fetch_array</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">...</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; &nbsp; <span style="color: #990000;">mysqli_free_result</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$result</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #990000;">mysqli_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$link</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
</pre>
<p>A to je vše, snad vám článek byl k nečemu užitečný <img src='http://www.havlena.net/blog/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<h3>Použitá literatura</h3>
<ul>
<li>RUBIN, Alexander. Geo/Spatial Search with MySQL. Scribd [online]. 2008 [cit. 2009-11-04]. Dostupný z WWW: &lt;<a href="http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL">http://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL</a>&gt;.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.havlena.net/blog/hledani-vzdalenosti-gps-souradnic-v-mysql-a-php/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
