На данный момент модуль для работы с KML в Delphi содержал инструменты для рисования линий только по координатам, например, TKmlLineString «рисует» незамкнутую линию (или, по другому, путь), а TKmlLinearRing — замкнутую. Подробнее об этих классах можете почитать здесь. Вместе с этим, может быть полезным рисование прямой линии по трем параметрам — начальным координатам (широте и долготе), длине линии и её направлению. Например, такая возможность будет весьма полезна, если Вам необходимо нанести на карту Google координатную сетку. Сегодня я рассмотрю такой вариант рисования линий.
Исходные данные следующие:
- широта и долгота начальной точки
- длина линии
- наклон линии
Задача: нарисовать прямую линию.
Итак, назовем наш новый класс TKmlStraightLine. Этот класс будет иметь следующее описание:
TKmlStraightLine = class(TKmlLineString) private FStartPoint: TKmlCoordinate; FLength: double; FBearing: double; procedure Calculate; public constructor Create;override; destructor Destroy;override; function Save(AParentNode: IXMLNode): IXMLNode; override; property StartPoint : TKmlCoordinate read FStartPoint; property Length: double read FLength write FLength; property Bearing: double read FBearing write FBearing; end;
StartPoint : TKmlCoordinate;//начальные координаты (широта и долгота)
Length: double;//длина линии
Bearing: double;//направление, отсчитываемое с севера по часовой стрелке
Для того, чтобы построить прямую линию нам достаточно знать две точки — начальную и конечную. Начальная точка задается нами, а конечную можно рассчитать вот по таким формулам:
По первой формуле рассчитывается широта конечной точки, а по второй, соответственно, долгота.
θ — направление от севера по часовой стрелке;
δ угловое расстояние d/R (d — длина линии, R — радиус Земли)
Все углы, в том числе, широта и долгота должны быть заданы в радианах.
Указанные выше формулы реализованы в методе Calculate следующим образом:
const сa = 6378137; // большая полуось эллипсоида в WGS-84 procedure TKmlStraightLine.Calculate; var Latitude2, Longtitude2: double; delta: double; startLat, startLong: double; brng: double; begin startLat:=DegToRad(StartPoint.Latitude); brng:=DegToRad(FBearing); delta:=FLength/сa; Latitude2:=ArcSin(sin(startLat)*cos(delta)+cos(startLat)*sin(delta)*cos(brng)); Longtitude2:=DegToRad(StartPoint.Longtitude)+ArcTan2(sin(brng)*sin(delta)*cos(startLat),cos(delta)-sin(startLat)*sin(Latitude2)); Latitude2:=RadToDeg(Latitude2); Longtitude2:=RadToDeg(Longtitude2); Coordinates.AddCoordinate(StartPoint.Longtitude,StartPoint.Latitude, 0); Coordinates.AddCoordinate(Longtitude2,Latitude2, 0); end;
Вызов метода осуществляется в перегруженном методе Save:
function TKmlStraightLine.Save(AParentNode: IXMLNode): IXMLNode; begin Calculate; Result := inherited Save(AParentNode); Result.AddChild('gx:drawOrder').Text := DrawOrder.ToString; end;
Теперь, для того, чтобы построить прямую линию в Google Earth достаточно выполнить следующий код:
KmlDoc.Placemark.Add(TKmlPlacemark.Create(TKmlStraightLine)); TKmlStraightLine(KmlDoc.Placemark.Last.Geometry).StartPoint.Latitude:=54.981856; TKmlStraightLine(KmlDoc.Placemark.Last.Geometry).StartPoint.Longtitude:=73.303919; TKmlStraightLine(KmlDoc.Placemark.Last.Geometry).Length:=1000; TKmlStraightLine(KmlDoc.Placemark.Last.Geometry).Bearing:=180;//линия будет направлена на ЮГ KmlDoc.SaveToFile('SL.kml'); ShellExecute(0, PWideChar('open'), PWideChar('SL.kml'), nil, nil, 0);
Результат представлен на рисунке ниже:
Если же вам необходимо разукрасить линию, например, добавить прозрачность, изменить цвет и толщину, то в kml-документ необходимо добавить стиль о котором я писал в этой статье.
Скачать обновленный модуль для работы с kml в delphi можно здесь:
Книжная полка
Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
|
||
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
|
||
Название: О чем не пишут в книгах по Delphi
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
|
Здравствуйте! Благодаря Вашему циклу статей я наконец-то поняла как надо работать с kml :) Спасибо!
Один вопрос, я не могу скачать обновленный модуль для работы с kml в delphi — ссылка ведет в никуда, точнее, в том разделе нет даже упоминания на «KML Reference в Delphi по-русски #9». Как скачать обновленный модуль для работы с kml в delphi, где он?
Здравствуйте. Рад, что смог помочь вам. Обновленный модуль лежит по той же ссылке (просто заменил файл в архиве) — вот тут https://yadi.sk/d/TWbDpceRRE1wOg
Ага, спасибо, но в архиве файл от 15 июня 2019 г и в нем нет даже упоминания о TKmlStraightLine