• Что бы вступить в ряды "Принятый кодер" Вам нужно:
    Написать 10 полезных сообщений или тем и Получить 10 симпатий.
    Для того кто не хочет терять время,может пожертвовать средства для поддержки сервеса, и вступить в ряды VIP на месяц, дополнительная информация в лс.

  • Пользаватели которые будут спамить, уходят в бан без предупреждения. Спам сообщения определяется администрацией и модератором.

  • Гость, Что бы Вы хотели увидеть на нашем Форуме? Изложить свои идеи и пожелания по улучшению форума Вы можете поделиться с нами здесь. ----> Перейдите сюда
  • Все пользователи не прошедшие проверку электронной почты будут заблокированы. Все вопросы с разблокировкой обращайтесь по адресу электронной почте : info@guardianelinks.com . Не пришло сообщение о проверке или о сбросе также сообщите нам.

Delphi Google Maps

Sascha Оффлайн

Sascha

Заместитель Администратора
Команда форума
Администратор
Регистрация
9 Май 2015
Сообщения
1,562
Баллы
155
Понадобилось в одном из проектов сделать отображение клиентов на карте. Стал копать в интернете как связаны Delphi и карты.

В одном из блогов увидел что для Delphi есть библиотека компонентов для работы

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

, называются он GMLib(Google Maps Library).



Скачать можно тут

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

.

Библиотека очень проста в работе. Для отображения карт используется компонент delphi Webbrowser.

Простой пример использования данной библиотеки.

На форму кидается компонент webbrowser.

Затем добавляются компоненты

GMMap - это компонент для управления картой.

GMMarker - компонент для управления отметками на карте.

GMGeoCode - компонент для запросов и геокодирования.

У компонента GMMap настраиваются различные параметры для отображения карты, а так же указывается webbrowser куда карта будет выводится, а также устанавливается свойсто GMMap.active:= true .

У компонента GMGeoCode указывается GMMap и GMMarker .

У компонента GMMarker указывается компонент GMMap.

Затем в обработчике события GMMap.AfterPageLoaded пишется следующий код.

Код:
procedure TForm1.GMMap1AfterPageLoaded(Sender: TObject; First: Boolean);
begin
if  First  then // проверка что загрузились изображения
  begin
    GMMap1.DoMap; // отображение карты
  end;
end;
Если все настроено правильно то после запуска приложения должна отобразится карта, точнее место карты с нулевой широтой и долготой. Это где то в Атлантическом океане.

Для поиска на карте добавил необходимо добавить компоненты edit и button

В обработчике события Button1.Click написать следующий код
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  GMGeoCode1.Marker.Clear;
  GMGeoCode1.Geocode(Edit1.Text);
  if GMGeoCode1.GeoStatus = gsWithoutState then
    Exit;
  if GMGeoCode1.Count = 0 then
  begin
    ShowMessage('Адрес не найден на карте, возможно он указан не правильно.');
  end
  else
  begin
    for i := 0 to GMGeoCode1.Count-1 do
    begin
            GMGeoCode1.Marker.Add(GMGeoCode1.GeoResult[i].Geometry.Location.Lat,
        GMGeoCode1.GeoResult[i].Geometry.Location.Lng,
        GMGeoCode1.GeoResult[i].FormatedAddr);
      GMGeoCode1.Marker.Items[i].MarkerType := mtStandard;
    end;
  end;
end;
Что бы код заработал, добавьте в раздел uses юниты GMConstants, GMFunctionsVCL

Пример работы
1.JPG

По вопросам комментаторов по поводу определение высоты точки. Для этого я переделал форму. Добавил на нее компонент GMElevation1 (он появился в одной из последних версий компонентов) и StatusBar1, затем переписал исходный код. Он немного кривой но работоспособный, поскольку в демо примере что идет с компонентами попытка определить высоту завершается ошибкой.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
  mypoint: TLatLng;
begin
  GMGeoCode1.Marker.Clear;
  GMGeoCode1.Geocode(Edit1.Text);
  mypoint := TLatLng.Create;// создаем обьект TLatlng для хранения координат
  if GMGeoCode1.GeoStatus = gsWithoutState then
    Exit;
  if GMGeoCode1.Count = 0 then
  begin
    ShowMessage('Адрес не найден на карте, возможно он указан не правильно.');
  end
  else
  begin
    for i := 0 to GMGeoCode1.Count - 1 do
    begin
      GMGeoCode1.Marker.Add(GMGeoCode1.GeoResult[i].Geometry.Location.Lat, GMGeoCode1.GeoResult[i].Geometry.Location.Lng, GMGeoCode1.GeoResult[i].FormatedAddr);
      GMGeoCode1.Marker.Items[i].MarkerType := mtStandard;
      StatusBar1.Panels[0].Text := 'lat: ' + FloatToStr(GMGeoCode1.GeoResult[i].Geometry.Location.Lat);
      StatusBar1.Panels[1].Text := 'lng: ' + FloatToStr(GMGeoCode1.GeoResult[i].Geometry.Location.Lng);
      mypoint.Lat := GMGeoCode1.GeoResult[i].Geometry.Location.Lat; // добавляем широту
      mypoint.Lng := GMGeoCode1.GeoResult[i].Geometry.Location.Lng; // добавляем долготу
      GMElevation1.Clear;    // очищаем список
      GMElevation1.AddLatLng(mypoint); // добвляем коодинаты для которых нужна высота
      GMElevation1.Execute; // делаем запрос
      StatusBar1.Panels[2].Text := 'Высота: '+  FloatToStr(GMElevation1.ElevationResult.Items[0].Elevation); // получаем высоту обьекта
      GMMap1.SetCenter(GMGeoCode1.GeoResult[i].Geometry.Location.Lat, GMGeoCode1.GeoResult[i].Geometry.Location.Lng);
    end;
  end;
end;
Пример работы нового кода.
2.JPG

Демо самого урока

Пожалуйста Авторизируйтесь или Зарегистрируйтесь для просмотра скрытого текста.

 

Вложения

T Оффлайн

tarakan

Принятый Кодер
Регистрация
28 Окт 2016
Сообщения
1
Баллы
28
Отлично спасибо, а можете просветить на счет offline карт OSM, какими компонентами и как с ними работать. Спасибо.
 
Вверх Снизу