Я создаю пользовательскую карту Google, которая имеет 125 маркеров, нанесенных с помощью CMS. При загрузке карты я получаю это сообщение:
Геокод не был успешным по следующей причине: OVER_QUERY_LIMIT
Я уверен, что именно так я геокодировал маркеры.
Как я могу избежать этих предупреждений и есть ли более эффективный способ геокодирования результатов?
ОБНОВЛЕНИЕ: Это моя попытка ответа Кейси, я сейчас получаю пустую страницу.
<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>
Неважно, какое решение используется, если маркеры загружаются мгновенно и не нарушают никаких условий.
google-maps
geocoding
обкрадывать
источник
источник
Ответы:
Как и все остальные, я мог бы дать вам ответ с кодом, но я не думаю, что кто-то объяснил вам, что вы делаете что-то, что в корне неправильно .
Почему вы нажали эту ошибку? Потому что вы вызываете геокод каждый раз, когда кто-то просматривает вашу страницу, и вы нигде не кэшируете свои результаты в БД!
Причина, по которой существует ограничение, состоит в том, чтобы предотвратить злоупотребление ресурсами Google (будь то добровольно или неохотно) - именно это вы и делаете :)
Несмотря на то, что геокод Google работает быстро, если бы все использовали его таким образом, его серверы были бы отключены. Причина, по которой существуют Google Fusion Tables, заключается в том, чтобы сделать большую часть тяжелой работы на стороне сервера для вас. Геокодирование и кэширование тайлов осуществляется на их серверах. Если вы не хотите использовать это, вы должны кэшировать их на своем сервере.
Если 2500 запросов в день - это слишком мало, вам нужно взглянуть на Профессиональную (платную) лицензию Google Maps, которая дает 100 000 запросов геокодирования в день, что обходится примерно в 10 тыс. В год (это много - при кэшировании на стороне сервера вам следует не достигните этого предела, если вы не являетесь каким-то огромным сайтом или занимаетесь интенсивной обработкой данных). Без кеширования на стороне сервера и использования вашего текущего подхода вы сможете делать только 800 просмотров страниц в день!
Как только вы поймете, что другие провайдеры взимают плату за геокод , вы поймете, что вам следует кэшировать результаты в БД. При таком подходе это будет стоить вам около 10 центов США за просмотр страницы!
Ваш вопрос: можете ли вы обойти ограничение газа, которое дает вам Google? Конечно. Просто сделайте запрос с разных ip адресов. Черт возьми, вы можете использовать прокси-вызовы через amazonastic ips и всегда иметь новые свежие 2500 выделенных вызовов. Но, конечно, помимо того, что вы незаконны (вы фактически обойдете ограничения, наложенные на вас условиями обслуживания Google Maps), вы будете совершать хакерские атаки, чтобы устранить недостатки, присущие вашей системе.
Так каков правильный путь для этого варианта использования? Прежде чем вызывать API геокодирования Google, отправьте его на свой сервер и запросите, находится ли он в вашем кэше. Если это не так, вызовите геокод, сохраните его в кеше и верните результат.
Есть и другие подходы, но это должно привести вас в правильном направлении.
Обновление: из ваших комментариев ниже сказано, что вы используете PHP, так что вот пример кода о том, как это сделать правильно (рекомендация самой команды Google) https://developers.google.com/maps/articles/phpsqlsearch_v3
источник
Я думаю, что Саша прав в обоих отношениях.
С точки зрения отправки всех ваших адресов одновременно, одним из вариантов является отправка запросов с интервалами. В прошлом при использовании JavaScript я предпочитал задерживать запросы на 0,25 (кажется, работает!) Секунды, используя
метод.
В .NET я выбрал:
Кажется, работает.
РЕДАКТИРОВАТЬ: Не могу проверить это, но это должно / может работать!
Пример Javascript. AddressArray содержит строки, которые являются адресами ...
РЕДАКТИРОВАТЬ:
источник
Похоже, вы достигли лимита одновременных запросов, установленного Google (хотя я не могу найти ссылку на то, каков этот предел на самом деле). Вам нужно будет распределить свои запросы так, чтобы вы не отправляли 125 запросов одновременно. Обратите внимание, что существует также ограничение в 2500 геокодов в день.
Обратитесь к документу Google Geocoding Strategies для получения дополнительной информации.
Обновление. В качестве дополнительного решения, вдохновленного публикацией Mapperz, вы можете подумать о создании новой таблицы Google Fusion , сохранении вашего адреса и любых связанных данных в таблице и геокодировании таблицы через их веб-интерфейс. Существует ограничение на количество запросов геокодов, которые Fusion Table делает, однако это ограничение довольно велико. Как только вы достигнете предела, вам нужно будет повторно отправить запрос геокода, и Fusion Tables определит, где он остановился. Преимуществом этого подхода является значительное улучшение скорости, поскольку вам нужно только геокодировать ОДИН РАЗ, где с вашим текущим решением вам нужно будет геокодировать каждую нагрузку, быстро достигая суточных пределов.
источник
Вот как я регулирую свои запросы геокодирования в javascript, адреса - это массив, содержащий каждый адрес геокодирования:
Это по существу добавляет секунду и половину между каждым запросом геокодирования.
источник
Я попробовал страницу сейчас, и она, кажется, работает прямо сейчас .
Хотя я думаю, что таймерный подход, который вы используете в настоящее время, является правильным и, насколько мне известно, единственный, который будет работать без какой-либо поддержки на стороне сервера, я должен предложить следующие изменения (я позволил себе переписать ваши функции геокодирования) воспользоваться преимуществами localStorage .
LocalStorage - это относительно новая технология, встроенная в большинство браузеров, которая позволяет веб-странице хранить данные на клиенте. Он чем-то похож на куки, но он намного мощнее и не всегда отправляется на сервер (в отличие от куки).
Моя цель - сохранить геокодированный адрес на клиенте, чтобы в случае, если пользователь обновляет страницу, нет необходимости снова вызывать функции геокодера Google на них. Реализация, приведенная ниже, является грубой (нам нужно добавить код для проверки устаревших записей и, возможно, нужен лучший ключ для кэширования, чем индекс), но этого должно быть достаточно для начала работы. Надеюсь, это поможет.
источник
используя геопо геокодеры, я могу геокодировать большое количество адресов без заминки (я не уверен в настройке постеров, или если он может включить зависимость python в свой проект)
вот мой тест:
Это все еще работает, и я с 7k результатов.
РЕДАКТИРОВАТЬ: Через некоторое время я достиг конца улицы, и Google начал давать мне те же очки, но похоже, что он все еще делает запросы и дает мне точные ответы.
источник
Эта функция PHP (я не знаю, на каком языке вы работаете, но вы можете выбрать его отдельно), использует API Google Geolocator. Учитывая адрес, он вернет нормализованный адрес и долготу. НТН.
источник
Только сейчас увидел ваш запрос. Вы можете попробовать следующий код. В другой части проверки состояния геокода рекурсивно вызовите ту же функцию с временным интервалом для потерянных адресов.
источник
Вот мое решение:
зависимости: Gmaps.js, jQuery
источник
Вы не можете избежать ограничения геокодирования карты Google: вы должны получать и хранить информацию LatLng .
Если у вас несколько городов и вы не хотите вручную получать LatLng, вы можете использовать тайм-аут, чтобы постепенно вызвать geocoder.geocode и сохранить информацию в объекте javascript, а затем использовать
console.log(JSON.stringify(object, null, 4));
для получения в консоли симпатичный печатный объект, поэтому для примертак что теперь вы можете добавить маркер, используя
locationsPosition["Johannesburg - ZA"].lat
и.lng
источник
Похоже, вам нужно сделать одну из двух вещей:
Как люди уже упоминали много раз, но у меня нет личного опыта, кажется, что лицензия Google на 100 тыс. В день составляет около 10 тыс. Долларов в год.
Если вам нужен такой же уровень точности или лучше (и вам не нужно платить эту цену), вы можете попробовать наш сервис. Для гораздо меньшего, чем Google (почти в 10 раз меньше), вы можете получить намного более высокий лимит, чем 2500 (наш самый низкий лимит - 25 КБ / день).
Конечно, использование нашего платного API геокодирования не является решением, которое я бы порекомендовал быть на 100% честным, даже если это плохой бизнес-смысл. Вместо этого я бы предложил перейти к варианту 1: оптимизировать службу для кэширования. Если вам не нужно более 2500 уникальных геокодов в день.
Отказ от ответственности : я работаю в Geocode Farm (сервис, который я рекомендую).
источник