2016-05-11 8 views
1

Ich werde eine App bauen, wo die Benutzer Punkte von Interesse in einem vordefinierten Radius um ihren Standort sehen können.PHP Radius Suche

Meine erste Idee war es, den Breiten- und Längengrad aller POIs in einer Datenbank zu speichern und den Standort des Benutzers mit dem Standort des POIs über SQL zu vergleichen.

Das Problem ist die Leistung, denke ich. Wenn es Tausende von POIs und Tausende von Benutzeranfragen mit ihrem Standort gibt, wäre das nicht sehr ökonomisch oder ist dies kein Problem für die heutigen Server?

Meine nächste Annäherung war, die Karte in Quadranten zu teilen und nur die umgebenden Quadranten zu beobachten.

tl; dr:

Alles in allem ich suche:

  • ein Weg
  • bestenfalls eine Umkreissuche die Ergebnisse für andere Benutzer das Caching zu tun
  • Der Cache wird aktualisiert, wenn ein neuer POI registriert wird.

Wenn Sie irgendwelche Ideen haben, wie etwas so zu realisieren, lass es mich wissen.

Danke

Fabian

+0

Ich denke, dass diese http://stackoverflow.com/questions/574691/mysql-great-circle-distance-haversine-formula Link für Sie hilfreich ist. – purvik7373

Antwort

1

Ich denke, was Sie suchen die Harversine formula ist, die es Ihnen, den Abstand zwischen zwei Punkten in einer Kugel (in diesem Fall der Erde) zu finden. Eine Implementierung mit SQL wäre so etwas wie dies:

ACOS (
    SIN(RADIANS($latitude)) * 
    SIN(RADIANS(T.latitude))+ 
    COS(RADIANS($latitude)) * 
    COS(RADIANS(T.latitude))* 
    COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance 

dies die Auswahl Ihrer Abfrage eine Spalte namens kehrt Abstandsberechnungs- zum Hinzufügen (in Km), wie weit ist der Punkt ($ Breitengrade, $ Länge), die normalerweise der Benutzer, aus (T.latitude, T.longitude), normalerweise das Element der Tabelle.

Falls Sie filtern möchten, und zeigen keine Elemente weiter als eine bestimmte Entfernung Sie eine Bedingung wie machen:

HAVING distance<$radius 

Ich stelle mir vor, dass Sie MySQL verwenden, wenn dies der Fall ist, dass Sie müssen HAVING anstelle von WHERE verwenden, um eine Bedingung über eine berechnete Spalte (Abstand) zu stellen.

SELECT T.*, ACOS (
     SIN(RADIANS($latitude)) * 
     SIN(RADIANS(T.latitude))+ 
     COS(RADIANS($latitude)) * 
     COS(RADIANS(T.latitude))* 
     COS(RADIANS($longitude-T.longitud)))*6378.137 AS distance 
FROM your_table as T 
HAVING distance < $radius 
ORDER BY distance LIMIT $limit 

Wenn Sie die Leistung hinzufügen, eine Grenze für die Abfrage ein bisschen mehr optimieren möchten, damit Sie die 10 nächstgelegenen Orten zum Beispiel haben:

Ein vollständiges Beispiel für eine Abfrage so sein würde.

Nehmen Sie sich Zeit, um auch Spatial data types zu betrachten, da sie speziell für diese Art von Arbeit gemacht wurden.

Beachten Sie, dass ich nicht empfehlen, Ihre PHP-Variablen direkt in Ihre Abfrage einfügen, ist wirklich unsicher, das habe ich nur als Beispiel.

Hoffe das hilft dir.

+0

Vielen Dank für diese schnelle Antwort. Ich werde in diesem Thema jetzt lesen. – Fabian

+0

@Fabian Sorry für die lange Antwort, aber ich denke, ich habe es ziemlich deutlich erklärt. – asurbernardo

+0

@Fabian Keine Sorge, froh, dass du deine Zweifel gelöst hast :) – asurbernardo