Ich arbeite an einer lokalen Unternehmensverzeichnis-Site, die benutzerdefinierte Beitragstypen für die Unternehmenseinträge verwendet. Eines der Felder ist "Postleitzahl". Wie kann ich eine standortbasierte Suche einrichten?
Ich möchte, dass Besucher ihre Postleitzahl eingeben und eine Kategorie auswählen können und alle Unternehmen mit einem bestimmten Radius oder alle Unternehmen nach Entfernung anzeigen können. Ich habe ein paar Plugins gesehen, die behaupten, dies zu tun, aber WordPress 3.0 nicht unterstützen. Irgendwelche Vorschläge?
Antworten:
Ich würde ändert die Antwort von gabrielk und den verknüpfte Blogeintrag unter Verwendung von Datenbankindizes und die Anzahl der tatsächlichen Entfernungsberechnungen zu minimieren .
Wenn Sie die Koordinaten des Benutzers und die maximale Entfernung (z. B. 10 km) kennen, können Sie einen Begrenzungsrahmen von 20 x 20 km mit der aktuellen Position in der Mitte zeichnen. Holen Sie sich diese Grenzkoordinaten und fragen Sie nur Speicher zwischen diesen Breiten- und Längengraden ab . Verwenden Sie noch keine Trigonometriefunktionen in Ihrer Datenbankabfrage, da dies die Verwendung von Indizes verhindert. (Sie könnten also ein Geschäft in 12 km Entfernung von Ihnen bekommen, wenn es sich in der nordöstlichen Ecke des Begrenzungsrahmens befindet, aber wir werfen es im nächsten Schritt weg.)
Berechnen Sie nur die Entfernung (wie der Vogel fliegt oder mit tatsächlichen Wegbeschreibungen, wie Sie es bevorzugen) für die wenigen Geschäfte, die zurückgegeben werden. Dies wird die Verarbeitungszeit drastisch verkürzen, wenn Sie eine große Anzahl von Geschäften haben.
Für die zugehörige Suche ( "Geben Sie die zehn nächstgelegenen Geschäfte") ) können Sie eine ähnliche Suche durchführen, jedoch mit einer anfänglichen Entfernungsschätzung (Sie beginnen also mit einem Bereich von 10 km x 10 km, und wenn Sie nicht genügend Geschäfte haben, erweitern Sie ihn auf 20 km mal 20 km und so weiter). Für diese anfängliche Entfernung erraten Sie einmal die Anzahl der Geschäfte über die gesamte Fläche und verwenden diese. Oder protokollieren Sie die Anzahl der erforderlichen Abfragen und passen Sie sie im Laufe der Zeit an.
Ich habe bei Mikes verwandter Frage ein vollständiges Codebeispiel hinzugefügt. Hier ist eine Erweiterung, die die nächstgelegenen X-Standorte angibt (schnell und kaum getestet):
quelle
Zuerst brauchen Sie eine Tabelle, die ungefähr so aussieht:
... für jede Postleitzahl ausgefüllt. Sie können dies erweitern, indem Sie Felder für Stadt und Bundesland hinzufügen, wenn Sie auf diese Weise nachschlagen möchten.
Dann kann jedem Geschäft eine Postleitzahl zugewiesen werden, und wenn Sie die Entfernung berechnen müssen, können Sie die Lat / Long-Tabelle mit den Geschäftsdaten verknüpfen.
Anschließend fragen Sie diese Tabelle ab, um den Breiten- und Längengrad für das Geschäft und die Postleitzahlen des Benutzers abzurufen. Sobald Sie es erhalten haben, können Sie Ihr Array füllen und es an eine Funktion zum Abrufen der Entfernung übergeben:
Dies ist als Proof-of-Concept gedacht, nicht als Code, dessen Implementierung ich empfehlen würde. Wenn Sie beispielsweise 10.000 Filialen haben, ist es ziemlich teuer, alle abzufragen und sie bei jeder Anfrage zu durchlaufen und zu sortieren.
quelle
Die MySQL-Dokumentation enthält auch Informationen zu räumlichen Erweiterungen. Seltsamerweise ist die Standard-distance () -Funktion nicht verfügbar. Weitere Informationen zum "Konvertieren" finden Sie auf dieser Seite: http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html die beiden POINT-Werte zu einem LINESTRING und berechne dann die Länge davon. "
Beachten Sie, dass jeder Anbieter wahrscheinlich unterschiedliche Breiten- und Längengrade anbietet, die den "Schwerpunkt" einer Postleitzahl darstellen. Es ist auch wichtig zu wissen, dass es keine wirklich definierten "Grenz" -Dateien für die Postleitzahl gibt. Jeder Anbieter hat seine eigenen Grenzen, die in etwa mit den spezifischen Adressenlisten einer USPS-Postleitzahl übereinstimmen. (In einigen "Grenzen" müssten Sie beispielsweise beide Straßenseiten einschließen, in anderen nur eine.) ZCTAs (ZIP Code Tabulation Areas), die von Anbietern häufig verwendet werden, beschreiben "Postleitzahl-Zustellbereiche nicht genau. und nicht alle für die Postzustellung verwendeten Postleitzahlen einschließen " http://www.census.gov/geo/www/cob/zt_metadata.html
Viele Unternehmen in der Innenstadt haben eine eigene Postleitzahl. Sie möchten einen möglichst vollständigen Datensatz erstellen. Stellen Sie daher sicher, dass Sie eine Liste mit Postleitzahlen finden, die sowohl die Postleitzahl "point" (in der Regel Unternehmen) als auch die Postleitzahl "border" enthält.
Ich habe Erfahrung mit den PLZ-Daten von http://www.semaphorecorp.com/ . Auch das war nicht 100% genau. Als mein Campus beispielsweise eine neue Postanschrift und eine neue Postleitzahl annahm, war die Postleitzahl verlegt. Das heißt, es war die einzige Datenquelle, die ich fand, die sogar die neue Postleitzahl hatte, also kurz nachdem sie erstellt wurde.
Ich hatte ein Rezept in meinem Buch, wie ich genau auf Ihre Anfrage eingehen kann ... in Drupal. Es stützte sich auf das Google Maps Tools-Modul ( http://drupal.org/project/gmaps , nicht zu verwechseln mit http://drupal.org/project/gmap , ebenfalls ein würdiges Modul). Möglicherweise finden Sie einige hilfreiche Beispiele Code in diesen Modulen funktioniert in WordPress natürlich nicht sofort.
quelle