<?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>goblor grübelt &#187; Stored Procdures</title>
	<atom:link href="http://goblor.de/wp/tag/stored-procdures/feed/" rel="self" type="application/rss+xml" />
	<link>http://goblor.de/wp</link>
	<description>Ein unabhängiges Denker-Blog aus Karlsruhe</description>
	<lastBuildDate>Tue, 13 Apr 2010 10:19:02 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OpenStreetMap-Projekt: Teil2 – Von den Rohdaten zum gerichteten Graphen</title>
		<link>http://goblor.de/wp/2009/10/17/openstreetmap-projekt-teil2-%e2%80%93-von-den-rohdaten-zum-gerichteten-graphen/</link>
		<comments>http://goblor.de/wp/2009/10/17/openstreetmap-projekt-teil2-%e2%80%93-von-den-rohdaten-zum-gerichteten-graphen/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 12:04:41 +0000</pubDate>
		<dc:creator>goblor</dc:creator>
				<category><![CDATA[Digital]]></category>
		<category><![CDATA[Forschung und Technik]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[OpenStreetMap]]></category>
		<category><![CDATA[OSM-Projekt]]></category>
		<category><![CDATA[Stored Procdures]]></category>

		<guid isPermaLink="false">http://goblor.de/wp/?p=974</guid>
		<description><![CDATA[Im 2. Teil des Projektes soll es darum gehen, einen gerichteten Graphen aus den in Teil 1 in die Datenbank eingelesenen OpenStreetMap-Daten zu erstellen, mit dem später z.B. eine Wegsuche realisiert werden kann.
In Bild1 ist  Beispielhaft ein Ausschnitt aus einer möglichen Karte aus den Rohdaten zu sehen, die allerdings für eine Wegsuche viele unnötige Knoten [...]]]></description>
			<content:encoded><![CDATA[<p>Im 2. Teil des Projektes soll es darum gehen, einen <a title="de.wikipedia.org: Gerichteter Graph" href="http://de.wikipedia.org/wiki/Graph_%28Graphentheorie%29#Gerichtete_Graphen">gerichteten Graphen</a> aus den in <a title="OpenStreetMap-Projekt: Teil1 – Openstreetmap-Daten in MySQL-Datenbank einlesen" href="http://goblor.de/wp/2009/10/16/openstreetmap-projekt-teil-1-openstreetmap-daten-in-mysql-datenbank-einlesen/">Teil 1</a> in die Datenbank eingelesenen OpenStreetMap-Daten zu erstellen, mit dem später z.B. eine Wegsuche realisiert werden kann.</p>
<div class="imagebox"><div class="image"><a href="http://goblor.de/wp/wp-content/uploads/2009/10/Wegbeispiel.png"><img class="size-full wp-image-976" title="Wegbeispiel" src="http://goblor.de/wp/wp-content/uploads/2009/10/Wegbeispiel.png" alt="Bild1: Beispiel-Darstellung von einigen Wegen nach OSM-Schema" width="640" height="400" /></a></div><div class="imgcaption">Bild1: Beispiel-Darstellung von einigen Wegen nach OSM-Schema</div></div>
<p>In Bild1 ist  Beispielhaft ein Ausschnitt aus einer möglichen Karte aus den Rohdaten zu sehen, die allerdings für eine Wegsuche viele unnötige Knoten enthält und deren Datenstruktur für unsere Zwecke nicht sonderlich praktisch ist. Wir brauchen für die Wegsuche nur die Weglänge zwischen zwei verbundenen End- oder Kreuzungs-Knoten.<span id="more-974"></span></p>
<p>Die Knoten 3, 4, 6, 9 und 10 brauchen wir nicht.<br />
Prinzipiell ist auch Knoten 1 nicht notwendig, wenn der rote Weg eine Einbahnstraße ist und der braune jedoch nicht oder auf einer der beiden Straßen eine Geschwindigkeitsbeschränkung gilt, wird er doch wieder gebraucht. In den Open-Streetmap-Daten sind auch Brücken durch einen eigenen Weg eingezeichnet. Damit kosten uns Brücken und Tempobeschränkungen zusätzliche Verbindungen, ich nehme das in diesem Fall aber in Kauf, um später Tempobeschränkungen und Einbahnstraßen berücksichtigen zu können.</p>
<div class="imagebox"><div class="image"><a href="http://goblor.de/wp/wp-content/uploads/2009/10/Wegbeispiel2.png"><img class="size-full wp-image-978" title="Wegbeispiel2" src="http://goblor.de/wp/wp-content/uploads/2009/10/Wegbeispiel2.png" alt="Bild2: Optimierte Wegdarstellung durch die Verbindungs-Tabelle" width="640" height="400" /></a></div><div class="imgcaption">Bild2: Optimierte Wegdarstellung durch die Verbindungs-Tabelle</div></div>
<p>Die Verbindungs-Tabelle enthält also eine Zeile für jeden Startknoten, Endknoten und der Wegstrecke dazwischen, wie in Bild2 (die natürlich notwendige Entfernung zwischen den Knoten fehlt hier). Weil wir Einbahnstraßen berücksichtigen wollen, werden Verbindungen, die keine Einbahnstraßen sind, werden in beide Richtungen einmal abgelegt. Das ist zwar nicht effizient, vereinfacht aber unserer Arbeit. Optimieren können wir auch noch, wenn erst mal alles läuft, wie wir uns das vorstellen.</p>
<p>Zunächst muss die eine Tabelle <a title="Datenbankschema für einen gerichteten und gewichteten Graphen" href="http://goblor.de/wp/wp-content/uploads/2009/10/verbindungen.sql.txt">verbindungen mit diesem SQL-Skript</a> angelegt werden. Zum <a title="Stored Procedure zum Erstellen einer Verbindungstabelle aus OpenStreetMap-Daten" href="http://goblor.de/wp/wp-content/uploads/2009/10/erstelleVerbindungen.sql.txt">Erstellen der Verbindungstabelle nutze ich dann eine Stored Procedure</a>. Die arbeitet direkt in der Datenbank und ist deshalb recht schnell. Ihr Ablaufdiagramm ist im Bild3 zu sehen. Zu Beginn wird eine sehr aufwändige Abfrage ausgeführt, die einen Großteil der Informationen ausliest, die später benötigt werden und mit einem Cursor zeilenweise abgearbeitet wird. In ihr wird festgelegt, welche Wege überhaupt berücksichtigt werden. Wenn wir einen Routenplaner für Autos wollen, ist es wohl eher nicht so hilfreich Fußwege und Treppen in der Karte zu haben.</p>
<div class="imagebox"><div class="image"><a href="http://goblor.de/wp/wp-content/uploads/2009/10/AblaufVerbindungen.png"><img class="size-full wp-image-979" title="AblaufVerbindungen" src="http://goblor.de/wp/wp-content/uploads/2009/10/AblaufVerbindungen.png" alt="Bild3: Ablaufdiagramm zum Erstellen der Verbindungen" width="821" height="493" /></a></div><div class="imgcaption">Bild3: Ablaufdiagramm zum Erstellen der Verbindungen</div></div>
<p>Das hier bereitgestellte Skript berücksichtigt bereits Einbahnstraßen, das macht die Abfrage zu Beginn zwar noch aufwändiger, allerdings ist es für Autofahrer einfach nicht interessant Einbahnstraßen in Gegenrichtung zu befahren.</p>
<p>Mit dem Befehl</p>
<p>CALL erstelleVerbindungen();</p>
<p>kann die Datenbank gefüllt werden. Das dauert wieder ziemlich lange. Alleine das Erstellen der ersten Abfrage nimmt bei mir für Baden-Württemberg bereits über 3 Minuten in Anspruch, aber erst danach werden auch Daten geschrieben. Diese Procedure kann sicherlich noch optimiert werden, ich habe mich damit nicht mehr genauer beschäftigt, als sie in brauchbarer Zeit das gewünschte Ergebnis geliefert hatte.</p>
<p><strong>[Update 24.10.]</strong> Ich habe noch einen Fehler im Skript entdeckt, der lustige Fehler produziert hat. Einige Straßen, wie die Europabrücke über den Rhein bei Karlsruhe hatten in Baden-Württemberg nur einen Wegpunkt. Das hatte den Effekt, dass große Strecken mit Entfernung 0 in die Verbindungsliste eingetragen wurden, die eigentlich nicht mal verbunden waren. So lässt sich natürlich keine ordentliche Wegsuche realisieren. Der Fehler ist aber nun behoben.</p>


<p>Ähnliche Artikel:<ol><li><a href='http://goblor.de/wp/2009/10/16/openstreetmap-projekt-teil-1-openstreetmap-daten-in-mysql-datenbank-einlesen/' rel='bookmark' title='Permanent Link: OpenStreetMap-Projekt: Teil1 &#8211; Openstreetmap-Daten in MySQL-Datenbank einlesen'>OpenStreetMap-Projekt: Teil1 &#8211; Openstreetmap-Daten in MySQL-Datenbank einlesen</a></li>
<li><a href='http://goblor.de/wp/2008/09/25/howto-openstreetmap-daten-in-mysql-datenbank-importieren/' rel='bookmark' title='Permanent Link: HowTo: OpenStreetMap-Daten in MySQL-Datenbank importieren'>HowTo: OpenStreetMap-Daten in MySQL-Datenbank importieren</a></li>
<li><a href='http://goblor.de/wp/2009/08/26/das-ist-also-eine-schlechte-soundkarte/' rel='bookmark' title='Permanent Link: Das ist also eine schlechte Soundkarte'>Das ist also eine schlechte Soundkarte</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://goblor.de/wp/2009/10/17/openstreetmap-projekt-teil2-%e2%80%93-von-den-rohdaten-zum-gerichteten-graphen/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Abstandsmessung optimieren</title>
		<link>http://goblor.de/wp/2008/10/02/abstandsmessung-optimieren/</link>
		<comments>http://goblor.de/wp/2008/10/02/abstandsmessung-optimieren/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 00:26:37 +0000</pubDate>
		<dc:creator>goblor</dc:creator>
				<category><![CDATA[Software]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[osm2sql]]></category>
		<category><![CDATA[Stored Procdures]]></category>

		<guid isPermaLink="false">http://goblor.de/wp/?p=128</guid>
		<description><![CDATA[Gestern habe ich die Deutschland-Daten auf dem Server importiert. Das hat exzellent und ohne Abbruch geklappt. Direkt aus dem osm2sql in die Datenbank gepiped. Auch wenn fritsch Befürchtungen wegen des Arbeitsspeichers hatte. Die Swap-Größe hat sich seit 2 Tagen nicht verändert.
Heute haben wir uns mal dem Zeit-Problem bei der Entfernungsberechnung zwischen zwei Städten gewidmet. Wir [...]]]></description>
			<content:encoded><![CDATA[<p>Gestern habe ich die Deutschland-Daten auf dem Server importiert. Das hat exzellent und ohne Abbruch geklappt. Direkt aus dem osm2sql in die Datenbank gepiped. Auch wenn fritsch Befürchtungen wegen des Arbeitsspeichers hatte. Die Swap-Größe hat sich seit 2 Tagen nicht verändert.</p>
<p>Heute haben wir uns mal dem Zeit-Problem bei der Entfernungsberechnung zwischen zwei Städten gewidmet. Wir haben mit 10 bis 20 Sekunden pro Abfrage begonnen. Fritsch hat dann heute Mittag beschlossen, die Indizes auf ein anderes Format zu ändern. Weg von <code>BTREE</code> hin zu <code>HASH</code>. Auch wenn das laut <a title="MySQL :: MySQL 5.1 Referenzhandbuch :: 13.1.4 CREATE INDEX" href="http://dev.mysql.com/doc/refman/5.0/en/create-index.html">MySQL 5.0-Referenz</a> gar nicht geht, hat uns das etwa eine Vervierfachung der Geschwindigkeit gebracht auf etwa 4 Sekunden.<span id="more-128"></span></p>
<p>Bisher hatten wurde ein View eingesetzt, der für alle Stadt-Kombinationen den Abstand berechnen konnte. Die Städte wurden dann per <code>WHERE</code> in der Abfrage eingeschränkt. Dumm nur, das die <a title="Orthodrome - Wikipedia" href="http://de.wikipedia.org/wiki/Orthodrome">Abstandsberechnung</a> recht aufwändig ist, weil sie 6 trigonometrische Funktionen auf einmal durchführt. Offenbar wurden die für jede Zeile berechnet, auch wenn die Zeile am Ende nicht ausgegeben wurde.</p>
<p>Deshalb habe ich mich heute abend nach fritschs <a title="Fritsch Place - Heute - Waterboarding in der WG" href="http://fritsch.fruehberger.net/index.php?option=com_content&amp;task=view&amp;id=117&amp;Itemid=37">&#8220;Ich waterboarde mich selbst&#8221;-Aktion</a> nochmal hingesetzt und eine Stored Procedure geschrieben, die zunächst 2 Tabellen erzeugt, in denen jeweils die Daten zu den beiden eingegebenen Städten stehen und erst dann eine Berechnung durchführt. Damit bin ich jetzt auf unter 0,5 Sekunden runter, was durchaus akzeptabel ist. Interessanterweise macht es auch praktisch keinen zeitlichen Unterschied, ob ich mir die Entfernungen von Bremen nach Heidelberg ausgeben lasse oder alle Entfernungen von Bre* nach Hei*. Obwohl das 125 Zeilen mehr ergibt.</p>
<p>Ein paar Probleme gibts aber doch noch:</p>
<ul>
<li>Bisher habe ich das Thema Encoding noch nicht betrachtet. Auf der Kommandozeile mit mysql werden Unicode-Zeichen fehlerhaft ausgegeben und auch die Eingabe ebensolcher Namen funktioniert nicht.</li>
<li>PhpMyAdmin scheint nicht mit Stored Procedures umgehen zu können.</li>
<li>Eine Stored Procedure ist einfach keine Tabelle und kein View und unkomfortabler zu nutzen.</li>
</ul>
<p>P.S.: Wie man Stored Procedures in MySQL schreibt, habe ich mir in <a title="MySQL - Using Stored Procedures Tutorials" href="http://www.brainbell.com/tutorials/MySQL/Using_Stored_Procedures.htm">diesem Tutorial</a> angeeignet.</p>


<p>Ähnliche Artikel:<ol><li><a href='http://goblor.de/wp/2009/10/17/openstreetmap-projekt-teil2-%e2%80%93-von-den-rohdaten-zum-gerichteten-graphen/' rel='bookmark' title='Permanent Link: OpenStreetMap-Projekt: Teil2 – Von den Rohdaten zum gerichteten Graphen'>OpenStreetMap-Projekt: Teil2 – Von den Rohdaten zum gerichteten Graphen</a></li>
<li><a href='http://goblor.de/wp/2008/09/28/es-scheint-zu-funktionieren/' rel='bookmark' title='Permanent Link: Es scheint zu funktionieren'>Es scheint zu funktionieren</a></li>
<li><a href='http://goblor.de/wp/2008/09/29/der-durchbruch/' rel='bookmark' title='Permanent Link: Der Durchbruch'>Der Durchbruch</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://goblor.de/wp/2008/10/02/abstandsmessung-optimieren/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
