গুগল মানচিত্রের জিওকোড সীমা এড়ানো হচ্ছে?


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> 

যতক্ষণ না চিহ্নিতকারীরা তাত্ক্ষণিকভাবে লোড হয় এবং এটি কোনও শর্তাদি এবং শর্ত ভঙ্গ না করে সমাধান কী তা সমাধান করার বিষয়টি আসলেই গুরুত্বপূর্ণ নয়।


আপনি কেন বলছেন না বা আপনি কতবার এই চেহারাগুলি করছেন। আপনি প্রতিটি পৃষ্ঠার যে একই পয়েন্ট রেন্ডার করেন তা একইভাবে জিওকোড করার চেষ্টা করছেন না? যদি মামলাটি হয়ে থাকে তবে আপনার অবস্থানটি ডাটাবেসে প্রথম যুক্ত হওয়ার পরে কেবল একবার এই লকআপস সার্ভারের পক্ষে এপি ব্যবহার করা উচিত at
পিটার

আপনি যদি @ পিটারের পরামর্শ চেষ্টা করতে চান তবে এখানে একটি সাধারণ সরঞ্জাম রয়েছে যা গুগল স্প্রেডশিটে পয়েন্টগুলি জিওকোড করবে। এটি আপনাকে সিএমএসে শহরগুলির জন্য দীর্ঘ / দীর্ঘ লেখার অনুমতি দেবে, সুতরাং রান-টাইমে আপনাকে জিওকোডার ব্যবহার করার দরকার নেই।
স্টিফেন লিড

@ পিটার আসলে এটি দুর্দান্ত ধারণা বলে মনে হচ্ছে। আমি কিছুটা ছিন্ন ছিলে কারণ এটি আমার সেন্টিমিটারের ব্যবহারযোগ্যতা হ্রাস পাবে। যদি ক্লায়েন্টটি কেবল ঠিকানা প্রবেশের পরিবর্তে প্রতি কোম্পানিতে ল্যাট / লম্বা সন্ধান করতে হয় তবে এটি খুব ব্যবহারকারী বান্ধব নয়। আমি কি এটি সঠিকভাবে বুঝতে পারি?
রব

আমার নতুন উত্তরটি পিএইচপি ফাংশনের জন্য নীচে দেখুন।
পিটার

2
@ আরব এফডাব্লুআইডাব্লু আমি মনে করি রাগির সঠিক পন্থা রয়েছে। কেসির উত্তরের জন্য এখনও প্রতিটি পয়েন্ট জিওকোড করা দরকার, প্রতিবার মানচিত্রটি আঁকলে, যা আপনার স্ট্যাটিক ডেটাসেটের জন্য প্রয়োজনীয় বলে মনে হয় না
স্টিফেন লিড

উত্তর:


57

অন্য সবার মতো, আমি আপনাকে কোড সহ একটি উত্তর দিতে পারতাম, তবে আমার মনে হয় না যে কেউ আপনাকে ব্যাখ্যা করেছে যে আপনি এমন কিছু করছেন যা মূলত ভুল

কেন আপনি এই ত্রুটি মারছেন? কারণ আপনি প্রতিবারই কেউ আপনার পৃষ্ঠাটি দেখে জিওকোড কল করছেন এবং আপনি ডিবিতে কোথাও আপনার ফলাফলগুলি ক্যাশে করছেন না!

সীমা বিদ্যমান থাকার কারণ হ'ল গুগলের সংস্থান থেকে অপব্যবহার রোধ করা (এটি স্বেচ্ছায় বা অনিচ্ছায় হোক) - যা হ'ল আপনি যা করছেন তা :)

যদিও গুগলের জিওকোডটি দ্রুত, সকলেই যদি এটির মতো ব্যবহার করে তবে এটি তাদের সার্ভারগুলিকে নামিয়ে ফেলবে। গুগল ফিউশন টেবিলের যে কারণ রয়েছে তা আপনার জন্য প্রচুর ভারী সার্ভার সাইড লিফটিং করা। জিওকোডিং এবং টাইল ক্যাচিং তাদের সার্ভারগুলিতে করা হয়। আপনি যদি এটি ব্যবহার করতে না চান, তবে আপনার সেগুলি আপনার সার্ভারে রাখা উচিত।

যদি এখনও হয়, 2500 দিনের জন্য অনুরোধটি খুব কম, তবে আপনাকে গুগল ম্যাপস প্রিমিয়ার (অর্থ প্রদান করা) লাইসেন্সটি দেখতে হবে যা আপনাকে বছরে 10 কে-এর কাছাকাছি কোনও কিছুর জন্য প্রতিদিন 100,000 জিওকোডিংয়ের অনুরোধ দেয় (এটি অনেকটা - সার্ভার সাইড ক্যাশিংয়ের সাথে আপনার উচিত) আপনি যদি কিছু বিশাল সাইট না হন বা ভারী ডেটা প্রক্রিয়াকরণ না করেন তবে এই সীমাতে পৌঁছাবেন না )। সার্ভার সাইড কেচিং এবং আপনার বর্তমান পদ্ধতির ব্যবহার না করে আপনি কেবল দিনে 800 পৃষ্ঠাগুলি করতে সক্ষম হবেন!

আপনি যখন বুঝতে পারবেন যে অন্যান্য সরবরাহকারীরা জিওকোডের জন্য চার্জ নেন , আপনি বুঝতে পারবেন যে আপনার ফলাফলটি ডিবিতে ক্যাশে করা উচিত। এই পদ্ধতির সাহায্যে আপনার প্রতি পৃষ্ঠাগুলিতে 10 মার্কিন সেন্ট খরচ পড়বে!

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

সুতরাং যে ব্যবহারের ক্ষেত্রে সঠিক উপায় কি? আপনি গুগল জিওকোড এপিআই কল করার আগে এটি আপনার সার্ভারে প্রেরণ করুন এবং এটি আপনার ক্যাশে রয়েছে কিনা তা অনুসন্ধান করুন। যদি তা না হয়, জিওকোডকে কল করুন, এটি আপনার ক্যাশে সংরক্ষণ করুন এবং ফলাফলটি ফিরে দিন।

অন্যান্য পদ্ধতি আছে, তবে এটি আপনাকে সঠিক দিকে শুরু করা উচিত।

আপডেট: নীচে আপনার মন্তব্যগুলি থেকে, এটি বলেছে যে আপনি পিএইচপি ব্যবহার করছেন, সুতরাং এটি কীভাবে সঠিকভাবে করা যায় তার একটি কোড নমুনা (নিজেই গুগল দল থেকে প্রস্তাব) https://developers.google.com/maps/articles/phpsqlsearch_v3


আপনি সার্ভার ইত্যাদিতে প্রেরণ করার মতো কোনও উদাহরণ পেয়েছি?
রব

আপনার ব্যাকএন্ড সিএমএস কি? (আমি ধরে নিলাম আপনি / এটি কীভাবে পরিবর্তন করতে পারবেন এবং কেবল একটি সাধারণ উদাহরণ চান যা এটি আপনার পছন্দের ভাষাতে কীভাবে করা যায় তা দেখায় You আপনার ক্লায়েন্ট সাইড জেএসের উদাহরণ প্রয়োজন নেই, বা আপনি কি? আপনি কোনও জেএস ব্যবহার করছেন? jquery মত কাঠামো?
রাগী ইয়াসার বুড়হুম

এছাড়াও, আপনাকে কীভাবে মার্কার ডেটা আপনার সিস্টেমে প্রথম স্থানে চলে আসে সে সম্পর্কে আপনাকে আরও প্রসঙ্গ দিতে হবে
রাগি ইয়াসার বারহুম

1
ঠিক আছে. পিএইচপি তারপর। গুগল ডকুমেন্টেশনের এই বিটের মধ্যে মাইএসকিএল
রাগী ইয়াসার বারহুম

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

কাজ মনে হচ্ছে।

সম্পাদনা: সত্যিই এটি পরীক্ষা করতে পারে না, তবে এটি / সম্ভবত কাজ করে!

জাভাস্ক্রিপ্ট উদাহরণ। ঠিকানাআরয়ে স্ট্রিংগুলি সম্বোধন করে ...

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

জবাবের জন্য ধন্যবাদ. আমি কীভাবে এটি আমার কোডের মধ্যে পেতে পারি। এটি কিছুটা নতুন তাই কিছু হাত ধরে রাখা দরকার। আপনি আমার উত্স কোড দেখতে সক্ষম হওয়া উচিত।
রব

কি বিট? আপনি কোন ভাষা ব্যবহার করছেন?
CatchingMonkey

আমি জাভাস্ক্রিপ্ট ব্যবহার করছি, আমি কীভাবে একটি বিরতি সেট করতে পারি?
রব

আমার উত্তর সম্পাদনা।
ক্যাচিংমনকি

এছাড়াও বুঝতে পেরেছি যে আমি সেটটাইমআউট () বোঝাই ... ধন্যবাদ ক্যাসি।
ক্যাচিংমনকি

9

দেখে মনে হচ্ছে আপনি গুগলের দ্বারা আরোপিত একযোগে অনুরোধের সীমাটিকে আঘাত করছেন (যদিও সীমাটি আসলে কী তা আমি কোনও রেফারেন্স পাই না)। আপনার অনুরোধগুলি স্থানের প্রয়োজন হবে যাতে আপনি একবারে 125 টি অনুরোধ প্রেরণ না করেন। নোট করুন যে প্রতিদিনের সীমাতে 2500 জিওকোড অনুরোধও রয়েছে।

আরও তথ্যের জন্য গুগল জিওকোডিং কৌশল নথির সাথে পরামর্শ করুন।

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


আমি অনুমান করেছি যে আমি সীমাটি হিট করব, আমি এটিতে এতই নতুন যে আমার মনে হয় সহায়তা করার জন্য আমার একটি কোড উদাহরণ প্রয়োজন।
রব

আমি গুগল ফিউশন টেবিলগুলি সন্ধান করছি এবং কয়েকটি সমস্যা দেখতে পাচ্ছি। ১. আপনাকে টেবিলে ম্যানুয়ালি ঠিকানাগুলি জিওকোড করতে হবে (ফাইল-> জিওকোডের মাধ্যমে), এটি কী স্বয়ংক্রিয়ভাবে করা যায়? ২. কিছু চিহ্নিতকারী কেবল কিছু নির্দিষ্ট জুম স্তরে উপস্থিত হয় অন্যরা জুম স্তরের যা কিছু দেখায়। এটি উদাহরণ - mediwales.com/mapping/example। আমি শেষ পর্যন্ত যা করতে চাই তা হ'ল আমার ওয়ার্ডপ্রেস ডেটা (অর্থাত্ সমস্ত সংস্থার ঠিকানা) ফিউশন টেবিলে রফতানি করা, সেগুলি স্বয়ংক্রিয়ভাবে জিওকোড করে সেই সমস্ত জিওকোডযুক্ত ঠিকানাগুলি ধরে ফেলুন এবং তাত্ক্ষণিকভাবে মানচিত্রটি প্লট করুন।
রব

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

আমি এখন পৃষ্ঠা চেষ্টা করেছি এবং এটা কাজ বলে মনে হয় এখনই

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

লোকালস্টোরেজ হ'ল তুলনামূলকভাবে নতুন প্রযুক্তি যা বেশিরভাগ ব্রাউজারগুলিতে তৈরি হয় যা ওয়েব পৃষ্ঠাকে ক্লায়েন্টে ডেটা সঞ্চয় করতে দেয়। এটি কিছুটা কুকিজের মতো, তবে এটি অনেক বেশি শক্তিশালী এবং এটি সর্বদা সার্ভারে (কুকিজের বিপরীতে) বিরক্তি প্রকাশ করে না।

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

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

অনেক অনেক ধন্যবাদ, কেবল অন্য কিছু দিয়ে যেতে কিন্তু এক মিনিটে এটি চেষ্টা করে দেখুন। একটি ভাল ধারণা মত শোনায়।
রব

এটি চেষ্টা করে দেখুন (এখন আগেরটিতে ফিরে এসেছে) এটি প্রথমবারের পরে কাজ করেছিল যখন আমি তা সতেজ করে খালি পৃষ্ঠাটি দেখিয়েছিলাম।
রব

এখনই চেষ্টা করুন, একটি ত্রুটি হয়েছিল, দয়া করে নোট করুন যে পপআপ_কন্টেন্ট ভেরিয়েবলটি ব্রেভিটির জন্য redacted হয়েছে।
unicoletti

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। জো \ xe3o নাভেস ডি \ xc1vila, 7595 - সেগিসমুন্ডো পেরেইরা, উবারেল-এক্সে 2 ইন্ডিয়া - মিনাস গেরেইস, 38408-288, ব্রাজিল ', (-18.9388154, -48.2220562)

7596 (u'Av। জো \ xe3o নাভেস ডি \ xc1vila, 7596 - সেগিসমুন্ডো পেরেইরা, উবারেল-এক্সে 2 ইন্ডিয়া - মিনাস গেরেইস, 38408-680, ব্রাজিল ', (-18.938814, -48.2217423)

7597 (u'Av। জো \ xe3o নাভেস ডি \ xc1vila, 7597 - সেগিসমুন্ডো পেরেইরা, উবারেল-এক্সে 2 ইন্ডিয়া - মিনাস জেরেইস, 38408-288, ব্রাজিল ', (-18.9388128, -48.2220381)

7598 (u'Av। জো \ xe3o নাভেস ডি \ xc1vila, 7598 - সেগিসমুন্ডো পেরেইরা, উবারেল-এক্সে 2 ইন্ডিয়া - মিনাস জেরেইস, 38408-680, ব্রাজিল ', (-18.9388114, -48.2217242)

7599 (u'Av। জো \ xe3o নাভেস ডি \ xc1vila, 7599 - সেজিসমুন্ডো পেরেইরা, উবারেল-এক্সে 2 ইন্ডিয়া - মিনাস গেরেইস, 38408-288, ব্রাজিল ', (-18.9388102, -48.2220201))

7600 (u'Av। জো \ xe3o নাভেস ডি \ xc1vila, 7600 - সেগিসমুন্ডো পেরেইরা, উবারেল-এক্সে 2 ইন্ডিয়া - মিনাস জেরেইস, 38408-680, ব্রাজিল ', (-18.9388088, -48.2217062)

এটি এখনও চলছে এবং আমি 7 কে ফলাফল সহ।

সম্পাদনা: কিছুক্ষণ পরে আমি রাস্তার প্রান্তটি ছুঁড়েছি এবং গুগল আমাকে একই পয়েন্ট দিতে শুরু করেছে, তবে দেখে মনে হচ্ছে এটি এখনও অনুরোধ করছে এবং আমাকে সঠিক উত্তর দিচ্ছে।


জিওপি যাদু নয়, ব্যবহারের সীমাবদ্ধতাগুলি এখনও প্রযোজ্য।
বর্ণমালা

1

এই পিএইচপি ফাংশন (আপনি কোন ভাষাতে কাজ করছেন তা আমি জানি না, তবে আপনি অবশ্যই এটিকে বেছে নিতে পারেন) গুগল জিওলোকেটর এপিআই ব্যবহার করে। একটি ঠিকানা দেওয়া হয়েছে, এটি স্বাভাবিকীকৃত ঠিকানা এবং ল্যাটলম্ব ফিরিয়ে দেবে। আছে 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));
}    

উত্তরের জন্য ধন্যবাদ, আমি কীভাবে এটি আমার কোডে অন্তর্ভুক্ত করব?
রব

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

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

আপনি গুগল ম্যাপ জিওকোড সীমা এড়াতে পারবেন না: আপনার অবশ্যই ল্যাটলংয়ের তথ্য সংগ্রহ এবং সংরক্ষণ করতে হবে ।

যদি আপনার বেশ কয়েকটি শহর থাকে এবং আপনি ম্যানুয়ালি ল্যাটলংটি পেতে না চান তবে আপনি একটি সময়সীমা ব্যবহার করে প্রগতিতে জিওকোডার geজোকোড কল করতে পারেন এবং জাভাস্ক্রিপ্ট অবজেক্টের ভিতরে তথ্য সংরক্ষণ করতে 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 এর জন্য গুগল লাইসেন্সটি প্রতি বছর প্রায় 10k মার্কিন ডলার।

আপনি যদি একই স্তরের নির্ভুলতা বা আরও ভাল চান (এবং সেই মূল্য দিতে হবে না), আপনি আমাদের পরিষেবাটি চেষ্টা করতে পারেন। গুগলের চেয়ে অনেক কম দামের জন্য (প্রায় দশম দাম), আপনি 2500 সীমা থেকে অনেক বেশি পেতে পারেন (আমাদের সর্বনিম্ন সীমা 25k / দিন)।

অবশ্যই, আমাদের প্রদত্ত জিওকোডিং এপিআই ব্যবহার করা আমার 100% সৎ হওয়ার পরামর্শ দেওয়ার সমাধান নয়, যদিও এটি স্বীকার করা খারাপ ব্যবসায়ের বোধগম্য। পরিবর্তে আমি বিকল্প 1 এর সাথে যাবার পরামর্শ দেব, ক্যাশে আপনার পরিষেবাটি অনুকূলিত করুন। আপনার যদি না হয় প্রতিদিন 2500 টিরও বেশি অনন্য জিওকোডের প্রয়োজন হয়।

দাবি অস্বীকার: আমি জিওকোড ফার্মের জন্য কাজ করি (আমি যে পরিষেবাটি সুপারিশ করছি)।


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