До сих пор мы изучали работы с KML в Delphi исключительно в части отрисовки на карте различных элементов: меток, линий, полигонов. При этом мы не касались стилей в KML. С помощью стилей мы можем, например, изменить толщину и цвет линии, прозрачность заливки, изменить внешний вид подсказки, которая появляется при клике по элементу на карте и так далее. И сегодня я решил посвятить статью именно этому вопросу — работе со стилями элементов в kml.
Для работы со стилями элементов в KML могут использоваться два элемента:
- Style — элемент стиля. В этом элементе можно определять то, как будет отрисовываться на карте текст метки, какую иконку назначить метке, цвет и толщина линий, заливка полигонов и так далее.
- StyleMap — карта стилей в виде списка «пара — значение». С помощью карты стилей мы, например, можем указать, что в обычном состоянии подпись метки на карте будет белого цвета, а при выделении метки — красным и т.д. В качестве значений списка выстукает идентификатор (Id) конкретного стиля (Style).
В этой статье я покажу работу с самыми простыми стилями в KML — шрифта меток, отрисовки линий и полигонов.
Итак, судя по иерархии элементов KML, которую я показывал в самой первой статье, посвященной KML в Delphi, элемент Style — это потомок абстрактного элемента StyleSelector, который, в свою очередь, является потомком абстрактного же элемента Object:
Внутри элемента Style могут содержаться любые элементы, порожденный от абстрактного SubStyle:
Например, в одном 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 — без проблем.
Очередную версию модуля вы можете скачать также со страницы с исходниками:
Следующая статья: «KML Reference в Delphi по-русски #5: Изменяем стиль подсказок к меткам«
Книжная полка
Описание Подробно рассматривается библиотека 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 и др.
|