Menghindari batas geocode Google Maps?

32

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.

rampok
sumber
Anda tidak mengatakan mengapa atau seberapa sering Anda melakukan pencarian ini. Anda tidak mencoba melakukan geocode pada poin yang sama setiap halaman render, bukan? Jika itu masalahnya Anda harus melihat menggunakan api untuk melakukan sisi server pencarian ini hanya sekali, ketika lokasi pertama kali ditambahkan ke database.
Peter
Jika Anda ingin mencoba saran @ Peter, ada alat sederhana di sini yang akan melakukan geocode poin dalam spreadsheet Google. Ini akan memungkinkan Anda menulis lat / long untuk kota-kota ke dalam CMS, jadi Anda tidak perlu menggunakan geocoder saat run-time.
Stephen Lead
@ Peter Sebenarnya itu terdengar seperti ide bagus. Saya sedikit sobek karena akan mengurangi kegunaan cms saya. Jika klien harus mencari tahu lat / long per perusahaan daripada hanya memasukkan alamat maka itu tidak sangat ramah pengguna. Apakah saya memahaminya dengan benar?
Rob
Lihat jawaban baru saya di bagian bawah untuk fungsi php.
Peter
2
@rob FWIW Saya pikir Ragi memiliki pendekatan yang tepat. Jawaban Casey masih mengharuskan Anda melakukan geocode setiap titik, setiap kali peta menarik, yang tampaknya tidak diperlukan untuk dataset statis Anda
Stephen Lead

Jawaban:

57

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

Ragi Yaser Burhum
sumber
Apakah Anda punya contoh yang bisa saya ikuti mengirimnya ke server dll?
Rob
Apa CMS backend Anda? (Saya berasumsi Anda bisa / tahu bagaimana mengubahnya dan hanya ingin contoh sederhana yang menunjukkan bagaimana melakukannya dalam bahasa pilihan Anda. Anda tidak perlu contoh klien sisi js, atau apakah Anda? Apakah Anda menggunakan js kerangka kerja seperti jquery?
Ragi Yaser Burhum
Selain itu, Anda harus memberikan lebih banyak konteks tentang bagaimana data marker masuk ke sistem Anda di tempat pertama
Ragi Yaser Burhum
1
BAIK. Php. Bit dari Dokumentasi Google ini harus mencakup bagian mysql dan php code.google.com/apis/maps/articles/phpsqlgeocode.html
Ragi Yaser Burhum
1
Lihat 10.1.3 (b) untuk perincian tentang jenis caching apa yang diizinkan. developers.google.com/maps/terms#section_10_12
Paul Ramsey
14

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

setTimeout( [FUNCTION CALL] , 250 )

metode.

Di .NET saya telah memilih:

System.Threading.Thread.Sleep(250);

Tampaknya bekerja.

EDIT: Tidak bisa mengujinya, tetapi ini harus / mungkin berhasil!

Contoh Javascript. AddressArray menyimpan string yang merupakan alamat ...

for (var i = 0; i < addressArray.length; i++0 
{

setTimeout('googleGeocodingFunction(' + addressArray[i] + ')' , 250);

}

EDIT:

for (var i = 0; i < address.length; i++) {
    function(i) {
        setTimeout(geocoder.geocode({ 'address': address[i] }, function(results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                places[i] = results[0].geometry.location;

                var marker = new google.maps.Marker({ position: places[i], map: map });
                markers.push(marker);
                mc.addMarker(marker);
                google.maps.event.addListener(marker, 'click', function() {
                    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 all coordinates 
                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);
            }
        }), 250);// End of setTimeOut Function - 250 being a quarter of a second. 
    } 
}
CatchingMonkey
sumber
Terima kasih balasannya. Bagaimana saya bisa memasukkannya ke dalam kode saya. Ini semua agak baru sehingga perlu dipegang. Anda harus dapat melihat kode sumber saya.
Rob
Bit yang mana? Bahasa apa yang Anda gunakan?
CatchingMonkey
Saya menggunakan javascript, bagaimana saya bisa mengatur interval?
Rob
Mengedit jawaban saya.
CatchingMonkey
Disebutkan juga maksud saya setTimeout () ... Terima kasih Casey.
CatchingMonkey
9

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.

Sasa Ivetic
sumber
Saya kira saya akan mencapai batasnya, saya sangat baru dalam hal ini sehingga saya pikir saya perlu contoh kode untuk membantu.
Rob
Saya telah mencari di Tabel Fusion Google dan menemukan beberapa masalah. 1. Anda harus secara manual membuat geocode alamat (via file-> geocode) dalam tabel, dapatkah ini dilakukan secara otomatis? 2. Beberapa penanda hanya muncul pada level zoom tertentu sementara yang lain menunjukkan level zoom apa pun. Ini adalah contohnya - mediwales.com/mapping/example. Apa yang akhirnya ingin saya lakukan adalah mengekspor data Wordpress saya (yaitu semua alamat perusahaan) ke tabel fusi, melakukan geocode secara otomatis kemudian mengambil semua alamat yang di-geocode dan memplot peta secara instan.
Rob
7

Berikut adalah cara saya membatasi permintaan geocode saya di javascript, alamat menjadi array yang berisi setiap alamat ke geocode:

for (i=0;i<=addresses.length;i++) {
    setTimeout( function () {
            geocoder.geocode( { 'address': addresses[i]}, function(results, status) {

                if (status == google.maps.GeocoderStatus.OK) { 

                    //create and add marker to map based off geocode result
                    var marker = new google.maps.Marker({  
                        map: map,
                        title: results[0].formatted_address,
                        position: results[0].geometry.location
                    });

                 } //EDIT, was missing the closing bracket here
            });

    }, i * 1500);
}

Ini pada dasarnya menambahkan setengah kedua antara setiap permintaan geocoding.

Casey
sumber
Terima kasih atas jawabannya. Saya terus mendapatkan halaman kosong ketika mencoba mengintegrasikan ke dalam kode saya - mediwales / mapping
Rob
Apakah Anda menggunakan alat debugging yang bisa menunjukkan kesalahan? Jika tidak, coba gunakan plugin FireFox firebug. Ini bisa sangat berguna dalam situasi seperti ini.
Casey
Saya tidak tidak. Saya tidak yakin saya meletakkan kode di tempat yang tepat, saya akan memperbarui pertanyaan saya dengan upaya saya.
Rob
Saya kehilangan braket penutup dalam contoh kode saya. Saya mengedit jawaban saya dan menambahkannya, dengan komentar. Namun, sepertinya ini bukan masalah dalam kode sampel Anda. Apakah Anda mendapatkan halaman kosong atau peta kosong? Halaman kosong akan menunjukkan ada kesalahan sintaksis dalam kode javascript. Peta kosong (tanpa penanda) akan menunjukkan bahwa kode geocoding mengalami masalah.
Casey
1
Hai. Saya sudah mencoba lagi jawaban Anda. Penundaan berfungsi saat ini tetapi tidak dapat membuat penanda untuk merencanakan. Dari kode saya ini adalah bit penting yang memplot penanda - (function (i) {and}) (i); tanpa itu ia tidak akan merencanakan, bahkan tanpa menambahkan penundaan.
Rob
5

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.

(function() { 

window.onload = function() { 
 var mc;
// Creating an object literal containing the properties we want to pass to the map 
var options = { 
zoom: 0, maxZoom: 0, 
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);
var popup_content = [..redacted..];

var geocoder = new google.maps.Geocoder(); 

var markers = [];

// Adding a LatLng object for each city 
function geocodeAddress(i) {
     // check if localStorage is available (it is now available on most modern browsers)
     // http://html5tutorial.net/tutorials/working-with-html5-localstorage.html
     // NB: this *must* be improved to handle quota limits, age/freshness, etc
     if(localStorage && localStorage['address_'+i]) {
        places[i]=JSON.parse(localStorage['address_'+i]);
        addPlace(i);
     } else {
      geocoder.geocode( {'address': address[i]}, function(results, status) {
        if (status == google.maps.GeocoderStatus.OK) {
            places[i] = results[0].geometry.location;
            if(localStorage) {
               // cache result locally on the browser, this will help reducing the number of requests
               // to the google geocoder in case the user refreshes the page
               // remember: the more he will refresh, the more he's likely to hit the limit
               // (this is one case where refreshing or closing the browser does not work)
               localStorage['address_'+i]=JSON.stringify(results[0].geometry.location);
            }

            addPlace(i);
        } else { 
            console.log("Geocoding of address "+address[i]+" failed");
        }
    })
}

function addPlace(i) {
    // 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);
}

function geocode() {
    if (geoIndex < address.length) {
        geocodeAddress(geoIndex);
        ++geoIndex;
    }
    else {
        clearInterval(geoTimer);
    }
}
var geoIndex = 0;
var geoTimer = setInterval(geocode, 600);  // 200 milliseconds (to try out)

var markerCluster = new MarkerClusterer(map, markers); 
} 
})
(); 
unicoletti
sumber
Terima kasih banyak, hanya mencoba sesuatu yang lain tetapi akan mencobanya sebentar lagi. Kedengarannya seperti ide yang bagus.
Rob
Baru saja mencobanya (sekarang telah kembali ke sebelumnya), itu bekerja pertama kali kemudian ketika saya menyegarkannya hanya menunjukkan halaman kosong.
Rob
coba sekarang, ada kesalahan, juga harap dicatat bahwa variabel popup_content telah dihapus untuk singkatnya.
unicoletti
3

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:

from geopy import geocoders

g = geocoders.GoogleV3()  #https://geopy.readthedocs.io/en/latest/#geopy.geocoders.GoogleV3

for x in xrange(1,10000):
    print x
    a = g.geocode("AV JOAO NAVES DE AVILA " + str(x) + " UBERLANDIA MG BRASIL")
    print a

cuplikan hasil

7595 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7595 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brasil, '(-18.9388154, -48.2220562))

7596 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7596 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brasil, '(-18.938814, -48.2217423))

7597 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7597 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brasil, '(-18.9388128, -48.2220381))

7598 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7598 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brasil, '(-18.9388114, -48.2217242))

7599 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7599 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-288, Brasil, '(-18.9388102, -48.2220201))

7600 (u'Av. Jo \ xe3o Naves de \ xc1vila, 7600 - Segismundo Pereira, Uberl \ xe2ndia - Minas Gerais, 38408-680, Brasil, '(-18.9388088, -48.2217062))

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.

George Silva
sumber
Geopy bukan sihir, batasan penggunaan masih berlaku.
alphabetasoup
1

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.

// GEOLOCATEBYADDRESS
// @arg (string)address
// @return (array) ((int)flag,(array)address,array(rawresponse))

function geolocatebyaddress($lookupaddress){

    $lookupaddress=trim("$lookupaddress New Zealand");
    $lookupaddress=urlencode($lookupaddress);

    //send off google api lookup request
    $apiurl="http://maps.google.com/maps/api/geocode/json";
    $apiurl.="?address=$lookupaddress";
    $apiurl.="&region=NZ";
    $apiurl.="&sensor=false";

    if (function_exists("curl_init")) {
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $apiurl);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $json = curl_exec($ch);
        curl_close($ch);
    }
    else     $json= file_get_contents($apiurl);

    //process response
    $response= json_decode($json,true);
    $approxflag=0;
    if ($response['status']=='OK' and count($response['results'])) {

        $aa= array();
        foreach($response['results'] as $cc=>$result) {
            //set keys
            foreach(array('street_number','road','suburb','city','postcode','region','lat','long') as $t){
                $aa[$cc][$t]='';
            }
            if ($result['geometry']){
                $aa[$cc]['lat']= $result['geometry']['location']['lat'];
                $aa[$cc]['long']=$result['geometry']['location']['lng'];
         }

            if (count($result['address_components'])){
                foreach ($result['address_components'] as $acs){
                    if ($acs['types'][0]=='street_number')               $aa[$cc]['street_number']= $acs['long_name']; 
                    if ($acs['types'][0]=='route')                       $aa[$cc]['road']=      $acs['long_name']; 
                    if ($acs['types'][0]=='sublocality')                 $aa[$cc]['suburb']=   $acs['long_name']; 
                    if ($acs['types'][0]=='locality')                    $aa[$cc]['city']=    $acs['long_name']; 
                    if ($acs['types'][0]=='postal_code')                 $aa[$cc]['postcode']= $acs['long_name']; 
                    if ($acs['types'][0]=='administrative_area_level_1') $aa[$cc]['region']=   $acs['long_name']; 
                }    
            }
            //successful?
            if ($result['geometry']['location_type']=='APPROXIMATE') $approxflag++;
            if (isset($result['partial_match']))  $approxflag++;
            if (!$aa[$cc]['street_number'])         $approxflag++;
        }
        if ($approxflag) return (array(1,$aa,$response));
        else return (array(2,$aa,$response));
    }
    else return (array(0,array(),$response));
}    
Peter
sumber
Terima kasih atas jawabannya, bagaimana saya memasukkan ini ke dalam kode saya?
Rob
Maaf saya anggap Anda mengode situs. Fungsi itu digunakan sebagai bagian dari skrip sisi server yang misalnya mengambil alamat input pengguna, menggunakan api geocoder google untuk mendapatkan coords. Anda kemudian dapat meletakkan coord tersebut di db Anda, dan ketika Anda perlu membuat peta, cukup kueri coords dan menghasilkan peta dengan spidol. Dengan begitu Anda tidak akan menyalahgunakan geocoder untuk setiap halaman yang di-render. (Apakah Anda menuliskan komentar saya? Saya mencoba membantu, dan menghukum saya tidak akan terlalu mendorong saya sama sekali). Juga saya tidak mau menyebutkan bahwa api mengharuskan Anda untuk menggunakannya dengan gmap.
Peter
1

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.

function spotPosition(address) {
        geocoder.geocode({ 'address': address }, function (results, status) {
            if (status == google.maps.GeocoderStatus.OK) {
                var lat = results[0].geometry.location.lat();
                var lang = results[0].geometry.location.lng();
                setMarker(lat, lang);
            }
            else if (status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                setTimeout(function () {
                    //Recursively calling spotPosition method for lost addresses
                    spotPosition(address);
                }, 1000);
            }
        });
    }
Jagath
sumber
0

Ini solusinya:

dependensi: Gmaps.js, jQuery

var Maps = function($) {
   var lost_addresses = [],
       geocode_count  = 0;

   var addMarker = function() { console.log('Marker Added!') };

   return {
     getGecodeFor: function(addresses) {
        var latlng;
        lost_addresses = [];
        for(i=0;i<addresses.length;i++) {
          GMaps.geocode({
            address: addresses[i],
            callback: function(response, status) {
              if(status == google.maps.GeocoderStatus.OK) {
                addMarker();
              } else if(status == google.maps.GeocoderStatus.OVER_QUERY_LIMIT) {
                lost_addresses.push(addresses[i]);
              }

               geocode_count++;
               // notify listeners when the geocode is done
               if(geocode_count == addresses.length) {
                 $.event.trigger({ type: 'done:geocoder' });
               }
            }
          });
        }
     },
     processLostAddresses: function() {
       if(lost_addresses.length > 0) {
         this.getGeocodeFor(lost_addresses);
       }
     }
   };
}(jQuery);

Maps.getGeocodeFor(address);

// listen to done:geocode event and process the lost addresses after 1.5s
$(document).on('done:geocode', function() {
  setTimeout(function() {
    Maps.processLostAddresses();
  }, 1500);
});
Julio Betta
sumber
0

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 contoh

            var locationsPosition = {
                    "Johannesburg - ZA": {
                        "lat": -26.2041028,
                        "lng": 28.047305100000017
                    },
                    "Chennai - IN": {
                        "lat": 13.0826802,
                        "lng": 80.27071840000008
                    }
             }

jadi sekarang Anda dapat menambahkan penanda menggunakan locationsPosition["Johannesburg - ZA"].latdan.lng

Andrea Bisello
sumber
-1

Sepertinya Anda perlu melakukan satu dari dua hal:

  1. ubah proses Anda menjadi hasil cache jika Anda tidak mendapatkan banyak yang unik per hari; atau
  2. tingkatkan ke layanan yang memungkinkan Anda memproses lebih banyak per hari

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).

Geocode. Staf Pertanian
sumber
Mengapa ini dipilih? Saya tidak melihat di mana sesuatu di sini tidak akurat atau salah?
Geocode.Staf Pertanian