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

До сих пор мы изучали работы с KML в Delphi исключительно в части отрисовки на карте различных элементов: меток, линий, полигонов. При этом мы не касались стилей в KML. С помощью стилей мы можем, например, изменить толщину и цвет линии, прозрачность заливки, изменить внешний вид подсказки, которая появляется при клике по элементу на карте и так далее. И сегодня я решил посвятить статью именно этому вопросу — работе со стилями элементов в kml.

Для работы со стилями элементов в KML могут использоваться два элемента:

  1. Style — элемент стиля. В этом элементе можно определять то, как будет отрисовываться на карте текст метки, какую иконку назначить метке, цвет и толщина линий, заливка полигонов и так далее.
  2. StyleMap — карта стилей в виде списка «пара — значение». С помощью карты стилей мы, например, можем указать, что в обычном состоянии подпись метки на карте будет белого цвета, а при выделении метки — красным и т.д. В качестве значений списка выстукает идентификатор (Id) конкретного стиля (Style).

В этой статье я покажу работу с самыми простыми стилями в KML — шрифта меток, отрисовки линий и полигонов.

Итак, судя по иерархии элементов KML, которую я показывал в самой первой статье, посвященной KML в Delphi, элемент Style — это потомок абстрактного элемента StyleSelector, который, в свою очередь, является потомком абстрактного же элемента Object:

Часть иерархии элементов KML (https://developers.google.com/kml/documentation/kmlreference)

Внутри элемента Style могут содержаться любые элементы, порожденный от абстрактного SubStyle:

Часть иерархии элементов KML (https://developers.google.com/kml/documentation/kmlreference)

Например, в одном Style мы можем определить стиль отрисовки линий, во втором — стиль подписей к меткам и отрисовки полигонов, в третьем — иконки и линий и так далее. А можем в один элемент Style включить вообще все возможные стили оформления.

При этом, часть стилей оформления элементов (линий, полигонов, иконок и меток) являются дочерними для абстрактного элемента ColorStyle.

Таким образом, в Delphi нам необходимо создать следующие классы:

TKmlSubStyle = class(TKmlObject);
TKmlSubStyleClass = class of TKmlSubStyle;

Класс TKmlColorStyle

Не используется напрямую в KML-файле, но содержит свойства общие для всех стилей, где применяется заливка цветом.

TKmlColorStyle = class(TKmlSubStyle)
  private
    FColor: string;
    FColorMode: TKmlColorMode;
  protected
    function GetName:string;override;
  public
    function Save(AParentNode: IXMLNode): IXMLNode; override;
    property Color: string read FColor write FColor;
    property ColorMode: TKmlColorMode read FColorMode write FColorMode;
  end;
Свойство Тип Описание
Color string Значения цвета и непрозрачности (альфа). См. подробное описание ниже.
ColorMode TKmlColorMode Может принимать значения normal и random (случайное значение цвета). Подробное описание см. ниже.

Color. Цвет и прозрачность выражаются в шестнадцатеричном формате. Диапазон значений для любого одного цвета составляет от 0 до 255 (от 00 до ff). Для альфы 00 полностью прозрачен, а ff полностью непрозрачен. Порядок выражения aabbggrr, где aa = альфа (от 00 до ff); bb = синий (от 00 до ff); gg = зеленый (от 00 до ff); rr = красный (от 00 до ff). Например, если вы хотите применить синий цвет с непрозрачностью 50% к наложению, вы должны указать следующее: 7fff0000, где alpha = 0x7f, синий = 0xff, зеленый = 0x00 и красный = 0x00.

ColorMode. Чтобы добиться действительно случайного выбора цветов, укажите базовый (Color) белый (ffffffff). Если вы укажете один компонент цвета (например, значение ff0000ff для красного), будут выбраны случайные значения цвета для этого одного компонента (красный). В этом случае значения будут варьироваться от 00 (черный) до ff (полностью красный).
Если вы укажете значения для двух или для всех трех цветовых компонентов, к каждому цветовому компоненту будет применена случайная линейная шкала с результатами, варьирующимися от черного до максимальных значений, указанных для каждого компонента.
Непрозрачность цвета определяется альфа-компонентом Color и никогда не бывает случайной.

Класс TKmlLineStyle

Определяет стиль линий (LineString и LinearRing).

TKmlLineStyle = class(TKmlColorStyle)
  private
    FWidth: single;
    FOuterWidth: single;
    FOuterColor: string;
    FPhysicalWidth: single;
    FLabelVisibility: boolean;
  protected
    function GetName:string;override;
  public
    function Save(AParentNode: IXMLNode): IXMLNode; override;
    property Width: single read FWidth write FWidth;
    property OuterWidth: single read FOuterWidth write FOuterWidth;
    property PhysicalWidth: single read FPhysicalWidth write FPhysicalWidth;
    property LabelVisibility: boolean read FLabelVisibility write FLabelVisibility;
    property OuterColor: string read FOuterColor write FOuterColor;
  end;
Свойство Тип Описание
Width single Толщина линий в пикселях
OuterColor string Цвет части линии, определенной в свойстве OuterWidth
OuterWidth single Значение в диапазоне от 0,0 до 1,0, которое указывает часть линии, в которой используется outerColor. Применяется только к линиям, устанавливающим ширину с помощью свойства  PhysicalWidth; не относится к линиям, использующим свойство Width.
PhysicalWidth single Физическая ширина линии в метрах
LabelVisibility boolean Логическое значение, определяющее, отображать или нет текстовую метку в LineString. По умолчанию метка не показывается для линий.

Класс TKmlPolyStyle

Определяет стиль многоугольников.

TKmlPolyStyle = class(TKmlColorStyle)
  private
    FFill: boolean;
    FOutline: boolean;
  protected
    function GetName:string;override;
  public
    function Save(AParentNode: IXMLNode): IXMLNode; override;
    property Fill: boolean read FFill write FFill;
    property Outline: boolean read FFill write FFill;
  end;
Свойство Тип Описание
Fill boolean Логическое значение. Указывает, нужно ли заполнять многоугольник.
Outline boolean Логическое значение. Указывает, следует ли обводить многоугольник. Контуры многоугольника используют текущий стиль LineStyle.

Класс TKmlLabelStyle 

Определяет стиль подписей к меткам на карте.

 TKmlLabelStyle = class(TKmlColorStyle)
  private
    FScale: single;
  protected
    function GetName:string;override;
  public
    function Save(AParentNode: IXMLNode): IXMLNode; override;
    property Scale: single read FScale write FScale;
  end;
Свойство Тип Описание
Scale single Изменяет масштаб подписи метки на карте

Для того, чтобы воспользоваться всеми приведенными выше классами необходим класс-контейнер для хранения информации:

TKmlStyle = class(TKmlStyleSelector)
  private
    FSubStyle: TObjectList;
  protected
    function GetName:string;override;
  public
    constructor Create;
    function Save(AParentNode: IXMLNode): IXMLNode; override;
    destructor Destroy;override;
    procedure AddStyle(AStyleClass: TKmlSubStyleClass);
    property SubStyle: TObjectList read FSubStyle;
  end;

Методы Save всех выше представленных классов классов по своему содержанию аналогичны тем, которые рассматривались в прошлой статье, поэтому приводить здесь я их не буду — можете посмотреть их в исходнике модуля. А перейдем сразу к рассмотрению того, что мы можем изобразить на карте Google Earth используя модуль для работы с KML в Delphi.
Рассмотрим пример использования собственных стилей для отрисовки линий.

 Style:=TKmlStyle.Create; //создаем стиль
 ADocument.Styles.Add(Style);//добавляем его в список документа
 Style.Id:='MySharedStyle';//обязательно  назначаем идентификатор
 Style.AddStyle(TKmlLineStyle); //добавляем стиль отрисовки линнии
 TKmlLineStyle(Style.SubStyle.Last).Color:='7f0000ff'; //задаем цвет линии
 TKmlLineStyle(Style.SubStyle.Last).ColorMode:=cmNormal; //режим - нормальный
 TKmlLineStyle(Style.SubStyle.Last).Width:=2; //толщина линии в пикселях

Сама линия будет такой:

ADocument.Placemark.Add(TKmlPlacemark.Create(TKmlLineString));
  with ADocument.Placemark.Last do
  begin
    Name := 'Метка';
    Snippet := edPlaceSnippet.Text;
    Description := memPlaceDescr.Text;
    Visibility := True;
 
    TKmlLineString(Geometry).Extrude := True;
    TKmlLineString(Geometry).AltitudeMode := TAltitudeModeEnum.amClampToGround;
    TKmlLineString(Geometry).AltitudeOffset:=5;
    TKmlLineString(Geometry).Tessellate:=True;
    //задаем координаты линии
    TKmlLineString(Geometry).AddCoord(-122.365662,37.826988,10);
    TKmlLineString(Geometry).AddCoord(-122.365202,37.826302,10);
    TKmlLineString(Geometry).AddCoord(-122.364581,37.82655,10);
    TKmlLineString(Geometry).AddCoord(-122.365038,37.827237,10);
    //ставим ссылку на наш стиль
    StyleUrl:='#MySharedStyle';
  end;

В результате получим вот такую линию на карте:

Воспользуемся другими свойствами стиля линий, например, зададим реальную ширину линии в метрах и нарисуем окантовку линии другим цветом:

    Style.Id:='MySharedStyle';
    Style.AddStyle(TKmlLineStyle);
    TKmlLineStyle(Style.SubStyle.Last).Color:='7f0000ff';
    TKmlLineStyle(Style.SubStyle.Last).OuterColor:='7fff00ff';
    TKmlLineStyle(Style.SubStyle.Last).ColorMode:=cmNormal;
    TKmlLineStyle(Style.SubStyle.Last).OuterWidth:=0.25;//четверть линии будет закрашена цветом OuterColor
    TKmlLineStyle(Style.SubStyle.Last).PhysicalWidth:=20;//ширина линии 20 метров

Результат применения такого стиля представлен на рисунке ниже:

Такой стиль удобно применять, например, для автомагистралей. А какая автомагистраль без названия? Давайте добавим на нашу линию надпись:

ADocument.Placemark.Add(TKmlPlacemark.Create(TKmlLineString));
  with ADocument.Placemark.Last do
  begin
    Name := 'Метка';
  //тут добавляем другие свойства линии - координаты, видимость на карте и т.д.  
  end;
 
Style:=TKmlStyle.Create;
ADocument.Styles.Add(Style);
Style.Id:='MySharedStyle';
Style.AddStyle(TKmlLineStyle);
[задаем необходимые свойства стиля]
TKmlLineStyle(Style.SubStyle.Last).LabelVisibility:=True;//показываем надпись

В результате получим следующую картинку:

А теперь изменим цвет подписи. Для этого создаем новый стиль меток:

 Style.AddStyle(TKmlLabelStyle);
 TKmlLabelStyle(Style.SubStyle.Last).Color:='ff00ff00';
 TKmlLabelStyle(Style.SubStyle.Last).ColorMode:=cmNormal;
 TKmlLabelStyle(Style.SubStyle.Last).Scale:=1;

Теперь наша линия с подписью будет выглядеть вот так:

Вот, пожалуй, на сегодня и всё. Остается только добавить, что используя штатные инструменты Google Earth вы вряд ли сможете реализовать рисование линий, как показано в последних примерах, а вот с 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 на ЛитРес
5 1 голос
Рейтинг статьи
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
Подписаться
Уведомить о
0 Комментарий
Межтекстовые Отзывы
Посмотреть все комментарии