Печать
Просмотров: 25576

Понадобилось в одном из проектов сделать отображение клиентов на карте. Стал копать в интернете как связаны 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