22.11.2009 20:47

KML - NetworkLink. Ссылки как инструмент создания иерархических структур.


Контейнер <NetworkLink id="ID"></NetworkLink> в файле KML позволяет создавать ссылки на внешние файлы KML/KMZ которые могут располататься как на локальном компьютере так и в удаленной сети. Чтобы указать местоположение самого файла используется элемент <Link>...</Link>.

Основной синтаксис таков:
<NetworkLink id="ID">
<name>...</name>                      <!-- строковой -->
<visibility>1</visibility>                   <!-- логическое 0 или 1 -->
<open>1</open>                        <!-- логическое 0 или 1 -->
<description>...</description>        <!-- строковое -->
<LookAt>...</LookAt>
<styleUrl>...</styleUrl>

<Link>...</Link>
</NetworkLink>


где,
Элемент <Link> (ссылка) указывает местоположение любого из следующих объектов:
- Файлы KML, получаемые с помощью сетевых ссылок
- Файлы изображений, используемые для значков в стилях значков, накладываемых изображений поверхности Земли и накладываемых изображений экрана
- Файлы моделей, используемые в элементе <Model>

Обратите внимание, что в контейнере <NetworkLink id="ID"></NetworkLink> можно использовать элементами Region, чтобы эффективно обрабатывать очень большие наборы данных.
Так же немаловажно, что в нем можно указать стили  styleUrl используемые для объектов находящихся во внешнем файле (стили конечно надо предварительно описать).

Теперь своими словами...

Как мне кажется основной смысл использования ссылок - это создание больших структурированных каталогов данных при помощи подключаемых внешних файлов. И таких каталогов, которые были бы легко редактируемыми.
Кроме того, разделение данных на сегменты (отдельные файлы) позволяет организовать такую структыру при которой загружаются лишь те данные которые нужны прямо сейчас, не требуя загрузки всего объема информации.

Рассмотрим использование ссылок на примере организации каталога City_to_KML...
В данный момент (версия 0.07) он выгледит так:



Как Вы видите уже сейчас в каталоге используются ссылки...
основной загрузочный файл City_to_kml_offline.kml выгледит так:


<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2"
xmlns:atom="http://www.w3.org/2005/Atom">
<Folder>
<name>City_to_kml_offline</name>
<open>1</open>
<description>City_to_KML Версия 0.07. Все права защищены © city2kml.ru и kirov2kml.ru 2009</description>
<NetworkLink>
<name>г. Киров</name>
<open>0</open>
<Link>
<href>..\City_to_KML_offline\Kirov\Kirov.kml</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>
</Folder>
</kml>


в нем подключается файл Kirov.kml в котором описанны структура данных по городу Кирову. И если потребуется добавить данные еще об одном городе, например Слободском, то в этот файл нужно будет добавить ссылку на него, например так:


<NetworkLink>
<name>г. Киров</name>
<open>0</open>
<Link>
<href>..\City_to_KML_offline\Slobodskoy\Slobodskoy.kml</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>



В файле Kirov.kml уже описывается структура данных по самому городу. Здесь описаны ссылки на границы города, адресный стол, модели и т.д.
Сам файл выгледит так:

<?xml version="1.0" encoding="UTF-8"?>
<!--Created by PRoman v2009 (http://www.kirov2kml.ru)-->
<kml xmlns="http://www.opengis.net/kml/2.2"
xmlns:gx="http://www.google.com/kml/ext/2.2"
xmlns:kml="http://www.opengis.net/kml/2.2"
xmlns:atom="http://www.w3.org/2005/Atom">

<Folder>
<name>г. Киров</name>
<open>1</open>
<description></description>

<NetworkLink> <!--Подключает файл с описаниями границ города и административных районов-->
<name>Границы</name>
<open>0</open>
<Link>
<href>..\Kirov\border\border.kml</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>

<NetworkLink> <!--Подключает файл адресного стола выполненного в виде плана-->
<name>Адресный стол</name>
<visibility>1</visibility>
<open>0</open>
<description></description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>..\Kirov\address_bureau\address_bureau.kmz</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>

<NetworkLink> <!--Подключает файл адресного стола выполненного в виде иконок-->
<name>Иконки зданий</name>
<visibility>1</visibility>
<open>0</open>
<description></description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>..\Kirov\address_bureau\building_symbol.kmz</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>

<NetworkLink> <!--Подключает файл с моделями зданий-->
<name>Модели зданий</name>
<visibility>0</visibility>
<open>0</open>
<description></description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>..\Kirov\building_model\building_model.kmz</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>

<NetworkLink> <!--Подключает файл с описанием инфраструктуры города-->
<name>Бизнес</name>
<visibility>1</visibility>
<open>0</open>
<description>В данном разделе пока мало материалов. Если Вы хотите добавить информацию о своей фирме в сборник City_to_kml то высылайте ее по адресу Этот e-mail адрес защищен от спам-ботов, для его просмотра у Вас должен быть включен Javascript . В заголовке письма укажите "Информация о Фирме для City_to_kml", а в письме укажите полное юридическое название, юридический и физический адреса и контактные телефоны.</description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>..\Kirov\business\business.kml</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>

<!--и так далее-->

</Folder>
</kml>


В данной реализации проекта ссылка на файл с моделями зданий указывает уже на конечный файл в котором содержатся сами модели, их описание а также описанна иерархия моделей (сортировка адресов по алфавиту).

Сейчас по прошествии какого то времени я вижу, что такая организация данных с моделями зданий была ошибкой!


При такой организации данных при добавлении моделей файл building_model.kmz начинает практически неограниченно расти, что затрудняет его редактирование, а кроме того при каждом его редактировании (добавление новой модели) появляется необходимость его замены. Пусть сейчас он размером всего 500 кб, так ведь и содержит он чуть больше 100 моделей (при том что часть из них выполнена в виде полигонов), а если количество моделей дойдет до планируемых 10-15 тыс. штук размер файла как мне кажется возрастет до нескольних десятков мегабайт...

Сейчас я предлагаю Вам рассмотреть альтернативный вариант организации данных о моделях с созданием индексного файла содержащего только описание структуры данных и ссылок на файлы моделей.
При такой организации данных индексный файл будет редактироваться крайне редко (только при добавлении информации о ранее не учтенных объектах, сейчас учитываются данные о более чем 12 тыс. зданий), кроме того в размере данный файл в разы вырасти не может в принципе (так как не учтенными как мне кажется могут быть не более 0,5-1 тыс. зданий).
Модели же к сборнику будут добавляться простым копированием файлов моделей в соответствующие папки.

Файле Kirov.kml изменится так:

Старую ссылку
<NetworkLink> <!--Подключает файл с моделями зданий-->
<name>Модели зданий</name>
<visibility>0</visibility>
<open>0</open>
<description></description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>..\Kirov\building_model\building_model.kmz</href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>


заменяем на
<NetworkLink> <!--Подключает индексный файл -->
<name>Модели зданий</name>
<visibility>0</visibility>
<open>0</open>
<description></description>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>..\Kirov\building_data\building_model.kmz</href>
<refreshMode>onChange</refreshMode>
</Link>
<Region>
<LatLonAltBox>
<north>58.726528</north>
<south>58.479984</south>
<east>49.820948</east>
<west>49.522871</west>
</LatLonAltBox>
<Lod>
<minLodPixels>1000</minLodPixels>
<maxLodPixels>-1</maxLodPixels>
</Lod>
</Region>
</NetworkLink>


так же контейнер <NetworkLink> дополним описанием области <Region> начиная с которой модели будут загружаться и отображаться.

В файле building_model.kmz будет содержаться сам индексный файл building_model.kml такого вида:


<?xml version="1.0" encoding="UTF-8"?>
<kml xmlns="http://earth.google.com/kml/2.0">
<Document>
<name>Building_Link</name>
<NetworkLink id="6148">
<name>г. Киров 1-й Газетный, пер.  4</name>
<visibility>1</visibility>
<open>0</open>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>models\6148\6148_model.kmz </href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>
<NetworkLink id="16534">
<name>г. Киров 1-й Газетный, пер.  5</name>
<visibility>1</visibility>
<open>0</open>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>models\16534\16534
_model.kmz </href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>
<NetworkLink id="6141">
<name>г. Киров 1-й Газетный, пер.  6</name>
<visibility>1</visibility>
<open>0</open>
<refreshVisibility>0</refreshVisibility>
<flyToView>0</flyToView>
<Link>
<href>models\6141\6141
_model.kmz </href>
<refreshMode>onChange</refreshMode>
</Link>
</NetworkLink>


<!-- и так далее, для всех моделей. всего чуть больше 12.3 тыс. ссылок -->


</Document>
</kml>


Как Вы видите данные о моделях будут находить в соответствующих им папках и файлах models\КодЗдания\КодЗдания_model.kmz
и будут загружаться если соответствующий файл модели существует (смотри скриншот ниже).



Аналогичным образом можно организовать и хранение данных о зданиях в виде планов или иконок.
например фаил здания в виде плана бы хранился в файле
models\КодЗдания\КодЗдания_plan.kmz
, а в виде иконки в файле
models\КодЗдания\КодЗдания_icon.kmz

Из всего выше сказанного можно сделать вывод!
Организация данных требует хорошего обдумывания!


P.S. Описанный вариант на 22.11.2009 находится в разработке и стадии тестирования у группы пользователей.
В публичном доступе появится в версии 0.08 в декабре 2009 года.