Pracuję nad lokalną witryną katalogu firm, która będzie używać niestandardowych typów wpisów dla wpisów biznesowych. Jednym z pól będzie „Kod pocztowy”. Jak skonfigurować wyszukiwanie oparte na lokalizacji?
Chciałbym, aby odwiedzający mogli wprowadzić swój kod pocztowy i wybrać kategorię oraz pokazać wszystkie firmy o określonym promieniu lub wszystkie firmy uporządkowane według odległości. Widziałem kilka wtyczek, które twierdzą, że to robi, ale nie obsługują WordPress 3.0. Jakieś sugestie?
search
geo-data
location-search
matowy
źródło
źródło
Odpowiedzi:
Zmodyfikowałbym odpowiedź z gabrielka i powiązanego posta na blogu , używając indeksów baz danych i minimalizując liczbę faktycznych obliczeń odległości .
Jeśli znasz współrzędne użytkownika i znasz maksymalną odległość (powiedzmy 10 km), możesz narysować obwiednię o wymiarach 20 km na 20 km z aktualną lokalizacją pośrodku. Uzyskaj te współrzędne graniczne i przeszukuj tylko magazyny między tymi szerokościami i długościami geograficznymi . Nie używaj jeszcze funkcji trygonometrii w zapytaniu do bazy danych, ponieważ uniemożliwi to użycie indeksów. (Więc możesz dostać sklep, który jest 12 km od ciebie, jeśli znajduje się w północno-wschodnim rogu obwiedni, ale wyrzucimy go w następnym kroku.)
Oblicz tylko odległość (gdy ptak lata lub według rzeczywistych wskazówek dojazdu, jak wolisz) dla kilku zwracanych sklepów. To znacznie skróci czas przetwarzania, jeśli masz dużą liczbę sklepów.
W przypadku powiązanego wyszukiwania ( „podaj dziesięć najbliższych sklepów” ) możesz przeprowadzić podobne wyszukiwanie, ale z początkowym odgadnięciem odległości (więc zaczynasz od obszaru 10 km na 10 km, a jeśli nie masz wystarczającej liczby sklepów, rozszerzasz go na 20 km na 20 km itd.). W tej początkowej odległości zgadnij, ile raz obliczysz liczbę sklepów na całej powierzchni i wykorzystaj ją. Lub zaloguj liczbę potrzebnych zapytań i dostosuj się w czasie.
Dodałem pełny przykład kodu na powiązane pytanie Mike'a , a oto rozszerzenie, które daje ci najbliższe lokalizacje X (szybkie i ledwo przetestowane):
źródło
Najpierw potrzebujesz stołu, który wygląda mniej więcej tak:
... wypełnione dla każdego kodu pocztowego. Możesz rozwinąć tę kwestię, dodając pola miasta i województwa, jeśli chcesz spojrzeć w ten sposób.
Następnie do każdego sklepu można otrzymać kod pocztowy, a gdy trzeba obliczyć odległość, można dołączyć tabelę lat / long do danych sklepu.
Następnie zapytaj tę tabelę, aby uzyskać szerokość i długość geograficzną sklepu i kodów pocztowych użytkownika. Gdy go zdobędziesz, możesz wypełnić tablicę i przekazać ją do funkcji „Uzyskaj odległość”:
Ma to na celu sprawdzenie poprawności koncepcji, a nie kodu, który faktycznie poleciłbym zaimplementować. Na przykład, jeśli masz 10 000 sklepów, przeszukanie ich wszystkich, przejrzenie i posortowanie ich na każde żądanie byłoby dość kosztowną operacją.
źródło
Dokumentacja MySQL zawiera również informacje o rozszerzeniach przestrzennych. Co dziwne, standardowa funkcja distance () nie jest dostępna, ale sprawdź tę stronę: http://dev.mysql.com/tech-resources/articles/4.1/gis-with-mysql.html, aby uzyskać szczegółowe informacje na temat „konwertowania” dwie wartości POINT do REGLINP, a następnie obliczyć jego długość. ”
Pamiętaj, że każdy sprzedawca może oferować różne szerokości i długości geograficzne reprezentujące „centroid” kodu pocztowego. Warto również wiedzieć, że nie ma żadnych naprawdę zdefiniowanych plików „brzegowych” kodu pocztowego. Każdy sprzedawca będzie miał swój własny zestaw granic, które z grubsza odpowiadają konkretnym listom adresów, które składają się na kod pocztowy USPS. (Na przykład w niektórych „granicach” trzeba uwzględnić obie strony ulicy, w innych tylko jedną.) Obszary tabel ZCTA, powszechnie używane przez dostawców, „nie przedstawiają dokładnie obszarów dostarczania kodu pocztowego, i nie zawierają wszystkich kodów pocztowych używanych do dostarczania poczty ” http://www.census.gov/geo/www/cob/zt_metadata.html
Wiele firm w centrum będzie miało swój własny kod pocztowy. Będziesz potrzebować możliwie pełnego zestawu danych, więc upewnij się, że znajdziesz listę kodów pocztowych, która zawiera zarówno „punktowe” kody pocztowe (zwykle firmy), jak i „graniczne” kody pocztowe.
Mam doświadczenie w pracy z danymi kodu pocztowego z http://www.semaphorecorp.com/ . Nawet to nie było w 100% dokładne. Na przykład, kiedy mój kampus przyjął nowy adres pocztowy i nowy kod pocztowy, kod pocztowy został zgubiony. To powiedziawszy, to jedyne źródło danych, które znalazłem, że w ogóle Miałem nowy kod pocztowy, więc wkrótce po jego utworzeniu.
W mojej książce był przepis na dokładnie to, jak spełnić twoją prośbę ... w Drupal. Opierał się na module Narzędzi Map Google ( http://drupal.org/project/gmaps , nie należy mylić go z http://drupal.org/project/gmap , również godnym modułem). Możesz znaleźć pomocną próbkę kod w tych modułach, choć oczywiście nie będą działać po wyjęciu z pudełka w WordPress.
źródło