<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.freifunk-franken.de/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Hood_als_Polygon%2FIdeen</id>
	<title>Hood als Polygon/Ideen - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.freifunk-franken.de/mediawiki/index.php?action=history&amp;feed=atom&amp;title=Hood_als_Polygon%2FIdeen"/>
	<link rel="alternate" type="text/html" href="https://wiki.freifunk-franken.de/mediawiki/index.php?title=Hood_als_Polygon/Ideen&amp;action=history"/>
	<updated>2026-05-19T10:59:05Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in Freifunk Franken</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://wiki.freifunk-franken.de/mediawiki/index.php?title=Hood_als_Polygon/Ideen&amp;diff=15849&amp;oldid=prev</id>
		<title>SebaBe: /* Alternative mit MySQL */</title>
		<link rel="alternate" type="text/html" href="https://wiki.freifunk-franken.de/mediawiki/index.php?title=Hood_als_Polygon/Ideen&amp;diff=15849&amp;oldid=prev"/>
		<updated>2019-07-26T08:28:11Z</updated>

		<summary type="html">&lt;p&gt;&lt;span dir=&quot;auto&quot;&gt;&lt;span class=&quot;autocomment&quot;&gt;Alternative mit MySQL&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 26. Juli 2019, 10:28 Uhr&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l131&quot;&gt;Zeile 131:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Zeile 131:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br/&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor man dann das Polygon hernimmt, könnte man für jede Hood sehr billig prüfen, ob die Koordinaten in den Bereich plus/minus der Höchstabweichung liegen. Wenn außerhalb, dann einfach weiter. Selbst wenn man die Größe sehr hoch wählt, sollte so ein beachtlicher Geschwindigkeitsgewinn zu holen sein.&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;Bevor man dann das Polygon hernimmt, könnte man für jede Hood sehr billig prüfen, ob die Koordinaten in den Bereich plus/minus der Höchstabweichung liegen. Wenn außerhalb, dann einfach weiter. Selbst wenn man die Größe sehr hoch wählt, sollte so ein beachtlicher Geschwindigkeitsgewinn zu holen sein.&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategorie:Hood]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-side-deleted&quot;&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;[[Kategorie:Polygon]]&lt;/ins&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;</summary>
		<author><name>SebaBe</name></author>
	</entry>
	<entry>
		<id>https://wiki.freifunk-franken.de/mediawiki/index.php?title=Hood_als_Polygon/Ideen&amp;diff=13716&amp;oldid=prev</id>
		<title>ChristianD: Die Seite wurde neu angelegt: „== Nutzung in Programmen == * Is-in Abfrage (PostGIS) * Is-in Abfrage (selbst programmiert) * ...  == PostgreSQL…“</title>
		<link rel="alternate" type="text/html" href="https://wiki.freifunk-franken.de/mediawiki/index.php?title=Hood_als_Polygon/Ideen&amp;diff=13716&amp;oldid=prev"/>
		<updated>2018-12-03T19:42:21Z</updated>

		<summary type="html">&lt;p&gt;Die Seite wurde neu angelegt: „== Nutzung in Programmen == * &lt;a href=&quot;#Is-in_Abfrage&quot;&gt;Is-in Abfrage (PostGIS)&lt;/a&gt; * &lt;a href=&quot;#Alternative_mit_MySQL&quot;&gt;Is-in Abfrage (selbst programmiert)&lt;/a&gt; * ...  == PostgreSQL…“&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== Nutzung in Programmen ==&lt;br /&gt;
* [[#Is-in Abfrage|Is-in Abfrage (PostGIS)]]&lt;br /&gt;
* [[#Alternative mit MySQL|Is-in Abfrage (selbst programmiert)]]&lt;br /&gt;
* ...&lt;br /&gt;
&lt;br /&gt;
== PostgreSQL und PostGIS ==&lt;br /&gt;
&amp;quot;Hood mit Polygon&amp;quot; und alles was dazu erforderlich ist lässt sich simpel realisieren mit [[wikipedia:de:PostgreSQL|PostgreSQL]] &amp;lt;br&amp;gt; und der Erweiterung [[wikipedia:de:PostGIS|PostGIS]] ([https://wiki.postgresql.org/images/7/7d/2011-11-11_pg.conf.de_darf_ich_vorstellen_postgis_aemde.pdf Doku de], [http://postgis.org/documentation/ Doku en], [http://trac.osgeo.org/postgis/wiki/UsersWikiMain Wiki en]). &lt;br /&gt;
&lt;br /&gt;
Als Datenbasis dient eine Tabelle mit GeoJSON für die Hood-Polygone, und eine Tabelle der Router-Koordinaten.&lt;br /&gt;
&lt;br /&gt;
=== von MySQL zu PostgreSQL ===&lt;br /&gt;
Zur Portierung der Daten aus unserer bisherigen [https://wiki.postgresql.org/wiki/Converting_from_other_Databases_to_PostgreSQL MySQL-DB zu PostgreSQL] gibt es mehrere freie Tools. Gut geeignet für unseren Zweck ist beispielsweise ...&lt;br /&gt;
&lt;br /&gt;
=== Is-in Abfrage ===&lt;br /&gt;
PostGIS &amp;quot;weiss&amp;quot; in welchem Polygon eine Koordinate liegt. &lt;br /&gt;
&lt;br /&gt;
Die Abfrage, in welcher Hood sich ein Router befindet, ist in einer PostgreSQL/PostGIS-DB ganz simpel und performant. In PostGIS gibt es dafür die [ Funktion &amp;quot;is-in&amp;quot;], die die Abfrage direkt in der DB prüft. Es ist also kein weiterer Programmieraufwand erforderlich.&lt;br /&gt;
&lt;br /&gt;
Der Router schickt wie bisher seinen Standort als Koordinate, und &amp;quot;is-in&amp;quot; liefert blitzschnell die Hood als Ergebnis. Damit ist wie bisher das zuständige Gateway definiert.&lt;br /&gt;
&lt;br /&gt;
[https://postgis.net/docs/Topology.html Weitere PostGIS-Funktionen] erledigen fast beliebige Aufgaben im gesamten Bereich Geo-Informatik.&lt;br /&gt;
&lt;br /&gt;
Falls der Umstieg auf PostgreSQL/PostGIS nicht erwünscht ist, müsste man die [[#Alternative mit MySQL|Funktion selber programmieren]].&lt;br /&gt;
&lt;br /&gt;
== Hood-Polygon und Voronoi ==&lt;br /&gt;
[[Datei:Hood Polygon vs. Voronoi.jpg|mini|Hood-Polygon über Voronoi]]&lt;br /&gt;
&lt;br /&gt;
Christian schlägt vor:&lt;br /&gt;
&lt;br /&gt;
Das neue System der Hood-Polygone liegt über dem bisherigen Voronoi-System. &lt;br /&gt;
&lt;br /&gt;
Erst wird geprüft ob die Koordinaten irgendwo in einer GeoJSON Hood liegen, &lt;br /&gt;
&amp;lt;br&amp;gt; ist das der Fall wird diese genommen. &lt;br /&gt;
&amp;lt;br&amp;gt; Ist das nicht der Fall und wir finden im GeoJSOn System keine&lt;br /&gt;
gültige Hood, &lt;br /&gt;
&amp;lt;br&amp;gt; dann machen wir mit Voronoi weiter.&lt;br /&gt;
&lt;br /&gt;
So könnte das theoretisch aussehen (kein reales Beispiel):&lt;br /&gt;
&lt;br /&gt;
Router A liegt in keiner GeoJSON Hood, er gehört zur Voronoi Hood B&lt;br /&gt;
&amp;lt;br&amp;gt; Router B liegt in keiner GeoJSON Hood, er gehört zur Voronoi Hood A&lt;br /&gt;
&amp;lt;br&amp;gt; Router C liegt in einer GeoJSON Hood, er gehört zur Geojson Hood C&lt;br /&gt;
&amp;lt;br&amp;gt; Router D liegt in einer GeoJSON Hood, er gehört zur Geojson Hood D&lt;br /&gt;
&amp;lt;br&amp;gt; Router E liegt in einer GeoJSON Hood, er gehört zur Geojson Hood D&lt;br /&gt;
&amp;lt;br&amp;gt; Router F liegt in keiner GeoJSON Hood, er gehört zur Voronoi Hood B&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Alternative mit MySQL ==&lt;br /&gt;
Wenn es für MySQL keine [[#Is-in Abfrage|&amp;quot;is-in&amp;quot; Funktion]] gibt, müsste man das selber programmieren.&lt;br /&gt;
&lt;br /&gt;
=== Idee Statisch (Markus) ===&lt;br /&gt;
Wenn man &amp;quot;is-in&amp;quot; nicht direkt in der DB in &amp;quot;Echtzeit&amp;quot; prüfen will (z.B. mit PostGIS), &amp;lt;br&amp;gt; könnte man:&lt;br /&gt;
# &amp;#039;&amp;#039;einmal&amp;#039;&amp;#039; von allen Routern die Koordinate auslesen,&lt;br /&gt;
# für jede Koordinate prüfen, in welcher Hood der Router liegt,&lt;br /&gt;
# und die Zuordnung in eine Tabelle schreiben.&lt;br /&gt;
&lt;br /&gt;
Dann bräuchte man bei Anfragen nur in der Tabelle nachschauen.&lt;br /&gt;
&lt;br /&gt;
Das bedeutet, dass man:&lt;br /&gt;
* bei jedem neuen Router (bzw. bei jeder Koordinaten-Änderung) &amp;lt;br&amp;gt; auch die Hood neu bestimmen &amp;lt;br&amp;gt; und in der Tabelle ergänzen müsste. &lt;br /&gt;
Dann wäre die Tabelle immer bis auf wenige Minuten aktuell.&lt;br /&gt;
&lt;br /&gt;
=== Idee mit Cache (Michael) ===&lt;br /&gt;
Man könnte die Anfragen auch einfach cachen, weil sie immer wieder gleich kommen und sich nur geringfügig ändern.&lt;br /&gt;
&lt;br /&gt;
=== Idee mit Cache (Christian) ===&lt;br /&gt;
(vermutlich das gleiche wie Michael weiter oben nur tiefergehend ausgeführt)&lt;br /&gt;
&lt;br /&gt;
Wir legen im keyxchange eine weitere Tabelle an, wo wir die GeoDaten zu&lt;br /&gt;
jeder Polygon-Hood abspeichern. Jeder GeoDatensatz verweist dann zu&lt;br /&gt;
einer HoodID die wir ganz normal in die bereits vorhandene Hood Tabelle&lt;br /&gt;
speichern.&lt;br /&gt;
Die Hoodtabelle braucht dann noch ein Flag PolygonHood oder voronoiHood&lt;br /&gt;
so das bei der voronoi Berechnung die PolygonHood nicht getestet wird.&lt;br /&gt;
&lt;br /&gt;
Das hat auch den Vorteil, das mehrere Polygone auf eine Hood verweisen&lt;br /&gt;
können (Schnaittach, Simmelsdorf und noch irgendwas verweist alles auf&lt;br /&gt;
die Hood Schnaittach)&lt;br /&gt;
&lt;br /&gt;
Im Cache würde ich dann &amp;quot;nur&amp;quot; noch lat, lon und HoodID abspeichern, der&lt;br /&gt;
Cache muss gar nicht wissen ob es eine voronoi oder PolygonHood ist, die&lt;br /&gt;
HoodID reicht.&lt;br /&gt;
&lt;br /&gt;
Sobald man 1x irgendwas an irgendeiner Hood ändern, muss der Cache&lt;br /&gt;
natürlich komplett geleert werden und wieder frisch aufgebaut werden.&lt;br /&gt;
Das kann man wunderbar vor, bzw nach den ganzen Berechnung machen. Bevor&lt;br /&gt;
man mit den Berechnen anfängt, fragt man die lat/lon die der Router&lt;br /&gt;
gesendet hat im Cache ab, gibt es die hat man direkt die HoodID und kann&lt;br /&gt;
die Hood den Router geben. Gibt es die nicht, führt man die komplette&lt;br /&gt;
Berechnung durch und speichert am Ende in den Cache lat, lon und HoodID&lt;br /&gt;
ab damit sie für den nächsten durchlauf zur Verfügung stehen.&lt;br /&gt;
&lt;br /&gt;
Ja es ist ein zusätzlicher Fehler aber ich seh das nicht als kritisch&lt;br /&gt;
an, wenn man den Cache leert falls man eine Hood anlegt oder ändert&lt;br /&gt;
sollte eigentlich nichts passieren. Aktualisieren oder so muss man nie&lt;br /&gt;
was, auch ist es egal zu welchen System der Cache gehört, nur eben den&lt;br /&gt;
Cache komplett leeren (man könnte natürlich auch nur den Bereich leeren&lt;br /&gt;
um den es sich handelt aber da wäre mir das Fehlerrisiko zu hoch, 1x den&lt;br /&gt;
Cache komplett neu aufbauen geht schon) wenn man was an den Hoods ändert.&lt;br /&gt;
&lt;br /&gt;
=== Idee mit Punkt (Christian) ===&lt;br /&gt;
Ich definieren einen Punkt der so ganz grob irgendwo in der Mitte des&lt;br /&gt;
Polygons liegt (muss nicht exakt sein, theoretisch geht auch ein Punkt&lt;br /&gt;
am Rand, besser wirds je nähe man zur Mitte kommt). Dann schau ich wie&lt;br /&gt;
groß der Abstand von meinen zuivor definierten Punkt zum Rand am&lt;br /&gt;
weitesten entfernen Punkt ist und speichere diesen Abstand.&lt;br /&gt;
&lt;br /&gt;
Danach prüfe ich erstmal, ist die gesendete Koordinate vom Router weiter&lt;br /&gt;
weg vom &amp;quot;ganz groben Mittelpunkt&amp;quot; als der Maximalabstand den ich zuvor&lt;br /&gt;
ermittelt habe, wenn ja kann ich mir schon sicher sein das er nicht in&lt;br /&gt;
diesen Polygon liegt und brauch die ganze Berechnung nicht durchlaufen.&lt;br /&gt;
Erst wenn er näher dran ist, muss ich noch die ganze Berechnung machen&lt;br /&gt;
damit ich genau weiß ob er drinnen liegt oder nicht.&lt;br /&gt;
&lt;br /&gt;
=== Idee mit PHP (Christian) ===&lt;br /&gt;
Ich bin dabei auf [http://assemblysys.com/php-point-in-polygon-algorithm/ diese Funktion] gestolpert.&lt;br /&gt;
&lt;br /&gt;
Man muss jetzt aus der GeoJson natürlich ein Array erstellen, dies hab&lt;br /&gt;
ich erstmal händisch gemacht (das in ne Schönform zu bringen sollte&lt;br /&gt;
technisch kein Problem sein). [http://fff-jupiter.fff.community/poly/array.txt Ergebnis mit dem Bereich Simmelsdorf].&lt;br /&gt;
&lt;br /&gt;
Danach hab ich noch 3 Koordinaten reingeklopft gegen die ich testen will&lt;br /&gt;
(später würde der Router hier seine Koordinaten hinschicken und der&lt;br /&gt;
keyxchange schaut in welchen MultiPolygon das liegt).&lt;br /&gt;
&lt;br /&gt;
=== Idee Höchstgrösse (Adrian) ===&lt;br /&gt;
Man könnte für die Gemeinde-Hoods eine Höchstgröße festlegen (= ± Winkelbruchteile).&lt;br /&gt;
&lt;br /&gt;
Bevor man dann das Polygon hernimmt, könnte man für jede Hood sehr billig prüfen, ob die Koordinaten in den Bereich plus/minus der Höchstabweichung liegen. Wenn außerhalb, dann einfach weiter. Selbst wenn man die Größe sehr hoch wählt, sollte so ein beachtlicher Geschwindigkeitsgewinn zu holen sein.&lt;/div&gt;</summary>
		<author><name>ChristianD</name></author>
	</entry>
</feed>