06.08.2010 23:17

 

KML - Создание слоя с номерами домов.

Взглянув на многие города в Яндекс Картах и Google Maps можно увидеть нумерацию домов на карте.


Это очень удобно, но в Google Earth для города Кирова пока слои с информацией об адресах не реализован.
Как же можно реализавать подобную функциональность?
Вариантов может быть несколько:
- Можно создать слой с подгружаемыми прозрачными тайлами на которых будут нанесены в виде текста номера домов;
- Можно реализовать отображение номеров домов за счет функциональности kml.

 

Рассмотрим второй вариант, так как он без особых усилий поддается корректировке.
Для реализации этого варианта необходимо иметь структурированную информацию о зданиях. Это как минимум адресную информацию об объектах (разделенную на информацию об улице и информацию о номере дома) и координаты объектов.
Адресная информация должна быть сегментированная, так как нам необходими отображать только номер дома, а информация об улице должна отсутствовать.


Итак предположим, что мы имеем данные об адресах и координатах зданий в xls файле, скриншот информации из файла представлен ниже:


Все что нам нужно, это сформировать kml файл с определенным образом оформленным стилем для меток.


Фрагмент описания стиля представлен ниже.
<Style id="sn_BuildingNumb">
<IconStyle>
<Icon>
</Icon>
</IconStyle>
<LabelStyle>
<color>ffffffff</color>
<scale>0.6</scale>
</LabelStyle>
<ListStyle>
</ListStyle>
</Style>


Вся хитрость в том, что внутри тегов <Icon></Icon> убирается все упоминания о ссылке на иконку которая обычно описывается внутри тегов <href></href>.

VBA Код для формирования kml файла Вы можете посмотреть ниже:
Sub generate_building_number_KML()
' Set file details
Set filePath = [File_details!C2]
' Set document name
Set docName = [File_details!C3]
Open filePath For Output As #1

'Write header to file

outputText = [File_details!C5] & docName & [File_details!C6] & [File_details!C15]
Print #1, outputText
'Start to loop through stations

For Each cell In [Data!A2.A50001]
'Korpus
If cell.Offset(0, 4) = "" Then
Korpus = ""
Else
Korpus = "/" & cell.Offset(0, 4)
End If
'Liter
If cell.Offset(0, 5) = "" Then
Liter = ""
Else
Liter = cell.Offset(0, 5)
End If
pmName = cell.Offset(0, 3) & Korpus & Liter

pmID = cell.Offset(0, 0)
coordValue1 = cell.Offset(0, 8)
coordValue2 = cell.Offset(0, 9)
coordValue3 = 0
pmDescription = cell.Offset(0, 2)
If pmName = "" Then

Exit For
End If
Style = "      <styleUrl>#msn_BuildingNumb</styleUrl>"

'Create a placemark

outputText = [File_details!E8] & pmID & [File_details!F8] & pmName & [File_details!E9] & Style & [File_details!F9] & coordValue1 & ", " & coordValue2 & ", " & coordValue3 & [File_details!C10] & [File_details!C11]
Print #1, outputText

Next
'Write footer to file

outputText = [File_details!C13]
Print #1, outputText
Close #1

End Sub


В итоге мы получаем адреса домов на карте как здесь!


Полный пример xls файла Вы можете скачать по этой ссылке.


P.S. ВАЖНО!!! Не забудьте после создания VBA макросом kml файла сменить его кодировку на UTF-8. Это можно сделать программой "Блокнот".

Спасибо Alex-у за замечания к статье! (замечания были на форуме но погибли в результате обрушения сервера)