Frage

Wie verhält sich eine Anwendung eine Umgebungs-Suche? Zum Beispiel ein Benutzer in einer Postleitzahl, dann listet die Anwendung alle Unternehmen innerhalb von 20 Meilen durch die Nähe bestellt werden.

Ich möchte etwas wie das in PHP und MySQL aufbauen. Ist dieser Ansatz richtig?

  1. Lernen Sie die Adressen für Standorte mich interessiert und speichern in der Datenbank
  2. Geokodieren alle Adressen mit Googles Geocodierungsdienst
  3. eine Datenbankabfrage schreiben, die Haversine Formel beinhaltet die Umkreissuche und Bestellung
  4. zu tun

Ist das OK? In Schritt 3 werde ich die Nähe für jede Abfrage berechnen. Ist es besser, einen NÄHE Tisch zu haben, der den Abstand zwischen jedem Unternehmen auflistet und ein paar Referenzstellen?

War es hilfreich?

Lösung

Wenn es genügend Datensätze für die Geschwindigkeit der Materie, hier ist ein Weg, um sie vor der Zeit zu indizieren.

Definieren Sie ein Raster von Bins etwa 20 Meilen auf einer Seite. Speichern Sie die Bin-Nummer mit jedem Rekord zu speichern. Bei Suchzeit berechnet die Nummern aller Bins, die einen 20-Meile Radius von Ihrem Such Punkt schneiden. Dann abrufen alle Geschäfte in einem dieser Fächer, und gehen Sie wie zuvor.

Andere Tipps

Wir verwenden diese viele tausend Punkte zu tun. Es ist wichtig, wenn Sie diese in SQL ausführen auf dem Latitude einen Index haben und Länge Spalte. Wir haben versucht, dies in SQL 2008 mit räumlichen Indizes zu tun, aber wir haben wirklich nicht die Leistungssteigerung sehen wir erwartet hatten. Obwohl, wenn Sie wollen in einem gewissen Abstand von einem ZIP Sie brauchen, darüber nachzudenken zu berechnen, wenn Sie gehen, um den ZIP-Schwerpunkt oder eine Polygon-Darstellung des ZIP-Code zu verwenden.

Haversine forumla ist ein guter Anfang.

Wir haben nicht die Leistung Probleme hatte, den Abstand auf die Schnelle Berechnung wir sie berechnen vor der Zeit für einige Anwendungen, bei denen wir die Punkte im Voraus wissen, und es werden Millionen von Datensätzen sein.

SELECT
        [DistanceRadius]=
        69.09 *
        DEGREES(
          ACOS(
            SIN( RADIANS(latitude) )*SIN( RADIANS(@ziplat) ) 
           +
            COS( RADIANS(latitude) )*COS( RADIANS(@ziplat) ) 
           *
            COS( RADIANS(longitude - (@ziplon)) )
          )
        )
        ,*
        FROM
            table

    ) sub
WHERE
    sub.DistanceRadius < @radius

Wir tun dies für etwa 1200 Standorte. Ich würde nur die Haversine Formel on the fly verwenden, obwohl je nach Anwendung Ihr, könnte es besser sein es anstelle von SQL in PHP zu speichern. (Unsere Implementierung ist in .net so Ihre milage können variieren).

Wirklich unser größter Nachteil der Art, wie wir es umgesetzt wird, ist, dass jede Berechnung (bis vor kurzem) auf der Datenebene berechnet werden musste, die quälend langsam war (wenn ich langsam sage, meine ich nicht sofortige es wirklich eine nahm Sekunde oder so), aber das war wegen der Tatsache, dass es den Abstand für alle 1200 Standorte basierend auf dem mitgelieferten Postleitzahl zu berechnen hatte.

auf der Route sind Sie wählen, gibt Je Möglichkeiten zur Beschleunigung der Anzahl Abstandsberechnungen nach oben, um den Längen- und Breitengrad suchen und die, die außerhalb eines vordefinierten Bereichs zu entfernen (zum Beispiel, wenn Sie bei allen Adresse innerhalb von 20 Meilen suchen berechnen kann, gibt es eine Sie Längenbereich, der alle Adressen in fallen haben 20 Meilen entfernt sein.) Das beschleunigen können Sie abfragen, wenn es sein muss.

Wir haben tatsächlich alle möglichen Kombinationen in unserer Datenbank zu speichern. In Wirklichkeit klingt es wie es ein großer Datenspeicher sein könnte, aber es ist wirklich nicht in dem großen Umfang der Dinge. Mit Indizes kann es ziemlich schnell sein, und Sie müssen nicht über Algorithmus Optimierung usw. sorgen wir dagegen entschieden, weil wir die Gleichung in C # hatte, und es erlaubt uns, die Informationen in den Cache notwendig, alle Berechnungen in der zu tun Business-Tier. Entweder wird gut funktionieren, es ist nur eine Frage das, was Ihre Präferenz.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top