Google मानचित्र की भौगोलिक सीमा से बचना?


32

मैं एक कस्टम गूगल मैप बना रहा हूं जिसमें 125 मार्कर एक सेमी के माध्यम से प्लॉट किए गए हैं। नक्शा लोड करते समय मुझे यह संदेश मिलता है:

निम्नलिखित कारण से जियोकोड सफल नहीं रहा: 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 स्प्रेडशीट में अंकों को जियोकोड करेगा। यह आपको CMS में शहरों के लिए lat / long लिखने की अनुमति देगा, इसलिए आपको रन-टाइम पर जियोकोडर का उपयोग करने की आवश्यकता नहीं होगी।
स्टीफन लीड

@Peter दरअसल यह एक बेहतरीन आइडिया लगता है। मैं थोड़ा फटा हुआ हूं क्योंकि इससे मेरी सेमी की उपयोगिता कम हो जाएगी। यदि ग्राहक को पता दर्ज करने के बजाय प्रति कंपनी / लट का पता लगाना है, तो यह बहुत उपयोगकर्ता के अनुकूल नहीं है। क्या मैं इसे सही तरीके से समझ रहा हूं?
रोब

एक php फ़ंक्शन के लिए मेरा नया उत्तर नीचे देखें।
पीटर

2
@rob FWIW मुझे लगता है कि रागी सही दृष्टिकोण है। केसी के जवाब के लिए अभी भी आवश्यक है कि आप हर बिंदु को भूकोड करें, हर बार जब नक्शा खींचता है, जो आपके स्थैतिक डेटासेट के लिए आवश्यक प्रतीत नहीं होता है
स्टीफन लीड

जवाबों:


57

हर किसी की तरह, मैं आपको कोड के साथ एक उत्तर दे सकता था, लेकिन मुझे नहीं लगता कि किसी ने आपको समझाया है कि आप कुछ ऐसा कर रहे हैं जो मूलभूत रूप से गलत है

आप इस त्रुटि को क्यों मार रहे हैं? क्योंकि आप हर बार किसी को अपने पृष्ठ को देखने के लिए जियोकोड कह रहे हैं और आप अपने परिणामों को डीबी में कहीं भी कैशिंग नहीं कर रहे हैं!

वह सीमा मौजूद है जो Google के संसाधनों (चाहे वह स्वेच्छा से हो या अनिच्छा से) से दुर्व्यवहार को रोकने के लिए है - जो कि वास्तव में है :)

हालाँकि google का जियोकोड तेज़ है, अगर हर कोई इसे इस तरह इस्तेमाल करता है, तो यह उनके सर्वर को नीचे ले जाएगा। Google फ्यूजन टेबल्स मौजूद होने का कारण आपके लिए भारी सर्वर साइड लिफ्टिंग करना है। जियोकोडिंग और टाइल कैशिंग उनके सर्वर पर किया जाता है। यदि आप उस का उपयोग नहीं करना चाहते हैं, तो आपको उन्हें अपने सर्वर पर कैश करना चाहिए।

यदि अभी भी, एक दिन में 2500 अनुरोध बहुत कम हैं, तो आपको Google मैप्स प्रीमियर (सशुल्क) लाइसेंस पर देखना होगा जो आपको प्रति दिन 10k के लिए 100,000 जियोकोडिंग अनुरोध देता है जो कि प्रति वर्ष 10k के आसपास होता है (यह बहुत है - सर्वर साइड कैशिंग के साथ आपको चाहिए जब तक आप कुछ विशाल साइट या भारी डेटा प्रसंस्करण नहीं कर रहे हैं) इस सीमा तक नहीं पहुंच रहे हैं। सर्वर साइड कैशिंग के बिना और अपने वर्तमान दृष्टिकोण का उपयोग करते हुए, आप केवल एक दिन में 800 पेजव्यू कर पाएंगे!

एक बार जब आपको पता चलता है कि अन्य प्रदाता जियोकोड के अनुसार शुल्क लेते हैं, तो आप समझेंगे कि आपको परिणाम db में कैश करना चाहिए। इस दृष्टिकोण के साथ यह आपको प्रति पृष्ठ दृश्य में लगभग 10 अमेरिकी सेंट खर्च होगा!

आपका प्रश्न यह है कि क्या आप उस थ्रॉटल सीमा के आसपास काम कर सकते हैं जो Google आपको देता है? ज़रूर। बस अलग-अलग आईपी पते से एक अनुरोध करें। हेक, आप अमेज़ॅन इलास्टिक ips के माध्यम से कॉल को प्रॉक्सी कर सकते हैं और हमेशा एक नए नए 2500 आवंटित कॉल होंगे। लेकिन निश्चित रूप से, अवैध होने के अलावा (आप Google मैप्स सेवा की शर्तों द्वारा आपको दिए गए प्रतिबंध को प्रभावी रूप से दरकिनार कर रहे हैं), आप अपने सिस्टम में निहित अंतर्निहित डिज़ाइन दोष को कवर करने के लिए एक हैक कर रहे होंगे।

तो उस उपयोग-मामले का सही तरीका क्या है? इससे पहले कि आप Google जियोकोड एपी को कॉल करें, इसे अपने सर्वर पर भेजें और यदि यह आपके कैश में है तो क्वेरी करें। यदि ऐसा नहीं है, तो जियोकोड को कॉल करें, इसे अपने कैश में स्टोर करें और परिणाम वापस करें।

अन्य दृष्टिकोण हैं, लेकिन यह आपको सही दिशा में शुरू करना चाहिए।

अपडेट: नीचे दी गई आपकी टिप्पणियों से, यह कहा गया है कि आप PHP का उपयोग कर रहे हैं, इसलिए यहां एक कोड नमूना है कि इसे सही तरीके से कैसे किया जाए (Google टीम से ही अनुशंसा) https://developers.google.com/maps/articles/phpsqlsearch_v3


क्या आपको एक उदाहरण मिला है जिसे मैं सर्वर आदि पर भेजने का अनुसरण कर सकता हूं?
रोब

आपका बैकएंड CMS क्या है? (मुझे लगता है कि आप इसे बदल सकते हैं / जान सकते हैं और बस एक सरल उदाहरण चाहते हैं जो दिखाता है कि अपनी पसंद की भाषा में ऐसा कैसे करें। आपको क्लाइंट साइड js के उदाहरण की आवश्यकता नहीं है, या क्या आप किसी भी js का उपयोग कर रहे हैं? jquery जैसी रूपरेखा?
रागी यासर बुरहुम

इसके अलावा, आपको इस बारे में अधिक संदर्भ देने की आवश्यकता होगी कि पहली बार में मार्कर डेटा आपके सिस्टम में कैसे आता है
रागी यासर बुरहुम

1
ठीक है। इसके बाद पी.एच.पी. गूगल प्रलेखन से यह थोड़ा mysql और php हिस्सा शामिल होना चाहिए code.google.com/apis/maps/articles/phpsqlgeocode.html
रागी यासिर Burhum

1
10.1.3 (बी) देखें कि किस प्रकार के कैशिंग की अनुमति है। Developers.google.com/maps/terms#section_10_12
पॉल रैमसे

14

मुझे लगता है कि साशा सही है, दोनों मायने में।

एक बार में अपने सभी पते भेजने के संदर्भ में, एक विकल्प अंतराल पर अनुरोध भेजने के लिए है। जावास्क्रिप्ट का उपयोग करते समय अतीत में मैंने 0.25 से देरी के अनुरोध का विकल्प चुना है (काम करने लगता है!) सेकंड का उपयोग करके

setTimeout( [FUNCTION CALL] , 250 )

तरीका।

.NET में मैंने इसका विकल्प चुना है:

System.Threading.Thread.Sleep(250);

काम करने लगता है।

संपादित करें: खिचड़ी भाषा वास्तव में इसका परीक्षण करती है, लेकिन यह काम करना चाहिए / हो सकता है!

जावास्क्रिप्ट उदाहरण। AddressArray में ऐसे तार हैं जो पते हैं ...

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

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

}

संपादित करें:

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

उत्तर के लिए धन्यवाद। मैं इसे अपने कोड में कैसे प्राप्त कर सकता हूं। यह सब थोड़ा नया है, इसलिए हाथ पकड़ने की जरूरत है। आपको मेरा स्रोत कोड देखने में सक्षम होना चाहिए।
रोब

कौन सा बिट? आप किस भाषा का उपयोग कर रहे हैं?
कैचिंगमेन्की

मैं जावास्क्रिप्ट का उपयोग कर रहा हूं, मैं एक अंतराल कैसे निर्धारित कर सकता हूं?
रोब

मेरे उत्तर का संपादन किया।
कैचिंगमेन्की

यह भी एहसास हुआ कि मैं setTimeout () ... धन्यवाद केसी।
पकड़ने

9

ऐसा लगता है कि आप Google द्वारा लगाई गई एक साथ अनुरोध सीमा को मार रहे हैं (हालांकि मुझे इस बात का संदर्भ नहीं मिल सकता है कि वास्तव में सीमा क्या है)। आपको अपने अनुरोधों को स्थान देने की आवश्यकता होगी ताकि आप एक बार में 125 अनुरोध न भेजें। ध्यान दें कि प्रति दिन की सीमा के लिए 2500 जियोकोड अनुरोध भी है।

अधिक जानकारी के लिए Google जियोकोडिंग रणनीतियाँ दस्तावेज़ से परामर्श करें ।

अद्यतन: Mapperz द्वारा एक पोस्ट के लिए प्रेरित एक अतिरिक्त समाधान के रूप में, आप एक नया Google फ़्यूज़न टेबल बनाने के बारे में सोच सकते हैं , अपने पते और किसी भी संबंधित डेटा को स्टोर कर सकते हैं, और टेबल को उनके वेब इंटरफ़ेस के माध्यम से जियोकोडिंग कर सकते हैं। जियोकोड अनुरोधों की एक सीमा है एक फ्यूजन टेबल बना देगा, हालांकि सीमा काफी बड़ी है। एक बार जब आप सीमा तक पहुंच जाते हैं, तो आपको जियोकोड अनुरोध को फिर से जमा करना होगा, और फ्यूजन टेबल्स वहां से निकल जाएंगे जहां यह छोड़ा था। इस दृष्टिकोण के लिए बोनस एक बड़ी गति सुधार है, क्योंकि आपको केवल ONCE को जियोकोड की आवश्यकता होगी, जहां आपके वर्तमान समाधान के साथ आपको हर लोड पर जियोकोड की आवश्यकता होगी, जल्दी से दैनिक सीमा तक पहुंच जाएगा।


मैंने अनुमान लगाया कि मैं सीमा से टकराना चाहूंगा, मैं इसके लिए बहुत नया हूं कि मुझे लगता है कि मुझे मदद करने के लिए एक कोड उदाहरण की आवश्यकता है।
रोब

मैं Google फ़्यूज़न टेबल्स में देख रहा हूँ और कुछ समस्याओं पर आता हूँ। 1. आपके पास तालिका में मैन्युअल रूप से जियोकोड पते (फाइल-> जियोकोड) हैं, क्या यह स्वचालित रूप से किया जा सकता है? 2. कुछ मार्कर केवल कुछ ज़ूम स्तरों पर दिखाई दे रहे हैं, जबकि अन्य जो कुछ भी ज़ूम स्तर दिखाते हैं। यह उदाहरण है - mediwales.com/mapping/example। आखिरकार मैं जो करना चाहता हूं वह मेरे Wordpress डेटा (यानी सभी कंपनी के पते) को फ़्यूज़न टेबल पर निर्यात करता है, उन लोगों को स्वचालित रूप से जियोकोड करता है और फिर उन सभी जियोकोडेड पते को पकड़ता है और मानचित्र को तुरंत प्लॉट करता है।
रॉब

7

यहाँ है कि मैं अपने जियोकोड रिक्वेस्ट को जावास्क्रिप्ट में कैसे लिखता हूँ, एड्रेस एक ऐसा ग्राउंड होता है जिसमें प्रत्येक एड्रेस जियोकोड में होता है:

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

यह अनिवार्य रूप से प्रत्येक जियोकोडिंग अनुरोध के बीच एक दूसरा और आधा जोड़ता है।


जवाब के लिए धन्यवाद। जब मेरा कोड - मीडिया / मैपिंग
रोब

क्या आप किसी भी डीबगिंग टूल का उपयोग कर रहे हैं जो त्रुटि को इंगित कर सकता है? यदि आप नहीं हैं, तो फायरफॉक्स प्लगइन फायरबग का उपयोग करने का प्रयास करें। यह इस तरह की स्थितियों में बहुत आसान हो सकता है।
केसी

मैं नहीं हूं। मुझे विश्वास नहीं है कि मैंने कोड को सही स्थान पर रखा है, मैं अपने प्रयास से अपने प्रश्न को अपडेट करूंगा।
रोब

मुझे अपने कोड नमूने में एक समापन कोष्ठक याद आ रहा था। मैंने अपना उत्तर संपादित किया और टिप्पणी के साथ जोड़ा। हालाँकि, ऐसा लगता है कि यह आपके नमूना कोड में कोई समस्या नहीं थी। क्या आपको एक रिक्त पृष्ठ या रिक्त नक्शा मिल रहा है? एक खाली पृष्ठ दर्शाता है कि जावास्क्रिप्ट कोड में एक सिंटैक्स त्रुटि है। एक रिक्त मानचित्र (कोई मार्कर नहीं) इंगित करेगा कि जियोकोडिंग कोड में एक समस्या है।
केसी

1
नमस्ते। मैंने आपके उत्तर पर एक और जाना है। देरी अब काम कर रही है, लेकिन मार्कर को साजिश करने के लिए नहीं मिल सकता है। मेरे कोड से ये महत्वपूर्ण बिट्स हैं जो मार्करों की साजिश करते हैं - (फ़ंक्शन (i) {और}) (i); उन लोगों के बिना यह देरी करने के बिना भी साजिश नहीं करेगा।
रोब

5

मैंने अभी पृष्ठ की कोशिश की है और यह अभी काम कर रहा है ।

जबकि मुझे लगता है कि वर्तमान में आप जिस टाइमर दृष्टिकोण का उपयोग कर रहे हैं वह सही है और जहां तक ​​मुझे पता है कि केवल वही काम करेगा जो w / o को कुछ सर्वर साइड सपोर्ट की आवश्यकता होगी, मुझे निम्नलिखित बदलावों का सुझाव देना चाहिए (मैंने आपके जियोकोडिंग कार्यों को फिर से लिखने की स्वतंत्रता ली) लोकलस्टोरेज का लाभ उठाने के लिए ।

लोकलस्टोरेज एक अपेक्षाकृत नई तकनीक है जिसे अधिकांश ब्राउज़रों में बनाया गया है जो वेब पेज को क्लाइंट पर डेटा स्टोर करने की अनुमति देता है। यह कुछ हद तक कुकीज़ के समान है, लेकिन यह बहुत अधिक शक्तिशाली है और यह हमेशा सर्वर (कुकीज़ के विपरीत) से नाराज नहीं होता है।

मेरा उद्देश्य क्लाइंट पर जियोकोडेड एड्रेस को सेव करना है ताकि अगर कोई यूजर पेज को रिफ्रेश करता है तो उन पर फिर से गूगल के जियोकोड फंक्शन को इनवाइट करने की जरूरत नहीं है। नीचे कार्यान्वयन क्रूड है (हमें बासी रिकॉर्ड की जांच के लिए कोड जोड़ना चाहिए और शायद इंडेक्स की तुलना में बेहतर कैशिंग कुंजी की आवश्यकता है) लेकिन आपको शुरू करने के लिए पर्याप्त होना चाहिए। आशा करता हूँ की ये काम करेगा।

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

बहुत बहुत धन्यवाद, बस कुछ और दे रहा हूं लेकिन एक मिनट में यह कोशिश करेगा। एक अच्छे विचार की तरह लगता है।
रोब

बस इसे आज़माया (अब वापस पिछले पर लौट आया है), इसने पहली बार काम किया जब मैंने इसे ताज़ा किया तो बस एक खाली पृष्ठ दिखा।
रोब

अब प्रयास करें, एक त्रुटि हुई थी, कृपया यह भी ध्यान दें कि पॉपअप_कंटेंट चर को संक्षिप्तता के लिए फिर से तैयार किया गया है।
14

3

जियोपी जियोकोडर्स का उपयोग कर मैं बड़ी संख्या में पतों को बिना किसी अड़चन के जियोडोड करने में सक्षम हूं (मुझे पोस्टर सेटअप का यकीन नहीं है, या अगर वह अपने प्रोजेक्ट के लिए एक अजगर निर्भरता को शामिल कर सकते हैं)

यहाँ मेरा परीक्षण है:

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

परिणाम स्निपेट

7595 (u'Av। Jo \ xe3o Naves de \ xc1vila, 7595 - सेगिस्मंडो परेरा, उबेरल \ xe2ndia - मिनस गेरैस, 38408-288, ब्राजील ', (-18.9388154, -48.2220562))

7596 (u'Av। Jo \ xe3o Naves de \ xc1vila, 7596 - सेगिस्मंडो परेरा, उबेरल \ xe2ndia - मिनस गेरैस, 38408-680, ब्राजील ', (-18.938814, -48.2217423))

7597 (u'Av। Jo \ xe3o Naves de \ xc1vila, 7597 - सेगिस्मंडो परेरा, उबेरल \ xe2ndia - मिनस गेरैस, 38408-288, ब्राजील ', (-18.9388128, -48.2220381))

7598 (u'Av। Jo \ xe3o Naves de \ xc1vila, 7598 - सेगिस्मंडो परेरा, उबेरल \ xe2ndia - मिनस गेरैस, 38408-680, ब्राजील ', (-18.9388114, -48.2217242))

7599 (u'Av। Jo \ xe3o Naves de \ xc1vila, 7599 - सेगिस्मंडो परेरा, उबेरल \ xe2ndia - मिनस गेरैस, 38408-288, ब्राजील ', (-18.9388102, -48.2220201))

7600 (u'Av। Jo \ xe3o Naves de \ xc1vila, 7600 - सेगिस्मंडो परेरा, उबेरल \ xe2ndia - मिनस गेरैस, 38408-680, ब्राजील ', (-18.9388088, -48.2217062))

यह अभी भी चल रहा है और मैं 7k परिणामों के साथ हूं।

संपादित करें: थोड़ी देर के बाद मैंने सड़क के अंत को छुपाया और Google ने मुझे वही अंक देने शुरू किए, लेकिन ऐसा लगता है कि यह अभी भी अनुरोध कर रहा है और मुझे सटीक उत्तर दे रहा है।


भूरा जादू नहीं है, उपयोग की बाधाएं अभी भी लागू होती हैं।
अल्फाबेटसैप

1

यह php फ़ंक्शन (मैं नहीं जानता कि आप किस भाषा में काम कर रहे हैं, लेकिन आप इसे अलग से चुन सकते हैं) google geolocator api का उपयोग करता है। एक पते को देखते हुए, यह सामान्यीकृत पते और हाल ही में लौटेगा। 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));
}    

उत्तर के लिए धन्यवाद, मैं इसे अपने कोड में कैसे शामिल करूंगा?
रोब

क्षमा करें, मुझे लगता है कि आप साइट को कोड कर रहे थे। उस फ़ंक्शन का उपयोग सर्वर साइड स्क्रिप्टिंग के भाग के रूप में किया जाता है जो उदाहरण के लिए उपयोगकर्ता इनपुट पता लेता है, कोर्ड्स को प्राप्त करने के लिए Google जियोकोडर एपी का उपयोग करता है। फिर आप उन कॉर्ड्स को अपने db में डाल सकते हैं, और जब आपको एक मैप तैयार करने की आवश्यकता होती है, तो कॉर्ड्स को क्वेरी करें और मार्करों के साथ मैप का उत्पादन करें। इस तरह से आप हर पेज को रेंडर करने के लिए जियोकोड को गाली देना नहीं चाहेंगे। (क्या आपने मेरी टिप्पणी को अस्वीकार कर दिया है? मैं मदद करने की कोशिश कर रहा हूं, और मुझे दंडित करना भी बहुत प्रोत्साहित नहीं करेगा)। इसके अलावा, मैं इस बात का उल्लेख करने के लिए भूल जाता हूं कि आपी को इसे एक गैम के साथ उपयोग करने की आवश्यकता है।
पीटर

1

अभी अभी आपकी क्वेरी देखी। आप निम्न कोड की कोशिश कर सकते हैं। जियोकोड स्टेटस चेक पार्ट के अन्य भाग में, खोए हुए पतों के लिए एक ही फ़ंक्शन को पुन: कॉल करें।

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

यहाँ मेरा समाधान है:

निर्भरताएँ: 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 मैप जियोकोड सीमा से बच नहीं सकते हैं: आपको लाटलिंज informations को प्राप्त करना और स्टोर करना होगा ।

यदि आपके पास कई शहर हैं और आप मैन्युअल रूप से LatLng प्राप्त नहीं करना चाहते हैं, तो आप समय-समय पर जियोकोडेर.जेओकोड को कॉल करने के लिए उपयोग कर सकते हैं और एक जावास्क्रिप्ट ऑब्जेक्ट के अंदर जानकारी को बचा सकते हैं और फिर console.log(JSON.stringify(object, null, 4));कंसोल में एक सुंदर मुद्रित ऑब्जेक्ट को प्राप्त करने के लिए उपयोग कर सकते हैं, इसलिए, के लिए उदाहरण

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

तो अब आप मार्कर का उपयोग कर जोड़ सकते हैं locationsPosition["Johannesburg - ZA"].latऔर.lng


-1

ऐसा लगता है कि आपको दो चीजों में से एक करने की ज़रूरत है:

  1. यदि आपको ऐसा नहीं मिलता है, तो अपनी प्रक्रिया को कैश परिणाम में बदलें, जो प्रति दिन अद्वितीय हैं; या
  2. ऐसी सेवा में अपग्रेड करना जो आपको प्रति दिन अधिक प्रोसेस करने की अनुमति देता है

जैसा कि लोगों ने कई बार उल्लेख किया है, लेकिन मेरे पास कोई व्यक्तिगत अनुभव नहीं है, ऐसा लगता है कि प्रति दिन 100k के लिए Google लाइसेंस प्रति वर्ष लगभग $ 10k अमरीकी डालर है।

यदि आप एक ही स्तर की सटीकता या बेहतर चाहते हैं (और उस कीमत का भुगतान नहीं करना है), तो आप हमारी सेवा को आज़मा सकते हैं। Google से बहुत कम (लगभग 10 वाँ लागत) के लिए, आप 2500 की सीमा से बहुत अधिक प्राप्त कर सकते हैं (हमारी न्यूनतम सीमा 25k / दिन है)।

बेशक, हमारे भुगतान किए गए जियोकोडिंग एपीआई का उपयोग करना समाधान नहीं है जो मैं 100% ईमानदार होने की सिफारिश करूंगा, भले ही यह स्वीकार करने के लिए खराब व्यावसायिक समझ हो। मैं इसके बजाय विकल्प 1 के साथ जाने का सुझाव दूंगा, अपनी सेवा को कैश में अनुकूलित करें। जब तक आपको प्रति दिन 2500 से अधिक UNIQUE जियोकोड की आवश्यकता न हो।

डिस्क्लेमर : मैं जियोकोड फार्म (जिस सेवा की मैं सिफारिश कर रहा हूं) के लिए काम करता हूं।


यह डाउन-वोट क्यों किया गया? मैं यह नहीं देख रहा हूँ कि यहाँ कुछ भी सही या गलत कहाँ है?
जियोकोड.फार्म स्टाफ
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.