mySQL Daten die in einen bestimmten bereich fallen
Hilker
- datenbank
0 Kalle0 Hilker
0 Kris0 Umkreissuche GeoDB
Tom
Hallo Forum,
Ich möchte aus einer Tabelle Datensätze zusammenfassen, die sich in einem Bereich finden. Also z.B. +-10, gibt es da irgendeine Möglichkeit?
Ich suche mich schon im Manual zu tode, habe aber bisher nichts passendes entdecken können. Lässt sich soein Bezug überhaut herstellen?
mfG der Hilker
Hallo Hilker,
Also z.B. +-10, gibt es da irgendeine Möglichkeit?
...
WHERE daten >= -10 AND daten <= 10
meinst du das?
Kalle
Hallo Hilker,
Hallo Kalle!
Also z.B. +-10, gibt es da irgendeine Möglichkeit?
...
WHERE daten >= -10 AND daten <= 10meinst du das?
Nein, das ist ja einfach :)
siehe meine antwort auf Kris...
Kalle
Ich möchte aus einer Tabelle Datensätze zusammenfassen, die sich in einem Bereich finden. Also z.B. +-10, gibt es da irgendeine Möglichkeit?
die gibt es ... nur wäre es weitaus hilfreicher wenn du deine Frage detaillierter stellst. Du möchtest also bestimmte Werte aus einer DB wiedergeben die +-10 sind ?
oder wie darf ich das "zusammenfassen" verstehen ?
Lässt sich soein Bezug überhaut herstellen?
klar ... denn mächtig ist die Datenbak ;)
Ich möchte aus einer Tabelle Datensätze zusammenfassen, die sich in einem Bereich finden. Also z.B. +-10, gibt es da irgendeine Möglichkeit?
die gibt es ... nur wäre es weitaus hilfreicher wenn du deine Frage detaillierter stellst. Du möchtest also bestimmte Werte aus einer DB wiedergeben die +-10 sind ?
Das wäre ja einfach...
Ich möchte Werte zusammenfassen die im Bereich +-10 liegen....
oder wie darf ich das "zusammenfassen" verstehen ?
Also, angenommen ich habe eine tabelle mit einer spalte 'zahlen' und eine spalte 'buchstaben'. Die Tabelle hat 100Reihen in Spalte 'zahlen' stehen die ganzzahlen von 1-100, in der buchstabenspalte die buchstaben von a-Za-Z
nehmen wir in diesem Fall mal +-1 an...
nun möchte ich aus der 'buchstaben' spalte, die buchstaben zu 3er blöcken zusammengefasst haben, die Ergebnismenge sollte dann so ähnlich wie dieses aussehen:
buchst. | z+-1
---------+---------
a | 1-3
b | 1-3
c | 1-3
d | 4-6
e | 4-6
f | 4-6
g | 7-9
. | .
. | .
. | .
. | .
puh... hoffentlich versteht das jetzt wer... :-)
Lässt sich soein Bezug überhaut herstellen?
klar ... denn mächtig ist die Datenbak ;)
Danke, der Hilker
echo $begrüßung;
Ich möchte Werte zusammenfassen die im Bereich +-10 liegen....
puh... hoffentlich versteht das jetzt wer... :-)
Wie genau ist denn "Bereich +-10" definiert und von welchem Bezugspunkt gehst du aus?
Meinst du alle Zeilen in denen deren Wert größer oder gleich Bezugswert-10 und kleiner oder gleich Bezugswert+10 ist?
echo "$verabschiedung $name";
echo $begrüßung;
Ich möchte Werte zusammenfassen die im Bereich +-10 liegen....
puh... hoffentlich versteht das jetzt wer... :-)Wie genau ist denn "Bereich +-10" definiert und von welchem Bezugspunkt gehst du aus?
das ist ja mein Dielemma, ich hab keinen bezugswert. :-(
Meinst du alle Zeilen in denen deren Wert größer oder gleich Bezugswert-10 und kleiner oder gleich Bezugswert+10 ist?
echo "$verabschiedung $name";
der Hilker
puh... hoffentlich versteht das jetzt wer... :-)
nöö, nicht wirklich. Was ist denn die tatsächliche Anwendung?
Es sieht so aus, als ob du einen Wert suchen willst und die Antwort soll sein: "auf Seite 3"
Lexikon-Inhaltsverzeichnis:
buchst. | Seite
---------+---------
a | 1
b | 1
c | 1
d | 2
e | 2
f | 2
g | 3
. | .
ist es das?
puh... hoffentlich versteht das jetzt wer... :-)
nöö, nicht wirklich. Was ist denn die tatsächliche Anwendung?
geokoordinaten zusammenfassen, die nahe beieinanderliegen.
Also: Fasse alle daten unter einem (beliebigen) Schlüssel zusammen, wenn sie nicht weiter als 5km voneinander entfernt sind.
ich hab auch schon im FreeGIS teil von mySQL geschmökert, da aber auch nichts passendes gefunden...
Es sieht so aus, als ob du einen Wert suchen willst und die Antwort soll sein: "auf Seite 3"
Lexikon-Inhaltsverzeichnis:
buchst. | Seite
---------+---------
a | 1
b | 1
c | 1
d | 2
e | 2
f | 2
g | 3
. | .ist es das?
auch nicht wirklich... ;-/
echo $begrüßung;
Was ist denn die tatsächliche Anwendung?
geokoordinaten zusammenfassen, die nahe beieinanderliegen.
Also: Fasse alle daten unter einem (beliebigen) Schlüssel zusammen, wenn sie nicht weiter als 5km voneinander entfernt sind.
Du hast n Datensätze in Tabelle x und willst zu jedem dieser Datensatz die Datensätze, die nicht weiter als 5 Kilometer entfernt liegen? Wenn es das ist, dann, so denke ich, brauchst du einen Self-Join und den erklären dir dann die Datenbankexperten ...
echo "$verabschiedung $name";
echo $begrüßung;
Was ist denn die tatsächliche Anwendung?
geokoordinaten zusammenfassen, die nahe beieinanderliegen.
Also: Fasse alle daten unter einem (beliebigen) Schlüssel zusammen, wenn sie nicht weiter als 5km voneinander entfernt sind.Du hast n Datensätze in Tabelle x und willst zu jedem dieser Datensatz die Datensätze, die nicht weiter als 5 Kilometer entfernt liegen? Wenn es das ist, dann, so denke ich, brauchst du einen Self-Join und den erklären dir dann die Datenbankexperten ...
*lol* Naja, das ist ja immerhin schonmal ein Hinweis :)
zudem ist es nur FAST richtig, ich möchte nicht zu jedem alle 5km entfernten, sondern nur die die noch nicht einem anderen zugeordnet sind... aber das müßte sich dann ja mit einem geschickten GROUP BY realisieren lassen...
echo "$verabschiedung $name";
Danke soweit!
geokoordinaten zusammenfassen, die nahe beieinanderliegen.
Ach so, Umkreissuche habe ich schon gemacht. Du gehst von einen Ort aus:
z.B. Birkenau/Odw. nord = 49.5670; ost = 8.7170;
Wenn nun 5 km 0.05 Grad entsprechen (habe ich jetzt nicht im Kopf), dann kannst du alle Orte in einem Quadrat mit der Kantenlänge 10 km finden, in dem Birkenau mittig liegt:
$links = row['ost'] -0.05;
$rechts = row['ost'] +0.05;
$oben = row['nord'] +0.05;
$unten = row['nord'] -0.05;
SELECT * FROM orte WHERE nord <= $oben AND nord >= $unten AND ost <= $rechts AND ost >= $links
Bitte auf Denkfehler überprüfen, bin nach einem langen Arbeitstag nicht mehr taufrisch.
Ist es das, was du meinst?
Oder willst du eine Landkarte in Quadrate aufteilen und allen Orten eines Quadrates denselben Suchbegriff geben?
Kalle
geokoordinaten zusammenfassen, die nahe beieinanderliegen.
Ach so, Umkreissuche habe ich schon gemacht. Du gehst von einen Ort aus:
z.B. Birkenau/Odw. nord = 49.5670; ost = 8.7170;Wenn nun 5 km 0.05 Grad entsprechen (habe ich jetzt nicht im Kopf), dann kannst du alle Orte in einem Quadrat mit der Kantenlänge
0.083333 entsprechen ca. 1km :-)
10 km finden, in dem Birkenau mittig liegt:
$links = row['ost'] -0.05;
$rechts = row['ost'] +0.05;
$oben = row['nord'] +0.05;
$unten = row['nord'] -0.05;SELECT * FROM orte WHERE nord <= $oben AND nord >= $unten AND ost <= $rechts AND ost >= $links
das ist mir schon klar, nur habe ich in meinem Fall keinen Bezugspunkt, und möchte ALLE orte aus der Basis haben die eine gewisse nähe zueinander aufweisen...
Bitte auf Denkfehler überprüfen, bin nach einem langen Arbeitstag nicht mehr taufrisch.
Ist es das, was du meinst?
Oder willst du eine Landkarte in Quadrate aufteilen und allen Orten eines Quadrates denselben Suchbegriff geben?
Das ganze stellt sich wie folgt dar:
Ich "male" an bestimmten Koordinaten kreuzchen in eine Karte, und an stellen wo viele kreuze sind, findet man dann nur noch schwer durch und man kann schlecht navigieren, daher würde ich solche "Ballungspunkte" gerne zu einem großen zusammenfassen.
Ein Beispiel ist hier zu sehen.
Kalle
der Hilker
jetzt habe ich mir so viel Mühe gegeben und war doch am Thema vorbei.
Das ganze stellt sich wie folgt dar:
Ich "male" an bestimmten Koordinaten kreuzchen in eine Karte, und an stellen wo viele kreuze sind, findet man dann nur noch schwer durch und man kann schlecht navigieren, daher würde ich solche "Ballungspunkte" gerne zu einem großen zusammenfassen.
Ein Beispiel ist hier zu sehen.
ich sehe einige Kreise, die sich überlappen. Es soll also keine Überlappung geben? Vor einer Antwort muss ich erstmal dein Problem richtig verstehen.
Kalle
jetzt habe ich mir so viel Mühe gegeben und war doch am Thema vorbei.
Das ganze stellt sich wie folgt dar:
Ich "male" an bestimmten Koordinaten kreuzchen in eine Karte, und an stellen wo viele kreuze sind, findet man dann nur noch schwer durch und man kann schlecht navigieren, daher würde ich solche "Ballungspunkte" gerne zu einem großen zusammenfassen.Ein Beispiel ist hier zu sehen.
ich sehe einige Kreise, die sich überlappen. Es soll also keine Überlappung geben? Vor einer Antwort muss ich erstmal dein Problem richtig verstehen.
Genau, kreise die sich überlappen sollen zusammengefasst werden...
Kalle
Genau, kreise die sich überlappen sollen zusammengefasst werden...
Dann bekommst du folgendes Problem: Es könnten sich ja Kreise von München bis Flensburg überlappen (kenne die Anwendung nicht, um was geht es? Mobilfunkmasten?)
Dann willst du also in der Mitte dieser Strecke einen kleinen Kreis?
Genau, kreise die sich überlappen sollen zusammengefasst werden...
Dann bekommst du folgendes Problem: Es könnten sich ja Kreise von München bis Flensburg überlappen
das würde nichts ausmachen, dann kann man ja trotzdem stellenweise welche zusammenfassen und so ist wieder Luft... die kette reißt somit ab...
(kenne die Anwendung nicht, um was geht es? Mobilfunkmasten?)
einfach nur eine grafische Anzeige wo sich welcher user befindet. rechts im eingabefeld kann man sich halt eintragen....
Dann willst du also in der Mitte dieser Strecke einen kleinen Kreis?
ich möchte nur, dass man an den stellen wo "viel los" ist, besser navigieren kann... ob ich dafür nun kreise zusammenfasse oder es irgendwie anders löse ist mir eigentlich gleich...
Gruß, der Hilker
ich möchte nur, dass man an den stellen wo "viel los" ist, besser navigieren kann... ob ich dafür nun kreise zusammenfasse oder es irgendwie anders löse ist mir eigentlich gleich...
Dann lege doch in Gedanken Karopapier auf die Landkarte, jedes Karo hat einen eindeutigen Namen, so wie die Quadrate im Stadtplan. Es sind natürlich wesentlich mehr Quadrate als im Stadtplan.
Du teils die BRD auf z.B. in 200 Quadrate neben- und 600 untereinander. Dann ist das linksobere "000_000" und das rechtsuntere "199_599".
Jetzt kannst du JEDEN Ort bei der Eingabe einem der Quadrate zuordnen:
020_360, 020_360, 025_010, 050_438, ...
Beim Setzen der Kreise holst du jedes belegte Quadrat EINMAL aus der Datenbank und setzt einen Kreis auf die Landkarte.
Ist das die Lösung?
Du teils die BRD auf z.B. in 200 Quadrate neben- und 600 untereinander. Dann ist das linksobere "000_000" und das rechtsuntere "199_599".
Jetzt kannst du JEDEN Ort bei der Eingabe einem der Quadrate zuordnen:
020_360, 020_360, 025_010, 050_438, ...
Beim Setzen der Kreise holst du jedes belegte Quadrat EINMAL aus der Datenbank und setzt einen Kreis auf die Landkarte.Ist das die Lösung?
Mhh... müßte mir mal überlgen wie der Aufwand ist,
Ich hab mich grade mit dem o.G. self join befasst und in einer testtabelle mit nummern und buchstaben diese klausel angewand:
SELECT test.num, altertest.num
FROM test
JOIN test AS altertest ON test.num
BETWEEN altertest.num
AND altertest.num +2
GROUP BY test.val
sie bewirkt genau das, was ich möchte, NUR: was mache ich jetzt mit dem anderen JOIN, der sowieso schon in der bisherigen Abfrage ist?!
*grübel*
SELECT id, name, nachname, user.plz, user.ort, geodata.lg, geodata.bg
FROM user
JOIN geodata ON geodata.plz = user.plz
AND geodata.staat = user.country
GROUP BY user.id
ORDER BY geodata.lg, geodata.bg, plz ASC
Also, das bekomm ich beim besten Willen nicht portiert...
Naja - egal... ist wohl Zeit für's Bett :)
Gruß und Danke!
DerHilker
Moin!
Wenn nun 5 km 0.05 Grad entsprechen (habe ich jetzt nicht im Kopf), dann kannst du alle Orte in einem Quadrat mit der Kantenlänge
0.083333 entsprechen ca. 1km :-)
Diese Antworten sind beide falsch. :)
Es besteht ein Unterschied, ob man Breitengrad oder Längengrad vor sich hat.
Die Breitengrade sind äquidistant, die Längengrade laufen zu den Polen hin immer dichter zusammen und haben nur am Äquator den gleichen Abstand, wie die Breitengrade.
Es gilt: Eine Bogenminute auf dem Breitengrad entspricht genau einer Seemeile oder 1852 Metern, eine Bogenminute auf dem Längengrad ist um cos(Breitengrad) kürzer).
- Sven Rautenberg
Hello,
Es besteht ein Unterschied, ob man Breitengrad oder Längengrad vor sich hat.
Die Breitengrade sind äquidistant, die Längengrade laufen zu den Polen hin immer dichter zusammen und haben nur am Äquator den gleichen Abstand, wie die Breitengrade.
In Ermangelung eines Globus kann ich nicht einfach gucken gehen.
Kannst Du "äquidistant" nochmal genauer erläutern?
Ist der Abstand der Breitengrade auf einer idealisierten Kugeloberfläche gleich, oder sind die durch die Breitengread gebildeten Ebenen gleichweit voneinander entfernt?
Gibt es eigentlich ein absolutes XYZ-Geosystem, in dem jeder Punkt der Erde (Erdoberfläche) eine absolute Position hat?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Moin!
Die Breitengrade sind äquidistant, die Längengrade laufen zu den Polen hin immer dichter zusammen und haben nur am Äquator den gleichen Abstand, wie die Breitengrade.
In Ermangelung eines Globus kann ich nicht einfach gucken gehen.
Kannst Du "äquidistant" nochmal genauer erläutern?
"äquidistant" = Die Entfernung zwischen zwei Breitengraden auf der Kugeloberfläche ist überall auf der Welt gleich.
Gibt es eigentlich ein absolutes XYZ-Geosystem, in dem jeder Punkt der Erde (Erdoberfläche) eine absolute Position hat?
Das gibt es, und man benutzt es schon sehr lange: Kugelkoordinaten in Form von Längen- und Breitenangabe.
Drüber hinaus kann man auch jedes andere Koordinatensystem nehmen, z.B. Zylinderkoordinaten oder kartesische Koordinaten. Diese Systeme sind jeweils ineinander transformierbar - es ist aber schlau, sich jeweils ein der Problemstellung angemessenes Koordinatensystem zu wählen.
- Sven Rautenberg
Hello,
Das gibt es, und man benutzt es schon sehr lange: Kugelkoordinaten in Form von Längen- und Breitenangabe.
Kugelkoordinaten sind ja nicht real, sondern idealisiert.
Hier würde man mindestens drei Angaben benötigen...
Das suchte ich eigentlich, also wie Du schon sagtest, z.B. ein karthesisches System. Nur man müsste dann eben wissen, wo die Achsen festgelegt wurden. Ich konnte da bisher nichts finden.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hi,
Kugelkoordinaten sind ja nicht real, sondern idealisiert.
Hier würde man mindestens drei Angaben benötigen...
Das suchte ich eigentlich, also wie Du schon sagtest, z.B. ein karthesisches System. Nur man müsste dann eben wissen, wo die Achsen festgelegt wurden. Ich konnte da bisher nichts finden.
Das ganze is ne Wissenschaft für sich.
Die verschiedenen Angaben für Längen- und Breitengrad eines Punktes auf der Erdoberfläche beziehen sich auf versch. Ellipsoide, die zugrunde gelegt werden.
Stichwort: "Kartendatum"
Bei topografischen Karten in D wird üblicherweise das Potsdam-Datum verwendet.
Neuere GPS-Geräte sind meist auf WGS 84 voreingestellt.
Um einen Punkt auf der Erdoberfläche wiederzufinden, benötigst du also zusätzlich zur Angabe der Koordinaten auch noch das Kartendatum.
Als Koordinatensystem mit entsprechender Projektion ist in D Gauß-Krüger gebräuchlich. Geht streifenweise in 3°-Schritten, wobei die Position eines Punktes als Abstand zum entspr. Mittelmeridian/Äquator angegeben wird.
Da man eine Kugel nicht verzerrungsfrei auf eine ebene Fläche abbilden kann, gibts jede Menge versch. Projektionsverfahren:
z.B Kegel-, Zylinder-, Schnittkegel-, Schnittzylinder-, und... und... und...
Um sich eingehend zu informieren, empfehle ich http://www.ottmarlabonde.de/
Viel Spaß !
gruß
ptr
Hello Hilker,
find ich interessant, was Du da macht. Darüber würde ich gerne etwas mehr wissen.
Wie hast Du die Karte "eingemessen"?
Nur so eine Idee: Javascript ist ja nun sowieso notwendig für Deine Lösung. Wie wäre es, wenn Du, nachdem Du eine Lösung für die Datenbankfrage gefunden hast, bei höherer Dichte eine Ausschnittvergrößerung aufpoppen lässt?
Wie ist denn das Satzformat für die abgefragte Tabelle?
Soviel ich weiß, gibt es zur Geo-DB auch ein paar Tools für eine Umkreissuche im Netz. Ich habe sie aber eben leider nicht gefunden :-(
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
auf jeden Fall passt das schon mal zum Thema:
http://de.wikipedia.org/wiki/Häufungspunkt
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
http://de.wikipedia.org/wiki/Häufungspunkt
hat mich auf den Lösungsansatz gebracht:
"Definition: Sei a Element eines topologischen Raumes X und sei M eine Teilmenge von X. Man sagt a ist Häufungspunkt von M, wenn in jeder Umgebung von a ein Punkt von M liegt, der von a verschieden ist."
Erweitere Dein Tabellenformat um die Spalte "Umgebungs_Anzahl"
Bestimme die Größe der gewünschten Umgebung
Nimm die Koordinaten des Punktes und zähle in der DB alle Datensätze, die in dieser Umgebung liegen.
Select count() as ANZAHL
from TABELLE
where (X between $xs-$umgebung and $xs+$umgebung) and
(Y between $ys-$umgebung and $ys+$umbegung);
Das Ergebnis trägst Du dann für den Satz ein.
Die Rechnung musst Du für jeden Satz durchführen. Das ergibt dann die Charts
über Umgebungs_Anzahl. Da musst Du nur noch einen Schwellwert festlegen, ab welcher
Umgebungs_Anzahl Du zusammfasst.
Das ist jetzt bitte nur ein Rohentwurf.
Wahrscheinlich kann man bei neueren MySQL-Versionen (oder was war im Einsatz?) auch ein Update mit Subselect machen. Dann brauchst Du kein Script drum herum zu bauen ;-)
Würde mich freuen, wenn Du die Lösung hier später veröffentlichen würdest.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
http://de.wikipedia.org/wiki/Häufungspunkt
hat mich auf den Lösungsansatz gebracht:"Definition: Sei a Element eines topologischen Raumes X und sei M eine Teilmenge von X. Man sagt a ist Häufungspunkt von M, wenn in jeder Umgebung von a ein Punkt von M liegt, der von a verschieden ist."
Erweitere Dein Tabellenformat um die Spalte "Umgebungs_Anzahl"
Bestimme die Größe der gewünschten Umgebung
Nimm die Koordinaten des Punktes und zähle in der DB alle Datensätze, die in dieser Umgebung liegen.Select count() as ANZAHL
from TABELLE
where (X between $xs-$umgebung and $xs+$umgebung) and
(Y between $ys-$umgebung and $ys+$umbegung);
OK, sowas in der Art habe ich mir schon ausgedacht.
Ich habe versucht mittels SubQuery die Ergebnismasse nochmals zu JOINen, was allerdings fehl schlug. Das Query dazu sah dann wie folgt aus:
SELECT *
FROM (
SELECT id, name, nachname, user.plz, user.ort, geodata.lg, geodata.bg
FROM user
JOIN geodata ON geodata.plz = user.plz
AND geodata.staat = user.country
GROUP BY user.id
ORDER BY geodata.lg, geodata.bg, plz ASC
) AS temptable
JOIN temptable ###<--- an der Stelle terminiert es geodata.temptable not exists.
AS altertable ON (temptable.bg
BETWEEN altertable.bg
AND altertable.bg +2)
AND (temp_table.lg
BETWEEN altertable.lg
AND altertable.lg +2)
GROUP BY temp_table.id
und war /ist rattenlangsam
Das Ergebnis trägst Du dann für den Satz ein.
Die Rechnung musst Du für jeden Satz durchführen. Das ergibt dann die Charts
über Umgebungs_Anzahl. Da musst Du nur noch einen Schwellwert festlegen, ab welcher
Umgebungs_Anzahl Du zusammfasst.
meine nächste Idee ist jetzt ein VIEW zu machen, und auf den dann das 2. Join, da ich aber bisher nicht mit VIEWs gearbeitet habe, weiß ich nicht wie resistent die Daten sind, und was passiert wenn dann z.b. zwei anfragen zeitgleich/nah gemachtwerden. wird dann ein 2.VIEWtable angelegt, oder der "alte" überschrieben?
Das ist jetzt bitte nur ein Rohentwurf.
Wahrscheinlich kann man bei neueren MySQL-Versionen (oder was war im Einsatz?) auch ein Update mit Subselect machen. Dann brauchst Du kein Script drum herum zu bauen ;-)
ich benutze momentan die aktuelle MySQL version (vor ein paar Tagen erst das Update gemacht)
Würde mich freuen, wenn Du die Lösung hier später veröffentlichen würdest.
ja, und ich würde mich freuen wenn ich eine "vernünftige" und fixe Lösung finden könnte/ würde :)
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
Hello,
Würde mich freuen, wenn Du die Lösung hier später veröffentlichen würdest.
ja, und ich würde mich freuen wenn ich eine "vernünftige" und fixe Lösung finden könnte/ würde :)
Ich werfe jetzt einfach mal ein: Du willst zuviel auf einmal!
Probier es doch erst mal in kleinen Schritten aus.
Und diese Berechnung bei jedem Seitenaufruf in Time durchzuführen, wir mMn Dein DBMS zum Absturz führen...
Erster Schritt sollte sein, mal die DBMS-Version zu nennen. Dann kann man vielelicht mittels Handbuch und Testinstallationen sehen, was zum Ziel führt und was eher Killer-Eigenschaften für die DB hat.
Und dann solltest Du uns eine Tabelle (als Dump oder CSV) zum Download bereitstellen, damit wir nicht selber Testdaten eintippen müssen. Was hältst Du davon?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
Würde mich freuen, wenn Du die Lösung hier später veröffentlichen würdest.
ja, und ich würde mich freuen wenn ich eine "vernünftige" und fixe Lösung finden könnte/ würde :)Ich werfe jetzt einfach mal ein: Du willst zuviel auf einmal!
Probier es doch erst mal in kleinen Schritten aus.
Und diese Berechnung bei jedem Seitenaufruf in Time durchzuführen, wir mMn Dein DBMS zum Absturz führen...
OK, bei den paar daten im Moment hab ich noch keine angst :)
Warum das o.g. Query so langsam war, hab ich auch herausgefunden, hatte versehentlich die plz in eine "TEXT" spalte geschrieben.
Erster Schritt sollte sein, mal die DBMS-Version zu nennen. Dann kann man vielelicht mittels Handbuch und Testinstallationen sehen, was zum Ziel führt und was eher Killer-Eigenschaften für die DB hat.
Ich benutze MySQL 5.0.18-nt unter Win2000.
Und dann solltest Du uns eine Tabelle (als Dump oder CSV) zum Download bereitstellen, damit wir nicht selber Testdaten eintippen müssen. Was hältst Du davon?
Ein Datenbank-Dump habe ich nach http://hilker.no-ip.org/ghostbuster/daten/datadump.sql.zip kopiert.
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
der Hilker
Achso, nochwas:
ich hab in einer Testtabelle mal einfach folgendes gemacht:
SELECT test.val, altertest.x, altertest.y
FROM test
JOIN test AS altertest ON (test.x
BETWEEN altertest.x
AND altertest.x +2)
AND (test.y BETWEEN altertest.y AND altertest.y +2)
GROUP BY test.val;
URSPRUNGSTABELLE ERGEBNISMASSE
+-----+-----+-----+ +-----+-----+-----+
| x | y | val | | val | x | y |
+-----+-----+-----+ +-----+-----+-----+
| 0 | 130 | A | | A | 0 | 130 |
| 10 | 125 | B | | B | 10 | 125 |
| 20 | 120 | C | | C | 20 | 120 |
| 30 | 115 | D | | D | 30 | 115 |
| 40 | 110 | E | | E | 40 | 110 |
| 50 | 105 | F | | F | 50 | 105 |
| 60 | 100 | G | | G | 60 | 100 |
| 70 | 95 | H | | H | 70 | 95 |
| 80 | 90 | I | | I | 80 | 90 |
| 90 | 85 | J | | J | 90 | 85 |
| 100 | 80 | K | | K | 100 | 80 |
| 119 | 69 | L | | L | 119 | 69 |
| 120 | 70 | M | | M | 119 | 69 |
| 121 | 71 | N | | N | 119 | 69 |
| 122 | 90 | O | | O | 122 | 90 |
| 150 | 55 | P | | P | 150 | 55 |
| 160 | 50 | Q | | Q | 160 | 50 |
| 170 | 45 | R | | R | 170 | 45 |
| 180 | 40 | S | | S | 180 | 40 |
| 190 | 35 | T | | T | 190 | 35 |
| 200 | 30 | U | | U | 200 | 30 |
| 210 | 25 | V | | V | 210 | 25 |
| 220 | 20 | W | | W | 220 | 20 |
| 230 | 15 | X | | X | 230 | 15 |
| 240 | 10 | Y | | Y | 240 | 10 |
| 250 | 5 | Z | | Z | 250 | 5 |
+-----+-----+-----+ +-----+-----+-----+
guckst du bei den manipulierten einträgen L,M und N ist zu sehen, dass das Ganze fein zusammengefasst wird.
Gruß, der Hilker
Hello,
nur was nützt Dir das?
Nun hast Du immer noch drei Punkte, die jetzt allerdings auf eine Koordinate fallen.
Welchen der drei Orte willst Du denn dann anzeigen?
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
nur was nützt Dir das?
Nun hast Du immer noch drei Punkte, die jetzt allerdings auf eine Koordinate fallen.
Ganz genau - diese 3 Punkte werden somit auch an der selben koordinate "zusammengefasst" angezeigt....
Welchen der drei Orte willst Du denn dann anzeigen?
Das passiert dann in dem Hint der aufgeht, wenn man mit der Maus drüber fährt... genau wie bei orten die mehrere PLZen haben...
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
Hello,
Welchen der drei Orte willst Du denn dann anzeigen?
Das passiert dann in dem Hint der aufgeht, wenn man mit der Maus drüber fährt... genau wie bei orten die mehrere PLZen haben...
Ich meinte, wie Du das in der Abfrage realisieren willst.
Die drei müssen doch irgendwie konsolidiert werden.
Da wird doch ohnehin noch ein Zwischenschritt notwendig werden, oder?
Tom
Hello,
Welchen der drei Orte willst Du denn dann anzeigen?
Das passiert dann in dem Hint der aufgeht, wenn man mit der Maus drüber fährt... genau wie bei orten die mehrere PLZen haben...Ich meinte, wie Du das in der Abfrage realisieren willst.
Die drei müssen doch irgendwie konsolidiert werden.
Da wird doch ohnehin noch ein Zwischenschritt notwendig werden, oder?
Das tue ich ja im Moment auch schon, wenn wie gesagt mehrere menschen im selben ort unter anderer PLZ eingetragen sind, das übernimmt die Logik, die die HTML Seite erstellt wenn sie das result auswertet
Tom
der Hilker
Hello,
SELECT test.val, altertest.x, altertest.y
FROM test
JOIN test AS altertest ON (test.x
BETWEEN altertest.x
AND altertest.x +2)
AND (test.y BETWEEN altertest.y AND altertest.y +2)
GROUP BY test.val;
Diese Abfrage hilft Dir aber nur scheinbar.
Bau mal ein paar Orte _unsortiert_ dazwischen, die außerdem noch in anderen Quadranten liegen.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello,
SELECT test.val, altertest.x, altertest.y
FROM test
JOIN test AS altertest ON (test.x
BETWEEN altertest.x
AND altertest.x +2)
AND (test.y BETWEEN altertest.y AND altertest.y +2)
GROUP BY test.val;Diese Abfrage hilft Dir aber nur scheinbar.
Bau mal ein paar Orte _unsortiert_ dazwischen, die außerdem noch in anderen Quadranten liegen.
Für so etwas gibbets doch die ORDER BY Klausel
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
der Hilker
Hello,
Für so etwas gibbets doch die ORDER BY Klausel
Sortiert die auch zweidimensional mit Unschärfe? :-)
Dein Problem ist, dass Du erst die Häufungspunkte benötigst, und diesen dann die Orte im Radius zuordenen musst. Diese müssen aber dabei aus der Menge der verfügbaren Orte entfernt werden, damit sie im nächsten Schleifendurchlauf nicht aus Versehen selber als relatives Maximum angesehen werden.
Bei einer überschaubaren Menge von z.B. 1000 Orten würde ich das nicht mit der Datenbank machen.
Das Problem beschäftigt mich aber nun schon dn halben Samstag und es ist durchaus interessant, wie man das mit der DB lösen kann.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Hello Hilker,
Moin Tom!
find ich interessant, was Du da macht. Darüber würde ich gerne etwas mehr wissen.
Wie hast Du die Karte "eingemessen"?
Wie genau meinst Du das? Ich habe weiter unten im Forum schonmal einen Thread geöffnet, da haben die Forumuser Daten eingetragen und ggf. bemängelt, aufgrund der so ermittelten Daten habe ich den Algorythmus der für das "einmessen" zuständig ist, auf die karte angepasst.
Nur so eine Idee: Javascript ist ja nun sowieso notwendig für Deine Lösung. Wie wäre es, wenn Du, nachdem Du eine Lösung für die Datenbankfrage gefunden hast, bei höherer Dichte eine Ausschnittvergrößerung aufpoppen lässt?
Ja, die Idee hatte ich auch schon, ist nur auch nicht grade Rudimentär so eine Funktion!
Wie ist denn das Satzformat für die abgefragte Tabelle?
Es gibt 2 Tabellen die via JOIN eine Ergebnismasse liefern, das Query sieht wie folgt aus:
SELECT id, name, nachname, user.plz, user.ort, geodata.lg, geodata.bg
FROM user
JOIN geodata ON geodata.plz = user.plz
AND geodata.staat = user.country
GROUP BY user.id
ORDER BY geodata.lg, geodata.bg, plz ASC
Soviel ich weiß, gibt es zur Geo-DB auch ein paar Tools für eine Umkreissuche im Netz. Ich habe sie aber eben leider nicht gefunden :-(
Ja, das ging mir genauso :-/
Harzliche Grüße vom Berg
http://www.annerschbarrich.deTom
der Hilker
Hello,
vielleicht hilft Dir dieses Statement auch nochmal weiter:
select A.ORT, B.ORT, A.X, A.Y, B.X, B.Y, sqrt(pow((B.X-A.X),2)+pow((B.Y-A.Y),2)) as DIST
from test as A, test as B
where A.ORT <> B.ORT
and B.X between A.X-10 and A.X+10
and B.Y between A.Y-10 and A.Y+10
#and DIST < 10 # funktioniert bei MySQL 3.23.55 leider nicht. Hab keine andere
order by DIST;
Listet alle Ortspaarungen innerhalb einer Umgebung auf. (so ungefähr)
Gilt natürlich nur innerhalb einer kurzen Distanz, da keine sphärische Berechnung berücksichtigt wurde...
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom