Добавить персонализированные данные к компоненту KML можно тремя способами. Какой из них вы выберете зависит от характера добавляемых данных и от того, как они должны отображаться. В частности, элемент <ExtendedData> поддерживает указанные ниже механизмы.
- Элемент <Data> позволяет добавлять нетипизированные пары "имя-значение" к пользовательским данным, связанным с компонентом KML (NetworkLink, Placemark, GroundOverlay, PhotoOverlay, ScreenOverlay, Document или Folder). Пары "имя-значение" по умолчанию отображаются во всплывающем окне с описанием. Они также могут служить для замещения объектов в элементе <text> внутри <BalloonStyle>. Подробнее…
- Элементы <Schema> и <SchemaData> позволяют добавлять к пользовательским данным, связанным с компонентом KML, типизированные данные.
- В KML-файл также можно включить любые пользовательские данные в формате XML. Google Планета Земля передает и сохраняет их вместе с файлом, однако никак не обрабатывает.
Примечание. Все три механизма можно применить в одном файле. Если разная информация добавляется из разных источников, рекомендуется использовать как типизированные данные (Schema/SchemaData), так и нетипизированные (Data).
Выбор механизма добавления данных
В большинстве случаев нетипизированные данные проще всего добавить к компоненту KML с помощью элемента <Data>. Для этого потребуется шаблон <BalloonStyle>, который можно применить ко всем компонентам Placemark в KML-файле. (Пример использования приведен в разделе Замещение объектов в элементах с расширенными данными.)
С помощью элементов <Schema> и <SchemaData> можно добавлять типизированные данные. Этот способ в первую очередь подойдет для передачи информации из географических информационных систем (ГИС). Если у вас есть типизированные данные из внешних приложений, используйте для добавления к компоненту структурированных типов элементы <Schema> и <SchemaData>. (Google Планета Земля не использует эти данные, но они могут требоваться другим приложениям.) Большинству пользователей, скорее всего, не потребуется знать остальные технические подробности этого механизма. Как и <Data>, элемент <SchemaData> упрощает работу с <BalloonStyle>.
Если вам требуется просто передать данные внутри KML-файла (без обработки в Google Планете Земля), достаточно записать их в формате XML. Для этого в KML-файле потребуется указать префикс пространства имен XML. Подробнее…
Добавление нетипизированных пар "имя-значение"
Элемент <Data> представляет собой достаточно простой и эффективный способ добавления нетипизированных пар "имя-значение" к компоненту KML. Ниже показан синтаксис этого элемента.
<ExtendedData>
<Data name="string">
<displayName>...</displayName> <!-- string -->
<value>...</value> <!-- string -->
</Data> </ExtendedData>
Атрибут name является уникальным идентификатором набора данных. Элемент <displayName> используется, если необходимо отобразить название набора данных в удобной для чтения форме. Добавьте в элемент <displayName> тег CDATA, чтобы использовать пробелы и гиперссылки.
Ниже показан пример кода для компонента Placemark, содержащего пользовательские данные о нескольких лунках на площадке для гольфа.
<kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>My Golf Course Example</name> <Placemark> <name>Club house</name> <ExtendedData> <Data name="holeNumber"> <value>1</value> </Data> <Data name="holeYardage"> <value>234</value> </Data> <Data name="holePar"> <value>4</value> </Data> </ExtendedData> <Point> <coordinates>-111.956,33.5043</coordinates> </Point>
</Placemark> <Placemark> <name>By the lake</name> <ExtendedData> <Data name="holeNumber"> <value>5</value> </Data> <Data name="holeYardage"> <value>523</value> </Data> <Data name="holePar"> <value>5</value> </Data> </ExtendedData> <Point> <coordinates>-111.95,33.5024</coordinates> </Point>
</Placemark> </Document> </kml>
На скриншоте ниже можно видеть, как элементы <Data> отображаются по умолчанию в графическом интерфейсе – во всплывающем окне с описанием метки.
Пример отображения данных во всплывающем окне с описанием
Использование элемента <BalloonStyle> в качестве шаблона
В KML можно определить элемент <Style>, присвоив ему идентификатор. После этого на стиль можно ссылаться с помощью <styleUrl> из того же или других KML-файлов. Определяемые таким образом стили называются общими. Элемент <text> внутри <BalloonStyle> поддерживает замещение объектов, т. е. для каждого экземпляра могут быть подставлены собственные значения. Ниже показан алгоритм замещения стандартных объектов.
- $[name]
- замещается названием метки.
- $[description]
- замещается описанием метки.
- $[address]
- замещается адресом метки.
- $[id]
- замещается идентификатором метки.
- $[Snippet]
- замещается фрагментом метки.
- $[geDirections]
- замещается инструкциями по навигации к метке или от нее.
Замещение объектов в элементах с расширенными данными
В Google Планете Земля поддерживается замещение объектов для некоторых расширенных данных, включенных в элемент <text> внутри <BalloonStyle>. В таблице ниже перечислены такие объекты.
Переменная | Чем замещается | Пример |
---|---|---|
$[name_attribute_of_Data_element] | Содержание элемента <value> | holeNumber, holeYardage |
$[name_attribute_of_Data/displayName] | Содержание элемента <displayName> | Hole Number, Hole Yardage |
Ниже показан код, в котором задается шаблон <BalloonStyle> для примера с лунками на площадке для гольфа. Во всплывающем окне с описанием каждой метки подставляется название метки и добавляется информация о номере лунки, паре и расстоянии до нее.
<?xml version="1.0" encoding="UTF-8"?> <kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>Data+BalloonStyle</name> <Style id="golf-balloon-style"> <BalloonStyle> <text> <![CDATA[ This is $[name] This is hole $[holeNumber] The par for this hole is $[holePar] The yardage is $[holeYardage] ]]> </text> </BalloonStyle> </Style> <!-- Пример общего стиля: одно и то же окно с описанием используется для двух меток --> <Placemark> <name>Club house</name> <styleUrl>#golf-balloon-style</styleUrl> <ExtendedData> <Data name="holeNumber"> <value>1</value> </Data> <Data name="holeYardage"> <value>234</value> </Data> <Data name="holePar"> <value>4</value> </Data> </ExtendedData> <Point> <coordinates>-111.956,33.5043</coordinates> </Point> </Placemark> <Placemark> <name>By the lake</name> <styleUrl>#golf-balloon-style</styleUrl> <ExtendedData> <Data name="holeNumber"> <value>5</value> </Data> <Data name="holeYardage"> <value>523</value> </Data> <Data name="holePar"> <value>5</value> </Data> </ExtendedData> <Point> <coordinates>-111.95,33.5024</coordinates> </Point> </Placemark> </Document> </kml>
Ниже показан скриншот для этого кода.
Пример отображения данных во всплывающем окне с описанием
Рассмотрим более реалистичный пример использования элемента <displayName>. Речь пойдет о локализации текста, и в этом случае потребуется уделить больше внимания форматированию.
<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2">
<Document>
<name>Entity-Replacement</name>
<Style id="displayName-value">
<BalloonStyle>
<text>
<![CDATA[
This is $[name]<br/>
$[holeNumber/displayName] $[holeNumber]<br/>
$[holePar/displayName] $[holePar]<br/>
$[holeYardage/displayName] $[holeYardage]
]]>
</text>
</BalloonStyle>
</Style>
<!-- Пример общего стиля:
одно и то же окно с описанием используется для двух меток
-->
<Placemark>
<name>Club house</name>
<styleUrl>#displayName-value</styleUrl>
<ExtendedData>
<Data name="holeNumber">
<displayName><![CDATA[
<b>This is hole </b>
]]></displayName>
<value>1</value>
</Data>
<Data name="holePar">
<displayName><![CDATA[
<i>The par for this hole is </i>
]]></displayName>
<value>4</value>
</Data>
<Data name="holeYardage">
<displayName><![CDATA[
<b><i>The yardage is </i></b>
]]></displayName>
<value>234</value>
</Data>
</ExtendedData>
<Point>
<coordinates>-111.956,33.5043</coordinates>
</Point>
</Placemark>
<Placemark>
<name>By the lake</name>
<styleUrl>#Entity-Replacement</styleUrl>
<ExtendedData>
<Data name="holeNumber">
<displayName><![CDATA[
<b>This is hole </b>
]]></displayName>
<value>5</value>
</Data>
<Data name="holePar">
<displayName><![CDATA[
<i>The par for this hole is </i>
]]></displayName>
<value>5</value>
</Data>
<Data name="holeYardage">
<displayName><![CDATA[
<b><i>The yardage is </i></b>
]]></displayName>
<value>523</value>
</Data>
</ExtendedData>
<Point>
<coordinates>-111.95,33.5024</coordinates>
</Point>
</Placemark>
</Document>
</kml>
А так это выглядит в графическом интерфейсе:
Добавление типизированных данных к компоненту
Элементы <Schema> и <SchemaData> позволяют добавить к компоненту типизированные данные. Эта функция полезна для передачи информации из ГИС и программных приложений, работающих с такими данными.
Что потребуется для добавления типизированных данных
Чтобы добавить к компоненту KML типизированные данные, выполните указанные ниже действия.
- Создайте элемент <Schema>, чтобы объявить новый тип.
- Создайте экземпляры нового типа с помощью элемента <SchemaData>.
Объявление элемента <Schema>
Элемент <Schema> служит для объявления структурированного типа данных и всегда является дочерним элементом элемента <Document>. Один <Document> может содержать любое количество элементов <Schema> или не содержать их вовсе.
Атрибут id
Элементу <Schema> всегда присваивается атрибут id, с помощью ссылок на который создаются экземпляры этого типа (используется элемент <SchemaData>). В KML-файле не должно быть двух одинаковых идентификаторов (id).
Атрибут name
Атрибут name используется для замещения объектов и не является обязательным.
Синтаксис
Ниже показан синтаксис элемента <Schema>.
<Schema name="string" id="ID"> <SimpleField type="string" name="string"> <displayName>...</displayName> <!-- string --> </SimpleField </Schema>
Элементу <SimpleField> всегда присваиваются атрибуты name и type. Если хотя бы один из них отсутствует, поле пропускается. Атрибут name можно также использовать для замещения объектов в элементе <text> внутри <BalloonStyle>. Тип Simplefield может принимать следующие значения:
string
int
uint
short
ushort
float
double
bool
Определение экземпляров данных
С помощью элемента <SchemaData> можно создать экземпляр типа персонализированных данных. Ниже показан синтаксис этого элемента.
<ExtendedData> <SchemaData schemaUrl="anyURI"> <SimpleData name=""> ... </SimpleData> <!-- string --> </SchemaData> </ExtendedData>
Атрибут schemaUrl ссылается на id элемента <Schema>, в котором объявляется тип (подобно тому, как styleUrl ссылается на id уже объявленного элемента Style).Если schemaUrl является http-адресом, Google Планета Земля получает файл из Интернета. Компоненту Placemark можно назначить только один экземпляр данного типа.
Пример
В примере ниже представлен тип пользовательских данных под названием ScenicVista. Он содержит три поля: TrailHeadName, TrailLength и ElevationGain. Поле TrailHeadName содержит значения типа string
, поле TrailLength – значения типа double
, а поле ElevationGain – значения типа int
. Метка с названием Easy trail содержит экземпляр этого типа. Для экземпляра заданы следующие значения: Pi in the sky в поле TrailHeadName, 3.14159 в поле TrailLength и 10 в поле ElevationGain.
<kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>ExtendedData+SchemaData</name> <open>1</open> <!-- определяем тип TrailHeadType с помощью 3 полей --> <Schema name="TrailHeadType" id="TrailHeadTypeId"> <SimpleField type="string" name="TrailHeadName"> <displayName><![CDATA[<b>Trail Head Name</b>]]></displayName> </SimpleField <SimpleField type="double" name="TrailLength"> <displayName><![CDATA[<i>Length in miles</i>]]></displayName> </SimpleField <SimpleField type="int" name="ElevationGain"> <displayName><![CDATA[<i>Change in altitude</i>]]></displayName> </SimpleField </Schema> <!-- Это аналогично добавлению трех полей в новый элемент типа TrailHead: <TrailHeadType> <TrailHeadName>...</TrailHeadName> <TrailLength>...</TrailLength> <ElevationGain>...</ElevationGain> </TrailHeadType>
--> <!-- Создадим экземпляры Placemark с полями TrailHeadType --> <Placemark> <name>Easy trail</name> <ExtendedData> <SchemaData schemaUrl="#TrailHeadTypeId"> <SimpleData name="TrailHeadName">Pi in the sky</SimpleData> <SimpleData name="TrailLength">3.14159</SimpleData> <SimpleData name="ElevationGain">10</SimpleData> </SchemaData> </ExtendedData> <Point> <coordinates>-122.000,37.002</coordinates> </Point> </Placemark> <Placemark> <name>Difficult trail</name> <ExtendedData> <SchemaData schemaUrl="#TrailHeadTypeId"> <SimpleData name="TrailHeadName">Mount Everest</SimpleData> <SimpleData name="TrailLength">347.45</SimpleData> <SimpleData name="ElevationGain">10000</SimpleData> </SchemaData> </ExtendedData> <Point> <coordinates>-121.998,37.0078</coordinates> </Point> </Placemark> </Document> </kml>
Пример отображения SchemaData (оставлен стиль всплывающего окна по умолчанию)
Замещение объектов в элементе <displayName>
Механизм Schema/SchemaData также поддерживает замещение объектов в элементе <text> внутри <BalloonStyle>.
В <displayName> элемента <Schema> можно включить пользовательские данные в пригодной для просмотра форме. Если изменить строку в элементе <Schema>, изменится и атрибут <displayName> всех компонентов, содержащих этот тип.
В элементе <text> внутри <BalloonStyle> определите <displayName> следующим образом:
$[TYPENAME/TYPEFIELD/displayName]
- TYPENAME
- – это атрибут name элемента <Schema>;
- TYPEFIELD
- – это атрибут name элемента <SimpleField>;
- displayName
- – это элемент <displayName> внутри <SimpleField>.
Ниже показан код для добавления шаблона <BalloonStyle> в <SchemaData> из предыдущего примера. Как и в примере с площадкой для гольфа, в начале документа определяются элементы <Style>, <BalloonStyle> и <text>. Затем все элементы Placemark в файле ссылаются на этот шаблон (ExtendedData+SchemaData).
<kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>ExtendedData+SchemaData</name> <open>1</open> <!-- Создадим шаблон, ссылающийся на пользовательский тип --> <Style id="trailhead-balloon-template"> <BalloonStyle> <text> <![CDATA[ <h2>My favorite trails!</h2> <br/><br/> The $[TrailHeadType/TrailHeadName/displayName] is <i>$[TrailHeadType/TrailHeadName]</i>. The trail is $[TrailHeadType/TrailLength] miles. <br/> The climb is $[TrailHeadType/ElevationGain] meters. <br/><br/> ]]> </text> </BalloonStyle> </Style> <!-- Объявим тип TrailHeadType с помощью 3 полей --> <Schema name="TrailHeadType" id="TrailHeadTypeId"> <SimpleField type="string" name="TrailHeadName"> <displayName><![CDATA[<b>Trail Head Name</b>]]></displayName> </SimpleField <SimpleField type="double" name="TrailLength"> <displayName><![CDATA[<i>The length in miles</i>]]></displayName> </SimpleField <SimpleField type="int" name="ElevationGain"> <displayName><![CDATA[<i>change in altitude</i>]]></displayName> </SimpleField </Schema> <!-- Создадим экземпляры Placemark с полями TrailHeadType --> <Placemark> <name>Easy trail</name> <styleUrl>#trailhead-balloon-template</styleUrl> <ExtendedData> <SchemaData schemaUrl="#TrailHeadTypeId"> <SimpleData name="TrailHeadName">Pi in the sky</SimpleData> <SimpleData name="TrailLength">3.14159</SimpleData> <SimpleData name="ElevationGain">10</SimpleData> </SchemaData> </ExtendedData> <Point> <coordinates>-122.000,37.002</coordinates> </Point> </Placemark> <Placemark> <name>Difficult trail</name> <styleUrl>#trailhead-balloon-template</styleUrl> <ExtendedData> <SchemaData schemaUrl="#TrailHeadTypeId"> <SimpleData name="TrailHeadName">Mount Everest</SimpleData> <SimpleData name="TrailLength">347.45</SimpleData> <SimpleData name="ElevationGain">10000</SimpleData> </SchemaData> </ExtendedData> <Point> <coordinates>-121.998,37.0078</coordinates> </Point> </Placemark> </Document> </kml>
Пример SchemaData с шаблоном BalloonStyle
Сравните всплывающее окно, созданное с помощью шаблона <BalloonStyle>, с окном на предыдущем скриншоте, для которого оставлен стиль по умолчанию.
Добавление пользовательских XML-данных к компоненту
Самый простой способ добавить к компоненту пользовательские данные – указать их в теге <ExtendedData>. Google Планета Земля сохраняет, но не обрабатывает такие данные.
Пользовательские данные, добавленные этим способом, должны включать префикс пространства имен (xmlns:prefix="namespace"). Его можно указать в элементе <kml> внутри <ExtendedData>. Префикс пространства имен должен предварять каждый экземпляр пользовательских данных, как показано ниже.
<kml xmlns="http://www.opengis.net/kml/2.2"> <Document> <name>ExtendedData Test</name> <Placemark> <name>CampsiteData</name> <!-- Импортированной схеме требуется префикс пространства имен --> <ExtendedData xmlns:camp="http://campsites.com"> <camp:number>14</camp:number> <camp:parkingSpaces>2</camp:parkingSpaces> <camp:tentSites>4</camp:tentSites> </ExtendedData> <Point> <coordinates>-114.041,53.7199</coordinates> </Point> </Placemark> </Document> </kml>