php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
PLZ Geokoordinaten


 
andik2000
26-02-2002, 19:17 
 
Ich bin auf der Suche nach einer Datenbank, die alle Postleitzahlen mit Längen- und Breitengradangaben enthält. Das ganze dann irgendwie als CSV-Datei.

Die Post bietet eine für ca. 120,- EUR an, preislich ähnlich habe ich auch zwei andere Lieferanten gefunden.
Ich denke aber, dass man die auch irgendwoher umsonst bekommt.
Also, hat jemand einen Tip?

Als Gegenleistung biete ich zum einen die Formel zum Berechnen der Entfernung, zum anderen diese schon komplett im Code eingebunden, der dann aus einer beliebigen Datenbak (mit PLZ Angabe) alle Adressen rauszieht, die in einem Radius von $x Kilometern um eine eingegeben PLZ ($y) liegen.

Habe ich gestern gecoded, wollte mir doch tatsächlich einer für 1000 EUR verkaufen. *lol*
Nun, ich habe es selbst hinbekommen.

Grüße, der Andi

 
pekka
26-02-2002, 21:11 
 
Ich hab hier noch ein SQL-File mit Bankleitzahlen, PLZs und Ländercodes rumliegen, dass ich mir mal von PHP Resource runtergezogen hatte - ich weiss nur nicht mehr wie's hiess, bei Bedarf schreib einfach ne Mail. Es sieht stark so aus als wären Positionsangaben dabei, ich selber hatte mir vorher schon ne DB gekauft.

Darf man so neugierig sein und Fragen was Du damit vorhast? :-)

Wegen vieler Nachfragen: Ich habe das File leider nicht mehr!

 
andik2000
27-02-2002, 12:20 
 
Ich habe so eine private Community für meine Freunde und mich, wir ziehen oft abends rum und verkehren in Bars und Caffes in Frankfurt, Wiesbaden, Mainz, Darmstadt und die ganze Umgebung.
Jetzt haben wir uns überlegt unsere Erfahrung in eine Datenbank zu packen und die Locations zu bewerten nach Ambiente, Geschmack und Preis.
Wenn jetzt einer der Member sich einen schönen Abend mach will, gibt er einfach eine Stadt ein oder wie weit er überhaut Fahren will und bekommt dann die dementsprechenden Locations angezeigt.

Zwingend ist dieses Feature nicht aber es wäre schon ganz nett.

Dank & Gruß,
der Andi

 
TerraTux
10-08-2003, 01:59 
 
Hallo,

wenn auch ewig spät...ich hab ne Datenbank mit GeoKoordinaten, und brauch nun n Script oder n Beispiel mit dem ich ne Umkreissuche für ne Community entwerfen kann...

in der UserDatenbank stehen Postleitzahlen der Benutzer, nun soll in die bestehende Suche diese umkreissuche eingebaut werden...ergo nach Postleitzahlen. Hab aber hiervon kein Plan...weiß nicht wie man aus 51.3225 | 7.3192 und 51.5322 | 7.2519 ne entfernung errechnen kann...

Andi, wär klasse wenn Du mich da unterstützen könntest... :)


Gruß,
TT

 
pekka
10-08-2003, 03:05 
 
Also komm. Ich hatte ne fünf in Mathe und kann das aus dem Stegreif :)

- Nimm zwei Orte, von denen Du die exakte Luftlinienentfernung kennst. z.B. deine zwei Beispielorte. Gehen wir mal hypothetisch davon aus, dass die Entfernung zwischen beiden exakt 30 km beträgt.
51.3225 | 7.3192 und 51.5322 | 7.2519

- Berechne die Entfernung. Ich glaub das war Pythagoras:

$distx = 51.3225 - 51.5322;
$disty = 7.3192 - 7.2519;

$distxq = $distx * $distx;
$distyq = $disty * $disty;

$dist = sqrt($distxq + $distyq);

$dist ist dann 0.22023482921646

Also sind 0.22usw Einheiten im Koordinatensystem der PLZ-Datenbank 30 Kilometer. Dementsprechend sind 0.22usw Einheiten durch 30 = 0.007341160973882 = 1 Kilometer.

Damit hast Du jetzt eine Methode zur Entfernungsberechnung plus einen Umrechnungsfaktor vom DB-Koordinatensystem in Kilometer.


Wenn Du das ganze deutschlandweit brauchst, wird es halt recht heftig, weil Du für eine Umkreissuche alle DB-Einträge auf die Entfernung zu PLZ x checken müsstest. Eine Lösung dafür, die ganz gut funktioniert, kann ich hier aber leider nicht posten, weil sie von uns kommerziell vertrieben wird.

 
TerraTux
10-08-2003, 15:07 
 
Eine Lösung dafür, die ganz gut funktioniert, kann ich hier aber leider nicht posten, weil sie von uns kommerziell vertrieben wird.

:{ :{

Na klasse...und was wollt ihr dafür an Kohle haben??

Kann aber auch jeden User aus der DB fischen, dessen PLZ nehmen, und die Entfernung zu meiner PLZ messen...fällt er in den Umkreis kommt dessen UserID in ein Array welches zum schluss ausgegeben wird oder??

Kann mir nun gut vorstellen das dies recht Ressourcenfressend wird... :(

Gruß,
TT

 
andik2000
11-08-2003, 12:00 
 
Also ich habe das in meiner Branchensuche so gelöst:


// Erst mal alle PLZs der gewaehlten Branche selektieren
$xresult = mysql_query("SELECT id, plz FROM adress_table WHERE branche = '$branche' AND status = 0");

// Fuer jede PLZ der gefundenen Adresse die Entfernung zur eingegebenen PLZ berechnen
while (list($id, $plz) = mysql_fetch_array($xresult)) {

// Geodaten von eigener- und Fremd-PLZ auswaehlen
$result1 = mysql_query("SELECT * FROM plz_table WHERE plz = '$ownplz'");
$result2 = mysql_query("SELECT * FROM plz_table WHERE plz = '$plz'");
$current1 = mysql_fetch_array($result1);
$current2 = mysql_fetch_array($result2);
$p1x = $current1['x'];
$p1y = $current1['y'];
$p2x = $current2['x'];
$p2y = $current2['y'];

// Die magische Formel
$dx = ($p1x - $p2x) * 80; //geogr. Breite der ersten PLZ - Breite der zweiten PLZ
$dy = ($p1y - $p2y) * 110; //geogr. Länge der ersten PLZ - Länge der zweiten PLZ
$entf = sqrt(pow($dx, 2) + pow($dy, 2));

// Alle IDs, die innerhalb meines Suchradius ($radius) liegen in $data schreiben
if (round($entf,1) <= $radius) {
$data = $data.$id.",";
}
}

$data = substr($data,0,strlen($data)-1); // letztes Komma entfernen
if ($data == "") {$data = "0,0";}

//Zum Schluß alle Adressen der gefundenen PLZ selektieren
$final_result = mysql_query("SELECT * FROM adress_table WHERE id in ($data)");


Grüße,
Andi

 
TerraTux
11-08-2003, 22:48 
 
Hallo Andi,

hab da jetzt n Problem...reines verständigungsproblem...

Du schreibst was vom Satz des Pytagoras, welcher für mich nicht unbekannt ist...hab nun aber auf www.koordinaten.de ne weitaus umständlichere Formel gefunden, mit der ich auch auf Werte komme die mit den Werten von gängigen Entfernungsmessern übereinstimmen...

Hab da nun 2 Funktionen drauß geschrieben:


function get_coords($plz)
{
if ( (!empty($plz)) && (strlen($plz) == 5) )
{
$query = mysql_query("SELECT laenge, breite FROM site_geocoords WHERE plzs LIKE '%". $plz ."%'");
$result = mysql_fetch_array($query);
$coords[0] = $result['laenge'];
$coords[1] = $result['breite'];
return $coords;
}
}



function distance($start_plz, $end_plz)
{
$erd_radius = 6378.388;

$start = get_coords($start_plz);
$end = get_coords($end_plz);

$x_start = $start[0] / 180 * M_PI;
$y_start = $start[1] / 180 * M_PI;

$x_end = $end[0] / 180 * M_PI;
$y_end = $end[1] / 180 * M_PI;

$e = acos( sin($x_start) * sin($x_end) + cos($x_start) * cos($x_end) * cos($y_start - $y_end) );
return $e * $erd_radius;
}


wenn ich damit reinweg ne Entfernungsmessung mache (z.B. als Entfernungsanzeige im Profil des Besuchten, ausgehend vom Referenzprofil in dem Falle mein eigenes) funktioniert....

Wenn ich jetzt ne Umkreissuche starten will, muss ich mit diesen Funktionen die gesammte DB durchfahren, für jeden eintrag eine Entfernung errechnen lassen...

Hab da mal ne Script-Laufzeit-Messung gemacht, bei ca 1000 Usern dauerts ganze 33 Sekunden... :(

Soetwas wie deine Query im ersten Reply, wüßt ich echt nicht wie ich diese mit diesen Funktionen in Verbindung bringen sollte...

$query = mysql_query("SELECT * FROM users WHERE profile_plz = (function(bla) <= $umkreis) ORDER BY user_name ASC LIMIT $start, $end")

wird ja rein syntaktisch nicht funktionieren :(

Da ne Idee ??

Gruß,
TT

 
andik2000
12-08-2003, 01:34 
 
Ich hatte das bei mir nur mal mit ca. 30 Testeinträgen gemacht, das ging da noch innerhalb 0,3 sek.
Bestimmt kann man das auch kompakter realisieren, leider bin ich da noch nicht so der SQL-Profi. Poste doch meinen Code mal im PHP Developer-Forum und frag mal ob da jemand eine Idee für einen schnelleren Ablauf hat. Würde mich auch interessieren, kann ja sein, dass man da mal wieder irgendwann braucht.
Aber es ist tatsächlich so, dass Du natürlich erst alle Einträge auswerten mußt und dann nur diese selektierst, die dann in deinem Umkreis liegen. Da man aber von den Adressen jeweils nur die PLZ als Anhaltpunkt hat, muß man diese auf jeden fall erst anhand der Geodaten umrechnen.
Es kann sein, dass schon eine Berechnung innerhalb der SQL-Abfrage geschehen kann, vielleicht irgendwie mit LEFT.JOIN oder so was, da müßte aber mal ein SQL-Experte seine Meinung mal abgeben.

So long...
Andi

 
TobiaZ
12-08-2003, 01:40 
 
Im PHP-Forum hat das nichts zu suchen! Das ist natürlich ganz alleine eine Sache des SQL-Querys.

Ob man einen JOIN macht, oder direkt die Daten zur PLZ speichert, muss man mal überlegen. hat letztendlich den selben effekt!

 
TerraTux
12-08-2003, 01:40 
 
mhh...hab mir grad so überlegt...

vielleicht lass ich auf dem Server auch alle 24h n perlscript rödeln welches die rechnungen alle macht, für jeden user zu jedem user...mit userid's und entfernungen...dann brauch ich mir nur noch die entsprechenden einträge dort herrauszufischen...und das kann ich dann mit querverweisen machen...

SELECT u.*, d.* FROM users u, distances d WHERE u.user_id = d.user_id...bla bla

nur ob das bei 1000 usern...wären immerhin ne mill einträge so ratsam und performanter wär...keine ahnung :confused:


Gruß,
TT

 
Wurzel
12-08-2003, 01:53 
 
ich hab zwar keine lösung parat, aber einen anderen denkansatz:

- ihr habt eine plz
- die plz hat ein koordinaten-paar => 1. db-abfrage
- der x/y-abstand pro grad/minute in km ist bekannt (näherungswerte)
- der suchradius ist bekannt => vorgabe

ansatz:
man benötigt 4/6/12/... wertepaare:
(ungenau aber, aber selten liegen orte exakt auf einer kreisbahn):
&nbsp;&nbsp;&nbsp;&nbsp;a
&nbsp;&nbsp;&nbsp;&nbsp;|
d-plz-b
&nbsp;&nbsp;&nbsp;&nbsp;|
&nbsp;&nbsp;&nbsp;&nbsp;c

danach werden alle orte/plz abgefragt, deren koordinaten innerhalb der
werte liegen => 2. db-abfrage

wie gesagt, ist ein spontaner ansatz.

 
TerraTux
12-08-2003, 10:43 
 
Das heißt ich schränke mir den Suchradius anhand der Koordinaten ein, such mir zu den übriggebliebenen Koordinaten die Postleitzahlen, und lass mir dann alle User ausgeben welche eine dieser Postleitzahlen haben...

Wär ne Idee...dann muss ja jetzt nur noch ne umsetzung ran...das könnt ich dann ja aber mit den Formeln (Pytagoras) von weiter oben machen...denk ich....mal durchprobieren :)

Danke erstmal,

Gruß,
TT

 
Pkolb
05-09-2003, 12:31 
 
Hi Leutz,
zur Zeit beschäftige ich mich auch mit diesem Thema.
Also pekka, ich weiss genau welche Rechnung du benutzt, doch (ich will dich jetzt nicht angreifen) deine Erklärung zur Berechnung habe ich auch nicht verstanden!

@terratux: Wenn deine Koordinaten stimmen und ich mich auch nicht verrechnet habe dann müssten ca.2km Luftlinie zwischen den Städten sein.

Hat jemand von euch solch eine Tabelle, in der die alle PLZs etc. aufgelistet sind?

Ich habe schon einige Interessante Beispiele, Threads, Datenbanken und käuflich zu erwerbende Datensätze gefunden. Wenn diesbezüglich jemand interesse hat, kann ich ihm die jeweiligen Links geben.

 
pekka
05-09-2003, 12:58 
 
Also pekka, ich weiss genau welche Rechnung du benutzt, doch (ich will dich jetzt nicht angreifen) deine Erklärung zur Berechnung habe ich auch nicht verstanden!


Hmm? Rechnung? Berechnung? Bitte erklären ;)
Welchen Teil der Berechnung hast du nicht verstanden?

 
andik2000
05-09-2003, 12:59 
 
Hallo Leute,

also im Grunde wird hier versucht auf einer 10 km Strecke 1 km zu sparen, obwohl ihr im Überschall-Flugzeug sitzt. Es wird sowieso nicht mit einer Abfrage machbar sein.

Schaut euch noch mal meinen Beitrag von oben an.
Das ist echt das Einfachste und Genaueste, und SQL ist so verdamt schnell, dass es da auch keine großen Performance-Einbußen gibt, wenn es mal ein paar Einträge mehr sind.

Man kann ja die erste Abfrage schon einschränken, dass nur noch die relevanten Daten berücksichtigt werden. z.B. nur Einträge aus Hessen oder einer bestimmten Branche etc.
Dann habe ich anstatt 10.000 Einträge vielleicht nur 2000, die mit der PLZ DB abgeglichen werden müssen.

Selbes Systen wird übrigens von mir bei www.flirtsurf.de eingesetzt (will ich mal ein wenig Werbung machen ;-) ). Da sind dann auch mehrere hundert bis tausend Einträge in der nächsten Zeit zu erwarten. Da kann ich die Performance mal testen.
Die Seite ist noch hier und da am enstehen - offizieller Online-Gang ist am 12.9.
Würde mich freuen euch dort Willkommen zu heißen, grade am Anfang ist jeder User wichtig. Sorry wenns hier und da noch ein wenig "unschön" ist, hatte aber bisher nur zwei Wochen Zeit, da eine andere Agentur kurz vorher den "Löffel" abgegeben hat.


Eine PLZ-Datenbank mit Geodaten hatte ich vor drei Jahren mal für ca. 200,- DM erworben. Wenn jemand interesse hat, kann ich gerne mal den Verkäufer nennen.
Schickt mir einfach eine Mail.

Grüße,
Andi

 
Wurzel
05-09-2003, 13:22 
 
Original geschrieben von andik2000
Eine PLZ-Datenbank mit Geodaten hatte ich vor drei Jahren mal für ca. 200,- DM erworben. Wenn jemand interesse hat, kann ich gerne mal den Verkäufer nennen.
Schickt mir einfach eine Mail.
schade eigentlich, denn die db gibts hier (http://opengeodb.de/index.php) vor free mit einem link zu entsprechenden klasse für die abfragen ... einbinden und gut ist ;) (letztere hat mittlerweile auch den weg ins scriptarchiv gefunden)

@pkolb
eine plz/orte tabelle kursierte hier auch mal im forum, einfach mal die suche benutzen

 
andik2000
05-09-2003, 13:34 
 
Oh, echt dumm - und da sind noch nicht mal die Ortsnamen mit drin :-(

Ich hatte damals hier angefragt, nach kostenlosen DBs (ist doch nur eineinhalb Jahre her, mir kams länger vor), da wußte niemand Bescheid.

Aber cool, danke !!!

 
Pkolb
05-09-2003, 13:36 
 
@alle: Ich bin zwar nicht der Thread- Ersteller, möchte mich aber trotzdem bei euch allen bedanken. Das war jetzt in stundenlanger Suche der nützlichste Thread den ich gefunden habe.

@pekka: Das mit den 30km, die du von anfang an für die Rechnung benutzt; Das Ergebnis... - Aber ist im Endeffekt auch egal.

@wurzel: Mal eine Frage- Also die Seite, die du genannt hast, ist ziemlich nützlich. Aber wird hier die Luftlinie berechnet oder wird ein Straßennetz als Grundlage benutzt.
Meine Frage ist berechtigt, denn als ich meinen Wohnort eingegeben habe (Seligenstadt) wurde mir mit 3,9km Kahl am Main angezeigt. Das Problem ist, zwischen Sel. und Kahl liegt der Main und es gibt keinen direkten Weg nach Kahl, der anähernd 3,9km wäre. Ich brauche mit dem Auto eine halbe Stunde um dahin zukommen.

Ansonsten gefällt mir die Seite sehr gut.

@andik2000: Das mit der Seite gehört hier nicht hin; genau wie meine Frage: Was bietet mir denn deine Flirtseite, was mir andere nicht bieten? - Aber ist stelle sie trotzdem! ;)

 
Wurzel
05-09-2003, 13:52 
 
Original geschrieben von Pkolb
@wurzel: Mal eine Frage- Also die Seite, die du genannt hast, ist ziemlich nützlich. Aber wird hier die Luftlinie berechnet oder wird ein Straßennetz als Grundlage benutzt.
Meine Frage ist berechtigt, denn als ich meinen Wohnort eingegeben habe (Seligenstadt) wurde mir mit 3,9km Kahl am Main angezeigt. Das Problem ist, zwischen Sel. und Kahl liegt der Main und es gibt keinen direkten Weg nach Kahl, der anähernd 3,9km wäre. Ich brauche mit dem Auto eine halbe Stunde um dahin zukommen.

was kann die datenbank dafür, dass dein auto nicht fliegen kann :dontknow: :D

klar wird hier nur die luftlinie berechnet ... für alles andere würdest du noch eine datenbank mit topologischen daten benötigen. das wirst du afaik nicht als opensource im netz finden. da kannst du nur auf dienste wie maps&guide zurückgreifen.

 
Pkolb
05-09-2003, 14:31 
 
Gut, habe ich mir schon gedacht. Wäre auch zu viel des Guten.
Habe die Seite aber über Google usw. garnicht gefunden!

Hast du (@wurzel) die Daten von OpengeoDB.de schonmal benutzt?- Wenn ja, wie hast du sie verwendet? (Ich bin doch ein Newbie in PHP)

 
Wurzel
05-09-2003, 14:46 
 
ja, aber nur testweise und auf die schnelle, also die db aufspielen und
die mitgelieferten demos ausprobieren... mehr noch nicht.

lief von anfang an problemlos. das einzige "problematische" war das einspielen der datenbank ... das hab ich in mehreren stufen machen müssen ... 13.000 datensätze waren meiner testumgebung etwas viel :rolleyes:

 
andik2000
05-09-2003, 14:57 
 
@pkolb: Hast im Grunde recht, war ja auch nur als "Anschauungsbeispiel" gedacht.

Zu Deiner Frage: Es gibt viele Single-Seiten und viele Single-Parties in Discotheken. Die Seite verbindet beides, denn einmal im Monat finden FlirtSurf Partys statt, bei denen dann in den Discos bis zu 20 Computerterminals aufgebaut werden (keine blöden Zettelchen mehr schreiben). Durch zahlreiche Sponsoren wird es interessante Gewinnspiele geben, wie z.B. einen BMW Z4 für ein Wochenende, Kostenloser Eintritt in Diskotheken für 50 User pro Monat u.v.m.
Ich darf leider noch nicht alle Features verraten. Dieses Konzept läuft seit 5 Jahren erfolgreich in der Galerie in Frankfurt. Nun haben sich die Gründer entschlossen ein deutschlandweites Franchise System aufzubauen. Los gehts im Rodgau (bei Frakfurt) und wird sich nach und nach in Deutschlands Discotheken ausweiten. Sogar eine kontinuierlich erscheinende Sampler-CD zum Label ist in Produktion. Die Werbetromel ist am rühren: Lokale zeitschriften (z.B. Fritz!) berichten bereits, auch Radiospots sind in Planung.
Ich glaube das langt est mal als Info :-)
Wie gesagt würde ich mich sehr an eurer Teilname freuen, denn der Anfang ist immer schwer und jeder User ist für uns wichtig (damit die DB nicht so leer aussieht).
Auch Kritik und verbesserungsvorschläge sind gerne willkommen.


Es grüßt der Andi

 
TerraTux
06-09-2003, 05:50 
 
Sööö...alles schön und gut...

aber ich weiß leider immernoch nicht wie ich mit der opengeodb und der Formel von koordinaten.de ne umkreissuche realisiere :(

habe also eine Tabelle für die Userdaten...in der stehen UserID anderer Schnickschnack und die Postleitzahl des Users...
eine Tabelle mit den Geodaten...

wenn ich jetzt whileschleifen nehme...alle user auslesen, entfernung abchecken -> im Umkreis? Ja -> ab ins Array || Nein -> Drop, und zum Schluss alle user aus dem "JA-Array" auflisten...

Sorry...dauert bei ca. 1200 Usern auf ner 1,7GHz-Maschine ca 33 sekunden...das is zu lahm !!! (Dank MySQL 4 beim zweiten mal nur noch 24 sekunden) trotzdem...

hat jemand ne bessere idee??

Gruß,
TT

 
TobiaZ
06-09-2003, 12:48 
 
1) Steht doch alles im thread
2) sollst du die entfernung im query abfragen!

 
Pkolb
08-09-2003, 11:22 
 
TerraTux bist ja mittlerweile schon weiter als ich.
Habe da jetzt nämlich ein kleines Problem. In den Datensätze von "opengeodb" gibt es zu den Ortskoordinaten jeweils 8 bis 9 stellige Zahlen. Bei der Berechnung von Koordinaten.de gibt es jedoch nur 6 stellige.
Sind es bei "opengeodb" jeweils eine Zahl oder verschiedene Koordinaten (z.B. 50044540 oder 50° 04l 45m 40o)
Welche Rechnung muss ich denn nehmen?


Hab's mir selbst beantwortet. Für alle, die die selbe Frage haben:
Die Zahlen sind eins- bis zweistellige Zahlen vor-, und x-beliebige nach dem Komma! Der Link zur Formel: http://www.koordinaten.de/online/formel.shtml

 
TobiaZ
08-09-2003, 11:45 
 
ich meine im thread hat jemand was von der passenden klasse erzählt, oder?

 
Pkolb
08-09-2003, 13:02 
 
Hat jemand noch eine PHP-Source für eine "Filialenberechnung"?
Dabei soll der User seinen Wohnort eingeben und die Berechnung spuckt dann die naheste Zweigstelle (...Filiale, Vereinssitz o.ä.) aus. :D
Ein Beispiel hierzu: http://www.koordinaten.de/online/filialsuche.shtml

Ich wüsste nämlich nicht, wie die Rechnung dabei theoretisch aussehen müsste.

:confused:

 
Wurzel
08-09-2003, 13:09 
 
gewusst wo ;)

- du hast die db
- du hast die classes von hier http://www.multimediamotz.de/GeoClass/
- und hier gibbet ein beispiel für die umkreissuche http://opengeodb.de/software/example.phps

 
Pkolb
08-09-2003, 13:25 
 
Gewusst Wo! :D
...aber das Beispiel ist, wie du sagtest, für die "Umkreissuche". Was ich aber möchte, ist die "Filialsuche". Klar sind sich beide im Aufbau sehr ähnlich. Ich brauche aber eine Source zum Abrufen der nahesten Filiale; aufgelistet nach Entfernung (z.B. kürzeste bis fünftkürzeste Entfernung).
Eben wie auf http://www.koordinaten.de/online/filialsuche.shtml

Muss ich dazu die Entfernungen vom Wohnort zu allen Fillialen errechnen und die kürzeste herausziehen oder gibt es eine andere Möglichkeit!? :(

 
Wurzel
08-09-2003, 13:50 
 
in der example.phps findest du folgendes:
/**
* Suche nach Ortsnamen
*/
$search = 'wuppertal%'; // Ortsname (MySQL-Wildcards möglich)
$matches = $geodb->findGeoObject($search);
print_r($matches); // <= füg das mal ein damit ermittelst du die geodaten des eigenen standortes. das ganze steht in einem array. werden mehrere treffer gefunden, muss der standort halt genauer gewählt werden. das übergibst du per $_POST, gibt es nur einen treffer, kannst du die daten direkt weiterverarbeiten.

die adress-db für der händler erweiterst du nun um die geodaten für deren standort (abgleich geodb-tab mit händler-tab). jedesmal, wenn ein neuer eintrag kommt, holst du auch die geodaten dazu.

die 2. abfrage (umkreissuche) sucht nun in der händler-tabelle. die anweisungen/zuordnungen musst du in der geoclass.php anpassen. oder du machst dir ein umbenanntes duplikat der klasse und arbeitest mit dem. welche tabelle abgefragt wird, muss ja in der klasse definiert werden.

mehr sollte es nicht sein.

 
Pkolb
15-09-2003, 17:48 
 
Hi Leutz,
das Thema Geo-Datenbank ist bei mir leider immer noch nicht abgehakt. Jetzt habe ich auch noch die blöde Idee, die jeweiligen Vorwahlen mit einzubinden. Da diese bei der OpenGeo- Datenbank nicht dabei sind, wäre ein weitere Datenquelle nützlich. Kennt jemand eine? :D

Hat jemand von euch eine Ahnung, wo ich diese Daten auch für die Schweiz und Österreich herbekomme?

 
RGummi
24-09-2003, 22:47 
 
Hallo,

also was die Unkreissuche angeht kann ich euch helfen

"SELECT * FROM ".PLZ_DATA_TABLE." WHERE SQRT(POW(".$phi."-Phi,2)*6400 + POW(".$theta."-Theta,2)*12100) < 10";

wobei $phi der Längengrad und $theat der Breitengrad ist

spuckt alles aus was in 10 km Entfernung so zu finden ist !

R

 
TobiaZ
24-09-2003, 22:56 
 
sieht nicht schlecht aus!!!

 
RGummi
24-09-2003, 23:01 
 
Hallo,

ich kann noch einen draufsetzen!

"SELECT PLZ, Ort, SQRT(POW(".$phi."-Phi,2)*6400 + POW(".$theta."-Theta,2)*12100) AS Distance FROM ".PLZ_DATA_TABLE." WHERE SQRT(POW(".$phi."-Phi,2)*6400 + POW(".$theta."-Theta,2)*12100) < 10 ORDER BY Distance";

sortiert das Ganze noch so, dass die nächsten PLZ-Gebiete am Anfang kommen und die Distanz auch noch mit rauskommt.

R

 
TobiaZ
24-09-2003, 23:08 
 
hast du das ganze irgendwo on air, dass man mal testen kann?

 
RGummi
24-09-2003, 23:24 
 
Nee bin ja gerade dabei, aber es geht.

Und wenn Du meinst die Erde sei eine Kugel und keine Scheibe (die Deutsche Post nimmt das an)

dann sieht das so aus

$phi = deg2rad(11.5583); // zum Test
$theta = deg2rad(48.1627); // zum Test
$radius = 6367.46; // Mittelwert zwichen Äquator und Polradius
$umkreis = 25;

"SELECT PLZ, Ort, ".$radius."*SQRT(2*(1-cos(Theta)*cos(".$theta.")*(sin(Phi)*sin(".$phi.")+cos(Phi)*cos(".$phi."))-sin(Theta)*sin(".$theta."))) AS Distance FROM ".PLZ_DATA_TABLE." WHERE ".$radius."*SQRT(2*(1-cos(Theta)*cos(".$theta.")*(sin(Phi)*sin(".$phi.")+cos(Phi)*cos(".$phi."))-sin(Theta)*sin(".$theta."))) <= ".$umkreis." ORDER BY Distance";

wobei theta und phi in rad anzugeben sind !!! Auch in der Datenbank

deg2rad() leistet da gute Dienste beim konvertieren


Der arme SQL Parser :-)

 
RGummi
24-09-2003, 23:51 
 
Hallo,

ist jetzt was zum Testen da

Umkreissuche (http://www.srpm.net/test/plzsearch.htm)

eure PLZ eingeben und umkreis

R

:jo:

 
Pkolb
25-09-2003, 11:15 
 
Nicht schlecht. Ist das mit der OpenGeoDB gemacht oder wo hast du die Daten her?

Und warum wird der eingegebene Ort in der Ausgabe mitaufgelistet (mit einer Entfernung, was ja gar nicht sein dürfte :confused: )?

 
TobiaZ
25-09-2003, 14:36 
 
41068 Mönchengladbach 0.000095

naja, n bisschen schwund ist immer. die erde ist ja wie gesagt keine scheibe und dadurch werden vermutlich kleine differenzen auftreten.

 
RGummi
25-09-2003, 19:59 
 
Selbstkritik !!!!

Was ich da auf die Schnelle gemacht habe war ja ganz nett. Es werden auch die Punkte genau auf die Kugel projeziert aber die Distanz berücksichtigt immer noch keine Erdkrümmung!!!

Ich kümmere mich darum, aber für den Hausgebrauch ist es ok.

Natürlich kommt der eigen PLZ-Bereich zurück. Es werden ja alle mit einer Distanz kleiner 10 km gesucht! Und da gehört das eigen Viertel ja auch dazu. Abweichungen beruhen wohl auf Rundungsfehlern.

R

 
TobiaZ
25-09-2003, 20:14 
 
naja, den eigenen ort kann man ja ggf rausfiltern ( >0 oder != PLZ)

Aber die korrekte Entfernung wäre nicht schlecht.

 
JohnM
25-09-2003, 20:54 
 
Sorry, dass ich störe, aber man muss doch nur die PLZ aus der opengeodb holen und dann mit den zugehörigen Daten ein neues GeoObject erstellen, oder liege ich falsch?


<?php
require_once("./GeoClass.php");
$geodb = new GeoDB(DB_NAME, DB_USER, DB_PASS, 'geo_locations', 'ort', 'breite', 'laenge', 'plzs');

$radius = 20; // aus der Form lesen
$maxHits = 50; // aus der Form lesen

$myHome = new GeoObject('Königstein im Taunus', 50.18333, 8.46667);
// myhome mit einer PLZ-Query festlegen ( vorher aus der Form lesen )

$matches = $geodb->findCloseByGeoObjects($myHome, $radius, $maxHits);
if (count($matches)) {
echo 'Im Umkreis von <b>'.$radius.'</b> km um <b>'.$myHome->name.'</b> wurden folgende Orte gefunden:<br>';
echo '<ul>';
foreach ($matches as $object) {
echo '<li>'.$myHome->getDistanceString($object).' ';
echo '('. $myHome->getOrientation($object, GEO_ORIENTATION_SHORT).') ';
echo '- <b>'.$object->name.'</b></li>';
}
echo '</ul>';
}
?>


Probiert das mal. ;)

 
RGummi
25-09-2003, 21:23 
 
Hallo

Hab es jetzt korrigiert!

SELECT PLZ, Ort, ".$radius."*ACOS(cos(Theta)*cos(".$theta.")*(sin(Phi)*sin(".$phi.")+cos(Phi)*cos(".$phi."))+sin(Theta)*sin(".$theta.")) AS Distance FROM ".PLZ_DATA_TABLE." WHERE ".$radius."*ACOS(cos(Theta)*cos(".$theta.")*(sin(Phi)*sin(".$phi.")+cos(Phi)*cos(".$phi."))+sin(Theta)*sin(".$theta.")) <= ".$umkreis." ORDER BY Distance";

Zu sehen und zu Testen unter



Umkreissuche (http://www.srpm.net/test/plzsearch.htm)

1. Wenn man GeoClass.php hat ja. Aber es ging wohl um das Prinzip was dahinter steckt!

2. Ich spare mir halt das foreach und den Traffic von der Datenbank in das script. Frei nach dem Motto was die Datenbank kann (mit einem SQL Aufruf)soll sie auch tun (weil sie es viel schneller kann). Angeblich gibt es SQL Statements die über mehrere DIN A4 Seiten gehn !!!

3. War für mich auch neu als ich mit SQL angefangen hat, aber mir hat ein profi gesagt "man filtert nichts per Hand" wenn da ne leistungsfähige Datenbank werkelt", der zweite Kommentar war dann "Was machst Du bei 10 Millionen Datensätzen" ??? Nun ja die PLZ Datenbank hat nur gute 8000 Einträge.

R

:grin:

 
TobiaZ
25-09-2003, 21:35 
 
kann jetzt in der seite keine veränderung sehen :dontknow: ?

zu 1: hattest du erwähnt, auf welchen daten deine db basiert?

zu 2: so ist es auch vollkommen richtig

 
JohnM
25-09-2003, 21:37 
 
Deine Formel wird zwar immer größer und unverständlicher für mich, aber die Genauigkeit wird deshalb nicht besser.
2-3 km Schwankungen zu den tatsächlichen Werten.
Welche PLZ Datenbank hat 8000 Einträge?
Meine hat rund 13000 :confused: (OpenGeoDB)

Ich hab noch eine andere mit rund 41000 PLZs ohne Geodaten.

http://www.php-resource.de/forum/files/postleitzahl_db/plz_gem.zip

 
RGummi
25-09-2003, 22:28 
 
Ist die Datenbank von der Post für ~100 EUR und hat 8265 Eintäge

PLZ|ORT|LÄNGE|BREITE

R

 
Webbi
26-09-2003, 19:47 
 
Moin Moin

Da ich mich gerade damit ein wenig beschäftige und ich durch ein Link diesen Post gefunden habe, hätte ich da vielleicht eine Idee.

Folgende Idee:

Usereingabe: PLZ 45
Koordinaten zu der PLZ: 7.3192 und 51.5322
gewünschter Umkreis: 30 Km

Mit diesen Angaben kann man doch dann um die 45 einen "Kreis" errechnen.
OK, das werden dann viele Koordinaten, aber du musst nicht die Datenbank bei jedem Eintrag abfragen.
Diese können dann halt mit den Koordinaten von 45 überpürft werden (between) - werden zwar viele, aber vielleicht ist das ja schneller. :dontknow:

 
JohnM
27-09-2003, 00:00 
 
Ich nehme dann doch lieber eine 5 stellige PLZ um die Geodaten ( Länge, Breite ) eines Ortes zu benutzen.

Hast Du eine Ahnung, wieviele Orte mit 45 anfangen? :D

 
TobiaZ
27-09-2003, 11:25 
 
Hast Du eine Ahnung, wieviele Orte mit 45 anfangen? Mönchengladbach schon mal nicht! :D

 
geoclass
07-10-2003, 00:09 
 
Hallo zusammen,

möchte euch darauf hinweisen, dass OpenGeoDB und GeoClass jetzt in einer neuen Version bei SourceForge zu finden sind: http://sf.net/projects/geoclassphp/

Leider haben wir noch keine Beispiele für die neu Klasse fertig, aber wir versuchen sie so schnell wie möglich nachzureichen (dann wahrscheinlich unter http://www.multimediamotz.de/GeoClass/).

Neu ist unter anderem die Möglichkeit beliebige SQL-Datenbanken anzubinden und eine eigene Unterstützung für OpenGeoDB.

Außerdem lassen sich Karten auf Basis von ArcInfo (.e00) Dateien zeichnen.

Gruß
Stefan

 
TobiaZ
07-10-2003, 15:09 
 
Echt edel, was ihr anbietet!

 
Pkolb
20-10-2003, 17:23 
 
Hi Leutz,
heute mal ne ganz blöde Frage, aber ich komme einfach nicht drauf! :(



Was muss ich hier:

function getInfo() {
return $this->name." (".$this->latitude."/".$this->longitude.")";


...eingeben, damit ich nicht den Namen, Längen- und Breitengrad erhalte, sondern (oder zusätzlich) die PLZ???

 
TobiaZ
20-10-2003, 17:25 
 
$this->plz oder $this->zip???

 
geoclass
20-10-2003, 17:34 
 
Hallo PKolb,

das kommt darauf an, wo du deine Daten her hast.

Ich gehe davon aus, dass du die neueste Version (0.2.1b) der GeoClass einsetzt (sonst unter http://sf.net/projects/geoclassphp downloaden) und als Datenbestand OpenGeoDB nutzt (sonst ebenfalls oben herunterladen).

$this->dbValues[plz];

Dabei ist zu beachten, dass bisher alle PLZs eines Ortes als durch Kommas getrennter String hinterlegt sind.

Gruß
Stefan

 
Pkolb
20-10-2003, 17:53 
 
Richtig, die Daten habe ich von OpenGeoDB, sorry das ich das oben vergessen habe zu erwähnen.


Somit benutze ich auch die GeoClass.php.
In dieser steht:


function getInfo() {
return $this->name." (".$this->latitude."/".$this->longitude.")";


...was mir den Namen des Ortes und die Längen- Breitengrade zurückgibt.



Aufgerufen wird das ganze durch:

/**
* Umkreissuche
*/
$radius = 100; // maximale Entfernung in Kilometern
$maxHits = 2000; // maximale Anzahl der Treffer
$myHome = new GeoObject('Frankfurt mit der PLZ 60598', 50.11667, 8.68333);
$matches = $geodb->findCloseByGeoObjects($myHome, $radius, $maxHits);
if (count($matches)) {
echo 'Im Umkreis von <b>'.$radius.'</b> km um <b>'.$myHome->name.'</b> wurden folgende Orte gefunden:<br>';
echo '<ul>';
foreach ($matches as $object) {
echo '<li>'.$myHome->getDistanceString($object).' ';
echo '('. $myHome->getOrientation($object, GEO_ORIENTATION_SHORT).') ';
echo '- <b>'.$object->getinfo().'</b></li>';
}
echo '</ul>';

Nun möchte ich, wie gesagt, noch zusätzlich die jeweilige PLZ mit ausgeben.
Mit den Vorschlägen von TobiaZ und geoclass funktioniert das ganze leider nicht. (Danke an euch beide!)

Sonst noch jemand eine Idee, wie ich das nun hinbekomme?

 
TobiaZ
20-10-2003, 18:00 
 
wie sieht es denn mit dem Vorschlag von geoClass aus?

 
geoclass
20-10-2003, 18:06 
 
In $geodb ist ja wahrscheinlich deine Klasse gespeichert, die auf die OpenGeoDB zugreift. In deinen $matches sind Geo_Object-Klassen, die neben den Variablen $object->latitude usw. noch ein Array $object->dbValues enthält, in denen alle Felder aus der Datenbank gespeichert sind.

echo '- <b>'.$object->getinfo().', '.$object->dbValues['plz'].'</b></li>';

sollte zum Ergebnis führen. Es sei denn wir haben einen großen Bug drin ;-)

Sonst mach als Test mal folgendes:

print "<pre>";
rprint($object->dbValues);
print "</pre>";

Es würde mich sehr interessieren, was daraus geworden ist, also antworte bitte ruhig noch mal. Sonst auch gerne unter geoclass [at] multimediamotz [dot] de

Gruß
Stefan

 
Pkolb
21-10-2003, 13:26 
 
Also, dank geoclass's Hilfe konnte ich nun meine gewünschte Ausgabe erzielen.

Das Problem war, dass die GeoClass.php nie die PLZ zurückgibt. Also muss eine neue Funktion geschrieben werden bzw. die getinfo()- Funktion geändert werden, wovon geoclass jedoch abrät, da es mit Updates von der GeoClass.php Probleme geben kann.

Ich habe es nun so gelöst:

In meiner GeoClass.php habe ich eine neue Funktion erstellt (getPLZ):


/** Returns the PLZ.
*/
function getPLZ() {
return "<b>".$this->name. " </b> und die dazugehörige PLZ(s): <b>" .$this->databaseValues[plzs]. "</b>";
}


...und in meine inex.php die Abfrage geschrieben:


/**
* Umkreissuche
*/
$radius = 20; // maximale Entfernung in Kilometern
$maxHits = 5; // maximale Anzahl der Treffer
$myHome = new GeoObject('Frankfurt mit der PLZ 60598', 50.11667, 8.68333);
$matches = $geodb->findCloseByGeoObjects($myHome, $radius, $maxHits);
if (count($matches)) {
echo 'Im Umkreis von <b>'.$radius.'</b> km um <b>'.$myHome->name.'</b> wurden folgende Orte gefunden:<br>';
echo '<ul>';
foreach ($matches as $object) {
echo '<li>'.$myHome->getDistanceString($object).' ';
echo '('. $myHome->getOrientation($object, GEO_ORIENTATION_SHORT).')';
echo '- '.$object->getplz().'</li>';


Die Ausgabe lautet nun:


6.23 km (O)- Offenbach und die dazugehörige PLZ(s): 63065,63067,63069,63071,63073,63075


...und da freut sich der kleine Pkolb :huep:

Danke nochmal an euch alle, für euere Hilfe.

Bis dann

Pkolb

 
TobiaZ
21-10-2003, 13:46 
 
Also muss eine neue Funktion geschrieben werden bzw. die getinfo()- Funktion geändert werden, wovon geoclass jedoch abrät, da es mit Updates von der GeoClass.php Probleme geben kann. Ich sach nur Class extends...

 
paule78
17-11-2003, 22:30 
 
Hallo zusammen, erstmal großes Lob für diesen Informativen Thread, hat mir super weitergeholfen.

Ich baue gerade eine Umkreissuche für eine gegeben PLZ.
RGummi hat ja schon eine seite gebastelt mit der das wunderbar geht


siehe RGummi:
Hallo,
ist jetzt was zum Testen da
Umkreissuche
eure PLZ eingeben und umkreis

So, nur leider hab ich es nicht geschaft die beiden selects zu vereinen, ich hole mir also mit dem ersten select anhand der plz die längen und breitenangaben, gebe die dann an php und hole mir damit dann mit dem zweiten select die plz's im umkreis von x km.

Kann man diese beiden select nicht zu einem vereinen (subselects oder joins oder sowas) um das ganze etwas perfomanter zu gestalten. Durch das zurückliefern des querrys an php, dann das durchlaufen (auch wenns nur ein eintrag ist) und dann der erneute querry wird man wohl nicht gerade zeit gutmachen im vergleich zu einem einzelnen, kombinierten select, oder?

hier nochmal direkt die beiden selects (etwas vereinfacht):

SELECT Phi,Theta FROM PLZ_Daten WHERE PLZ='<irgendeine plz>';

SELECT PLZ, Ort FROM PLZ_Daten WHERE 6367.46*ACOS(cos(Theta)*cos(0.862091)*(sin(Phi)*sin(0.154011)+cos(Phi)*cos(0.154011))+sin(Theta)*sin (0.862091)) <= 10


gruss,
paul

 
cEEkAy
27-11-2003, 13:48 
 
Hi Leute, hab das ganze Thema mit Interesse verfolgt, steig aber noch nicht so ganz dahinter.

Hat von euch vielleicht jemand ein fertiges script und eine kleine datenbank damit ich das ganze mal selber testen kann ???

Ich möchte erstmal versuchen eine einfache Umkreissuche nach Postleitzahlen hinzubekommen, und später erst vielleicht dieses ganze fortgeschrittenenzeugs mit entfernung und koordinaten hinzufügen...

Freu mich über Tips und Tricks

Grüße cEEkAY

 
andik2000
27-11-2003, 14:48 
 
Nun, um eine "einfache" Umkreissuche zu realisieren, mußt Du dich zwangsläufig mit den koordinaten auseinandersetzen.
Der Einfachste Fall ist eine Datenbank mit allen Postleitzahlen und den dazugehörigen Geokoordinaten.
Um die Entfernung zwischen zwei PLZs zu berechnen brauchst Du pro PLZ die geografische Längen- und Breitenangabe.
Natürlich sind diese nicht auf den Meter genau, da immer der Mittelpunkt eines PLZ-Gebietes als Berechnung der Geokoorinaten dient. Bei einem Dorf, was evtl. nur eine PLZ hat, wird also der Ortskern gespeichert, obwohl das ganze Dorf vielleicht einen Durchmesser von mehreren Kilometern hat. Das nur mal als Info nebenbei.

Alle nötigen Formeln und Scripts (auch die zum "einfachen" Berechnen) findest Du eigentlich hier.

Schau mal am Anfang, da habe ich ein Script gepostet. Damit habe ich es auch gelernt.

Grüße, Andi

 
stanFRA
02-12-2003, 18:32 
 
Hi Ihr Alle,

also ich bin jetzt seit 2 Tagen mit nem ähnlichen Problem wie einige andere auch im web unterwegs...

Ich benötige alle ca. 8300 PLZ in Deutschland und die dazugehörigen Geokoordinaten (im Mittelpunkt), kommaseparierte Textdatei ist vollkommend ausreichend.

Irgendwie führen alle hier genanten Links nicht so wirklich zum Erfolg....

Weiss einer eventl. weiter - ausser das Ding bei der Post zu kaufen...

THX Stan

 
andik2000
02-12-2003, 18:37 
 
Völlig kostenlos!

http://opengeodb.de/download/
Wurde hier bereits gepostet!

Grüße
Andi

 
stanFRA
02-12-2003, 18:42 
 
danke für den tip, hab das teil gestern gesaugt aber war nicht ganz zufrieden...da sind doch nur die koordinaten der einzelnen städte hinterlegt, nicht aber die mittelkoordinaten JEDER postleitzahl....oder bin ich jetzt blöd oder was ?

 
andik2000
02-12-2003, 18:52 
 
Also darin ist alles anthalten : PLZ, Geodaten, Stadtname, Bundesland, Landkreis, KFZ-Kennzeichen, Gemeindeschlüssel etc.

Jenachdem was Du brauchst kannst Du den Rest rausschmeißen. Letztendlich bis auf PLZ und Geodaten, falls Du nur diese zur Berechnung brauchst.
Einige hier arbeiten ja schon fleißig damit, die Scripts beziehen sich teilweise auch direkt auf diese DB, darum sollte es mittlerweile aufgefallen sein, wenn nicht alle PLZs erfasst worden seien.
Ich arbeite noch mit einer gekauften DB, die ca. 8250 Einträge hat. Die Open Geo DB ist ca. genau so lang, sogar länger. Darum glaube ich schon, dass akke PLZ erfasst sind.

Grüße

 
Primusio
14-12-2003, 18:17 
 
Hallöchen,
habe gerade mit gierigen Augen jeden Beitrag verschlungen :)

Habe darauf hin ein Test Script geschrieben, was aber nicht so funzt wie es soll und zwar auf Basis von opengeodb.



$phi = deg2rad(12.25);
$theta = deg2rad(51.8333);
$radius = 6367.46;

$result = mysql_query("SELECT plz, ort, ".$radius."*ACOS(cos(breite)*cos(".$theta.")*(sin(laenge)*sin(".$phi.")+cos(laenge)*cos(".$phi."))+sin(breite)*sin(".$theta.")) AS Distance
FROM geodb_locations
WHERE ".$radius."*ACOS(cos(breite)*cos(".$theta.")*(sin(laenge)*sin(".$phi.")+cos(laenge)*cos(".$phi."))+sin(breite)*sin(".$theta.")) <= 1000 ORDER BY Distance");

while($ort = mysql_fetch_array($result)) {
echo $ort['plz']." ".$ort['Distance']."<br>";
}


Die Homekoordinaten sind von meiner Heimatstadt und bei der WHERE Klausel habe ich "<= 1000" genommen, um überhaupt Werte zu bekommen.

Die erste Distanz ist "113.640198" und soweit liegt unsere Stadt auch nicht vom Schuss ab. Kann mir jemand sagen, wo mein Fehler liegt ? probiere hier schon seit 3 Stunden herum.

Würde mich über schnelle Hilfe wirklich freuen.

MfG
Primusio

 
Pkolb
15-12-2003, 12:10 
 
Hallo Leutz,
so, jetzt schalte ich mich nach einer langen Pause auch wieder in diese Gesprächsrunde.

Nach einigen Tests mit der Open- Geodatenbank bin ich der Meinung, es wären (fast) alle PLZs enthalten.
Das Problem mit diesen Datensätzen ist jedoch, dass z.B. gesamt Frankfurt zwar viele PLZs aber nur eine einzigste Koordinate hat, was den Leistungsumfang der Datenbank erheblich beeinträchtigt.
Das bedeutet nämlich, dass wenn ich in Frankfurt z.B. eine Filiale suche und wohne selbst in Frankfurt, wird mir die Filiale mit 0km Entfernung angegeben. Dabei kann aber sein, das die Filiale in Wirklichkeit mehrere Kilometer weit weg liegt!
Also ist die Datenbank in solchen Fällen total funktionslos. :(

 
Chriss
31-12-2003, 03:56 
 
Original geschrieben von RGummi
$phi = deg2rad(11.5583); // zum Test
$theta = deg2rad(48.1627); // zum Test
$radius = 6367.46; // Mittelwert zwichen Äquator und Polradius
$umkreis = 25;

"SELECT PLZ, Ort, ".$radius."*SQRT(2*(1-cos(Theta)*cos(".$theta.")*
(sin(Phi)*sin(".$phi.")+cos(Phi)*cos(".$phi."))-sin(Theta)*sin(".$theta.")))
AS Distance FROM ".PLZ_DATA_TABLE." WHERE ".$radius."*SQRT(2*(1-
cos(Theta)*cos(".$theta.")*(sin(Phi)*sin(".$phi.")+cos(Phi)*cos(".$phi."))-
sin(Theta)*sin(".$theta."))) <= ".$umkreis." ORDER BY Distance";

wobei theta und phi in rad anzugeben sind !!! Auch in der Datenbank

deg2rad() leistet da gute Dienste beim konvertieren


Da ich die Tabelle geo_locations von opengeo verwende, und hier die Koordinaten in Grad (nicht Rad) vorliegen, müsste ich diese also in Rad umrechnen, um Deine Abfrage nutzen zu können.

Die Funktion Rad in Grad habe ich gefunden GRAD(), aber wie lautet die Funktion für Grad in Rad in MySQL?

@all: Hat schon jemand den Ansatz von @RGummi auf opengeo übertragen? Falls ja, könnte er ja mal seine Abfrage hier posten.

Auch ich finde diesen Thread äußerst interessant und danke allen Beteiligten für die interessanten Hinweise.

Gruß,
Chriss

 
TobiaZ
31-12-2003, 12:44 
 
Blick ins Manual hilft (http://www.mysql.com/doc/en/Mathematical_functions.html)

 
Chriss
31-12-2003, 14:18 
 
Original geschrieben von TobiaZ
Blick ins Manual hilft (http://www.mysql.com/doc/en/Mathematical_functions.html)

Danke! Im deutschen Manual (http://www.little-idiot.de/mysql/) habe ich es leider nicht gefunden und eine ordentliche Suche gibt es dort leider nicht.

Gruß,
Chriss

 
TobiaZ
31-12-2003, 14:21 
 
dann solltest du dir das OFFIZIELLE mal vornehmen: http://www.mysql.com/doc/de/Mathematical_functions.html (auch in Deutsch)

 
Chriss
31-12-2003, 15:30 
 
Original geschrieben von TobiaZ
dann solltest du dir das OFFIZIELLE mal vornehmen: http://www.mysql.com/doc/de/Mathematical_functions.html (auch in Deutsch)

Ja, da habe ich nun reingeschaut. Vielen Dank.
Chriss

 
Chriss
31-12-2003, 18:02 
 
Den Ansatz von @RGummi habe ich nun auf die Tabelle geo_locations vom
Projekt opengeo übertragen:


SELECT ort, plzs, ".$radius."*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*
(sin(RADIANS(laenge))*sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-
sin(RADIANS(breite))*sin(".$breite."))) AS Distance FROM geo_locations
WHERE ".$radius."*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*
sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-sin(RADIANS(breite))*
sin(".$breite."))) <= ".$umkreis." ORDER BY Distance"


Anschließend habe ich eine Verknüpfung zu einer "Mitglieds"-Tabelle, eine Tabelle mit Namen und u. a. PLZ, erstellt, so dass ich diese Tabelle nun sortiert nach PLZ/Entfernung ausgeben kann. Zur Zeit nutze ich einen Umkreis von max. 50 km. Dann dauert die Abfrage ca. 4 Sekunden. Gibt es vielleicht noch Möglichkeiten, die Performance zu verbessern, so dass man den Umkreis noch weiter vergrößern kann?

Bringt ein Update auf MySQL 4.x ggf. einen entscheidenden Vorteil?

Gruß
Chriss
PS: Beirtrag bearbeitet, da sich anfängliche Frage erledigt hat.

 
bingo
12-01-2004, 17:22 
 
hallo,

ersteinmal vielen dank an alle, die ihre nützlichen tipps preisgegeben haben.

ich habe jedoch ein weiteres problem.
und zwar bräuchte ich eine der OpenGeoDB ähnliche Datenbank, in der jedoch am besten weltweit alle länder, zumindest aber komplett west-europa erfasst ist.
hat jemand einen tipp für mich wo ich so etwas (auch kommerziell) finde?

vielen dank einstweilen

grüße
bingo

 
Wurzel
12-01-2004, 19:04 
 
folge dem link aus dem thread:
http://www.php-resource.de/forum/showthread.php?s=&threadid=31584

sollte ne db dabei rausspringen, darfst du die mir gerne per mail zukommen lassen :)

 
iilt
28-03-2004, 21:59 
 
Hallo..............

ich bin am verzweifeln, wie und wo muß ich diese Geoclass den installieren damit die läuft,

Martin

 
TobiaZ
28-03-2004, 22:10 
 
brauchst die nur auf deinem webspace upzuloaden.

btw: paar grundlagen mit classen wären nicht schlecht.

 
iilt
28-03-2004, 22:22 
 
Ist duntergeladen localen Apache verzeichnis hinterlegt, aber dat funzt nicht installiet ist Mysql, Apache2.0 und php4,

HILFE!!!!!!!!!!!!!!!

 
TobiaZ
28-03-2004, 22:36 
 
definiere "es funzt" nicht!

damit kann hier keiner was anfangen!

 
iilt
28-03-2004, 22:46 
 
So erstmal sorry fürs crossposting,

So nun zu meinem Problem

ich hab die Geodb runtergeladen und in meine MysqlDatenbank integriert, so weit läuft die auch, dann hab ich class datei heruntergeladen und ins Apache htdocs Verzeichnis gelegt, wenn ich nun mit der Beispieldatenbank auf diese zugreifen will, komen ganz viel Meldung das er den Pfad nicht findet, bin echt noch Anfänger.
SORRY

Martin

 
TobiaZ
28-03-2004, 22:52 
 
wenn ich nun mit der Beispieldatenbank auf diese zugreifen will, du willst mit der datenbank auf die class zugreifen. das macht man andersrum! :D

komen ganz viel Meldung das er den Pfad nicht findet, wäre nicht schlecht zu wissen, welche diese sind. Korrigier mal den Pfad.

bin echt noch Anfänger.deswegen der Hinweis auf die Grundlagen (evtl auch über Klassen hinaus.)

SORRY Du hast mir nichts getan :D

 
iilt
28-03-2004, 23:45 
 
Ich erhalte folgende Fehlermedlungen:

Notice: Use of undefined constant DSN - assumed 'DSN' in C:\Programme\Apache Group\Apache2\htdocs\opengeodb.php on line 28

Notice: Use of undefined constant PATH_DATA - assumed 'PATH_DATA' in C:\Programme\Apache Group\Apache2\htdocs\opengeodb.php on line 35

Warning: main(Geo/Geo.php): failed to open stream: No such file or directory in C:\Programme\Apache Group\Apache2\htdocs\opengeodb.php on line 45

Fatal error: main(): Failed opening required 'Geo/Geo.php' (include_path='.;c:\php4\pear') in C:\Programme\Apache Group\Apache2\htdocs\opengeodb.php on line 45

Martin

 
TobiaZ
29-03-2004, 15:55 
 
einfach mal übersetzen ;)

 
iilt
30-03-2004, 12:52 
 
Das "DSN" und "PATH_DATA" nicht difinierte Variabeln sind hab ich auch gesehen die Frage ist Warum?

laut PEAR::DB kann DSN mit

MYSQL://USER@HOST

initalisiert werden aber dat macht er nicht

Wie kann ich ermitteln ob PEAR::DB eingebunden ist?

Martin

 
iilt
07-04-2004, 12:14 
 
mit folgendem Code funktoniert die Abfrage:

// Abfrage der Längen und Breiten Koordinaten wobei $plz aus Formular stammt

$Laenge_breite=mysql_query("SELECT laenge, breite FROM geodb_locations WHERE plz=$plz");
$Laenge_breitearray=mysql_fetch_array($Laenge_breite);

// Übergabe der Daten an die Variabelen

$laenge=$Laenge_breitearray[0] / 180 * M_PI; // Umrechnung von GRAD IN RAD
$breite=$Laenge_breitearray[1]/ 180 * M_PI; // Umrechnung von GRAD IN RAD

$umkreis=$umk; // Übername aus Formular
$Abfrage1=mysql_query("SELECT ort, plz,(6367.41*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*
(sin(RADIANS(laenge))*sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-
sin(RADIANS(breite))*sin(".$breite.")))) AS Distance FROM geodb_locations
WHERE 6367.41*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*
sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-sin(RADIANS(breite))*
sin(".$breite."))) <= ".$umkreis." ORDER BY Distance");

// Ausgabe

$Ergebnis2=mysql_fetch_array($Abfrage1);
$Ergebnis3=mysql_num_rows($Abfrage1);
echo "<table border=1><tr>";
echo "Anzahl: $Ergebnis3";

for ($i=0;$i<$Ergebnis3;$i++)
{
while ($Ergebnis2=mysql_fetch_array($Abfrage1,MYSQL_ASSOC))

{

echo "<tr><td>";
echo implode("<td>",$Ergebnis2);
echo "</tr>";
}

 
Wumpso
14-04-2004, 16:08 
 
Hallo iilt,

Original geschrieben von iilt
Ist duntergeladen localen Apache verzeichnis hinterlegt, aber dat funzt nicht installiet ist Mysql, Apache2.0 und php4,

HILFE!!!!!!!!!!!!!!!
:confused:

bist Du tatsächlich noch der gleiche?
Deine Abfrage, die Du gepostest hast is ja Klassse, genau das was ich suche, weil mir ehrlich gesagt das mit der GeoClass bzw. Geo.php zu heftig ist und ich am besten eine Abfrage brauche, wo die Entfernung zweier PLZs nur ein von mehreren Kriterien ist.

Voll gut!

Ansonsten vielen Dank für die Arbeit aller hier im Forum!:rocks:

Wumpso

 
zissakos
08-06-2004, 02:39 
 
Hallo Leute,

verfolge diese Diskussion seit langem, und da ich auch so ein Feature auf meiner Seite haben wollte, aber nicht so kompliziert wie mit GeoClass, habe ich eine kleine Funktionssammlung "plz.php" geschrieben, die kinderleicht mittels require() von überall eingebunden werden kann und die wichtigsten Befehle bereitstellt:


// liefert alle Postleitzahlen zu einem Ort in einem array zurueck
// Parameter: String $ort
// Returns: array
function plzGetPLZ($ort)


// liefert alle Ortsnamen zu einer PLZ in einem array zurueck (z.B. auch Ortsname:Stadtteilname)
// Parameter: Int $plz
// Returns: array
function plzGetOrt($plz)


// liefert die Distanz zwischen zwei PLZ in km zurueck.
// Vorsicht: Es ist die Luftlinie gemeint, nicht die Strassenentfernung!
// Parameter: Int $plz1, Int $plz2
// Returns: float
function plzGetDistanceBetween($plz1, $plz2)


// liefert alle PLZ in definierbarem Umkreis um eine PLZ in einem array zurueck
// Parameter: Int $plz (Zentrum der Betrachtung), float $distance (Umkreisradius in km)
// Returns: array
function plzGetAllPLZNear($plz, $distance)



Benötigt wird lediglich die aktuellste Version der openGeoDB, die wie bekannt unter http://opengeodb.de/ erhältlich ist.

Über Feedback und Verbesserungsvorschläge würde ich mich freuen!

 
Berni
01-07-2004, 16:44 
 
ich habe mir eben mal die plz.php runtergeladen.
Wenn ich die PLZ 63329(egelsbach) eingebe, werden mir die falschen Ort angezeigt. Diese angezeigten Orte sind wesentlich weiter als zb. 10 Km.

what's wrong :confused:

BTW: die examples.php von opengeodb.de liefert ebenfalls die gleichen falschen Daten. Kann es sein das in der DB was nicht stimmt.
ich verwende opengeodb-0.1.3.sql.


many Thanks für alle Hinweise
cu
berni

 
josch
21-02-2005, 18:16 
 
hallo zusammen,

ich habe eine kleine datebank (name, plz, ort, website) und möchte die einzelnen user nun mit punkten grafisch auf einer deutschlandkarte anzeigen lassen.

ein script dafür selbst zu erstellen kann ich nicht, aber vielleicht kann mir jemand helfen eins zu finden was ich an meine bedürfnisse anpassen kann?

grz,
josch

 
andik2000
21-02-2005, 18:41 
 
Würde bedeuten die Koordinaten von ca. 8200 Punkte für dein Bild zu definieren und den PLZs zuzuordnen - soviel PLZ gibts nämlich ungefähr.
Oder anhand der Geodaten einen Bezug auf die Größenverhältnisse des Bildes umrechnen.

Man könnte jedoch Postleitzahlengruppen bilden, denn je nach Größe des Bildes bedeckt ja so ein Punkt ganze Städte, die ja mehrere PLZs haben können.

Was meint ihr anderen Experten dazu?

Grüße,
Andi

 
Chriss
21-02-2005, 18:59 
 
Original geschrieben von josch
hallo zusammen,
[...]vielleicht kann mir jemand helfen eins zu finden was ich an meine bedürfnisse anpassen kann?

Schau' mal hier: Map-Hack für das vBulletin-Board (http://www.vbulletin-germany.com/forum/showthread.php?t=10817&highlight=map)

Das Skript ist aber wohl nur vb-Lizenznehmern zugänglich. Vielleicht hat ja noch jemand anders ein anderes, öffentlich zugängliches Skript.

Gruß,
Chriss

 
Feuerbowle
19-04-2005, 13:49 
 
Hallo,

ich hab heute das Beispiel von iilt (eine Seite vorher) versucht auszuführen aber irgendwie bekomm ich einen Fehler. Hab jetzt rausgefunden, das meine DB Abfrage:

$Abfrage1=mysql_query("SELECT ort, plz,(6367.41*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*
sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite.")))) AS Distance FROM geodb_locationsWHERE 6367.41*
SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*sin(".$laenge.")+cos(RADIANS(laenge))*
cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite."))) <= ".$umkreis." ORDER BY Distance");

False zurück liefert. Hab sie genauso übernommen wie iilt geschrieben hat.

War hab ich falsch gemacht? Hier nochmal mein gesammter Code:


<?
include("config.php");

#Verbindung zur Datenbank aufbauen
$db = mysql_connect($Servername, $Benutzer, $Passwort);

#Datenbankname zuweisen
mysql_select_db($Datenbank);

$plz = $_POST["PLZ"];
$umkreis = $_POST["UMKR"];

$Laenge_breite=mysql_query("SELECT laenge, breite FROM geodb_locations WHERE plz=$plz");
$Laenge_breitearray=mysql_fetch_array($Laenge_breite);

$laenge=$Laenge_breitearray[0] / 180 * M_PI; // Umrechnung von GRAD IN RAD
$breite=$Laenge_breitearray[1]/ 180 * M_PI; // Umrechnung von GRAD IN RAD

$Abfrage1=mysql_query("SELECT ort, plz,(6367.41*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*
sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite.")))) AS Distance FROM geodb_locationsWHERE 6367.41*
SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*sin(".$laenge.")+cos(RADIANS(laenge))*
cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite."))) <= ".$umkreis." ORDER BY Distance");

$Ergebnis2=mysql_fetch_array($Abfrage1);
$Ergebnis3=mysql_num_rows($Abfrage1);
echo "<table border=1><tr>";
echo "Anzahl: $Ergebnis3";

for ($i=0;$i<$Ergebnis3;$i++)
{
while ($Ergebnis2=mysql_fetch_array($Abfrage1,MYSQL_ASSOC))
{
echo "<tr><td>";
echo implode("<td>",$Ergebnis2);
echo "</tr>";
}
}
?>

 
Friedward74
19-05-2005, 15:43 
 
Hi Feuerbowle,

denke mal das liegt nur daran, dass Du hier in der Abfrage n Leerzeichen vergessen hast "FROM geodb_locationsWHERE" .

Zu der bereits häufiger aufgetauchten Frage nach einer Quelle, die nicht nur alle Orte mit dazugehörigen PLZ, sondern alle PLZ als separate Dtensätze beinhaltet bietet die opengeodb auch ne Quelle: Hier der Link (http://prdownloads.sourceforge.net/opengeodb/opengeodb-0.2.3b-UTF8-text-plz.zip?download)

Allerdings hab ich mal ne andere Frage, als MySQL Newbie:

Wie verknüpfe ich die obige Anfrage am besten mit meiner separaten Mitgliedertabelle (PLZ vorhanden). Ich vermute das klappt über nen JOIN, bin allerdings damit noch nicht so vertraut. Anforderung ist : Suche alle Mitglieder, aus der Tabelle tab_mitglieder, die nicht mehr als 100 km von PLZ 12345 entfernt sind, mit Angabe der Entfernung, aufsteigend nach Entfernung sortiert.

Wär dankbar für nen Tip. Desweiteren bin ich auch an der oben genannten Kartendarstellung der (online-)Mitglieder interessiert (oben als Map-Hack verlinkt). Vielleicht kann mir auch dort jemand weiterhelfen.

Many thanx

Friedward

 
0001001
19-06-2005, 15:08 
 
Hallo an alle,
ich finde es super dass das Thema hier so ausführlich diskutiert wird. Das hilft mir als php und sql Anfänger schon sehr weiter.

Jedoch wurde bisher eigentlich immer über die Umkreissuche diskutiert.
Ich würde gerne eine Abfrage schreiben, die die Route zwischen zwei Orten ausgibt (auf Basis von opengeodb).
Leider weiß ich als Anfänger nicht wie aufwändig eine solche Abfrage ist.
Die Abfrage soll enthalten:
- Ort A (z.B. Kölln)
- Ort B (z.B. Dortmund)
- maximale Anzahl an Zwischenstopps (z.B. 10)
- maximale Entfernung zwischen den Zwischenstopps ( z.B. 10 km)
( - nur Orte in unterschiedlichen Landkreisen anfahren)

das Ganze ist für ein Browser Spiel gedacht, das auf opgengeodb basiert. Damit könnte man sich Routen zwischen zwei Orten berechnen lassen, wobei man immer nur Orte in unterschiedlichen Landkreisen anfährt)

Ist sowas möglich bzw wie aufwändig ist es sowas zu schreiben?

 
pekka
19-06-2005, 15:13 
 
Das kommt auf die Route an, die Du berechnen willst! Dir ist klar, daß Du mit opengeodb-Daten natürlich nur die Luftlinie zwischen zwei Punkten berechnen kannst.

Mit der Einschränkung ist das von Dir beschriebene Szenario schon machbar - es ist nur ein Arsch voll Arbeit! Vor allem das mit den Zwischenstopps in unterschiedlichen Landkreisen. Als Anfänger würde ich davon vorerst die Finger lassen.

 
0001001
19-06-2005, 16:31 
 
Das es nur Luftlinie ist ist klar das macht auch nichts.

Die Route die berechnet werden soll, ist gar nicht so wichtig, die Orte lassen sich ja leicht austauschen.

Naja mit den Zwischenstops: Wenn man die maximale Entfernung zwischen den Orten groß genug wählt z.B. 25 km, dann dürfte sich doch immer ein Ort finden der in einem neuen Landkreis liegt oder?

Wenn du sagst dass das ein Haufen Arbeit ist, dann heißt das wohl dass sich sowas nicht in eine einzige SQL Abfrage packen lässt?

 
pekka
19-06-2005, 17:27 
 
Original geschrieben von 0001001
Naja mit den Zwischenstops: Wenn man die maximale Entfernung zwischen den Orten groß genug wählt z.B. 25 km, dann dürfte sich doch immer ein Ort finden der in einem neuen Landkreis liegt oder?



Nicht unbedingt. Hier in BW gibt es Landkreise, die sich über 50 km erstrecken....


Wenn du sagst dass das ein Haufen Arbeit ist, dann heißt das wohl dass sich sowas nicht in eine einzige SQL Abfrage packen lässt?

Auf keinen Fall. Zumindest nicht für uns Normalsterbliche. Und wahrscheinlich nichtmal für die mySQL-Götter hier im Forum. Da mußt Du mit PHP zwischenfummeln.

 
wurm
23-03-2006, 18:26 
 
Hallo,

ihr emsigen Ameisen, die alles zusammentragen und umwandeln was im laufe der Zeit daher kommt was mir und anderen zugute kommt.
....... ich habe sehr interessiert die Beiträge hier gelesen ..... mir raucht der Kopf schon :) kann alles garnicht aufeinmal verarbeiten... denn ich gebe es zu ich bin ein absolutes Newbie in Sachen php-Programmierung und möchte trotzdem folgendes realisieren:


Umkreissuche (...wie schon hier ausführlich behandelt, aber zur Zeit von mir nicht unmittelbar alles nachvollziehbar :( )

- nur für Hessen

- nach Branche
- PlZ-Eingabe
- Entfernungsberechnung

- sortierte Ausgabe (nach Alphabet oder einfach ohne speziellen Optionen ) ---> Branche, Personen, Entfernung

Meine erste Frage,... und ich werde wohl öfter hier etwas Feetback brauchen :) ist, ....

- wo bekomme ich die Geodaten nur für Hessen her??

Vielleicht ist es aber auch nur eine Einstellungsgeschichte in OpenGeoDB?

Bittte verzeiht mir hier die laienhafte Anfrage, aber ich versuche mich langsam an ds Thema heranzupirschen.

Besten Dank schon mal ijm voraus an diejenigen die sich für mich Zeit nehmen.

~~~~~> Das Würmchen gräbt sich durch :)

 
TobiaZ
23-03-2006, 18:40 
 
- wo bekomme ich die Geodaten nur für Hessen her?? musst du vermutlich aus der gesamtdb extrahieren.

 
Cowboy74
09-04-2006, 14:00 
 
Hi Leute,

erst mal ein großes Dankeschön an alle die hier in diesem Board mitgewirkt haben!

Es hat zwar gedauert. Ich habe es jetzt aber mit Eurer Hilfe hinbekommen, die Einträge aus einer Kundenliste nach der Entfernung der PLZ anzeigen zu lassen.

Von den ganzen ZIP Dateien, die man aber von der opengeodb Seite herunterladen konnte, waren relativ viele unnötige Daten dabei, kaputte Dateien etc. Habe mir hier jetzt eine passende DB zusammengebastelt.

Wer von Euch jetzt nur eine reine Datenbank braucht, um Entfernungen zwischen PLZ zu berechnen (nicht mehr und nicht weniger), kann mir eine PN schicken, dann sende ich die SQL Datenbank gerne zu. Komprimiert hat sie auch nur 266 KB!

Meine Abfrage, um die Kundendaten aus der Tabelle kunden jetzt entsprechend anzuzeigen, sieht wie folgt aus. Ist eine Variation aus einer Abfrage, die hier im Forum zu finden war:

$query="

SELECT kunden.plz, kunden.name, geodaten.ort, geodaten.plz, geodaten.land,

(6367.41*SQRT(2*(1-cos(RADIANS(geodaten.breite))*cos(".$breite.")*(sin(RADIANS(geodaten.laenge))*sin(".$laenge.")+cos(RADIANS(geodaten.laenge))*cos(".$laenge."))-sin(RADIANS(geodaten.breite))*sin(".$breite.")))) AS Distance

FROM geodaten, kunden

WHERE 6367.41*SQRT(2*(1-cos(RADIANS(geodaten.breite))*cos(".$breite.")*(sin(RADIANS(geodaten.laenge))* sin(".$laenge.")+cos(RADIANS(geodaten.laenge))*cos(".$laenge."))-sin(RADIANS(geodaten.breite))* sin(".$breite."))) <= ".$umkreis."

AND kunden.plz=geodaten.plz

ORDER BY Distance";

Grüße aus Bayern!

 
sk4r
21-04-2006, 02:25 
 
Hi leute,
also ich bin schon lange auf der suche nach so einem script.
ich brauche sowas, welches die 2 plz's aus der datenbank ausliest und die entfernung berechnet. wie würde soetwas aussehen?

danke

gruß
sk4r

 
josch
21-04-2006, 11:37 
 
ich habe die entfernungsberechnung auf der seite www.fontanus.de realisiert. wenn jemand interesse an dem script hat, kann er sich gerne melden.

 
sk4r
21-04-2006, 18:30 
 
Hi josch, da ich dir aus welchem grund auch immer keine pm schicken kann, poste ich dir hier meine email addy und hoffe, dass du mir das script schickst.. vielen dank

sc00b@web.de

^^
das sind keine "OOOO's" sondern "Nuller"

 
TobiaZ
21-04-2006, 19:34 
 
PM gehen auch nur für Stern-User ;) Aber du kannst seine Mailfkt verwenden.

 
josch
21-04-2006, 21:47 
 
wann bekomme ich den ersten stern - und welche bewandniss hat es das erst ein stern erreicht werden muß?

grz,
josch

 
TobiaZ
21-04-2006, 22:30 
 
Suchst du, brauchst du nicht peinlich Fragen ;)http://www.php-resource.de/forum/showthread.php?s=&threadid=28002&highlight=stern

 
josch
21-04-2006, 23:57 
 
ob nun stern oder nicht - ist mir total egal. ;-)
allerdings ist mir dennoch nicht klar warum man sich nicht auch ohne PMs senden kann, aber das gehört wohl in einen anderen thread.

 
R4v3r
02-07-2006, 05:08 
 
Hallo Leute!

Was mich etwas wundert, ist die Anzahl der Postleitzahlen.

Hier wird mal von 8xxx gesprochen.

Lt. Wikipedia gibt es aber ca. 30.000 Postleitzahlen

http://de.wikipedia.org/wiki/Postleitzahl_(Deutschland)

In meinem Unternehmen haben wir zudem eine Liste mit allen Postleitzahlen, welche ca. 40.000 Einträge umfasst.

Wird bei den 8xxx nicht berücksichtigt, dass es mehre PLZ pro Ort gibt, oder woher kommt dieser niedrige Wert??

Ansonsten noch eine Frage:

Gibt es eine DB mit PLZ, Ort, Länge und Breite?

Mit der GeoDB komm ich nicht wirklich klar, da dort unter der Type "500100000" Postleitzahlen und Orte ausgegeben werden (jeweils die Ort samt allen Postleitzahlen dieser Orte) ich finde aber leider keine Möglichkeit, die Orte mit den Postleitzahlen zu verbinden...

 
pekka
02-07-2006, 14:29 
 
Lt. Wikipedia gibt es aber ca. 30.000 Postleitzahlen


Wenn Du in deinem Eigenen Link ein wenig runterscrollst (http://de.wikipedia.org/wiki/Postleitzahl_%28Deutschland%29#Postleitzahlenarten), siehst Du die Verteilung dieser 30.000.

 
samuel
30-11-2006, 18:31 
 
Noch eine Frage. Problem ist doch, dass mehrere Ort einen PLZ haben koennen.
Gibt es eine Zuordnung zwischen den offziellen Gemeindeschlüsseln (http://de.wikipedia.org/wiki/Amtlicher_Gemeindeschl%C3%BCssel) der Orte in Deutschland und den Geokoordinaten?

Danke

 
CGNer
30-01-2007, 10:06 
 
hallo zusammen,

ich habe mir dieses script auf meine db angepasst und es funktioniert einwandfrei! ;-)


$ort = $_POST["ORT"];
$umkreis = $_POST["UMKR"];

$Laenge_breite=mysql_query("SELECT laenge, breite FROM geodaten WHERE ort=$ort");
$Laenge_breitearray=mysql_fetch_array($Laenge_breite);

$laenge=$Laenge_breitearray[0] / 180 * M_PI; // Umrechnung von GRAD IN RAD
$breite=$Laenge_breitearray[1]/ 180 * M_PI; // Umrechnung von GRAD IN RAD

$Abfrage1=mysql_query("SELECT ort, plz,(6367.41*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*
sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite.")))) AS Distance FROM geodaten WHERE 6367.41*
SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*sin(".$laenge.")+cos(RADIANS(laenge))*
cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite."))) <= ".$umkreis." ORDER BY Distance");

$Ergebnis2=mysql_fetch_array($Abfrage1);
$Ergebnis3=mysql_num_rows($Abfrage1);
echo "<table border=1><tr>";
echo "Anzahl: $Ergebnis3";

for ($i=0;$i<$Ergebnis3;$i++)
{
while ($Ergebnis2=mysql_fetch_array($Abfrage1,MYSQL_ASSOC))
{
echo "<tr><td>";
echo implode("<td>",$Ergebnis2);
echo "</tr>";
}
}


nun würde ich diese suche auch auf ortsnamen erweitern. problem ist das viele orte z.b. Köln) mehrere postleitzahlen haben...?!

wie kann ich das realisieren? bin für jeden tipp dankbar...

 
Benny-one
30-01-2007, 10:24 
 
http://phpmagazin.de/itr/ausgaben/psecom,id,293,nodeid,60,_language,de.html

Per E-Mail bin ich vll. bereit diesen Artikel per PDF zu mailen

 
CGNer
30-01-2007, 11:06 
 
Was soll mir das sagen? ;-)

 
zerni
30-01-2007, 16:09 
 
XML
GPS für Webseiten
Google Sitemaps

 
dakness
16-09-2007, 17:28 
 
Hallo ich habe mal eine Funktion gebastelt womit es auch möglich ist eine suche in einen bestimmten Radius einzugrenzen.

<?php
//entfernt
?>

bei anfrage per Mail kann ich auch die Tabellen Struktur zuschicken


MfG
darkness

 
andreaskeck
24-10-2007, 10:31 
 
Hallo zusammen,

ich verwende das Script wie nachfolgende beschrieben, nur nicht nach Ort
sondern nach PLZ so wie es in früheren Beiträgen schon beschrieben ist.
Der Script läuft bei mir auch, jedoch wird immer das erste Ergebnis nicht angezeigt, egal welche PLZ ich nehme. Beim ausprinten der Variable:
$Ergebnis3 kommt die Anzahl korrekt, beim $Ergebnis2 fehlt aber immer der erste wert.

Beispiel: Anzahl: 6
$Ergebnis2 zeigt mir dann aber nur 5 Datensätze an. Es ist immer der
erste Datensatz im Ergebnis der nicht angezeigt wird!

Kann mir hier jemand sagen an was das liegt?



Gruß

Andreas


Original geschrieben von CGNer

[$ort = $_POST["ORT"];
$umkreis = $_POST["UMKR"];

$Laenge_breite=mysql_query("SELECT laenge, breite FROM geodaten WHERE ort=$ort");
$Laenge_breitearray=mysql_fetch_array($Laenge_breite);

$laenge=$Laenge_breitearray[0] / 180 * M_PI; // Umrechnung von GRAD IN RAD
$breite=$Laenge_breitearray[1]/ 180 * M_PI; // Umrechnung von GRAD IN RAD

$Abfrage1=mysql_query("SELECT ort, plz,(6367.41*SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*
sin(".$laenge.")+cos(RADIANS(laenge))*cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite.")))) AS Distance FROM geodaten WHERE 6367.41*
SQRT(2*(1-cos(RADIANS(breite))*cos(".$breite.")*(sin(RADIANS(laenge))*sin(".$laenge.")+cos(RADIANS(laenge))*
cos(".$laenge."))-sin(RADIANS(breite))*sin(".$breite."))) <= ".$umkreis." ORDER BY Distance");

$Ergebnis2=mysql_fetch_array($Abfrage1);
$Ergebnis3=mysql_num_rows($Abfrage1);
echo "<table border=1><tr>";
echo "Anzahl: $Ergebnis3";

for ($i=0;$i<$Ergebnis3;$i++)
{
while ($Ergebnis2=mysql_fetch_array($Abfrage1,MYSQL_ASSOC))
{
echo "<tr><td>";
echo implode("<td>",$Ergebnis2);
echo "</tr>";
}
}

 
TobiaZ
24-10-2007, 13:45 
 
Wenn ich deinen "Code" richtig verstanden habe, fehlen dir so grundlegende Grundlagen wie

while($row=mysql_fetch...)
// ausgabe der zeile

 
andreaskeck
24-10-2007, 14:29 
 
Original geschrieben von TobiaZ
Wenn ich deinen "Code" richtig verstanden habe, fehlen dir so grundlegende Grundlagen wie

while($row=mysql_fetch...)
// ausgabe der zeile

Ich habe den Fehler gefunden:



$Ergebnis2=mysql_fetch_array($Abfrage1); // Hier dran liegt der Fehler, denn hier wird bereits der erste Datensatz gelesen,
// und unten in der while Schleife werden dann die restlichen Datensätze ausgelesen. Die Zeile löschen und schon stimmt es.
$Ergebnis3=mysql_num_rows($Abfrage1);
echo "<table border=1><tr>";
echo "Anzahl: $Ergebnis3";

for ($i=0;$i<$Ergebnis3;$i++)
{
while ($Ergebnis2=mysql_fetch_array($Abfrage1,MYSQL_ASSOC))
{
echo "<tr><td>";
echo implode("<td>",$Ergebnis2);
echo "</tr>";
}
}


Alle Zeitangaben in WEZ +2. Es ist jetzt 12:39 Uhr.