Tworzę niestandardową mapę Google, która ma 125 znaczników wykreślonych za pomocą cms. Podczas ładowania mapy otrzymuję ten komunikat:
Geokod nie powiódł się z następującego powodu: OVER_QUERY_LIMIT
Jestem prawie pewien, że w ten sposób geokodowałem znaczniki.
Jak mogę uniknąć tych ostrzeżeń i czy istnieje bardziej skuteczny sposób geokodowania wyników?
AKTUALIZACJA: To jest moja próba odpowiedzi Casey, właśnie dostaję pustą stronę.
<script type="text/javascript">
(function() {
window.onload = function() {
var mc;
// Creating an object literal containing the properties we want to pass to the map
var options = {
zoom: 10,
center: new google.maps.LatLng(52.40, -3.61),
mapTypeId: google.maps.MapTypeId.ROADMAP
};
// Creating the map
var map = new google.maps.Map(document.getElementById('map'), options);
// Creating a LatLngBounds object
var bounds = new google.maps.LatLngBounds();
// Creating an array that will contain the addresses
var places = [];
// Creating a variable that will hold the InfoWindow object
var infowindow;
mc = new MarkerClusterer(map);
<?php
$pages = get_pages(array('child_of' => $post->ID, 'sort_column' => 'menu_order'));
$popup_content = array();
foreach($pages as $post)
{
setup_postdata($post);
$fields = get_fields();
$popup_content[] = '<p>'.$fields->company_name.'</p><img src="'.$fields->company_logo.'" /><br /><br /><a href="'.get_page_link($post->ID).'">View profile</a>';
$comma = ", ";
$full_address = "{$fields->address_line_1}{$comma}{$fields->address_line_2}{$comma}{$fields->address_line_3}{$comma}{$fields->post_code}";
$address[] = $full_address;
}
wp_reset_query();
echo 'var popup_content = ' . json_encode($popup_content) . ';';
echo 'var address = ' . json_encode($address) . ';';
?>
var geocoder = new google.maps.Geocoder();
var markers = [];
// Adding a LatLng object for each city
for (var i = 0; i < address.length; i++) {
(function(i) {
geocoder.geocode( {'address': address[i]}, function(results, status) {
if (status == google.maps.GeocoderStatus.OK) {
places[i] = results[0].geometry.location;
// Adding the markers
var marker = new google.maps.Marker({position: places[i], map: map});
markers.push(marker);
mc.addMarker(marker);
// Creating the event listener. It now has access to the values of i and marker as they were during its creation
google.maps.event.addListener(marker, 'click', function() {
// Check to see if we already have an InfoWindow
if (!infowindow) {
infowindow = new google.maps.InfoWindow();
}
// Setting the content of the InfoWindow
infowindow.setContent(popup_content[i]);
// Tying the InfoWindow to the marker
infowindow.open(map, marker);
});
// Extending the bounds object with each LatLng
bounds.extend(places[i]);
// Adjusting the map to new bounding box
map.fitBounds(bounds)
} else {
alert("Geocode was not successful for the following reason: " + status);
}
});
})(i);
}
var markerCluster = new MarkerClusterer(map, markers);
}
})
();
</script>
Tak naprawdę nie ma znaczenia, jakie jest rozwiązanie, o ile markery ładują się natychmiast i nie łamie żadnych warunków.
google-maps
geocoding
Obrabować
źródło
źródło
Odpowiedzi:
Jak wszyscy inni, mógłbym dać ci odpowiedź z kodem, ale nie sądzę, żeby ktoś ci wytłumaczył, że robisz coś, co jest zasadniczo złe .
Dlaczego napotykasz ten błąd? Ponieważ wywołujesz geokod za każdym razem, gdy ktoś przegląda twoją stronę i nie zapisujesz wyników w pamięci podręcznej nigdzie!
Limit istnieje, aby zapobiegać nadużyciom ze strony zasobów Google (czy to dobrowolnie, czy niechętnie) - właśnie to robisz :)
Chociaż geokod Google'a jest szybki, gdyby wszyscy tak go używali, spowodowałoby to awarię serwerów. Powodem, dla którego istnieją tabele Google Fusion, jest wykonywanie dużych obciążeń po stronie serwera. Geokodowanie i buforowanie kafelków odbywa się na ich serwerach. Jeśli nie chcesz tego używać, powinieneś buforować je na swoim serwerze.
Jeśli nadal 2500 żądań dziennie to za mało, musisz spojrzeć na licencję Google Maps Premier (płatną), która daje 100 000 żądań geokodowania dziennie za około 10 000 rocznie (to dużo - przy buforowaniu po stronie serwera powinieneś nie osiągać tego limitu, chyba że jesteś dużą witryną lub wykonujesz intensywne przetwarzanie danych). Bez buforowania po stronie serwera i korzystania z obecnego podejścia będziesz w stanie wykonać 800 odsłon dziennie!
Gdy zdasz sobie sprawę, że inni dostawcy naliczają opłaty za geokod , zrozumiesz, że powinieneś buforować wyniki w bazie danych. Przy takim podejściu kosztowałby około 10 centów amerykańskich za wyświetlenie strony!
Twoje pytanie brzmi: czy możesz obejść limit przepustnicy, który daje ci Google? Pewnie. Wystarczy złożyć wniosek z różnych adresów IP. Heck, możesz proxy połączeń za pośrednictwem elastycznego IPA Amazon i zawsze będziesz mieć nowe świeże 2500 przydzielonych połączeń. Ale oczywiście, oprócz tego, że jest nielegalny (skutecznie obchodzisz ograniczenia nałożone przez warunki korzystania z Google Maps), robisz włamanie, aby wyeliminować nieodłączną wadę projektową, którą masz w swoim systemie.
Więc jaki jest właściwy sposób dla tego przypadku użycia? Zanim zadzwonisz do Google Geocode API, wyślij go na swój serwer i zapytaj, czy znajduje się w pamięci podręcznej. Jeśli nie jest, należy wywołać geokod, zapisać go w pamięci podręcznej i zwrócić wynik.
Istnieją inne podejścia, ale to powinno zacząć od właściwego kierunku.
Aktualizacja: z poniższych komentarzy wynika, że używasz PHP, więc oto przykład kodu, jak to zrobić poprawnie (zalecenie samego zespołu Google) https://developers.google.com/maps/articles/phpsqlsearch_v3
źródło
Myślę, że Sasa ma rację pod każdym względem.
Jeśli chodzi o wysyłanie wszystkich adresów jednocześnie, jedną z opcji jest wysyłanie żądań w odstępach czasu. W przeszłości, gdy korzystałem z JavaScript, wybrałem opóźnianie żądań o 0,25 (wydaje się, że działa!) Sekund przy użyciu
metoda.
W .NET wybrałem:
Wydaje się działać.
EDYCJA: Nie mogę tego naprawdę przetestować, ale to powinno / może działać!
Przykład Javascript. AddressArray przechowuje ciągi, które są adresami ...
EDYTOWAĆ:
źródło
Wygląda na to, że osiągasz limit równoczesnych żądań nałożony przez Google (chociaż nie mogę znaleźć odniesienia do tego, jaki jest limit). Będziesz musiał rozdzielić swoje żądania, aby nie wysłać jednocześnie 125 wniosków. Pamiętaj, że istnieje również limit 2500 żądań geokodów dziennie.
Aby uzyskać więcej informacji, zapoznaj się z dokumentem Google Geocoding Strategies .
Aktualizacja: Jako dodatkowe rozwiązanie zainspirowane postem Mapperza, możesz pomyśleć o utworzeniu nowej tabeli Google Fusion , przechowywaniu adresu i wszelkich powiązanych danych w tabeli oraz geokodowaniu tabeli za pomocą interfejsu internetowego. Istnieje ograniczenie liczby żądań geokodów, które będzie generować Tabela Fusion, jednak limit jest dość duży. Po osiągnięciu limitu konieczne będzie ponowne przesłanie żądania geokodu, a tabele syntezy zaczną od miejsca, w którym zostało przerwane. Dodatkową zaletą tego podejścia jest ogromna poprawa prędkości, ponieważ wystarczy geokodować RAZ, a przy obecnym rozwiązaniu trzeba geokodować przy każdym obciążeniu, szybko osiągając dzienne limity.
źródło
Oto jak dławię moje żądania geokodu w javascript, adresy są tablicą zawierającą każdy adres do geokodu:
Zasadniczo dodaje to drugą i połowę między każdym żądaniem geokodowania.
źródło
Próbowałem już teraz strony i wydaje się, że teraz działa .
Chociaż uważam, że podejście z timerem, którego obecnie używasz, jest prawidłowe i o ile wiem, jedyne, które będzie działać bez wymagającego wsparcia po stronie serwera, powinienem zasugerować następujące zmiany (mogłem przepisać twoje funkcje geokodowania) skorzystać z localStorage .
Lokalny magazyn to stosunkowo nowa technologia wbudowana w większość przeglądarek, która pozwala stronie internetowej przechowywać dane na kliencie. Jest nieco podobny do plików cookie, ale ma znacznie większą moc i nie zawsze jest ponownie wysyłany do serwera (w przeciwieństwie do plików cookie).
Moim celem jest zapisanie adresu geokodowanego na kliencie, aby w przypadku odświeżenia strony przez użytkownika nie było potrzeby ponownego wywoływania na nim funkcji geokodera Google. Poniższa implementacja jest prymitywna (powinniśmy dodać kod, aby sprawdzić nieaktualne rekordy i prawdopodobnie potrzebujemy lepszego klucza buforowania niż indeks), ale powinno wystarczyć, aby zacząć. Mam nadzieję, że to pomoże.
źródło
za pomocą geokoderów geopoli jestem w stanie geokodować dużą liczbę adresów bez żadnych problemów (nie jestem pewien konfiguracji plakatów lub czy może on uwzględnić zależność Pythona od swojego projektu)
oto mój test:
To wciąż działa i mam 7000 wyników.
EDYCJA: Po chwili dotarłem do końca ulicy, a Google zaczął dawać mi te same punkty, ale wygląda na to, że wciąż wysyła prośby i udziela dokładnych odpowiedzi.
źródło
Ta funkcja php (nie wiem w jakim języku pracujesz, ale na pewno możesz go rozdzielić) używa Google Geolocator API. Podany adres zwróci znormalizowany adres i dłuższy. HTH.
źródło
Właśnie zobaczyłem twoje zapytanie. Możesz wypróbować następujący kod. W części sprawdzania statusu geokodu w innym przypadku, wywołuj rekurencyjnie tę samą funkcję z odstępem czasu dla utraconych adresów.
źródło
Oto moje rozwiązanie:
zależności: Gmaps.js, jQuery
źródło
Nie możesz ominąć limitu geokodów mapy Google: musisz uzyskać i przechowywać informacje LatLng .
Jeśli masz kilka miast i nie chcesz ręcznie uzyskać LatLng, możesz użyć limitu czasu, aby stopniowo wywołać geocoder.geocode i zapisać informacje w obiekcie javascript, a następnie użyć,
console.log(JSON.stringify(object, null, 4));
aby uzyskać w konsoli ładny obiekt drukowany, więc dla przykładwięc teraz możesz dodać znacznik za pomocą
locationsPosition["Johannesburg - ZA"].lat
i.lng
źródło
Wygląda na to, że musisz zrobić jedną z dwóch rzeczy:
Jak ludzie wspominali wiele razy, ale nie mam osobistego doświadczenia, wydaje się, że licencja Google na 100 tys. Dziennie to około 10 tys. USD rocznie.
Jeśli chcesz mieć ten sam poziom dokładności lub lepszy (i nie musisz płacić tej ceny), możesz wypróbować naszą usługę. Za dużo mniej niż Google (prawie dziesiąty koszt) możesz uzyskać limit znacznie wyższy niż 2500 (nasz najniższy limit to 25 tys. Dziennie).
Oczywiście korzystając z naszego API płatnego geokodowania nie jest rozwiązaniem, które 100% uczciwości, nawet jeśli przyznanie się do tego nie jest rozsądne z biznesowego punktu widzenia. Zamiast tego sugeruję skorzystanie z opcji 1, zoptymalizowanie usługi do buforowania. Chyba że potrzebujesz więcej niż 2500 UNIKALNYCH geokodów na dzień.
Oświadczenie : Pracuję dla Geocode Farm (usługa, którą polecam).
źródło