Saya membuat peta google khusus yang memiliki 125 marker diplot melalui cms. Saat memuat peta saya menerima pesan ini:
Geocode tidak berhasil karena alasan berikut: OVER_QUERY_LIMIT
Saya cukup yakin itu adalah cara penanda geocode saya.
Bagaimana saya bisa menghindari peringatan ini dan apakah ada cara yang lebih efisien untuk melakukan geocode pada hasilnya?
UPDATE: Ini adalah usaha saya pada jawaban Casey, saya hanya mendapatkan halaman kosong saat ini.
<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>
Tidak masalah apa solusinya selama marker memuat secara instan dan tidak melanggar syarat & ketentuan apa pun.
google-maps
geocoding
rampok
sumber
sumber
Jawaban:
Seperti orang lain, saya dapat memberi Anda jawaban dengan kode, tetapi saya tidak berpikir seseorang telah menjelaskan kepada Anda bahwa Anda melakukan sesuatu yang secara fundamental salah .
Mengapa Anda memukul kesalahan ini? Karena Anda memanggil geocode setiap kali seseorang melihat halaman Anda dan Anda tidak melakukan caching di mana pun di db!
Alasan yang membatasi ada adalah untuk mencegah penyalahgunaan dari sumber daya Google (apakah itu mau atau tidak mau) - yang persis apa yang Anda lakukan :)
Meskipun geocode google cepat, jika semua orang menggunakannya seperti ini, itu akan menurunkan server mereka. Alasan mengapa Google Fusion Tables ada adalah untuk melakukan banyak mengangkat sisi server yang berat untuk Anda. Caching geocoding dan ubin dilakukan di server mereka. Jika Anda tidak ingin menggunakannya, maka Anda harus menyimpannya di server Anda.
Jika masih, 2500 permintaan sehari terlalu sedikit, maka Anda harus melihat lisensi Google Maps Premier (berbayar) yang memberi Anda 100.000 permintaan geocoding per hari untuk sesuatu sekitar 10rb setahun (itu banyak - dengan caching sisi server Anda harus tidak akan mencapai batas ini kecuali jika Anda adalah situs besar atau sedang melakukan pemrosesan data berat). Tanpa caching sisi server dan menggunakan pendekatan Anda saat ini, Anda hanya dapat melakukan 800 tampilan halaman sehari!
Setelah Anda menyadari bahwa penyedia lain membebankan biaya per geocode , Anda akan memahami bahwa Anda harus menyimpan hasilnya di db. Dengan pendekatan ini, Anda akan dikenakan biaya sekitar 10 sen AS per tampilan halaman!
Pertanyaan Anda adalah, bisakah Anda mengatasi batasan throttle yang Google berikan kepada Anda? Yakin. Buat saja permintaan dari berbagai alamat ip. Heck, Anda bisa proksi panggilan melalui ips amazon elastis dan akan selalu memiliki 2500 panggilan baru yang dialokasikan. Tapi tentu saja, selain ilegal (Anda secara efektif menghindari pembatasan yang diberikan kepada Anda oleh persyaratan layanan Google Maps), Anda akan melakukan peretasan untuk menutupi cacat desain bawaan yang Anda miliki di sistem Anda.
Jadi apa cara yang benar untuk kasus penggunaan itu? Sebelum Anda memanggil api geocode google, kirim ke server Anda dan permintaan jika ada di cache Anda. Jika tidak, panggil geocode, simpan di cache Anda dan kembalikan hasilnya.
Ada beberapa pendekatan lain, tetapi ini harus membantu Anda memulai ke arah yang benar.
Pembaruan: Dari komentar Anda di bawah ini, dikatakan Anda menggunakan PHP, jadi di sini ada contoh kode tentang cara melakukannya dengan benar (rekomendasi dari tim Google sendiri) https://developers.google.com/maps/articles/phpsqlsearch_v3
sumber
Saya pikir Sasa benar, dalam kedua hal.
Dalam hal mengirim semua alamat Anda sekaligus, satu opsi adalah mengirim permintaan secara berkala. Di masa lalu ketika menggunakan JavaScript saya telah memilih untuk menunda permintaan dengan 0,25 (tampaknya berfungsi!) Detik menggunakan
metode.
Di .NET saya telah memilih:
Tampaknya bekerja.
EDIT: Tidak bisa mengujinya, tetapi ini harus / mungkin berhasil!
Contoh Javascript. AddressArray menyimpan string yang merupakan alamat ...
EDIT:
sumber
Sepertinya Anda mencapai batas permintaan simultan yang diberlakukan oleh Google (meskipun saya tidak dapat menemukan referensi tentang batas sebenarnya). Anda perlu mengosongkan permintaan Anda sehingga Anda tidak mengirim 125 permintaan sekaligus. Perhatikan bahwa ada juga batas 2.500 permintaan geocode per hari.
Konsultasikan dokumen Strategi Geocoding Google untuk informasi lebih lanjut.
Pembaruan: Sebagai solusi tambahan yang diilhami berkat pos oleh Mapperz, Anda dapat berpikir tentang membuat Google Fusion Table baru , menyimpan alamat Anda dan data terkait apa pun dalam tabel, dan melakukan geocoding tabel melalui antarmuka web mereka. Ada batasan jumlah permintaan geocode yang akan dibuat Tabel Fusion, namun batasnya cukup besar. Setelah Anda mencapai batas, Anda harus mengirimkan kembali permintaan geocode, dan Fusion Tables akan mengambil di mana permintaan itu ditinggalkan. Bonus untuk pendekatan ini adalah peningkatan kecepatan yang sangat besar, karena Anda hanya perlu melakukan geocode ONCE, di mana dengan solusi Anda saat ini, Anda perlu melakukan geocode pada setiap beban, dengan cepat mencapai batas harian.
sumber
Berikut adalah cara saya membatasi permintaan geocode saya di javascript, alamat menjadi array yang berisi setiap alamat ke geocode:
Ini pada dasarnya menambahkan setengah kedua antara setiap permintaan geocoding.
sumber
Saya sudah mencoba halamannya sekarang dan sepertinya berfungsi sekarang .
Sementara saya pikir pendekatan timer yang saat ini Anda gunakan sudah benar dan sejauh yang saya tahu satu-satunya yang akan bekerja tanpa memerlukan dukungan sisi server saya harus menyarankan perubahan berikut (saya mengambil kebebasan menulis ulang fungsi geocoding Anda) untuk memanfaatkan Penyimpanan lokal .
LocalStorage adalah teknologi yang relatif baru yang dibangun di sebagian besar browser yang memungkinkan halaman web untuk menyimpan data pada klien. Ini agak mirip dengan cookie, tetapi jauh lebih kuat dan tidak selalu membenci server (tidak seperti cookie).
Tujuan saya adalah untuk menyimpan alamat yang di-geocode pada klien sehingga jika pengguna me-refresh halaman tidak perlu lagi memanggil fungsi geocoder Google pada mereka. Implementasi di bawah ini kasar (kita harus menambahkan kode untuk memeriksa catatan basi dan mungkin perlu kunci caching yang lebih baik daripada indeks) tetapi harus cukup untuk membantu Anda memulai. Semoga ini bisa membantu.
sumber
menggunakan geopy geocoder saya dapat melakukan geocode sejumlah besar alamat tanpa hambatan (saya tidak yakin tentang pengaturan poster, atau jika ia dapat menyertakan ketergantungan python ke proyeknya)
ini tes saya:
Ini masih berjalan dan saya dengan hasil 7k.
EDIT: Setelah beberapa saat saya telah memukul ujung jalan dan google mulai memberi saya poin yang sama, tetapi sepertinya itu masih membuat permintaan dan memberi saya jawaban yang akurat.
sumber
Fungsi php ini (saya tidak tahu bahasa tempat Anda bekerja, tetapi Anda dapat memilihnya secara terpisah) menggunakan google geolocator api. Diberikan alamat, itu akan mengembalikan alamat dinormalisasi dan latlong. HTH.
sumber
Baru saja melihat permintaan Anda. Anda dapat mencoba kode berikut. Pada bagian lain, periksa status status geocode, panggil fungsi yang sama dengan jarak waktu untuk alamat yang hilang.
sumber
Ini solusinya:
dependensi: Gmaps.js, jQuery
sumber
Anda tidak dapat menghindari batas geocode google map: Anda harus mendapatkan dan menyimpan informasi LatLng .
Jika Anda memiliki beberapa kota dan Anda tidak ingin mendapatkan LatLng secara manual, Anda dapat menggunakan batas waktu untuk memanggil geocoder.geocode dan menyimpan informasi di dalam objek javascript secara progresif dan kemudian menggunakan
console.log(JSON.stringify(object, null, 4));
untuk mendapatkan objek tercetak yang cukup dicetak di konsol, jadi, untuk contohjadi sekarang Anda dapat menambahkan penanda menggunakan
locationsPosition["Johannesburg - ZA"].lat
dan.lng
sumber
Sepertinya Anda perlu melakukan satu dari dua hal:
Seperti yang telah disebutkan orang berkali-kali, tetapi saya tidak memiliki pengalaman pribadi dengan, tampaknya lisensi Google untuk 100rb per hari adalah sekitar $ 10rb USD per tahun.
Jika Anda menginginkan tingkat akurasi yang sama atau lebih baik (dan tidak harus membayar harga itu), Anda dapat mencoba layanan kami. Untuk jauh lebih sedikit daripada Google (hampir 10 biaya), Anda bisa mendapatkan batas yang jauh lebih tinggi dari 2500 (batas terendah kami adalah 25rb / hari).
Tentu saja, menggunakan API Geocoding Berbayar kami bukan solusi yang saya rekomendasikan untuk 100% jujur, meskipun itu masuk akal untuk mengakui hal itu. Saya malah menyarankan pergi dengan opsi 1, mengoptimalkan layanan Anda ke cache. Kecuali jika Anda membutuhkan lebih dari 2500 geocode UNIK per hari.
Penafian : Saya bekerja untuk Geocode Farm (layanan yang saya rekomendasikan).
sumber