Случайное количество маркеров, нарисованных при последовательных попытках с использованием GMLib

У меня есть приложение, в котором есть кнопка, которая при нажатии запускает запрос, затем считывает набор данных и добавляет маркеры в TGMMap/TGMMarker, соответствующие прочитанным значениям (оно также использует TGMGeoCode для геокодирования адресных значений, если это имеет значение) . При первом нажатии кнопки всегда размещается правильное количество (10) маркеров, но если я снова нажимаю кнопку сразу после отображения точек, рисуется случайное количество маркеров (иногда 3, иногда 1, иногда 5 и др.). Однако, если я подожду некоторое время (около 15-20 секунд), прежде чем снова нажать кнопку, всегда будет отображаться правильное количество точек, поэтому я уверен, что это какая-то проблема времени, когда DOM может быть построен не полностью. или какой-то скрипт все еще выполняется или ??? Есть ли какой-то флаг состояния, который я могу проверить, чтобы убедиться, что карта готова принять новые маркеры, или есть какой-то цикл ProcessMessage, который мне нужно реализовать, или ??

Код в основном работает так каждый раз, когда нажимается кнопка:

  dataSet.Active := false;
  dataset.Active := true;
  Marker1.Clear();
  while (dataset.Eof=false) do
  begin
    fGeoCoder.Geocode(address);
    // Use first GeoCode result??
    if (fGeoCoder.GeoStatus = gsOK) and (fGeoCoder.Count > 0) then
    begin
      geoResult := fGeoCoder.GeoResult[0];
      lat := geoResult.Geometry.Location.Lat;
      lng := geoResult.Geometry.Location.Lng;

      marker := Marker1.Add(lat, lng);
    end;
    dataset.Next();
  end;

Заранее благодарим за любую помощь, которую вы можете предоставить.


person Andrew Clark    schedule 16.11.2015    source источник


Ответы (1)


Это ограничение API Карт Google, а не проблема GMLib. Если вы не хотите ждать, вам нужно заплатить за доступ к Google Maps API. Если нет, вы можете проверить статус геокодирования (GeoStatus) и, если он отличается от gsOK, подождать несколько секунд и отправить тот же запрос.

person cadetill    schedule 16.11.2015
comment
Да, спасибо, cadetill, я не знал, что существуют ограничения на API геокодирования. Для других, кто заинтересован, см. Developers.google.com/maps/documentation/business/articles/… для получения подробной информации, в основном вам разрешено 10 запросов геокодирования в секунду. Пример кода Delphi для обработки этих запросов: i := 1; в то время как (fGeoCoder.GeoStatus = gsOVER_QUERY_LIMIT) и (i‹=3) действительно начинают Sleep(2000); fGeoCoder.Geocode(адрес); Инк (я); конец; - person Andrew Clark; 26.12.2015