2009-05-09 3 views
6

Я хочу использовать геокод google через HTTP функциональность для перевода названия города в долготу и широту в моем веб-приложении AJAX.Функция Google Geocode через функцию обратного вызова HTTP?

Тем не менее, кажется, что ни одна функция обратного вызова не существует для HTTP функциональности геокодера

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

Это правда, ни одна функция обратного вызова не существует?

Потому что, если это так, это означает, что геокод Google через HTTP api бесполезен при использовании с AJAX, потому что JavaScript будет генерировать ошибку исключения crossdomain.

Любые идеи о том, как я могу использовать геокод через HTTP api в своем веб-приложении AJAX в JavaScript?

Примечание: Я не хотите использовать полномасштабную Google Maps API, который около 200kb скачать (т.е. GClientGeocoder). Я хочу использовать HTTP api b/c, это очень быстрая реакция и отсутствие необходимости в том, чтобы мои веб-пользователи загружали огромные полномасштабные интерактивные карты google api.

E.g. http://maps.google.com/maps/geo?output=json&sensor=false&key= {API_KEY} & q = {ГОРОД, ГОСУДАРСТВО} & CALLBACK = ????

Благодаря

+0

Нет сырого JSONP. Вы можете использовать REST API (с прокси-сервером, если необходимо), или вы можете использовать GClientGeocoder. –

+0

Как сказано, использование прокси глупо и грубо, но да, будет работать. Если это правда, что JSONP не существует для HTTP и только для GClientGeocoder ... это было бы очень грустно. – 2009-05-10 07:30:32

ответ

3

хмм .... Я думаю, что вы должны были бы иметь свой AJAX перезвонить на свой собственный сервер, а затем вызвать Геокодировать Google с вашего сервера.

То, как я делаю геокодирование AJAX, все это проходит через мой код ASP.NET.

EDIT:

В WebForms среде ASP.NET я мог бы реализующего это как легкий файл 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. Таким образом, мне нужно будет только изменить логику сервисов и оставить клиенту просто получить общий набор координат/данных местоположения.

Кроме того, используя эту абстракцию, я мог бы фактически объединить несколько данных из разных источников данных геокодирования. Опять же сервер заботится об агрегировании, клиент просто получает и отображает отфильтрованные данные.

+0

Кажется, это ужасная трата, необходимая для создания промежуточного шага на вашем веб-сайте, чтобы просто загрузить контент и отправить в результате обход исключения перекрестной области. Любопытно, есть ли другой способ вокруг него или недокументированная процедура обратного вызова. – 2009-05-10 06:03:05

+0

Я слышу тебя Тим. Я думаю, это просто право безопасности. Вы знаете, что они говорят, вы не можете проникнуть в дом, у которого нет дверей ... э-э, они так говорят? вы знаете, что я имею в виду – andy

+0

@tim: просто быстрый комментарий к тому, что вы сказали. Если вы выполняете вызов AJAX на свой сервер, как если бы вы делали звонок прямо в Google, а затем просто отключали Ping google с прошлыми параметрами, то да, вы используете посредника, но вы не переставляете или загружать любой лишний контент. – andy

0

Ознакомьтесь с API Карт Google. Он имеет некоторые функции с обратным вызовом, который использует его службу геокодирования.

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

+0

Спасибо, но не хочу использовать полный API Google Maps. Я хочу использовать HTTP-геокодер. – 2009-05-10 02:49:07

3

Вот пример, который использует Google Maps Geocoder. Функция 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

Спасибо, но не хочу использовать полный API Google Maps. Я хочу использовать HTTP-геокодер. – 2009-05-10 02:48:50

2

Как уже отмечалось, вы не читали полную страницу. Вы хотите, чтобы эта страница вызывала JavaScript Client Geocode.

Вот упрощенная версия скрипта, который я написал некоторое время назад. Он также использует элемент управления Google Map, но не забывайте об этом. Задержка функции взлома заключается в том, что казалось, что Google иногда возвращал значение null, когда я нажимал на их серверы слишком быстро. Я не знаю, если это все еще проблема, поэтому не вставляйте ее, если вам не нужно.

<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

Спасибо, но не хочу использовать полный API Google Maps. Я хочу использовать HTTP-геокодер. – 2009-05-10 02:49:19

1

Вы можете использовать Yahoo Query язык, как указано в моем блоге 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')) с помощью src http://query.yahooapis.com/v1/public/yql?q= {your yql здесь} & format = json & callback = {ваша функция здесь}, где {ваш yql здесь} заменяет кодировку URI, кодированную вами yql statment.

+0

Разве это не исключение перекрестного домена, которое предотвращает AJAX? – 2009-05-10 05:12:54

+0

Если вы пытались использовать XMLHTTPRequest, тогда да, он будет сбит. Поэтому вместо этого вы загружаете его как тег сценария и с обратным вызовом он будет вызывать одну из ваших функций с результатами. – jasonincode

0

Во-вторых, предлагаю создать серверную страницу для доступа к геокодеру. Я делаю что-то подобное, и он отлично работает. Есть хорошая статья о работе с геокодером в PHP here.

Также обратите внимание, что технически you're not permitted использовать геокодер Google, если вы не будете показывать данные на карте Google, но я не знаю, будут ли они на самом деле проверять вас.

1

Если вы смотрели на документацию и не нашел и как Эндрю и Майк не сказал «да», и сказал вам, как это сделать, я подозреваю, у вас есть свой ответ.

лол

и позволяет всем прочитать в документации сервиса:

10.13 скрыть или маску из Google идентификатор вашего сервиса, как он использует службы, в том числе не в состоянии следовать соглашения идентификации , перечисленные в документации API Карт; или 10,14 нарушить политику в документации по API Карт или нарушают принципы программного обеспечения Google (...)

Также

Эта услуга предназначена для геокодирования статическими (известных) адресов с помощью интерфейса REST, для размещение содержимого приложения на карте.Для динамического геокодирования определяемых пользователем адресов (например, в рамках пользовательского интерфейса элемента), обратитесь к документации для клиента геокодировщиком JavaScript или API Карт для Flash Client геокодировщиком. Геокодирование - задача времени и ресурсов. Если возможно, предварительно известный геокод адресов (с использованием службы геокодирования , описанной здесь или другого геокодирования ) и сохраните результаты в временном кэше вашего собственного дизайна.

Но тогда снова вы можете попробовать Google Maps API V3 Geocoder

0

Я тоже столкнулся с проблемами вы описанные выше. Как указано, Google предотвращает междоменное доступ HTTP к URL Geocode API:

Это сильно снижает его полезность при использовании сценариев на стороне клиента. Единственным решением, которое я нашел для этой задачи, было создание серверной прокси-службы, которая передает ответы с API геокодирования Google Maps на мой клиентский сценарий.

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