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