уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

На данный момент модуль для работы с 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;
Для более полного понимание того, что будет описано ниже, рекомендую скачать модуль для работы с KML в Delphi и изучить предыдущие статьи по вопросу работы с KML в Delphi.
Этот класс является потомком класса TKmlLineString — незамкнутой линии и содержит следующие свойства:
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 можно здесь:

Исходники — Google API

Книжная полка

Описание Подробно рассматривается библиотека FM, позволяющая создавать полнофункциональное программное обеспечение для операционных систем Windows и OS X, а также для смартфонов и планшетных компьютеров, работающих под управлением Android и iOS
купить книгу delphi на ЛитРес
Описание: Рассмотрены практические вопросы по разработке клиент-серверных приложений в среде Delphi 7 и Delphi 2005 с использованием СУБД MS SQL Server 2000, InterBase и Firebird. Приведена информация о теории построения реляционных баз данных и языке SQL. Освещены вопросы эксплуатации и администрирования СУБД.
купить книгу delphi на ЛитРес
Описание: Рассмотрены малоосвещенные вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные режимы их работы, особенности для протоколов TCP и UDP и др.
купить книгу delphi на ЛитРес
0 0 голоса
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
3 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии
Jane
Jane
20/02/2020 13:56

Здравствуйте! Благодаря Вашему циклу статей я наконец-то поняла как надо работать с kml :) Спасибо!
Один вопрос, я не могу скачать обновленный модуль для работы с kml в delphi — ссылка ведет в никуда, точнее, в том разделе нет даже упоминания на «KML Reference в Delphi по-русски #9». Как скачать обновленный модуль для работы с kml в delphi, где он?

Jane
Jane
20/02/2020 20:10
Ответить на  Vlad

Ага, спасибо, но в архиве файл от 15 ‎июня ‎2019 ‎г и в нем нет даже упоминания о TKmlStraightLine