OVER_QUERY_LIMIT টি প্রতিক্রিয়া না পেয়ে আমি কীভাবে 20 ঠিকানা জিওকোড করব?


87

গুগল জিওকোডার ভি 3 ব্যবহার করে, যদি আমি 20 টি ঠিকানা জিওকোড করার চেষ্টা করি তবে আমি একটি ওভিআইকিউকিআর_লিমিট পাই যতক্ষণ না আমি সেগুলিকে 1 সেকেন্ডের ব্যবধানে রাখি, তবে আমার মার্কারগুলি স্থাপনের আগে 20 সেকেন্ড সময় লাগে।

স্থানাঙ্কগুলি আগাম সংরক্ষণের পরিবর্তে এটি করার কোনও অন্য উপায় আছে?


এটা কি এখনও আছে? ডকুমেন্টেশনে আমি দেখতে পাই কেবলমাত্র বিধিনিষেধ হ'ল: "প্রতি দিন 2,500 ভূ-অবস্থানের অনুরোধের ক্যোয়ারী সীমা"। কোড.google.com/apis/maps/docamentation/geocoding/…
রুসউ

6
এটি প্রতিদিন ব্যবহারকারী হিসাবে মোট প্রশ্নের পরিমাণ নয়, এটি একটি স্বল্প পরিমাণে প্রশ্নের সংখ্যা সম্পর্কে, যেমন কোনও লুপে জিজ্ঞাসাবাদ করার সময়।
মিশিগেল ভ্যান অস্টারহাট

আমাদের দোকানে আমাদের ব্যবসায়ের লাইসেন্স রয়েছে এবং আমরা প্রতি সেকেন্ডে 10 টিরও বেশি অনুরোধ হ্যান্ডেল করতে না পেরে এই সমস্যাটি নিয়ে চলি। একটি ব্যবসায়িক লাইসেন্স এবং নিয়মিত বিকাশকারী মধ্যে একমাত্র পার্থক্য হ'ল আমাদের প্রতি দিন 100,000 কলের খুব সীমা রয়েছে।
অভি

@ মিচিয়েলভু আপনি কি সমাধান করেছেন? যদি হ্যাঁ, তবে দয়া করে আমাকে সাহায্য করুন। আমি OVER_QUERY_LIMIT পেয়ে যাচ্ছি। আমার প্রশ্নফিডল
প্রব

উত্তর:


85

না, অন্য কোনও উপায় নেই: আপনার যদি অনেকগুলি অবস্থান থাকে এবং সেগুলি মানচিত্রে প্রদর্শন করতে চান তবে সর্বোত্তম সমাধানটি হ'ল:

  • জিওকোডার ব্যবহার করে অক্ষাংশ + দ্রাঘিমাংশ আনুন, যখন কোনও অবস্থান তৈরি হয়
  • ঠিকানার পাশাপাশি আপনার ডাটাবেসে সেগুলি সংরক্ষণ করুন
  • এবং আপনি যখন মানচিত্রটি প্রদর্শন করতে চান তখন সেই সঞ্চিত অক্ষাংশ + দ্রাঘিমাংশ ব্যবহার করুন।

এটি অবশ্যই বিবেচনা করে যে আপনার কাছে অবস্থানগুলির পরামর্শের চেয়ে আপনার অবস্থানগুলি অনেক কম সৃষ্টি / পরিবর্তন রয়েছে।


হ্যাঁ, এর অর্থ হল স্থানগুলি সংরক্ষণ করার সময় আপনাকে আরও কিছু কাজ করতে হবে - তবে এর অর্থ এটিও রয়েছে:

  • আপনি ভৌগলিক স্থানাঙ্ক দ্বারা অনুসন্ধান করতে সক্ষম হবেন
    • উদাহরণস্বরূপ " আমি যেখানে এখন আমি তার নিকটে অবস্থিত পয়েন্টগুলির একটি তালিকা চাই "
  • মানচিত্র প্রদর্শন করা অনেক দ্রুত হবে
    • এমনকি এতে 20 টিরও বেশি অবস্থান রয়েছে
  • ওহ, এবং, এছাড়াও (সর্বশেষ কিন্তু কম নয়) : এটি কাজ করবে ;-)
    • আপনি কম কম এন সেকেন্ডে এক্স জিওকোডার কলগুলির সীমাটিকে আঘাত করবেন।
    • এবং আপনি কমপক্ষে Y ওয়্যার জিওকোডার কলগুলির সীমাটিকে কম আঘাত করবেন।

আমি কৌতূহলী যে আপনি কীভাবে নিশ্চিত হতে পারেন যে কিছু সময় কেটে যাওয়ার পরে ফলাফলগুলি ঠিক আছে (আসুন, একমাস বলা যাক)। আপনি কি একবারে একবারে সেগুলি আবার জিজ্ঞাসা করেন?
ক্রিস

4
যদি ঠিকানা (আপনার ডিবিতে ইতিমধ্যে আপনার রয়েছে - অন্যথায় আপনি জিওকোড করতে সক্ষম হবেন না) তবে অক্ষাংশ / দ্রাঘিমাংশ পরিবর্তন হওয়ার সম্ভাবনা খুব কম। এবং, অবশ্যই, প্রতিটি বার ঠিকানাটি সংশোধন করা হলে, জিওকোডারকে পুনরায় জিজ্ঞাসা করা উচিত, নতুন ঠিকানার সাথে মিলিত অক্ষাংশ + দ্রাঘিমাংশ পেতে।
পাস্কাল মার্টিন

আমি ল্যাব / লম্বাটি ডিবিতে রেখেছি এবং এটিটি ডিবি থেকে অ্যাজেএক্সের মাধ্যমে অ্যারের হিসাবে পুনরুদ্ধার করেছি, তবে এটি আবার একটি জাভা স্ক্রিপ্ট লুপে পৌঁছে দেওয়া উচিত, এর চেয়েও বেশি আমি ডিবি থেকে 173 অবস্থান পেয়েছি। এখন এটি আমাকে একই OVER_QUERY_LIMIT স্থিতি দেখায়। দয়া করে পরামর্শ দিন ...
প্রভু এম

20

প্রতিটি অনুরোধের জন্য আপনাকে আসলে একটি সম্পূর্ণ দ্বিতীয় অপেক্ষা করতে হবে না। আমি দেখতে পেয়েছি যে আমি যদি প্রতিটি অনুরোধের মধ্যে 200 মিলি সেকেন্ড অপেক্ষা করি তবে আমি OVER_QUERY_LIMIT প্রতিক্রিয়া এড়াতে সক্ষম এবং ব্যবহারকারীর অভিজ্ঞতা পাসযোগ্য pass এই সমাধানের সাহায্যে আপনি 4 সেকেন্ডে 20 আইটেম লোড করতে পারেন।

$(items).each(function(i, item){

  setTimeout(function(){

    geoLocate("my address", function(myLatlng){
      ...
    });

  }, 200 * i);

}

4
তবে (200 * i) এর অর্থ হল প্রতিটি অনুরোধের মধ্যে বিরতি বাড়ছে। সুতরাং তৃতীয় অনুরোধে এটি 600, তারপরে 800 ইত্যাদি
রোমান

খালি '* আমি'
ক্রিস

9
সেটটাইমআউট একবার এটি কার্যকর করবে। সুতরাং আমি যদি সঠিক হয়ে থাকি, (..., 200 * i) প্রতিটি কলকে 200 মিমি (ওয়াটেক মন্তব্য হিসাবে) দ্বারা পৃথক করে সময় নির্ধারণ করবে, যা গাবোডেসেস অর্জন করতে চেয়েছিল। বর্তমান (..., 200) 200 মিমি পরে একই সময়ে তাদের সকলকে কার্যকর করবে। নাকি আমি কিছু মিস করছি?
Lepe

@ গ্যাবেডেসেস - আপনার setIntervalপ্রয়োজন অনুরোধের পরিবর্তে প্রয়োজনীয় সংখ্যার উপর ভিত্তি করে কাজ করা উচিত setTimeoutএবং এটিতে সেট করা উচিত 100- কেবলমাত্র যদি ভবিষ্যতে অ্যাড্রেসের পরিমাণ আরও বাড়িয়ে দেয় 20
রব স্কট

4
@ গ্যাবেডেস আমি আপনার সমাধানটি চেষ্টা করেছি তবে এখনও ওভি.কোয়ারী_লিমিটেড ফিডল
প্রবস

6

দুর্ভাগ্যক্রমে এটি গুগল ম্যাপস পরিষেবার একটি সীমাবদ্ধতা।

আমি বর্তমানে জিওকোডিং বৈশিষ্ট্যটি ব্যবহার করে একটি অ্যাপ্লিকেশনটিতে কাজ করছি এবং আমি প্রতিটি ব্যবহারকারীর ভিত্তিতে প্রতিটি অনন্য ঠিকানা সংরক্ষণ করছি। আমি গুগল মানচিত্রে ফিরিয়ে দেওয়া তথ্যের ভিত্তিতে ঠিকানার তথ্য (শহর, রাস্তা, রাজ্য, ইত্যাদি) তৈরি করি এবং তারপরে ডাটাবেসে ল্যাট / লম্বা তথ্যও সংরক্ষণ করি। এটি আপনাকে জিনিসগুলি পুনরায় কোড করতে বাধা দেয় এবং আপনাকে সুন্দর বিন্যাসিত ঠিকানা দেয়।

আপনি এটি করতে চান এমন আরেকটি কারণ হ'ল নির্দিষ্ট আইপি ঠিকানা থেকে জিওকোড করা যায় এমন ঠিকানাগুলির দৈনিক সীমা রয়েছে limit আপনি চান না যে কারণে আপনার আবেদনটি কোনও ব্যক্তির জন্য ব্যর্থ হয়।


2

আমি 140 টি ঠিকানা জিওকোড করার চেষ্টা করে একই সমস্যায় পড়ছি।

আমার কাজের ভিত্তিতে পরবর্তী জিওকোডিংয়ের অনুরোধের প্রতিটি লুপের জন্য আমাদের ঘুম (100000) যোগ করা হয়েছিল । যদি অনুরোধের স্থিতি OVER_QUERY_LIMIT হয়, আমাদের ঘুম 50000 দ্বারা বৃদ্ধি করা হয় এবং অনুরোধটি পুনরাবৃত্তি করা হয়, ইত্যাদি।

এবং কারণে সমস্ত প্রাপ্ত ডেটা (ল্যাট / লম্বা) প্রতিটি বার পৃষ্ঠাটি লোড হওয়ার সময় অনুরোধটি চালানোর জন্য এক্সএমএল ফাইলে সংরক্ষণ করা হয়।


4
আপনার উত্তর, অস্পষ্ট আপনি সার্ভারের দিকে উল্লেখ করা হয় বা এই জাভাস্ক্রিপ্ট যদি এটা আধুনিক আছে, usleep হয়, না একটি ফাংশন ভুল হতে হবে, এবং অত: পর যদি এটা সাবেক, তারপর আমি আপনাকে পরামর্শ দিচ্ছি আপনি স্পষ্টভাবে এই রাষ্ট্র আপনার উত্তর সংশোধন অস্পষ্টতা এড়ানোর জন্য সার্ভার সাইড।
t0mm13b

1

সম্পাদনা:

এই সমাধানটি খাঁটি জেএসে রয়েছে তা ভুলে গেছেন, আপনার কেবলমাত্র প্রয়োজন এমন একটি ব্রাউজার যা https://developer.mozilla.org/it/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / গ্লোবাল_অবজেক্টস / প্রচারের প্রতিশ্রুতি দেয়


যাদের এখনও এখনও এটি সম্পাদন করা দরকার তাদের জন্য আমি আমার নিজস্ব সমাধান লিখেছি যা প্রতিশ্রুতিগুলির সাথে সময়সীমা মিশ্রিত করে।

কোড:

/*
    class: Geolocalizer
        - Handles location triangulation and calculations.
        -- Returns various prototypes to fetch position from strings or coords or dragons or whatever.
*/

var Geolocalizer = function () {
    this.queue          = [];     // queue handler..
    this.resolved       = [];
    this.geolocalizer = new google.maps.Geocoder();  
};

Geolocalizer.prototype = {
    /*
        @fn: Localize
        @scope: resolve single or multiple queued requests.
        @params: <array> needles
        @returns: <deferred> object
    */
    Localize: function ( needles ) {
        var that = this;
        // Enqueue the needles.
        for ( var i = 0; i < needles.length; i++ ) {
            this.queue.push(needles[i]);
        }
        // return a promise and resolve it after every element have been fetched (either with success or failure), then reset the queue.
        return new Promise (
            function (resolve, reject) {
                that.resolveQueueElements().then(function(resolved){
                  resolve(resolved);
                  that.queue    = [];
                  that.resolved = [];
                });
            }
        );
    },

    /*
        @fn: resolveQueueElements
        @scope: resolve queue elements.
        @returns: <deferred> object (promise)
    */

    resolveQueueElements: function (callback) {
        var that = this;
        return new Promise(
            function(resolve, reject) {
                // Loop the queue and resolve each element.
                // Prevent QUERY_LIMIT by delaying actions by one second.
                (function loopWithDelay(such, queue, i){
                    console.log("Attempting the resolution of " +queue[i-1]);
                    setTimeout(function(){
                        such.find(queue[i-1], function(res){
                           such.resolved.push(res); 
                        });
                        if (--i) {
                            loopWithDelay(such,queue,i);
                        }
                    }, 1000);
                })(that, that.queue, that.queue.length);

                // Check every second if the queue has been cleared.
                var it = setInterval(function(){
                    if (that.queue.length == that.resolved.length) {
                        resolve(that.resolved);
                        clearInterval(it);
                    }
                }, 1000);
            }
        );
    },

    /*
        @fn: find
        @scope: resolve an address from string
        @params: <string> s, <fn> Callback
    */
    find: function (s, callback) {
        this.geolocalizer.geocode({
            "address": s
        }, function(res, status){
           if (status == google.maps.GeocoderStatus.OK) {
               var r = {
                   originalString:  s,
                   lat: res[0].geometry.location.lat(),
                   lng: res[0].geometry.location.lng()
               };
               callback(r);
           }
            else {
                callback(undefined);
                console.log(status);
                console.log("could not locate " + s);
            }
        });
    }
};

দয়া করে নোট করুন যে এটি গুগল ম্যাপস স্টাফগুলি পরিচালনা করতে আমি যে বৃহত্তর গ্রন্থাগারটি লিখেছিলাম কেবল তারই একটি অংশ, সুতরাং মন্তব্যগুলি বিভ্রান্তিকর হতে পারে।

ব্যবহারটি বেশ সহজ, পদ্ধতির তবে কিছুটা আলাদা: একবারে একটি ঠিকানা লুপিং ও সমাধান করার পরিবর্তে আপনাকে ক্লাসে একটি অ্যারে ঠিকানা পাঠানো দরকার এবং এটি নিজেই অনুসন্ধানটি পরিচালনা করবে, একটি প্রতিশ্রুতি ফেরত যা , সমাধান হয়ে গেলে, সমস্ত সমাধান করা (এবং অমীমাংসিত) ঠিকানা সম্বলিত একটি অ্যারে প্রদান করে।

উদাহরণ:

var myAmazingGeo = new Geolocalizer();
var locations = ["Italy","California","Dragons are thugs...","China","Georgia"];
myAmazingGeo.Localize(locations).then(function(res){ 
   console.log(res); 
});

কনসোল আউটপুট:

Attempting the resolution of Georgia
Attempting the resolution of China
Attempting the resolution of Dragons are thugs...
Attempting the resolution of California
ZERO_RESULTS
could not locate Dragons are thugs...
Attempting the resolution of Italy

অবজেক্ট ফেরত:

এখানে চিত্র বর্ণনা লিখুন

পুরো ম্যাজিকটি এখানে ঘটে:

(function loopWithDelay(such, queue, i){
                    console.log("Attempting the resolution of " +queue[i-1]);
                    setTimeout(function(){
                        such.find(queue[i-1], function(res){
                           such.resolved.push(res); 
                        });
                        if (--i) {
                            loopWithDelay(such,queue,i);
                    }
                }, 750);
            })(that, that.queue, that.queue.length);

মূলত, এটি প্রতিটি আইটেম তাদের প্রত্যেকের মধ্যে 750 মিলি সেকেন্ডের বিলম্বের সাথে লুপ করে, অতএব প্রতি 750 মিলিসেকেন্ডে একটি ঠিকানা নিয়ন্ত্রণ করা হয়।

আমি আরও কিছু পরীক্ষা করেছি এবং আমি জানতে পেরেছি যে এমনকি 700 মিলিসেকেন্ডেও আমি মাঝে মাঝে QUERY_LIMIT ত্রুটি পেয়েছিলাম, যখন 750 এর সাথে আমার কোনও সমস্যা হয়নি।

যাই হোক না কেন, আপনি যদি কম বিলম্বকে পরিচালনা করে সুরক্ষিত বোধ করেন তবে উপরের 750 টি সম্পাদনা করুন feel

আশা করি এটি নিকট ভবিষ্যতে কাউকে সহায়তা করবে;)


0

আমি গুগল জিওকোডারকে সবেমাত্র পরীক্ষা করেছি এবং আপনার মত একই সমস্যা পেয়েছি। আমি লক্ষ্য করেছি যে আমি প্রতি 12 টি অনুরোধে কেবলমাত্র OVER_QUERY_LIMIT স্থিতি পাই তাই আমি 1 সেকেন্ডের জন্য অপেক্ষা করি (এটি অপেক্ষা করতে সর্বনিম্ন বিলম্ব হয়) এটি অ্যাপ্লিকেশনটি ধীর করে দেয় তবে প্রতি অনুরোধের চেয়ে 1 সেকেন্ড অপেক্ষা কম

info = getInfos(getLatLng(code)); //In here I call Google API
record(code, info);
generated++; 
if(generated%interval == 0) {
holdOn(delay); // Every x requests, I sleep for 1 second
}

বেসিক হোল্ডঅন পদ্ধতি সহ:

private void holdOn(long delay) {
        try {
            Thread.sleep(delay);
        } catch (InterruptedException ex) {
            // ignore
        }
    }

আশা করি এটা সাহায্য করবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.