Suchen
Inside Forum
Nützliche Links




 
phpforum.de bei Facebook
 
phpforum.de bei Twitter
 

Zurück   PHP Forum: phpforum.de > PHP > PHP

PHP Alles rund um PHP

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 21.02.2018, 12:34
KainLaVey KainLaVey ist offline
Neuer Besucher
 
Registriert seit: 18.07.2016
Beiträge: 28
Frage "Einfache" Umkreissuche auf Basis der PLZ

Hallo zusammen,

vorab: Natürlich habe ich zuerst die Suchfunktion im Forum genutzt weil ich davon ausgegangen bin dass dies schon öfters gefragt wurde. Allerdings sind die Beiträge die ich dazu gefunden habe alle schon recht alt und damit ggf. nicht mehr ganz up to date und evtl. gibt es mittlerweile ja simplere Methoden oder APIs für diese Aufgabe

- Ich habe Nutzer
- Ich habe Veranstaltungen
- Beide in einer DB mit PLZ

Nutzer soll eine Umkreissuche für Veranstaltungen in seiner Nähe machen können. Also alle Veranstaltungen aus der DB anzeigen im Umkreis von X Kilometern. Also so ähnlich wie hier http://www.serp-perception.com/umkreissuche.php

Ich brauche keine GoogleMaps anzeige oder sowas. Einfach nur die zutreffenden Veranstaltungs-Datensätze.

Gibt es für dieses "Problem" mittlerweile fertige Skripte oder APIs? Evtl. kann mir auch jemand ein aktuelles brauchbares Tutorial empfehlen?

OpenGeoDB wird ja schon länger nicht mehr weiterentwickelt wenn ich das richtig sehe.

Schön wäre halt eine API an die ich eine PLZ und einen Kilometerwert schicke und die mir dann alle PLZ die im Umkreis sind zurück gibt. Darauf basierend könnte ich dann ja recht simpel die Datensätze auslesen lassen.

Vielen lieben Dank <3:
Mit Zitat antworten
  #2  
Alt 21.02.2018, 13:06
chrishorn chrishorn ist offline
Engagierter Besucher
 
Registriert seit: 21.11.2011
Beiträge: 628
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Also auf der Seite von OpenGeoDB

http://opengeodb.giswiki.org/wiki/OpenGeoDB_Downloads

gibt's ja einen Link zum Download

http://www.fa-technik.adfc.de/code/opengeodb/

und da steht

Zitat:
DE.tab 21-Feb-2018 13:06 5.4M
das ist ja schon ziemlich aktuell. Von da aus brauchst du ja nur die Koordinaten zur PLZ suchen und die Distanz berechnen, oder halt alle PLZ im Umkreis suchen. Dazu gibt's aber hundert Tutorials nach denen du nur suchen musst. Ich würde da PostgreSQL mit PostGIS Extension empfehlen, dann geht das auch gleich in der Datenbank und ziemlich performat.
Mit Zitat antworten
  #3  
Alt 21.02.2018, 13:43
akretschmer akretschmer ist offline
Engagierter Besucher
 
Registriert seit: 25.09.2013
Beiträge: 1.165
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Zitat:
Zitat von chrishorn Beitrag anzeigen
Also auf der Seite von OpenGeoDB

http://opengeodb.giswiki.org/wiki/OpenGeoDB_Downloads

gibt's ja einen Link zum Download

http://www.fa-technik.adfc.de/code/opengeodb/

und da steht



Ich würde da PostgreSQL mit PostGIS Extension empfehlen, dann geht das auch gleich in der Datenbank und ziemlich performat.

ACK. KNN-Indexe, also indexbasierte Umkreissuche.
__________________
--
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Mit Zitat antworten
  #4  
Alt 23.04.2018, 12:23
KainLaVey KainLaVey ist offline
Neuer Besucher
 
Registriert seit: 18.07.2016
Beiträge: 28
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Hallo,

vielen Dank schon mal für euer Feedback.

Die GeoDB war für meine Zwecke etwas zu groß und komplex aufgebaut. Aber ich habe einen ganz simplen SQL Dump gefunden von einer DB mit allen deutschen Städten: https://launix.de/launix/launix-gibt...atenbank-frei/


Ich habe jetzt also eine Tabelle "zip_codes":
plz (als primary key), latitude, longitude

Und eine Tabelle "bands":
id, name, plz (definiert als fremdschlüssel für plz aus der zip_codes tabelle)


Mittels folgender Query bekomme ich schon mal alle Postleitzahlen im Umkreis von 10 KM zu den eingegeben breiten/längengraden:

SQL Quellcode:
SELECT *,
        (
            6371 * acos
            (
                cos(
                    radians( 51.9538685 )
                )
                * cos(
                    radians( lat)
                ) * cos(
                    radians( lng) - radians( 7.9908987 )
                ) + sin(
                    radians( 51.9538685 )
                ) * sin(
                    radians( lat)
                )
            )
        ) AS distance
FROM zip_codes
HAVING distance <= 10
ORDER BY distance ASC;


Kann ich den Query so anpassen dass er mir direkt alle Bands ausgibt die zu diesen Postleizahlen passen? Oder sind dafür zwei getrennte Querys nötig?

Danke für eure Hilfe. Ich bin kein blutiger Anfänger, aber auch kein Profi wenn es um SQL & Co geht.
Mit Zitat antworten
  #5  
Alt 23.04.2018, 13:08
KainLaVey KainLaVey ist offline
Neuer Besucher
 
Registriert seit: 18.07.2016
Beiträge: 28
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Ok. Ich habe den SQL einfach um ein InnerJoin ergänzt. Und das scheint zu funktionieren.

SQL Quellcode:
SELECT bands.name,
        (
            6371 * acos
            (
                cos(
                    radians( 51.9538685 )
                )
                * cos(
                    radians( lat)
                ) * cos(
                    radians( lng) - radians( 7.9908987 )
                ) + sin(
                    radians( 51.9538685 )
                ) * sin(
                    radians( lat)
                )
            )
        ) AS distance
FROM zip_codes
INNER JOIN bands ON (zip_codes.plz = bands.plz)
HAVING distance <= 10
ORDER BY distance ASC;


Oder meint ihr es gibt hier noch einen Fehler den ich nur nicht sehe/bemerke?
Mit Zitat antworten
  #6  
Alt 23.04.2018, 13:22
protestix protestix ist offline
Engagierter Besucher
 
Registriert seit: 29.06.2016
Beiträge: 711
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Warum nutzt du nicht die GIS Funktion der DB, denn genau dafür sind sie da. MySQL kann das seit Version 5.7, und das ist um ein vielfaches schneller als deine Variante, auch wenn PG hier optimaler wäre.

Lies mal hier nach.
https://dev.mysql.com/doc/refman/8.0...ial-types.html
Mit Zitat antworten
  #7  
Alt 23.04.2018, 13:33
KainLaVey KainLaVey ist offline
Neuer Besucher
 
Registriert seit: 18.07.2016
Beiträge: 28
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Danke für den Tipp. Schaue ich mir an. Wobei es bei mir auch nicht um ewig viele Daten geht. Am Ende evtl 100-200 Bands maximal. Dafür scheint die Performance jetzt auch schon zu genügen. Aber schneller ist natürlich immer besser ;P
Mit Zitat antworten
  #8  
Alt 23.04.2018, 13:41
protestix protestix ist offline
Engagierter Besucher
 
Registriert seit: 29.06.2016
Beiträge: 711
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Die Geschwindigkeit ist hier nicht auf die Anzahl der Bands beschränkt, sondern bezieht alle Städte mit ein und vervielfacht sich zudem wenn du joinst. Schau doch mal wann welchen Berechnungen gemacht werden. Du musst ja deinen Standort gegen alle Standorte der Städte vergleichen um eine Distanz zu ermitteln. Erst danach filterst du die raus deren Kriterium dem Having entsprechen.

Wenn zudem mehrere Benutzer gleichzeitig auf der Seite eine Umkreissuche durchführen kann das schon einen merklichen Unterschied machen.
Mit Zitat antworten
  #9  
Alt 23.04.2018, 13:55
akretschmer akretschmer ist offline
Engagierter Besucher
 
Registriert seit: 25.09.2013
Beiträge: 1.165
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

KNN-Suche in PostgreSQL ist indexbasiert, damit noch bei zig Millionen Datensätzen super schnell. Aber vielleicht steht der Fragesteller ja auf Schmerzen und bevorzugt MySQL...
__________________
--
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
Mit Zitat antworten
  #10  
Alt 23.04.2018, 13:59
KainLaVey KainLaVey ist offline
Neuer Besucher
 
Registriert seit: 18.07.2016
Beiträge: 28
Standard AW: "Einfache" Umkreissuche auf Basis der PLZ

Der Fragenstelle steht auf die Systeme die er zumindest rudimentär beherrscht ;-) Aber ich bin ja Lernfähig und schaue mir gerne weitere Dinge an.

Da es bei mir nur um PLZs in NRW geht und nicht um zig millionen Datensätze muss ich halt abwägen zwischen "Bin ich mit der Perfommance so schon zufrieden" und "Sich in komplett neue Bereiche einarbeiten". Am Ende auch eine Zeit/Kostenfrage. KKN Suche und PostgreSQL sagt mir aktuell halt garnix. Daher bringt es mir für dieses konkrete Projekt nix da was komplett neues zu lernen sondern ich muss versuchen mit dem Möglichkeiten & Fähigkeiten die mir zu verfügung stehen aus zu kommen.

Geändert von KainLaVey (23.04.2018 um 14:04 Uhr)
Mit Zitat antworten


Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.

Gehe zu
Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
"Einfache" MySQL Abfrage: Stehe auf dem Schlauch und brauche Hilfe! LeonardB Datenbanken 2 31.10.2011 14:46
<input name="Linkbezeichnung" ' . $eingabefeld . ' size="30" value="' . $liste['linkb menschmeyer PHP 7 12.10.2008 23:57
HILFEEE 2 "einfache" Tabellen PHP_Tanja HTML 6 04.04.2008 19:03
<form name="login" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST" /> RhettButler PHP 18 24.07.2007 09:58
sortieren "von bis" und "asc", nack Klick "desc" Oliver Albers PHP 1 04.02.2004 11:36


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:48 Uhr.


Powered by vBulletin® Version 3.8.8 (Deutsch)
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Powered by NuWiki v1.3 RC1 Copyright ©2006-2007, NuHit, LLC