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

В одном из блогов увидел что для Delphi  есть библиотека компонентов для работы Google Maps, называются он 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

 Пример работы

goglemap

По вопросам комментаторов по поводу определение высоты точки. Для этого я переделал  форму. Добавил на нее компонент 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;

Пример работы нового кода.

gmaps new

 

 

Комментарии   

0 #22 Sasha 19.06.2017 22:33
Цитирую Александр К:
Цитирую Sasha:
Цитирую Александр К:
По прежнему при открытии карты - карта не открывается и крутит крутит и программа повисает. В чем может быть причина версия GMLib последняя с github.

Может у вас фаерволл или антивирус блокирует доступ программе в интернет?

На разных ПК работает одинаково! Причем до смены версии карты с предыдущей версией GMLib работало стабильно хорошо!

судя по тому что пишут в интернете, новая версия компонентов может не работать , если на компьютере стоит IE 8 .
Цитировать
0 #21 Александр К 19.06.2017 19:57
Цитирую Sasha:
Цитирую Александр К:
По прежнему при открытии карты - карта не открывается и крутит крутит и программа повисает. В чем может быть причина версия GMLib последняя с github.

Может у вас фаерволл или антивирус блокирует доступ программе в интернет?

На разных ПК работает одинаково! Причем до смены версии карты с предыдущей версией GMLib работало стабильно хорошо!
Цитировать
0 #20 Sasha 19.06.2017 19:21
Цитирую Александр К:
По прежнему при открытии карты - карта не открывается и крутит крутит и программа повисает. В чем может быть причина версия GMLib последняя с github.

Может у вас фаерволл или антивирус блокирует доступ программе в интернет?
Цитировать
0 #19 Александр К 19.06.2017 18:34
По прежнему при открытии карты - карта не открывается и крутит крутит и программа повисает. В чем может быть причина версия GMLib последняя с github.
Цитировать
0 #18 DCodeR 07.06.2017 16:10
Цитирую Xvir:
Приветствую, подскажите почему то перестал работать ! что случилось? GMGeoCode1.Geocode не получает ,но и маркер соответственно по адресу не могу отобразить!


Обновись с github
Цитировать
0 #17 Xvir 06.06.2017 15:44
Приветствую, подскажите почему то перестал работать ! что случилось? GMGeoCode1.Geoc ode не получает ,но и маркер соответственно по адресу не могу отобразить!
Цитировать
0 #16 Александр К 22.05.2017 17:13
Добрый день! У меня перестала карта загружаться через эти компоненты. Может кто подскажет в чем причина? Ключ есть, новый даже взял на сайте гугла!
Цитировать
0 #15 Sergo 14.05.2017 18:44
А возможно устанавливать маркер на каждую позицию
GMMarker1.Add.P osition:=Routes [0].Leg[5].Step [0].Path[0]; ?
Цитировать
0 #14 Sasha 14.05.2017 15:55
Цитирую Sergo:
Цитирую Sasha:
Цитирую Sergo:
Маркеры он ставит, но сам маршрут визуально не прокладывает

Странно, у меня прокладывается маршрут и по городам и по городу между домами. я добавил GMDirection выставил map := GMMap1; и дальше код из предыдущего комментария и все . прокладывается линия .

А можешь отправить скрин вкладки Properties из Direction?

Выслал на почту из профиля.
Цитировать
0 #13 Sergo 14.05.2017 15:27
Цитирую Sasha:
Цитирую Sergo:
Маркеры он ставит, но сам маршрут визуально не прокладывает

Странно, у меня прокладывается маршрут и по городам и по городу между домами. я добавил GMDirection выставил map := GMMap1; и дальше код из предыдущего комментария и все . прокладывается линия .

А можешь отправить скрин вкладки Properties из Direction?
Цитировать

Добавить комментарий


Защитный код
Обновить