Геокод Google через функцию обратного вызова HTTP?

Если предположить, что более высокий идентификатор означает более свежий отчет (лучше хранить временную метку), вы можете использовать оконные функции в последних версиях sqlite, чтобы упростить задачу:

SELECT id, user_id, report_id, earned
FROM (SELECT id, user_id, report_id, earned
           , rank() OVER (PARTITION BY report_id, user_id ORDER BY earned DESC, id DESC) AS ranking
      FROM example)
WHERE ranking=1 AND report_id=3;
id          user_id     report_id   earned    
----------  ----------  ----------  ----------
10          20          3           30        
9           40          3           50        
6
задан 11 May 2009 в 13:37
поделиться

7 ответов

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

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

0
ответ дан 10 December 2019 в 00:44
поделиться

Вот пример, который использует геокодер 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 December 2019 в 00:44
поделиться

Вы можете использовать язык запросов Yahoo, как описано в моем сообщении в блоге http://jawtek.blogspot.com/2009/03/unwritten-guide-to-yahoo-query-langauge .html

Вы можете использовать инструкцию yql, например:

 select * from json, где
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= {ваш yql здесь} & format = json & callback = {ваша функция здесь} где {ваш yql здесь } заменяется версией вашего статуса yql с кодировкой URI.

1
ответ дан 10 December 2019 в 00:44
поделиться

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

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

РЕДАКТИРОВАТЬ:

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

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

3
ответ дан 10 December 2019 в 00:44
поделиться

As others noted, you didn't read the full page. You want what that page calls the JavaScript Client Geocode.

Here's a simplified version of a script I wrote a while back. It also uses a Google Map control, but feel free to ignore that. The delay function hack is because it seemed Google was occasionally returning null when I hit their servers too fast. I don't know if this is still an issue, so don't put it in unless you have to.

<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>
2
ответ дан 10 December 2019 в 00:44
поделиться

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

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

0
ответ дан 10 December 2019 в 00:44
поделиться

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

lol

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

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

Также

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

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

1
ответ дан 10 December 2019 в 00:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: