Google Geocode через функцию обратного вызова HTTP? - PullRequest
6 голосов
/ 10 мая 2009

Я хочу использовать геокод Google через HTTP для перевода названия города в долготу и широту для моего веб-приложения AJAX.

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

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

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

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

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

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

например. http://maps.google.com/maps/geo?output=json&sensor=false&key={API_KEY}&q={CITY,STATE}&CALLBACK=????

Спасибо

Ответы [ 8 ]

3 голосов
/ 10 мая 2009

Вот пример, в котором используется геокодер Google Maps. Функция геокодера 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]
            );
          }
        }
      }
    );
  }
}
3 голосов
/ 10 мая 2009

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

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

EDIT:

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

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

2 голосов
/ 10 мая 2009

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

Вот упрощенная версия сценария, который я написал некоторое время назад. Он также использует элемент управления Google Map, но не стесняйтесь игнорировать это. Хак с функцией задержки вызван тем, что казалось, что 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>
1 голос
/ 08 июня 2009

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

лол

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

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

Также

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

Но опять же вы можете попробовать Google Maps API V3 Geocoder

1 голос
/ 10 мая 2009

Вы можете использовать язык 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"

Затем вы добавили бы тег script в ваш html (это можно сделать с помощью document.createElement ('script')) с помощью src http://query.yahooapis.com/v1/public/yql?q={your yql здесь} & format = json & callback = {ваша функция здесь} где { ваш yql здесь} заменен на URI-кодированную версию вашего yql-статуса.

0 голосов
/ 23 сентября 2010

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

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

Я написал чрезвычайно затянутое сообщение в блоге, описывающее этот процесс.

0 голосов
/ 12 мая 2009

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

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

0 голосов
/ 10 мая 2009

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

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

...