Картографический стиль «Y»

В связи с очередным изменением дизайна Яндекс-карт, а также их решительного перехода на векторные тайлы, настало время открыть последний из уцелевших черновиков картографического стиля «Y». Этот xml-файл под мапник стилизует данные OpenStreetMap под стиль Яндекс-карт образца 2016 года.

Файл рабочий, но нет прилагаемого архива с иконками. Оформление кода жуткое и полная дичь в запросах. Надеюсь, сможет послужить хотя-бы в качестве примера стиля под мапник. В связи с лицензионными проблемами предостерегаю от использования в собственных проектах в неизменном виде: я против ничего не имею, но с Яндексом сами разбирайтесь. Выкладываю исключительно в историко-познавательных целях. Ну и еще ради сохранения. Через пару лет и этого файла не останется.

Картографический код как в чудесной алисиной стране: требуется много усилий для того, что-бы он хотя-бы оставался на месте и не деградировал.

Превьюшки картостиля (в левой части картинок оригинальные Яндекс-карты, в правой картостиль «Y» на базе данных OpenStreetMap):

Фрагмент кода (первые 200 строк)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE Map[]>
<Map srs="+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0
		+x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null
		+wktext +no_defs +over" background-color="#aacbd9" >
 
<!-- Масштабы и зумы
zoom_00 <MaxScaleDenominator>1000000000</MaxScaleDenominator>
		<MinScaleDenominator>400000000</MinScaleDenominator>
 
zoom_01 <MaxScaleDenominator>400000000</MaxScaleDenominator>
		<MinScaleDenominator>200000000</MinScaleDenominator>
zoom_02 <MaxScaleDenominator>200000000</MaxScaleDenominator>
		<MinScaleDenominator>100000000</MinScaleDenominator>
zoom_03 <MaxScaleDenominator>100000000</MaxScaleDenominator>
		<MinScaleDenominator>50000000</MinScaleDenominator>
 
zoom_04 <MaxScaleDenominator>50000000</MaxScaleDenominator>
		<MinScaleDenominator>25000000</MinScaleDenominator>
zoom_05 <MaxScaleDenominator>25000000</MaxScaleDenominator>
		<MinScaleDenominator>15000000</MinScaleDenominator>
zoom_06 <MaxScaleDenominator>15000000</MaxScaleDenominator>
		<MinScaleDenominator>7000000</MinScaleDenominator>
 
zoom_07 <MaxScaleDenominator>7000000</MaxScaleDenominator>
		<MinScaleDenominator>3500000</MinScaleDenominator>
zoom_08 <MaxScaleDenominator>3500000</MaxScaleDenominator>
		<MinScaleDenominator>1500000</MinScaleDenominator>
zoom_09 <MaxScaleDenominator>1500000</MaxScaleDenominator>
		<MinScaleDenominator>700000</MinScaleDenominator>
 
zoom_10 <MaxScaleDenominator>700000</MaxScaleDenominator>
		<MinScaleDenominator>350000</MinScaleDenominator>
zoom_11 <MaxScaleDenominator>350000</MaxScaleDenominator>
		<MinScaleDenominator>150000</MinScaleDenominator>
zoom_12 <MaxScaleDenominator>150000</MaxScaleDenominator>
		<MinScaleDenominator>70000</MinScaleDenominator>
 
zoom_13 <MaxScaleDenominator>70000</MaxScaleDenominator>
		<MinScaleDenominator>35000</MinScaleDenominator>
zoom_14 <MaxScaleDenominator>35000</MaxScaleDenominator>
		<MinScaleDenominator>20000</MinScaleDenominator>
zoom_15 <MaxScaleDenominator>20000</MaxScaleDenominator>
		<MinScaleDenominator>10000</MinScaleDenominator>
 
zoom_16 <MaxScaleDenominator>10000</MaxScaleDenominator>
		<MinScaleDenominator>5000</MinScaleDenominator>
zoom_17 <MaxScaleDenominator>5000</MaxScaleDenominator>
		<MinScaleDenominator>2500</MinScaleDenominator>
zoom_18 <MaxScaleDenominator>2500</MaxScaleDenominator>
		<MinScaleDenominator>1500</MinScaleDenominator>
 
zoom_19 <MaxScaleDenominator>1500</MaxScaleDenominator>
		<MinScaleDenominator>700</MinScaleDenominator>
zoom_20 <MaxScaleDenominator>700</MaxScaleDenominator>
		<MinScaleDenominator>350</MinScaleDenominator>
-->
 
<Parameters>
  <Parameter name="bounds">-180,-90,180,90</Parameter>
  <Parameter name="center">0,0,2</Parameter>
  <Parameter name="format">png</Parameter>
  <Parameter name="minzoom">2</Parameter>
  <Parameter name="maxzoom">19</Parameter>
  <Parameter name="name">
	  <![CDATA[Mapstyle Y for OpenStreetMap Data,
				powered by Sergey Golubev]]></Parameter>
</Parameters>
 
<FontSet name="regular">
  <Font face-name="Ubuntu Regular"/>
  <Font face-name="Arial Regular"/>
  <Font face-name="DejaVu Sans Book"/>
</FontSet>
<FontSet name="italic">
  <Font face-name="Times New Roman Italic"/>
  <Font face-name="FreeSerif Italic"/>
  <Font face-name="DejaVu Serif Italic"/>
</FontSet>
<FontSet name="bold">
  <Font face-name="Arial Bold"/>
  <Font face-name="Liberation Sans Bold"/>
  <Font face-name="DejaVu Sans Bold"/>
</FontSet>
 
<Style name="RUworld" filter-mode="first" >
<Rule>
    <MaxScaleDenominator>1000000000</MaxScaleDenominator>
	<MinScaleDenominator>700</MinScaleDenominator>
			<PolygonSymbolizer
			fill="#fffff7" />
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="10"
			stroke-linejoin="round" />
</Rule>
 
<Rule>
    <MaxScaleDenominator>1000000000</MaxScaleDenominator>
	<MinScaleDenominator>100000000</MinScaleDenominator>
		<Filter>([ISO_A2] = 'BY')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="2"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fff8e7" />
</Rule>
<Rule>
    <MaxScaleDenominator>100000000</MaxScaleDenominator>
	<MinScaleDenominator>50000000</MinScaleDenominator>
		<Filter>([ISO_A2] = 'BY')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="5"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fff8e7" />
</Rule>
<Rule>
    <MaxScaleDenominator>50000000</MaxScaleDenominator>
	<MinScaleDenominator>12500000</MinScaleDenominator>
		<Filter>([ISO_A2] = 'BY')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="10"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fff8e7" />
</Rule>
<Rule>
    <MaxScaleDenominator>12500000</MaxScaleDenominator>
	<MinScaleDenominator>700</MinScaleDenominator>
		<Filter>([ISO_A2] = 'BY')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="10"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fffff7" />
</Rule>
<Rule>
    <MaxScaleDenominator>1000000000</MaxScaleDenominator>
	<MinScaleDenominator>100000000</MinScaleDenominator>
		<Filter>([ISO_A2] = 'RU')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="2"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fff0f5" />
</Rule>
<Rule>
    <MaxScaleDenominator>100000000</MaxScaleDenominator>
	<MinScaleDenominator>50000000</MinScaleDenominator>
		<Filter>([ISO_A2] = 'RU')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="5"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fff0f5" />
</Rule>
<Rule>
    <MaxScaleDenominator>50000000</MaxScaleDenominator>
	<MinScaleDenominator>12500000</MinScaleDenominator>
		<Filter>([ISO_A2] = 'RU')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="10"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fff0f5" />
</Rule>
<Rule>
    <MaxScaleDenominator>12500000</MaxScaleDenominator>
	<MinScaleDenominator>700</MinScaleDenominator>
		<Filter>([ISO_A2] = 'RU')</Filter>
			<LineSymbolizer
			stroke="rgba(135, 135, 135, 0.04)"
			stroke-width="10"
			stroke-linejoin="round" />
				<PolygonSymbolizer
				fill="#fffff7" />
</Rule>
</Style>
<Style name="RUworld-outline" filter-mode="first" >
<Rule>
    <LineSymbolizer stroke="#85c5d3" stroke-width="3"
		stroke-linejoin="round" />
</Rule>
</Style>
<Layer name="RUworld"  srs="+proj=longlat +ellps=WGS84 +no_defs">
    <StyleName>RUworld-outline</StyleName>
    <StyleName>RUworld</StyleName>
    <Datasource>
       <Parameter name="file"><![CDATA[WORLD/world.shp]]></Parameter>
       <Parameter name="id"><![CDATA[RUworld]]></Parameter>
       <Parameter name="project"><![CDATA[ymapstyle]]></Parameter>
       <Parameter name="srs"><![CDATA[]]></Parameter>
       <Parameter name="type"><![CDATA[shape]]></Parameter>
    </Datasource>
  </Layer>

Уличная картография в Авейру

Продолжаю обозревать свои коллекции. В этот раз решил начать разговор о пигс-картографии на примере карт небольшого португальского городка: https://youtu.be/i2G0JrSyKJk


Дедовский метод

Если вы жаждете грязных сексуальных игрищ, то немедленно отправляйтесь картировать деревья. В блогах OSM по этому поводу недавно был любопытный мануал, а в прошлом году я написал по этому поводу развернутую статью. Но ни в одной, ни в другой публикации не было сказано самого притягательного.

Когда вы укажете на плане местоположение дерева, запишете породу, окружность ствола, санитарное состояние и в очередной раз убедитесь, насколько уродлива схема тегирования деревьев в OpenStreetMap дело останется за измерением высоты. Конечно, можно использовать высотомер за сто евро или оценить высоту на глаз, но где же тут разврат?

Прислонитесь к дереву спиной, а после шагайте прочь в любом удобном направлении. Остановитесь примерно в той точке, где дерево, будь оно тут же свалено налетевшим штормом, хлестнуло бы вас по голове кончиком вершинки. Раздвиньте ноги, наклонитесь и постарайтесь через промежность увидеть вершину дерева. Если вершина не видна, пройдите еще немного вперед и повторите наблюдение. Если вершина слишком выступает — вернитесь назад, вы должны увидеть только самый кончик верхней ветви.

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

Конечно, если ровно отмерить базис и глянуть на вершину через суунтовский высотомер, результат будет точнее, но уж больно это трудоемкий способ, да и работает не всегда. А уж про цены на дендрологические инструменты без слез не расскажешь.

Самое время, в рамках импортозамещения, перейти на старые проверенные дедовские методы. Тем более, что смотреть через промежность на вершины деревьев — это единственный полезный навык, который вы можете получить за десять лет обучения в Лесотехнической академии.

Закон первой маски

Когда покупаешь водку, просят вначале надеть маску а после показать паспорт. Потом удивляются количеству ковидных скептиков. Ладно, зафиксируем мысль о том, что маски нужны и скопления народа опасны. Но вот перед нами кадры демонстраций из Белоруссии. Где ожидаемая вспышка заболеваний? Пусть Лукашенко — злобный диктатор и все скрыл, но тогда почему до сих пор не лежат по койкам протестующие Хабаровска?

Число заболевших растет, но это не мешает задавать вопросы, первый из которых: насколько органичен такой рост? Где число заболеваний отражает естественную динамику развития болезни, а где результат вызван особенностями тестирования и подсчета?

Так совпало, что мне надоело в очередной раз проверять степенные распределения на соответствие закону Бенфорда. Полтора века назад Саймон Ньюком изучая потертости страниц в сборниках логарифмических таблиц обнаружил любопытный феномен, который спустя шестьдесят лет обобщил Френк Бенфорд: В экспоненциальных распределениях каждое третье число начинается с единицы. Точнее, вероятность встретить единицу 30.1, двойку 17.6, тройку 12.5 и далее согласно разработанной Бенфордом формуле.

Этому закону соответствует огромное количество экспоненциальных (и как обобщенный случай — степенных) распределений. Учитывая закон и все ограничения, с помощью распределения Бенфорда можно проверить данные на естественность, поэтому использовать его приходится часто. Для автоматизации процесса я написал небольшую программу, которая проверяет частоту первых цифр из вашего распределения на соответствие распределению Бенфорда и в качестве демонстрации подключил статистику по заболеваемости ковидом в регионах России. Можете проверять любые ваши данные, хоть результаты голосования, хоть статистику по зарплате, хоть общее проективное покрытие oxalis acetosella, как в моем случае.

Ну а что-же ковид? Оказалось, что в распределениях суммарного количества заболевших наибольшие отклонения от распределения Бенфорда наблюдаются в Москве с областью и соседствующими регионами, Северном Кавказе, Татарии и Башкирии, Туве, Чукотке и Камчатке.

Распределения по количеству выздоровевших наиболее соответствуют закону Бенфорда вдоль границы с Казахстаном, юго-востоку (Приморье и Сахалин) и Северо-Западу (Карелия и Мурманская) России.

Распределения по количеству погибших от коронавируса наиболее близки к распределению Бенфорда в юго-западных, западно-уральских регионах, частично на юге Западной Сибири и в Приморье.

У меня есть предположения о причинах таких географических особенностей, но я бы хотел услышать комментарий специалиста. И это не потому, что я диссидент, а ровно напротив: я сторонник самого жестокого карантина: с применением боевого оружия и превращением всех институтов в шарашки.

Каждый день пандемии ждешь прорыва научной мысли, а вместо этого слышишь рекомендации намотать на лицо тряпку и сидеть по домам.

P.S. Спасибо всем, кто откликнулся на призыв о поиске сырых данных по заболеваемости в регионах.

Про ремонт и бардак

Полтора месяца ничего годного не публиковал и вот опять. А если серьезно, то на днях обнаружил в «Колыбели» Воннегута прямую отсылку к парадоксу Рассела. Это наталкивает на любопытные мысли, но я пока сам не вполне понимаю какие.

Избыток информации

Лишь идиоты говорят про избыток информации в окружающем мире. На самом деле, до появления нового органа чувств или иной эволюционной трансформации человеческого тела количество потребляемой информации возрасти не может. Тем более, что большинство информации мы по-прежнему получаем из реального мира. Можно подумать, будто в древности не было ни звуков, ни запахов, а только сплошное прибытие поезда на вокзал Ла-Сьота.

Можем понимать под информацией только новостные сюжеты. Это не только ничего не меняет, но даже наоборот: мы живем в эпоху страшного информационного голода и с каждым днем новостей становится все меньше. Изменилось не количество, а качество информации: вместо одного Левитана десять тысяч блогеров. Теперь информация многократно размножена и завернута в разные упаковки. А заодно к ней «в нагрузку» добавлена всякая дрянь: я уже год слышу про какого-то Байдена, а про то, что соседа посадили только месяц назад узнал.

Вокруг нас не избыток информации, а куча ютуберов, которые друг на друге паразитируют. И еще бесконечная инфографика. Увлекательно, красиво, но с тем же успехом вы можете голод жевательной резинкой утолять. А если думаете, что я опять ворчу — найдите из сотен новомодных сайтов о статистике ковида хоть один, с которого можно табличный файл с данными сохранить. Или хоть одно интернет-голосование с указанием достоверности результатов. Ну или вспомните хоть одну новость, которую позавчера узнали. Не можете? Правильно. Потому что не было никаких новостей.

Звук

Однажды в метро я включил скачанные выступления конференции t.me/spbgeotex. С тех пор, записывая подкасты я всегда в audacity усиливаю сигнал на 15 пунктов и разрешаю любую перегрузку сигнала. И это при том, что у спбгеотеха лучший звук из тех, что я встречал.

Идея проста: чем глупее разговор, тем громче он должен звучать. Самая важная мысль постигается вообще без слов. Если продолжить мысль, неизбежно выводишь максиму: о самом важном человек может догадаться лишь самостоятельно. Следовательно, самые интересные собеседники — глухонемые. Только они нафиг никому не нужны.

Как отличать гадюк

Если не брать во внимание гадюк с ареалами на Кавказе, вроде реликтовой или Динника, а заодно исключить малочисленные виды, вроде гадюки Никольского, то из настоящих гадюк в европейской части России останутся лишь две: обыкновенная (Vipera berus) и восточная степная (Vipera renardi). Крайне важно уметь отличать одну от другой, поскольку в противном случае в любом приличном обществе вам никто руки не подаст.

Проблема видового определения гадюк в необходимости быстрого принятия решения. Не каждому выпадает удача в спокойной обстановке препарировать змею, досконально изучая ее внешний облик и внутреннее строение. Чаще гадюка появляется перед глазами на несколько секунд, да еще в ситуации, которая не располагает к обстоятельным наблюдениям.

Однако, общие черты уловить реально. Если морда гадюки заострена, в верхней части головы расположены темные симметричные точки, верхняя часть головы резко переходит в боковую, образуя подобие ребра, а вдоль чешуек проходит светлая полоса, то перед вами степная гадюка. Если морда тупая и округлая, а чешуйки монохромные — перед вами обычная гадюка.

Можно поступить хитрее: если вы обнаружили гадюку на севере, то скорее всего это гадюка обыкновенная, если на юге, то скорее всего гадюка степная. Определитель Гуськова, Лукиной и Конева 1983 года вообще не указывает на присутствие обыкновенной гадюки в Ростовской области. Но это очень сомнительный подход.

Путем эксперимента я обнаружил наилучший способ отличать гадюку степную от гадюки обыкновенной. Он прост и не требует сложных наблюдений. Все элементарно: если после общения со змеей из вас вытекает моча с кровью, то это была обыкновенная гадюка. Если без крови, то степная. Минус метода в скорости определения, но зато он не такой размытый как в справочниках по серпентологии.

И раз уж зашел разговор о гадюках, должен вас обязательно предупредить. Любое препарирование гадюки следует производить только в очках и перчатках. Это не потому, что яд брызнет, а потому, что в этом случае крайне трудно тереть глаза или ковырять в носу. А если гадюка свежая, то еще не забывайте о рефлексах: эти создания могут цапнуть даже после того, как вы им половину пищеварительной системы удалили.

Картографирование деревьев в городе

Картографирование деревьев в городе

Практикующие ботаники используют разные методы городской дендросъемки. Выбор зависит от исходных данных и ожидаемого результата. Самая трудная работа — обследование кгиоповских объектов, где от ботаника требуют подробную информацию о каждом дереве: породу, вид, местоположение, диаметр кроны и ствола в двух местах, контур кроны на плане, повреждения, заболевания, особенности (вплоть до ширины дупла и угла наклона ствола) и другую информацию. На другом конце списка — сбор данных для расчета восстановительной стоимости. Это ситуация при которой деревья все-равно вырубят под какую-нибудь стройку и необходимо лишь оценить нанесенный ущерб.

Если выйти за границы массовых методов, с одной стороны стоит добавить ультразвуковое обследование стволов и прочую фантастику, а с другой — картирование в OpenStreetMap, которое обычно даже не картирование, а так, «заодно дерево отметил». Сейчас в базе OSM около тринадцати миллионов деревьев, но мануала по полевому маппингу и обработке данных до сих пор нет. Появится он скорее всего не скоро (если вообще появится), поэтому я решил изложить опыт десяти интенсивных дней полевого маппинга деревьев, в результате которого удалось увеличить количество точек natural=tree на сотую долю процента. Это примерно полторы тысячи деревьев. Однако, не так важны сами деревья, как обнаруженная ущербность нынешней схемы тегирования городской растительности.

Для выхода в поле необходимо минимум две вещи: знание видов и полевые материалы. К сожалению, первое из мануалов не узнать: даже если выучить все определители, умение отличить один вид от другого приобретается только с опытом. Однако, если есть сомнения, рекомендую особое внимание перед выходом обратить на вид листьев, коры и самое главное: тип ветвления побегов для основных городских деревьев. Для Санкт-Петербурга это клен остролистный, липа, дуб, вяз, ясень, береза, тополь, осина, черемуха, рябина, ива, ольха серая и ольха черная, боярышник, вишня, яблоня, конский каштан, ель, сосна, лиственница, пихта и туя. Знание этих пород поможет вам в девяти случаях из десяти.

Полевые материалы каждый готовит под себя. Многие ботаники используют карту и бланк, но я убежден в недальновидности такого подхода. Если вам не требуется вносить много данных о каждом дереве — лучше сразу писать на карте. Это уменьшает количество работы, и снижает вероятность ошибки, поскольку пропадает потребность в проставлении номеров на карте и в бланке. Если данных много (как при обследовании объекта, который охраняет КГИОП), то на карте стоит лишь указывать местоположение дерева, его номер и контур кроны, а всю остальную информацию записывать на диктофон. Я указывал только местоположение, породу, высоту, диаметр, количество стволов и санитарное состояние по четырехбалльной шкале: такое количество данных можно вносить без всякого диктофона.

Полевые карты изготовил в QGIS, загрузив данные через QuickOSM — это такой модуль overpass для QGIS. Главное требование к полевым материалам — карты должны быть бледными и содержать только нужную информацию, в моем случае, это дома с номерами, дороги с подписями улиц и заборы.

Карта до выхода в поле

Кроме этого я отметил на карте границы зеленых насаждений общего пользования из питерского RGIS-a. Последнее я не рекомендую повторять, поскольку процедура сомнительна в плане лицензионной чистоты и помогает лишь ориентироваться (и то не всегда). Я спокойно признаюсь в этом по двум причинам: во-первых, никакие данные из посторонних источников в OSM не внесены, границы RGIS только помогают ориентироваться в больших дворах (вот аналогия: можно ли вносить название улицы на которой ты стоишь если ты пришел к ней используя условные карты от Google). Во-вторых, согласно OSM-Wiki эти данные доступны как общественное достояние (public domain). В любом случае, не так страшно использовать чужие данные, как умалчивать об этом.

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

Планшетка для спортивного ориентирования

Планшетка для спортивного ориентирования

Размер планшетки определяет формат карт, в моем случае A5. По многолетнему опыту могу сказать, что это наиболее удобный формат для полевых работ. Главное, не забыть про обзорную карту:

Обзорная карта

Обзорная карта

Полевая работа не представляет большой сложности если не брать в расчет физиологические неудобства. Желательно отмечать деревья так, что-бы карта была ориентирована на север. Это не принципиально, но облегчает обработку. Важно меньше размышлять и больше делать. Для размышлений есть подготовительный этап, в поле это приводит к потерянному времени и ошибочному результату. Выбираете первое дерево, определяете направление движения и отмечаете на карте точки — местоположения ближайших 5-10 деревьев. Далее идете от дерева к дереву и для каждой точки записываете что-то типа «2л22+28у24», где 2 — количество стволов, л — липа, 22+28 — диаметры стволов на высоте груди в см, у — удовлетворительное состояние, 24 — высота в метрах.

Очень важно сохранять бланки в чистоте — вносить минимум исправлений, а те, что неизбежны не закрашивать, а просто аккуратно и однообразно зачеркивать. Иначе потом предстоят отдельные мучения по дешифрированию написанного. Удивительно, но этим банальным правилом пренебрегает огромное количество специалистов.

Информация на карте

Таким способом в день удается картировать около трехсот деревьев. Летом больше, но все-равно после третьей сотни наступает усталость и темпы работы заметно снижаются. После заполнения, карта выглядит так:

Карта после заполнения

Карта после заполнения

Здесь красным обведены границы — это уже результат камеральной обработки. Придя в тепло я прорисовываю границы съемки красным, здания черным и нумерую все деревья по порядку проводя через каждое дерево ходовую линию зеленого цвета. Важно, что-бы линия нигде не пересекала себя, а первое, последнее и каждое десятое дерево были подписаны. В этом вопросе необходима внимательность, поскольку ошибка или пропущенное дерево потом создадут много хлопот.

Карта с границами, зданиями и номерами

Теоретически, данные уже можно вносить в OpenStreetMap, но к сожалению OSM, который зародился как проект полевого картографирования, последний десяток лет развивается в направлении диванного маппинга. Вносить полевые данные с помощью JOSM или ID — это неоправданная трата сил и времени, поэтому прибегнем к дополнительным инструментам.

Первым делом вносим данные о деревьях в любой редактор, текстовый или табличный. Я использую WPS — это аналог Excel для линукса. Путем нехитрых манипуляций разбиваем формулу вида «2л22+28у24» на пять столбцов (количество, порода, диаметр, санитарное состояние и высота). В шестом стобце указываем номер дерева (по зеленой линии). Вносить лучше всего по порядку идя по зеленой линии от точки к точке. Когда все готово — переводим все в csv-формат (кому лень переводить — может подгрузить в QGIS модуль для импорта данных из табличных редакторов). На этом этапе создаем дополнительные столбцы: natural (все строки заполнены текстом «tree»), genus (род на латыни), genus:ru (род на русском), health (санитарное состояние), height (высота), kind:ru (порода).

Сканируем или фотографируем карты и привязываем их в QGIS. Если они не сильно измялись в поле и сканированы — для привязки достаточно трех точек и аффинной трансформации. В моем случае точек потребовалось больше, поскольку иначе как проективной трансформацией фотографию нормально не привяжешь.

Привязанная в QGIS полевая карта

Привязанная в QGIS полевая карта

После привязки создаем точечный слой и обклацываем все точки вдоль зеленой линии одну за другой, ничего не пропуская и не ставя лишнего. Это крайне важно, поскольку определяет как будут сцеплены атрибутивные данные с геометрией. Для контроля полезно включить отображение количества объектов в слое. Когда все готово, остается только создать в таблице столбец с целочисленными значениями и заполнить его формулой $id+1 — в результате каждой точке будет присвоен номер, под которым он упомянут в таблице с данными. Остается лишь связать геометрию с внешней таблицей и скопировать данные из привязанной таблицы в атрибуты слоя.

Внесение геометрии в QGIS

Внесение геометрии в QGIS

Сохраняем файл в формате geojson в WGS84 (EPSG:4326). Теперь через оверпас проверяем наличие деревьев в базе OSM на территорию обследованных районов. В моем случае таковых было всего пять. Сверяем их со своими данными и если все совпадает (при обследовании вы их нашли), а теги на деревьях не содержат важной информации — смело удаляем их через JOSM. Если не нашли, но вы в качестве своей работы уверены — тоже удаляйте.

Осталось только загрузить в JOSM ваш район работ, открыть файл geojson, копировать из него данные в слой openstreetmap и убедиться, что все на своих местах. У меня иногда вставленный слой по неизвестной причине съезжает, но это ошибка систематическая и исправляется элементарным перемещением.

JOSM с данными о деревьях

JOSM с данными о деревьях

Казалось бы, загружай в базу и радуйся. Но есть пару щепетильных моментов, на которые опытный осмер уже наверняка обратил внимание. Начнем с базового: а что именно мы вносим? Понятно, что деревья, но вот мы полторы тысячи деревьев осмотрели и ощупали. Самое время спросить: «Что такое дерево?». Сирень — дерево или нет? А липа? А дюжина лип, которые растут как кустарник? В OSM внесено не тринадцать миллионов деревьев, а тринадцать миллионов natural=tree, среди которых и трава, и кустарники, и деревья и все, что угодно.

Теперь наименование. Если следовать описанию тега natural=tree, мы должны указать вид (species), в крайнем случае род (genus). Подход логичный, но так делать нельзя. Могу ли я указать вид липы? Допустим, с очень большой погрешностью могу, благо их всего два в городе: платифиллос и кордата. А как быть с ясенями, у которых диагностический признак — почки, расположены на высоте трех человеческих ростов? А как быть с лиственницами, виды которых во всем Питере может нормально различить только один человек?

Для таких ситуаций есть род (genus). Но вот передо мной вишня. Если я внесу genus для вишни по всем правилам, то выйдет, что у меня никакая не вишня, а слива. Потому как вишня — это сливовый подрод (Prunus subgenus Cerasus). И черемуха, кстати тоже. А как быть с трактовкой разных таксонов? Никогда вы эту проблему не решите, если не признаете, что вносить вид в OSM столь же глупо, как и указывать для каждого дерева нуклеотидную цепь. Вид и род — это очень, очень, очень тяжело и сложно. То что определяем мы, называется «порода» — группа растений, выделенная на основе практической целесообразности. Это может быть и вид (конский каштан обыкновенный) и род (вяз) и подрод и все, что угодно. Хороший пример с тополями, которые разделяют на две породы: осину, которая populus tremula и тополь, который объединяет все остальные тополя.

А как обстоит дело с морфометрией? Есть circumference=* — окружность ствола в метрах. Но как быть, если стволов несколько? Как обозначить, что дерево является угрозой? Как тегировать кронированный обрубок тополя? Как тегировать особые случаи произрастания, например, когда береза вьется лианой по сосне? Или черемуха, ветви которой в четверть метра толщиной вросли в землю? Как обозначать скворечники и кормушки? А если в них живут белки? Хотя стоп, сейчас меня в нечеткое тегирование унесет, а я все это не для того рассказываю. Рассказываю я это для того, что неожиданно хороший повод для встречи образовался — поработать над схемой тегирования деревьев. Ну и еще немного для того, что-бы похвастаться. Что я, зря полторы недели корячился?