Google Haritalar coğrafi kod sınırından kaçınılması?


32

Bir cms ile çizilen 125 işaretli özel bir google haritası oluşturuyorum . Haritayı yüklerken şu mesajı alıyorum:

Geocode aşağıdaki nedenden dolayı başarılı olamadı: OVER_QUERY_LIMIT

İşaretçileri coğrafi kodladığımdan eminim.

Bu uyarıları nasıl önleyebilirim ve sonuçları coğrafi olarak kodlamanın daha etkili bir yolu var mı?

GÜNCELLEME: Bu Casey'nin cevabındaki girişimi, şu anda sadece boş bir sayfa alıyorum.

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

Belirteçlerin anında yüklendiği ve çözümün şart ve koşullarını ihlal etmediği sürece çözümün ne olduğu önemli değildir.


Bu aramaları neden veya ne sıklıkta yaptığınızı söylemiyorsunuz. Her sayfanın oluşturduğu aynı noktaları coğrafi olarak kodlamaya çalışmıyorsunuz, değil mi? Durum buysa, konum veritabanına ilk eklendiğinde, bu tarafı sunucu tarafı sadece bir kez aramak için api kullanmaya bakıyor olmalısınız.
Peter,

@ Peter'ın tavsiyesini denemek istiyorsanız, burada bir Google elektronik tablosundaki noktaları coğrafi olarak kodlayacak basit bir araç var . Bu, şehirler için en son / uzun süreyi CMS'ye yazmanıza izin verir, böylece jeokoderi çalışma zamanında kullanmanıza gerek kalmaz.
Stephen Lead

@Peter Aslında bu harika bir fikir gibi geliyor. Cms'imin kullanılabilirliğini azaltacağından biraz yırtıldım. Eğer müşteri sadece adresi girmek yerine, şirket başına enine / en uzun olanı bulmak zorundaysa, o zaman kullanıcı dostu değildir. Bunu doğru anlıyor muyum?
Rob

Bir php işlevi için aşağıya yeni cevabımı görün.
Peter,

2
@rob FWIW Ragi'nin doğru yaklaşıma sahip olduğunu düşünüyorum. Casey'nin cevabı hala her noktayı, her harita çizdiğinizde, statik veri setiniz için gerekli görünmeyen, coğrafi kodlama yapmanızı gerektirir
Stephen Lead

Yanıtlar:


57

Diğer herkes gibi, size kod ile bir cevap verebilirim, ancak birisinin size temelde yanlış bir şey yaptığınızı açıkladığını sanmıyorum .

Neden bu hatayı vuruyorsun? Çünkü birileri sayfanızı her görüntülediğinde coğrafi kod çağırıyorsunuz ve sonuçlarınızı db'nin hiçbir yerinde önbelleğe almıyorsunuz!

Limitin mevcut olmasının nedeni, Google'ın kaynaklarından (isteyerek veya istemeyerek de olsa) istismarı önlemek - ki bu tam olarak yaptığınız şey :)

Google'ın coğrafi kodu hızlı olmasına rağmen, eğer herkes böyle kullanırsa, sunucularını yıkar. Google Fusion Tables'ın mevcut olmasının nedeni, sizin için ağır sunucu tarafında bir sürü kaldırma yapmaktır. Coğrafi kodlama ve döşeme önbelleklemesi sunucularında yapılır. Bunu kullanmak istemiyorsanız, onları sunucunuzda önbelleğe almalısınız.

Yine de, günde 2500 istek çok azsa, yılda 10 k civarında bir şey için günde 100.000 coğrafi kodlama isteği veren Google Maps Premier (ücretli) lisansına bakmanız gerekir (bu, sunucu tarafında önbelleklemeniz gerekir) çok büyük bir site değilseniz veya ağır veri işlemesi yapmıyorsanız bu sınıra ulaşmamak . Sunucu tarafı önbelleğe almadan ve mevcut yaklaşımınızı kullanmadan, günde yalnızca 800 sayfa görüntüleme yapabilirdiniz!

Diğer sağlayıcıların coğrafi kod başına ücretlendirdiğini fark ettikten sonra , sonuçları db'de önbelleğe almanız gerektiğini anlayacaksınız. Bu yaklaşımla, sayfa görünümü başına yaklaşık 10 ABD kuruşa mal olacak!

Sorunuz Google’ın size verdiği gaz kelebeği sınırını aşabilir misiniz? Emin. Sadece farklı ip adreslerinden bir istek yapın. Heck, sizleri amazon elastik ips'lerinde proxy yapabilir ve her zaman 2500 yeni atanmış çağrıya sahip olabilirsiniz. Ancak elbette, yasadışı olmanın yanı sıra (Google Haritalar hizmet şartları tarafından size verilen kısıtlamayı etkili bir şekilde atıyorsunuzdur), sisteminizde sahip olduğunuz doğal tasarım hatasını ele almak için bir kesmek istiyorsunuz.

Peki bu kullanım için doğru yol nedir? Google geocode api'yi aramadan önce, sunucunuza gönderin ve önbelleğinizde olup olmadığını sorgulayın. Değilse, coğrafi kodu arayın, önbelleğinize kaydedin ve sonucu döndürün.

Başka yaklaşımlar var, ama bu seni doğru yöne başlatmalı.

Güncelleme: Aşağıdaki yorumlarınızdan PHP kullandığınızı belirtti, bu yüzden doğru bir şekilde nasıl yapacağınıza dair bir kod örneği (Google ekibinin önerisi) https://developers.google.com/maps/articles/phpsqlsearch_v3


Bunu sunucuya gönderirken izleyebileceğim bir örnek var mı?
Rob

Arka uç CMS'niz nedir? (Nasıl değiştireceğinizi bildiğinizi / bildiğinizi ve sadece kendi dilinizde nasıl yapıldığını gösteren basit bir örnek istediğinizi varsayıyorum. Bir müşteri tarafı js örneğine ihtiyacınız yok mu, yoksa siz var mı? Herhangi bir js kullanıyor musunuz? jquery gibi bir çerçeve?
Ragi Yaser Burhum 5:11

Ayrıca, işaretleyici verilerinin sisteminize nasıl
girdiğiyle

1
TAMAM. Php o zaman. Google Dokümantasyonundan alınan bu bit, mysql ve php
kodunu içermelidir

1
Ne tür önbelleklemeye izin verildiğiyle ilgili ayrıntılar için 10.1.3 (b) 'ye bakınız. developers.google.com/maps/terms#section_10_12
Paul Ramsey

14

Bence Sasa haklı, her iki konuda da.

Tüm adreslerinizi bir kerede göndermek açısından, bir seçenek istekleri aralıklarla göndermektir. Geçmişte JavaScript kullanırken istekleri 0,25 saniye (gecikmeli görünüyor!) Saniye kullanarak geciktirmeyi seçtim.

setTimeout( [FUNCTION CALL] , 250 )

yöntem.

.NET'te şunu seçtim:

System.Threading.Thread.Sleep(250);

İş gibi görünüyor.

EDIT: Cant gerçekten test ediyor, ancak bu çalışmalı / çalışmalı!

Javascript örneği. AddressArray, adres olan dizeleri tutar ...

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

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

}

DÜZENLE:

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

Yanıt için teşekkürler. Bunu koduma nasıl sokabilirim. Bunların hepsi biraz yeni, biraz el tutmak gerekir. Kaynak kodumu görebilmelisiniz.
Rob,

Hangi bit? Hangi dili kullanıyorsun
CatchingMonkey

Javascript kullanıyorum, bir aralığı nasıl ayarlayabilirim?
Rob,

Cevabımı düzenledi.
CatchingMonkey

Ayrıca setTimeout () demek istedim ... Teşekkürler Casey.
CatchingMonkey

9

Google tarafından dayatılan eşzamanlı istek sınırına ulaşıyor gibisiniz (sınırın gerçekte ne olduğuna dair bir referans bulamıyorum). Aynı anda 125 istek göndermemeniz için isteklerinizi boş bırakmanız gerekir. Ayrıca günlük limit başına 2500 coğrafi kod talebi olduğunu unutmayın.

Consult Google Geocoding Stratejileri fazla bilgi için belgeyi.

Güncelleme: Mapperz tarafından gönderilen bir gönderiyle eklenmiş bir çözüm olarak, yeni bir Google Fusion Table oluşturmayı , adresinizi ve ilgili tüm verileri tabloya kaydetmeyi ve tabloyu web arayüzleri üzerinden coğrafi kodlamayı düşünebilirsiniz . Bir Füzyon Tablosunun yapacağı coğrafi kod isteklerinin sayısında bir sınır vardır, ancak sınır oldukça yüksektir. Sınıra ulaştığınızda, coğrafi kod isteğini yeniden göndermeniz gerekecek ve Fusion Tabloları kaldığı yerden devam edecektir. Bu yaklaşımın avantajı, devir hızındaki büyük bir gelişmedir, çünkü ONCE'ye sadece coğrafi kodlama yapmanız gerekir, mevcut çözümünüzle her yükte coğrafi kodlama yapmanız ve günlük limitlere hızlıca ulaşmanız gerekir.


Sınıra varacağımı tahmin ettim, bu konuda yeniyim, yardım için bir kod örneğine ihtiyacım var.
Rob

Google Fusion Table’ları inceledim ve birkaç sorunla karşılaştım. 1. Tablodaki adresleri manuel olarak (dosya-> coğrafi kod aracılığıyla) elle girmeniz gerekir, bu otomatik olarak yapılabilir mi? 2. Bazı işaretleyiciler yalnızca belirli yakınlaştırma düzeylerinde görünürken, diğerleri yakınlaştırma düzeyini ne olursa olsun gösterir. Bu örnektir - mediwales.com/mapping/example. Sonunda yapmak istediğim, Wordpress verilerimi (örneğin tüm şirket adresleri) füzyon masasına dışa aktarmak, otomatik olarak bunları coğrafi kodlamak ve ardından tüm bu coğrafi kodlanmış adresleri almak ve haritayı anında çizmek.
Rob

7

Coğrafi kod taleplerimi javascript'te nasıl kısacağım, adresler her adresi içeren bir kod olacak şekilde coğrafi kod:

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);
}

Bu, esasen her coğrafi kodlama isteği arasında ikinci ve yarısı ekler.


Cevap için teşekkürler. Koduma
Rob

Hatayı işaret edebilecek herhangi bir hata ayıklama aracı kullanıyor musunuz? Değilse, FireFox eklentisi firebug'u kullanmayı deneyin. Bu gibi durumlarda oldukça kullanışlı olabilir.
Casey,

Hayır değilim Kodu doğru yere koyduğuma emin değilim, denemem ile sorumu güncelleyeceğim.
Rob

Kod örneğime bir kapanış dirsek eksikti. Cevabımı düzeltip yorum ekledim. Ancak, bunun örnek kodunuzda bir sorun olmadığı görülüyor. Boş bir sayfa mı yoksa boş bir harita mı alıyorsunuz? Boş bir sayfa javascript kodunda bir sözdizimi hatası olduğunu gösterir. Boş bir harita (işaretçi yok) coğrafi kodlama kodunun bir sorunu olduğunu gösterir.
Casey,

1
Merhaba. Cevabına bir kere daha baktım. Gecikme şimdi çalışıyor, ancak işaretçilerin üzerine çizim yapamıyorlar. Kodumdan itibaren bunlar işaretleri gösteren önemli bitlerdir - (function (i) {and}) (i); bunlar olmadan gecikme eklemeden bile arsa göstermez.
Rob,

5

Şimdi sayfayı denedim ve çalışıyor gibi görünüyor şu anda .

Şu anda kullanmakta olduğunuz zamanlayıcı yaklaşımının doğru olduğunu düşünüyorum ve bazı sunucu tarafı desteği gerektirmeden çalışacak olanı bildiğim kadarıyla aşağıdaki değişiklikleri önermeliyim (coğrafi kodlama işlevlerinizi yeniden yazma özgürlüğünü aldım) localStorage'dan yararlanmak için .

LocalStorage , web sayfasının istemcide veri depolamasına izin veren çoğu tarayıcıda yerleşik olan nispeten yeni bir teknolojidir. Çerezlere biraz benzer, ancak çok daha güçlü ve her zaman sunucuya küfretmiyor (çerezlerin aksine).

Amacım, müşteriye coğrafi kodlanmış adresi kaydetmektir, böylece kullanıcı sayfayı yenerse, Google'ın coğrafi kodlayıcı işlevlerini tekrar çalıştırmaya gerek kalmaz. Aşağıdaki uygulama kabadir (eski kayıtları kontrol etmek için kod eklemeliyiz ve muhtemelen dizinden daha iyi bir önbellek anahtarına ihtiyacımız var), ancak başlamanıza yetecek kadar olmalıdır. Umarım yardımcı olur.

(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); 
} 
})
(); 

Çok teşekkürler, sadece başka bir şey vererek ama bir dakika içinde bunu deneyecek. İyi bir fikir gibi geliyor.
Rob

Sadece denedim (şimdi öncekine döndüm), ilk defa çalıştı, sonra tazelediğimde sadece boş bir sayfa gösterdi.
Rob

Şimdi deneyin, bir hata oluştu, ayrıca popup_content değişkeninin kısalık için yeniden düzenlendiğini lütfen unutmayın.
unicoletti

3

geopy geocoder'ları kullanarak çok sayıda adresi sorunsuz bir şekilde kodlayabiliyorum (posterlerin kurulumundan emin değilim veya projesine bir python bağımlılığı ekleyebilir mi)

işte benim sınavım:

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

sonuç pasajı

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

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

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

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

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

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

Bu hala çalışıyor ve ben 7k sonuçları ile yaşıyorum.

DÜZENLEME: Bir süre sonra sokağın sonunu vurdum ve google bana aynı puanlar vermeye başladı, ancak hala talep ediyor ve bana doğru cevaplar veriyor gibi görünüyor.


Coğrafya büyü değildir, kullanım kısıtlamaları hala geçerlidir.
alphabetasoup

1

Bu php işlevi (hangi dilde çalıştığınızı bilmiyorum, ama onu ayrı ayrı seçebilirsiniz) google geolocator api kullanıyor. Bir adres verildiğinde, normalize edilmiş adrese geri dönecek ve uzunca 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));
}    

Cevabınız için teşekkürler, bunu koduma nasıl eklerim?
Rob

Üzgünüm, siteyi kodladığını sandım. Bu işlev, örneğin kullanıcı giriş adresi alan, kodlayıcıları almak için google geocoder api'yi kullanan sunucu tarafı komut dosyasının bir parçası olarak kullanılır. Daha sonra bu kodları db'inize koyabilirsiniz ve bir harita üretmeniz gerektiğinde, sadece kodları sorgulayın ve haritayı işaretçilerle oluşturun. Bu şekilde, tartışıldığı gibi her sayfa için jeokoderi kötüye kullanmayacaksınız. (yorumumu indirdin mi? Yardım etmeye çalışıyorum ve beni cezalandırmak da beni hiç cesaretlendirmeyecek). Ayrıca api'nin onu bir gmap ile kullanmanızı gerektirdiğini söylemekten vazgeçtim.
Peter,

1

Şimdi sorgunuzu gördüm. Aşağıdaki kodu deneyebilirsiniz. Coğrafi kod durum kontrolü başkası bölümünde, kayıp adresler için bir zaman aralığı ile aynı işlevi tekrar tekrar arayın.

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);
            }
        });
    }

0

İşte benim çözümüm:

bağımlılıklar: 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);
});

0

Google harita coğrafi kod sınırından kaçınamazsınız: LatLng bilgilerini edinmeli ve saklamalısınız .

Birkaç şehriniz varsa ve LatLng'i manuel olarak almak istemiyorsanız, geocoder.geocode'u çağırmak ve bir javascript nesnesinin içindeki bilgileri kaydetmek için aşamalı olarak kullanabilirsiniz ve ardından console.log(JSON.stringify(object, null, 4));konsoldan oldukça basılmış bir nesneyi elde etmek için kullanabilirsiniz. örnek

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

yani şimdi locationsPosition["Johannesburg - ZA"].latve kullanarak işaretçi ekleyebilirsiniz.lng


-1

İki şeyden birini yapmanız gerekiyor gibi geliyor:

  1. Günde benzersiz olan pek fazla bir şey alamazsanız, işleminizi sonuçları önbelleğe almak için değiştirin; veya
  2. günde daha fazla işlem yapabilmenizi sağlayan bir servise yükseltme

İnsanların birçok kez bahsettiği gibi, ancak kişisel deneyimim yok, her gün 100 bin dolarlık bir Google lisansının yılda yaklaşık 10 bin dolar olduğu görünüyor.

Aynı doğruluk seviyesini veya daha iyisini istiyorsanız (ve bu bedeli ödemek zorunda değilseniz) hizmetimizi deneyebilirsiniz. Google’dan çok daha düşük bir ücret karşılığında (neredeyse 10’u), 2500’den daha yüksek bir limit alabilirsiniz (en düşük limit 25k / gün).

Tabii ki, Ücretli Geocoding API'mızı kullanmak , kabul etmek kötü bir iş anlayışı olsa da,% 100 dürüst olmanızı tavsiye ederim. Bunun yerine seçenek 1 ile gitmeyi öneririm, hizmetinizi önbelleğe almak için optimize edin. Günde 2500'den fazla BENZERSİZ coğrafi koduna ihtiyacınız yoksa.

Feragatname : Geocode Çiftliği için çalışıyorum (önerdiğim hizmet).


Bu neden aşağı oy kullandı? Buradaki hiçbir şeyin doğru veya yanlış olduğunu görmüyorum.
Geocode.Farm Staff,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.