2009-05-09 19 views
6

Chcę użyć funkcji Google Geocode poprzez HTTP, aby przetłumaczyć nazwę miasta na długość i szerokość geograficzną dla mojej aplikacji internetowej AJAX.Google Geokodowanie za pośrednictwem funkcji zwrotnej HTTP?

Okazuje się jednak, że nie istnieje funkcja zwrotna dla funkcjonalności geocoder HTTP

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

Czy to prawda, nie istnieje funkcja zwrotna?

Bo jeśli to prawda, to w istocie oznacza, że ​​geocode Google poprzez API HTTP jest bezużyteczny w przypadku korzystania z technologii AJAX ponieważ JavaScript rzuci crossdomain błąd wyjątku.

Jakieś pomysły dotyczące wykorzystania geokodowania poprzez api HTTP w mojej aplikacji internetowej AJAX w JavaScript?

Uwaga: robię nie chcesz użyć pełnowartościowy Google Maps API, które jest ok 200KB download (tj GClientGeocoder). Chcę używać interfejsu HTTP api b/c jego bardzo szybkiej reakcji i braku potrzeby od użytkowników sieci pobierania ogromnego, pełnowymiarowego interaktywnego interfejsu map Google.

E.g. http://maps.google.com/maps/geo?output=json&sensor=false&key= {API_KEY} & q = {CITY, STATE} & CALLBACK = ????

Dzięki

+0

Brak surowego JSONP. Możesz użyć interfejsu API REST (w razie potrzeby z proxy) lub użyć GClientGeocoder. –

+0

Jak powiedziałem, używanie proxy jest głupie i prymitywne, ale tak, działałoby. Jeśli to prawda, że ​​JSONP nie istnieje dla HTTP i tylko dla GClientGeocoder ... to byłoby bardzo bardzo smutne –

Odpowiedz

3

hmm .... myślę, że trzeba mieć swoją AJAX oddzwonić na własnym serwerze, a następnie zadzwonić Geokodując Google z serwera.

Tak jak robię geokodowanie AJAX, wszystko przechodzi przez mój kod ASP.NET.

EDIT:

W WebForms środowisku ASP.NET mogę implementuje to jako lekki pliku ashx, ale dla celów uproszczenia, oto przykład 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); 
    } 
} 

W powyższym przykładzie Strona .NET przekazuje tylko żądanie.

Ale w rzeczywistym środowisku wolałbym, aby mój kod .NET nie tylko przekazywał dane. W ten sposób mogę wykonać obsługę błędów, filtrowanie, sprawdzanie poprawności, logikę biznesową, wszystko na serwerze, przed wysłaniem tych danych do klienta.

Pozwala to również na większą abstrakcję. tzn. mogę zmienić geokodowanie z google na yahoo. W ten sposób musiałbym zmienić tylko moją logikę serwowania i zostawić klientowi po prostu otrzymanie ogólnego zestawu danych współrzędnych/lokalizacji.

Ponadto, korzystając z tej abstrakcji, mogłem w rzeczywistości zebrać wiele danych z różnych źródeł danych geokodujących. Ponownie, serwer zajmuje się agregowaniem, klient po prostu odbiera i wyświetla przefiltrowane dane.

+0

Wydaje się, że to okropne marnowanie, aby utworzyć krok pośrednika na swojej stronie internetowej, aby po prostu pobrać zawartość i odświeżyć Wynik pomija wyjątek domeny krzyżowej. Ciekawy, jeśli jest inny sposób lub nieudokumentowana procedura oddzwonienia. –

+0

Słyszę cię Tim. Myślę, że to po prostu bezpieczeństwo. Wiesz, co mówią, nie możesz włamać się do domu, który nie ma drzwi ... erm, czy tak mówią? wiesz co mam na myśli – andy

+0

@tim: po prostu krótki komentarz na temat tego, co powiedziałeś. Jeśli wykonujesz wywołanie AJAX na swoim serwerze, tak jakbyś robił połączenie bezpośrednio do Google, a potem po prostu kazałeś serwerowi pingować go z przeszłymi parametrami, to tak, używasz pośrednika, ale nie przesyłasz lub pobieranie jakiejkolwiek zbędnej treści – andy

3

Oto przykład, który korzysta z Google Maps geocoder. Funkcja getLocation funkcji geokodera przyjmuje funkcję zwrotną jako drugi argument.

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

Dziękujemy, ale nie chcesz używać pełnego interfejsu API Google Maps. Chcę użyć geokodera HTTP. –

2

Inni zauważyli, że nie przeczytali Państwo całej strony. Chcesz to, co ta strona nazywa JavaScript Client Geocode.

Oto uproszczona wersja skryptu, który napisałem jakiś czas temu. Używa również kontrolki Google Map, ale możesz to zignorować. Hack funkcji opóźnienia jest taki, że wydawało się, że Google od czasu do czasu zwraca zero, gdy zbyt szybko trafię na ich serwery. Nie wiem, czy to nadal jest problem, więc nie wkładaj go, chyba że musisz.

<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

Dzięki, ale nie chcesz korzystać z pełnego interfejsu Google Maps API. Chcę użyć geokodera HTTP. –

1

Można używać języka Yahoo Query jak wskazano w moim blogu http://jawtek.blogspot.com/2009/03/unwritten-guide-to-yahoo-query-langauge.html

Użytkownik będzie mógł korzystać oświadczenie YQL jak:

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

Następnie należy dodać tag skryptu do kodu HTML (można to zrobić za pomocą document.createElement ('script')) z src http://query.yahooapis.com/v1/public/yql?q= {twój yql tutaj} & format = json & callback = {twoja funkcja tutaj} gdzie {twój yql tutaj} jest zamieniany na URI Zakodowaną wersję ciebie statystyka yql.

+0

Czy nie jest to nadal wyjątek międzydomenowy, który zapobiega AJAX? –

+0

Jeśli próbujesz użyć XMLHTTPRequest, a następnie tak, zostanie on zestrzelony. Zamiast tego ładuje się go jako znacznik skryptu i wywołanie zwrotne wywołuje jedną z funkcji wraz z wynikami. – jasonincode

0

Po drugie proponuję utworzyć stronę po stronie serwera, aby uzyskać dostęp do geokodera. Robię coś podobnego i działa świetnie. Jest dobry artykuł na temat pracy z geokoderem w PHP here.

Należy również pamiętać, że technicznie you're not permitted używać geokodera Google, chyba że będziesz wyświetlać dane na mapie Google - ale nie wiem, czy faktycznie będą Cię sprawdzać.

1

Jeśli spojrzał na dokumentacji i nie okazało się, że i zarówno Andrew i Mike nie powiedział „tak”, i powiedział, jak to zrobić, ja podejrzewasz, że masz swoją odpowiedź.

lol

i pozwala wszystkim zapoznać się z dokumentacją serwisowego:

10,13 ukryć lub maskę z Google tożsamość usługi, ponieważ korzysta z Usługi, w tym poprzez brak postępuj zgodnie konwencje identyfikacji wymienione w dokumentacji API Maps API; lub 10,14 narusza żadnych zasad w Dokumentacji Maps API lub naruszają Zasady oprogramowania Google (...)

także

Usługa ta przeznaczona jest dla geokodowanie statyczne (znany) rozwiązuje użyciu interfejs REST, na umieszczenie zawartości aplikacji na mapie.Dla dynamicznego geokodowanie o zdefiniowanych przez użytkownika adresów (na przykład w elemencie interfejsu użytkownika ), zapoznać się z dokumentacją dla JavaScript geocoder klienta lub Maps API dla Flash Client geocoder. Geokodowanie to zadanie czasochłonne i zasobochłonne . Jeśli jest to możliwe, pre-geocode znane adresy (za pomocą usługi geokodowania opisanej tutaj lub innej usługi geokodowania ) i zapisz wyniki w tymczasowej pamięci podręcznej o wartości własnego projektu.

Ale potem znowu można spróbować Google Maps API V3 Geocoder

0

Ja też spotkałem wyzwaniom ty opisanych powyżej. Jak już wskazano, Google uniemożliwia dostęp HTTP między domenami do adresu URL przetwarzania danych geograficznych API:

ten sposób poważnie zmniejsza jego użyteczność przy użyciu skryptów po stronie klienta. Jedynym rozwiązaniem, które znalazłem w tym wyzwaniu, było stworzenie usługi proxy po stronie serwera, która przekazuje odpowiedzi z interfejsu Google Maps Geocode API do mojego skryptu po stronie klienta.

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

Powiązane problemy