2009-05-09 9 views
6

मैं अपने geAXode का उपयोग HTTP कार्यक्षमता के माध्यम से शहर के नाम को मेरे AJAX वेब एप्लिकेशन के लिए अक्षांश और अक्षांश में अनुवाद करने के लिए करना चाहता हूं।Google जियोकोड?

हालांकि, ऐसा लगता है कि कोई कॉलबैक फ़ंक्शन HTTP जियोकोडर कार्यक्षमता

http://code.google.com/apis/maps/documentation/geocoding/index.html

के लिए मौजूद है यह सच है, कोई कॉलबैक फ़ंक्शन मौजूद है?

क्योंकि यदि यह सत्य है, तो इसका अनिवार्य रूप से मतलब है कि HTTP एपीआई के माध्यम से Google geocode AJAX के साथ उपयोग किए जाने पर बेकार है क्योंकि जावास्क्रिप्ट एक क्रॉसडोमेन अपवाद त्रुटि फेंक देगा।

जावास्क्रिप्ट में मेरे AJAX वेब एप्लिकेशन में HTTP एपीआई के माध्यम से मैं geocode का उपयोग कैसे कर सकता हूं इस पर कोई विचार?

नोट: मैं पूर्ण विकसित गूगल मैप्स एपीआई जो लगभग 200kb डाउनलोड जाता है (यानी GClientGeocoder) का उपयोग नहीं करने चाहते हैं। मैं इसकी अत्यधिक त्वरित प्रतिक्रिया के HTTP एपीआई बी/सी का उपयोग करना चाहता हूं और मेरे वेब उपयोगकर्ताओं को भारी पूर्ण उड़ा इंटरएक्टिव Google मानचित्र एपीआई डाउनलोड करने की आवश्यकता नहीं है।

उदा। http://maps.google.com/maps/geo?output=json&sensor=false&key= {API_KEY} & q = {CITY, STATE} & कॉलबैक = ????

धन्यवाद

+0

कोई कच्चा JSONP नहीं है। आप आरईएसटी एपीआई (यदि आवश्यक हो तो प्रॉक्सी के साथ) का उपयोग कर सकते हैं, या आप GClientGeocoder का उपयोग कर सकते हैं। –

+0

कैसे कहा, प्रॉक्सी का उपयोग मूर्ख और कच्चे है लेकिन हाँ, काम करेगा। यदि यह सच है कि JSONP HTTP के लिए मौजूद नहीं है और केवल GClientGeocoder के लिए मौजूद है ... यह बहुत ही दुखी होगा –

उत्तर

3

हम्म .... मुझे लगता है कि जब आप अपनी AJAX वापस अपने सर्वर करने के लिए कॉल, और फिर अपने सर्वर से गूगल के जियोकोड कॉल करना होगा।

यह बताता है कि मैं AJAX geocoding कैसे करता हूं, यह सब मेरे एएसपी.NET कोड के माध्यम से जाता है।

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

ASP.NET WebForms वातावरण मैं एक हल्के ashx फ़ाइल के रूप में इस लागू करता है हो सकता है में, लेकिन सादगी के प्रयोजनों के लिए, यहाँ एक ASPX उदाहरण है:

public partial class GoogleHandler : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) { 
     Response.Write(GetGoogleXML("http://pseudo_googlegeocode?parameter=" + parametersFromQuerystring); 
    } 
} 

उदाहरण में ऊपर , .NET पृष्ठ केवल अनुरोध को पास कर रहा है।

लेकिन वास्तविक वातावरण में, मैं बल्कि मेरा .NET कोड डेटा को पार करने से अधिक करता हूं। इस तरह से मैं क्लाइंट को उस डेटा को भेजने से पहले सर्वर पर त्रुटि प्रबंधन, फ़िल्टरिंग, सत्यापन, व्यवसाय तर्क, सब कुछ कर सकता हूं।

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

इसके अलावा, उस अमूर्तता का उपयोग करके मैं वास्तव में विभिन्न geocoding डेटा स्रोतों से एकाधिक डेटा एकत्र कर सकता था। फिर, सर्वर एकत्रित करने का ख्याल रखता है, क्लाइंट केवल फ़िल्टर किए गए डेटा को प्राप्त करता है और प्रदर्शित करता है।

+0

सामग्री डाउनलोड करने और पुन: पोस्ट करने के लिए अपनी वेबसाइट पर एक मध्यस्थ कदम बनाने के लिए एक भयानक अपशिष्ट की तरह लगता है क्रॉस डोमेन अपवाद को बाईपास करने के परिणामस्वरूप। उत्सुक अगर इसके चारों ओर एक और तरीका है एक अनियंत्रित कॉलबैक दिनचर्या। –

+0

मैं तुम्हे टिम सुनता हूं। मुझे लगता है कि यह सिर्फ सुरक्षा अधिकार है। आप जानते हैं कि वे क्या कहते हैं, आप ऐसे घर में नहीं तोड़ सकते हैं जिसमें दरवाजे नहीं हैं ... erm, क्या वे कहते हैं? आप जानते हैं कि मेरा क्या मतलब है – andy

+0

@tim: आपने जो कहा है उस पर बस एक त्वरित टिप्पणी। यदि आप अपने सर्वर पर एक एजेक्स कॉल करते हैं, जैसे कि आप सीधे Google पर कॉल कर रहे थे, और उसके बाद बस अपने पैरामीटर को पिछले पैरामीटर के साथ पिंग करें, तो हाँ, आप एक बिचौलियों का उपयोग कर रहे हैं, लेकिन आप दोबारा पोस्ट नहीं कर रहे हैं या किसी भी अतिरिक्त सामग्री को डाउनलोड करना – andy

0

Google मानचित्र API देखें। इसमें कॉलबैक के साथ कुछ फ़ंक्शन हैं जो इसकी जियोकोडिंग सेवा का उपयोग करते हैं।

http://code.google.com/apis/maps/documentation/reference.html#GClientGeocoder.getLatLng

+0

धन्यवाद लेकिन पूर्ण उड़ा Google मानचित्र API का उपयोग नहीं करना चाहते हैं। मैं HTTP geocoder का उपयोग करना चाहता हूँ। –

3

यहाँ एक उदाहरण गूगल मैप्स जियोकोडर उपयोग करता है। Geocoder फ़ंक्शन getLocation दूसरे तर्क के रूप में कॉलबैक फ़ंक्शन लेता है।

function findAddress(street, city, state, zip) { 
    var address = [ 
    street, 
    city.toLowerCase(), 
    state.toLowerCase(), 
    zip 
    ].join(', '); 

    if (!geocoder) { 
    geocoder = new GClientGeocoder(); 
    } 

    if (geocoder) { 
    geocoder.getLocations(
     address, 
     function(result) { 
     var dialog, len, point; 
     if (result.Status.code != G_GEO_SUCCESS) { 
      alert("Error: "+result.Status.code) 
     } else { 
      len = result.Placemark.length; 
      if (len > 1) { 
      alert("Multiple matches were found. I'll leave it as an exercise to handle this condition"); 
      } else { 
      point = new GLatLng(
       result.Placemark[0].Point.coordinates[1], 
       result.Placemark[0].Point.coordinates[0] 
      ); 
      } 
     } 
     } 
    ); 
    } 
} 
+1

धन्यवाद लेकिन पूर्ण उड़ा Google मानचित्र API का उपयोग नहीं करना चाहते हैं। मैं HTTP geocoder का उपयोग करना चाहता हूँ। –

2

जैसा कि अन्य ने नोट किया, आपने पूरा पृष्ठ नहीं पढ़ा। आप चाहते हैं कि वह पृष्ठ JavaScript Client Geocode कहलाता है।

यहां एक लिपि का एक सरलीकृत संस्करण है जिसे मैंने कुछ समय पहले लिखा था। यह Google मानचित्र नियंत्रण का भी उपयोग करता है, लेकिन इसे अनदेखा करने के लिए स्वतंत्र महसूस करें। देरी फ़ंक्शन हैक इसलिए है क्योंकि ऐसा लगता है कि जब कभी मैं अपने सर्वर को बहुत तेज़ करता हूं तो Google कभी-कभी शून्य नहीं कर रहा था। मुझे नहीं पता कि यह अभी भी एक मुद्दा है, इसलिए इसे तब तक न रखें जब तक आपको यह नहीं करना पड़े।

<script type="text/javascript"> 

    //<![CDATA[ 

    var freezeLocations; 
    var coder; 
    var map; 

    function load() { 
     if (GBrowserIsCompatible()) { 
     map = new GMap2(document.getElementById("map")); 
     map.setCenter(new GLatLng(38.479395, -98.349609), 4); 
     map.addControl(new GLargeMapControl()); 
     } 

     coder = new GClientGeocoder(); 

     missionLocations = new Array(); 
     missionLocationsDelayed = new Array(); 
     addMissionLocation("Atlanta, Georgia", "http://improveverywhere.ning.com/group/atlanta"); 
     //etc. 
    } 

    function addMissionLocation(newLocation, url) 
    { 
     var successful = false; 
     var counter = 0; 

     while(!successful && counter < 3) 
     { 
      coder.getLatLng(
       newLocation, 
       function(point) { 
        if (!point) { 
         //alert(newLocation + " not found"); 
         successful = false; 
        } else { 
         missionLocations.push(new GMarker(point, { title:newLocation})); 
         //alert(missionLocations.length); 
         map.addOverlay(missionLocations[missionLocations.length - 1]); 
         missionLocations[missionLocations.length - 1].bindInfoWindowHtml("<a href='" + url + "'>" + newLocation + "</a>"); 
         successful = true; 
        } 
       } 
      ); 

      if(!successful) 
      { 
       delayGeocode(); 
      } 

      counter++; 
     } 
    } 

    function delayGeocode() 
    { 
     for(var i = 0; i < 2000000; i++) 
     { 
     } 
    } 


    //]]> 
    </script> 
+0

धन्यवाद लेकिन पूर्ण उड़ा Google मानचित्र API का उपयोग नहीं करना चाहते हैं। मैं HTTP geocoder का उपयोग करना चाहता हूँ। –

1

आप के रूप में अपने ब्लॉग पोस्ट में उल्लिखित याहू क्वेरी भाषा इस्तेमाल कर सकते हैं http://jawtek.blogspot.com/2009/03/unwritten-guide-to-yahoo-query-langauge.html

आप की तरह एक YQL कथन का उपयोग करने में सक्षम होगा:

select * from json where 
    url="http://maps.google.com/maps/geo?output=json&sensor=false&q=Indianapolis,In"

तो फिर तुम एक स्क्रिप्ट टैग अपने html में जोड़ना होगा (document.createElement ('script') के साथ किया जा सकता है, एक स्रोत http://query.yahooapis.com/v1/public/yql?q= {आपका yql यहां} & प्रारूप = जेसन & कॉलबैक = {आपका फ़ंक्शन यहां} जहां {आपका yql यहां} आपके यूआरआई एनकोडेड संस्करण के साथ प्रतिस्थापित है yql स्टेटमेंट।

+0

क्या यह अभी भी एक क्रॉस डोमेन अपवाद नहीं होगा, जो AJAX रोकता है? –

+0

यदि आप XMLHTTPRequest का उपयोग करने का प्रयास कर रहे थे तो हाँ इसे शूट किया जाएगा। तो इसके बजाय आप इसे एक स्क्रिप्ट टैग के रूप में लोड करते हैं और कॉलबैक के साथ यह परिणाम के साथ आपके कार्यों में से एक को कॉल करेगा। – jasonincode

0

मैं geocoder तक पहुंचने के लिए सर्वर-साइड पेज बनाने के लिए सुझाव देता हूं। मैं कुछ ऐसा कर रहा हूं और यह बहुत अच्छा काम करता है। PHP here में geocoder के साथ काम करने के बारे में एक अच्छा लेख है।

यह भी ध्यान दें कि तकनीकी रूप से you're not permitted Google के geocoder का उपयोग करने के लिए जब तक कि आप Google मानचित्र पर डेटा प्रदर्शित नहीं करेंगे - लेकिन मुझे नहीं पता कि वे वास्तव में आपको जांचेंगे या नहीं।

1

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

lol

और सुविधा देता है सभी सेवा के दस्तावेज़ पढ़ें:

10,13 छिपाने या गूगल से मुखौटा आपकी सेवा की पहचान के रूप में यह का उपयोग करता है सेवा, करने में नाकाम रहने से सहित का पालन करें मानचित्र सम्मेलन में सूचीबद्ध पहचान सम्मेलन ; या 10.14 नक्शे API के प्रलेखन में किसी भी नीतियों का उल्लंघन या Google के सॉफ़्टवेयर सिद्धांत (...)

इसके अलावा

का उल्लंघन यह सेवा स्थिर जियोकोडिंग (जाना जाता है) के पते एक बाकी इंटरफ़ेस का उपयोग कर, के लिए के लिए डिज़ाइन किया गया है मानचित्र पर एप्लिकेशन सामग्री के प्लेसमेंट ।उपयोगकर्ता परिभाषित पतों की गतिशील जियोकोडिंग के लिए (उदाहरण के लिए, एक उपयोगकर्ता इंटरफ़ेस तत्व के अंदर), जावास्क्रिप्ट ग्राहक जियोकोडर या फ्लैश ग्राहक जियोकोडर के लिए मानचित्र API के लिए दस्तावेज़ देखें। जियोकोडिंग समय और संसाधन गहन कार्य है। जब भी संभव हो, प्री-जिओकोड पता (जिओकोडिंग सेवा का उपयोग करके या किसी अन्य जियोकोडिंग सेवा) का उपयोग करके ज्ञात है, और अपने परिणामों को अपने स्वयं के डिज़ाइन के अस्थायी कैश में संग्रहीत करें।

लेकिन तब फिर आप की कोशिश कर सकते Google Maps API V3 Geocoder

0

मैं भी चुनौतियों आप ऊपर वर्णित का सामना करना पड़ा। आपने यह इंगित करता है, Google जियोकोड एपीआई यूआरएल के लिए क्रॉस-डोमेन HTTP पहुंच को रोकता है:

यह गंभीर रूप से इसकी उपयोगिता जब क्लाइंट-साइड स्क्रिप्टिंग का उपयोग कर कम करता है। इस चुनौती में मुझे मिला एकमात्र समाधान एक सर्वर-साइड प्रॉक्सी सेवा बनाना था जो Google मानचित्र Geocode API से प्रतिक्रियाओं को मेरी क्लाइंट-साइड स्क्रिप्ट पर रिले करता है।

I wrote an extremely long-winded blog post describing this process.

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^