15.11.2009 12:39

KML - Вырезание областей.


В предыдущей статье мы рассмотрели описание объектов мультигеометрии в файлах kml/kmz и создали простейшую модель двухуровневого здания.

А сегодня давайте рассмотрим возможность вычитания областей, ее реализацию, возможности и ограничения...


На скриншоте ниже Вы можете увидеть объект с вырезанными областями...



Итак.
Данная возможность предоставляется для монипуляций с полигонами и описывается внутри контейнера <Polygon></Polygon> площадного объекта.

на словах это выглядит так:
Сначала описываем родителььский объект (тот из которого мы будем вырезать области), а затем описываем собственно области которые будем вырезать внутри тегов <innerBoundaryIs></innerBoundaryIs>.

Синтаксис

<Polygon id="KMLe_i1">
<outerBoundaryIs> <!-- Родительский объект -->
<LinearRing>
<coordinates></coordinates>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs> <!-- 1-ая Вычитаемая область -->
<LinearRing>
<coordinates></coordinates>
</LinearRing>
</innerBoundaryIs>
<innerBoundaryIs> <!-- 2-ая Вычитаемая область -->
<LinearRing>
<coordinates></coordinates>
</LinearRing>
</innerBoundaryIs>
</Polygon>


В качестве реального примера рассмотрим описание центральной части Школа №52 в г. Кирове по адресу: проспект Строителей, 44

ПРИМЕР:
<Polygon id="KMLe_i1"> <!-- Контейнер вставляемого площадного объекта -->
<outerBoundaryIs> <!-- Родительский объект -->
<LinearRing>
<coordinates>
49.59234845619655,58.59446255943887,9 49.59233226488411,58.59521974731953,9 49.5917483871707,58.59522183521581,9 49.59175385416538,58.59493167756657,9 49.59160891423326,58.59493225001189,9 49.5916065511124,58.59506999318475,9 49.59151274714672,58.59507105590355,9 49.59150980466125,58.59503632262925,9 49.59135886782617,58.59503928313474,9 49.59135130211364,58.59479855171171,9 49.59159153998758,58.59479894749139,9 49.59159534886371,58.59481573735966,9 49.59176168508441,58.5948176632262,9 49.59177316855536,58.59445259890458,9 49.59234845619655,58.59446255943887,9 </coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs> <!-- Вычитаемая область -->
<LinearRing>
<coordinates>
49.59212784103101,58.59456659517932,9 49.59212665242644,58.59464908044272,9 49.5921774049507,58.59464793304035,9 49.59217621771401,58.59474774073846,9 49.59195386465706,58.59474921361812,9 49.5919514657123,58.59456673145301,9 49.59212784103101,58.59456659517932,9 </coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</innerBoundaryIs>
<innerBoundaryIs> <!-- Вычитаемая область -->
<LinearRing>
<coordinates>
49.59195882807086,58.59508778762745,9 49.59196024617062,58.59495154815,9 49.59215904189252,58.59495185359816,9 49.59215859308142,58.59508824897923,9 49.59195882807086,58.59508778762745,9
</coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</innerBoundaryIs>
<altitudeMode>relativeToGround</altitudeMode>
<extrude>1</extrude>
<tessellate>1</tessellate>
</Polygon>


А теперь давайте совместим в одном объекте мультигеометрии центральную часть здания и отдельно стоящую постройку так же относящуюся к школе.


Итоговый файл 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">
<Placemark id="8697">
<name>г. Киров Строителей, проспект  44</name>
<description><![CDATA[<center><table><tr><th colspan='2'
align='center'><em>Информация</em></th></tr><tr bgcolor="#E3E3F3">
<th>Тип</th>
<td>Школа №52.</td>
</tr><tr bgcolor="">
<th>Статья</th>
<td><a href="/index.php?option=com_content&view=article&id=7087&catid=3&Itemid=24">Подробнее на сайте...</a></td>
</tr></table></center>]]></description>
<LookAt>
<longitude>49.592066</longitude>
<latitude>58.594852</latitude>
<range>0</range>
<tilt>0</tilt>
<heading>0</heading>
<altitudeMode>relativeToGround</altitudeMode>
<altitude>200</altitude>
</LookAt>
<Style>
<BalloonStyle>
<bgColor>FFFFFFFF</bgColor>
<textColor>FF000000</textColor>
</BalloonStyle>
</Style>
<MultiGeometry id="KMLe_1">
<Polygon id="KMLe_i1">
<outerBoundaryIs>
<LinearRing>
<coordinates>
49.59234845619655,58.59446255943887,9 49.59233226488411,58.59521974731953,9 49.5917483871707,58.59522183521581,9 49.59175385416538,58.59493167756657,9 49.59160891423326,58.59493225001189,9 49.5916065511124,58.59506999318475,9 49.59151274714672,58.59507105590355,9 49.59150980466125,58.59503632262925,9 49.59135886782617,58.59503928313474,9 49.59135130211364,58.59479855171171,9 49.59159153998758,58.59479894749139,9 49.59159534886371,58.59481573735966,9 49.59176168508441,58.5948176632262,9 49.59177316855536,58.59445259890458,9 49.59234845619655,58.59446255943887,9 </coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</outerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates>
49.59212784103101,58.59456659517932,9 49.59212665242644,58.59464908044272,9 49.5921774049507,58.59464793304035,9 49.59217621771401,58.59474774073846,9 49.59195386465706,58.59474921361812,9 49.5919514657123,58.59456673145301,9 49.59212784103101,58.59456659517932,9 </coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</innerBoundaryIs>
<innerBoundaryIs>
<LinearRing>
<coordinates>
49.59195882807086,58.59508778762745,9 49.59196024617062,58.59495154815,9 49.59215904189252,58.59495185359816,9 49.59215859308142,58.59508824897923,9 49.59195882807086,58.59508778762745,9
</coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</innerBoundaryIs>
<altitudeMode>relativeToGround</altitudeMode>
<extrude>1</extrude>
<tessellate>1</tessellate>
</Polygon>
<Polygon id="KMLe_i2">
<outerBoundaryIs>
<LinearRing>
<coordinates>
49.5927876116118,58.59454958967447,6 49.59278051317632,58.59487920591166,6 49.5925670609286,58.59488602618522,6 49.59256859747783,58.59455099535362,6 49.5927876116118,58.59454958967447,6 </coordinates>
<altitudeMode>relativeToGround</altitudeMode>
</LinearRing>
</outerBoundaryIs>
<altitudeMode>relativeToGround</altitudeMode>
<extrude>1</extrude>
<tessellate>1</tessellate>
</Polygon>
</MultiGeometry>
</Placemark>
</kml>


Как видите в этом файле мы совместили несколько объектов один из которых имеет вырезанные области.

Теперь немного о недостатках...
Как мне кажется основным недостатком является то, что предлагаемый механизм описания вырезаемых областей не позволяет создавать арки. Тоесть нельзя вырезать проем с стене или полость в объекте...

P.S. попробуйте поиграть с высотой вырезаемой области (можно добиться очень интересных эффектов), например таких...