Как в Европе

Как в Европе

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

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

Наверняка не одну сотню раз вы слышали фразу «Жить как в Европе». В ответ я раньше советовал поехать туда и лично убедиться, в глупости сказанного. Одно дело — негроидный Париж, другое — арабские кварталы Кельна, третье — пустота ночного Бергамо, четвертое — меланхолия вечернего Йоэнсуу. А еще есть венгерский соцреализм, иберийская Россия и Афины, которые больше напоминают Индию. Европа вся разная.

Произнося «как в Европе», обычно представляют Швейцарию, но ведь можно и Косово. Ехать самому для доказательства крайне полезно, но уж больно долго и дорого. Пока не снимут карантин, можно заняться картированием. Из Сербии в Австрию, затем погулять по Албании и заскочить в чешскую деревушку. В бывшей Югославии прекрасно почти как в сибирской тайге: всегда найдется, что замапить. Но и в окрестностях Германии можно наскрести по сусекам недостающие домики.

Даже картирование показывает как сильно отличаются друг от друга европейские страны. С другой стороны, вспоминаю свои правки в Конго, Мадагаскаре и Сомали: по сравнению с Африкой, между Шахтами и Валенсией разницы вообще никакой нет.

Философия в OpenStreetMap

Философия в OpenStreetMap

Не парадокс Рассела, конечно, но посудите сами. Самое время презрительно плюнуть в меня с высокой колокольни. Ты же, дескать, что год назад говорил? «OpenStreetMap мертв». А он до сих пор живее живых. Я бы даже согласился, но плевать приходится лишь самому на себя. Отсюда возникает вопрос: кто прав?

Все показатели растут: больше пользователей, больше точек. Нет повода ворчать и распускать ложную критику. Примерно по такому закону распухают утопленники: сильно, неотвратимо, но в полной зависимости от окружающих условий. Что нового произошло в OSM за этот год? Какое изменение или событие опровергает пассивную инерционность проекта? Это при том, что судьба дважды дала уникальный шанс: из дома выходить нельзя, сериалы просмотрены, а игры надоели. Уходящий год мог запомниться тремя явлениями: курьерской доставкой, конференциями в зуме и OpenStreetMap. Зум и курьеры не подвели. OSM остался невозмутимым.

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

Для примера возьмем старый спор о тегировании воинских частей в его обобщенном виде: стоит ли наносить на карту объекты, информация о местоположении которых может привести к негативным последствиям? Насколько я знаю, первым этот холивар устроил Платон в своем «Мифе о пещере». Но главный спор развернулся двадцать два века спустя между представителями американской философской мысли: Липпманом и Дьюи.

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

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

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

Лишь человек из пещеры видит в OpenStreetMap только набор геоданных. Можно даже перефразировать классику: джосм — это инструмент, с помощью которого картографы диктуют свою непреклонную, но вялую волю всему мировому сообществу. При этом сам проект скорее напоминает советский дом отдыха с душем Шарко. Если бы возникла потребность выбрать лицо проекта, лучшей кандидатурой был бы Брежнев.

«В упорной борьбе за количество домиков партия и народ правили сиськи-масиськи и добились выполнения поставленного плана». Спокойствие, уверенность и стабильность. Как на кладбище, только с надеждой на перспективы.

Антиксероксники

Антиксероксники

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

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

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

А главное, количество таких объявлений столь велико, что сразу понятно: их на ксероксе печатают. Точно секта какая-то. Не удивлюсь, если окажется, что в OpenStreetMap для обозначения такого объекта ни одного подходящего тега не найдется. Разве что мапить их как объекты культа.

Картографический стиль «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>

Подкаст натуралиста. Использование данных OpenStreetMap

Этот выпуск предназначен для тех, кто решит использовать геоданные OSM в первый раз. Я не обсуждаю историю проекта, успехи, недостатки, OSMF и прочее — это тема отдельного разговора. Здесь касаюсь лишь вопросов, которые чаще всего мне задают.

В подкасте упоминаю поисковик по базам данных от гугла: datasetsearch.research.google.com, форум OSM: forum.openstreetmap.org и отличный чат русскоязычного сообщества в телеграмме: @ruosm. Кроме этого существует канал с обобщением текущих событий в OSM: @ruosm_news и канал Ильи Зверева: @shtosm. В этих источниках вы найдете если не все, то по крайней мере ссылки на все.

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

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

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

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

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

OpenStreetMap мертв

Формат конференций устарел. Позиция спикеров заранее известна, да и сами докладчики всегда одни и те же. В перерывах чай и светские беседы. Между перерывами карго-культ партийных заседаний. Пафос, слайды и попытки зевнуть не открывая рта, что-бы лицо выглядело еще более заинтересованным. «Это была потрясающая конференция» — говорят участники и моргают.

И только мы — конференционные фрики еще держимся. Я держусь и два моих учителя: депутат и гусляр. Можете сами убедиться. Остальные (вменяемые) доклады конференции @spbgeotex доступны по ссылке.

Большое спасибо за помощь организаторам, моей соседке по даче, Фридриху Ницше и Константину Эдуардовичу Циолковскому. Это была потрясающая конференция.

Фиаско

Несколько дней назад я выдал самый вялый, импотентский и пустой доклад за последнее время. Не то лепнина так на меня подействовала, не то аудитория не моя, а скорее всего, следовало просто бахнуть до конференции.

Помните, я рассказывал о публичных выступлениях? Так вот, это пример того, как делать не следует. Единственный плюс доклада — он самый короткий. Кроме того, он про состояние гидрографии в проекте OpenStreetMap (хотя, это скорее минус).

Если вам потребуется рвотное, достаточно всего лишь посмотреть это видео. Противоядие доступно в других докладах конференции спбгеотех.

Броунфилд

Рано или поздно всякий осмер узнает тег landuse=brownfield: «земли, запланированные для застройки, где старые постройки использовались в промышленных или коммерческих целях». Но мало кто вникал в происхождение этого тега. А зря, тут есть над чем призадуматься.

Описание тега landuse=brownfield в вики прямо наследует английскую традицию употребления термина «коричневое поле». Так англичане неформально (ну ок, полуформально) обзывают «previously developed land» — ранее развитую территорию. Скажем развалины завода с английской точки зрения — типичный landuse=brownfield.

Но такому определению всего семь лет и три месяца. После того как 27 марта 2012 года Великобритания выпустила свод градостроительных правил (National Planning Policy Framework), понятия brownfield и PDL стали синонимами, а североамериканское понятие броунфилда перестало соответствовать английскому.

Термин «brownfield» возник в 1992 году при обсуждении в конгрессе США промышленных территорий загрязненных опасными отходами. Теперь в США brownfield — это юридическое понятие. Если в Англии любые развалины завода — это brownfield, то в США, а заодно и Канаде, brownfield — это развалины, которым сопутствует загрязнение (например, высокое содержание ртути в почве) или опасность такого загрязнения.

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

А в России тегировать броунфилды вообще непонятно как. Понятие «запланировано для застройки» здесь может сохраняться неизменным в течении десятков лет, пока все окончательно не накроется natural=wood.

Весь этот спич символизирует то, что в новом подкасте я собирался рассказать вам о мусоре и загрязнении, но так зарылся в этой теме, что решил удалить все не публикуя этот невнятный позор. Говорить о загрязнении не упомянув «Тихого дорожника», Карачай и «чудо чистоты» стыдно, а свести все в один подкаст невозможно. Но я обязательно что-нибудь придумаю.

И это я еще не упомянул про landuse=landfill.

Проблема тегирования

На днях в осмерском телеграмм-чатике пользователь Sergey Sinitsyn задал любопытный вопрос: «Из одной точки одновременно растут берёза, сосна и ель — расположите теги у точки в правильной последовательности». Можно отмахнуться, мол ставь как угодно, но вообще-то это вызов, который в приличном обществе принято принимать. Можно даже расширить вопрос до принципиального способа тегирования таких объектов.

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

1. Геометрический способ.
Семь знаков после запятой обеспечивают сантиметровую точность (вдоль меридиана 1.1 см, вдоль параллели Москвы около 0.5 см). Это позволяет наносить любые деревья, как бы близко они не росли друг к другу — нет смысла использовать одну точку для всех деревьев сразу.

Этот способ очевиден, но не идеален. Во-первых, он повышает трудоемкость внесения данных, во-вторых, усложняет редактирование, в-третьих, возникают проблемы с рендером. Но главное, как быть, если деревья растут не просто рядом, а действительно из одной точки? Например ольха, укоренившаяся в дупле липы? Я уже не говорю про типичные эпифиты, с точным картированием которых никто не заморачивался.

2. Биологический способ.
Если сантиметровой точности недостаточно, выход есть. В OpenStreetMap я не встречал правила, согласно которому точка дерева на карте соответствует расположению комля. А поскольку третьей координаты нет, точкой дерева можно считать проекцию центра биомассы организма на поверхность земли. Таким образом, растущие из одного места наклоненные деревья, могут быть удалены на карте друг от друга на десятки метров.

3. Формальный способ.
Никто не мешает поставить на точку тег «группа деревьев». Строго говоря, это как раз один из случаев natural=wood. Представлять три дерева как лес непривычно, но в osm лес понимается по айтишному, как более одной воткнутой в землю толстой разветвленной палки.

4. Нечеткий способ.
Я не мог про это не сказать, сами понимаете. Способ аналогичен предыдущему, но позволяет не только указать на группу деревьев, но и дать пояснение о породе. Например так: natural=wood, species=betula …:0.3, species=pinus …:0.3, species=picea …:0.4. Нотация произвольная, характеристические числа соответствуют выраженности вида в группе (здесь все деревья одинаковы, только елка-picea чуть больше: 0.4 вместо 0.3).

5. Динамический способ.
Вернемся к natural=tree. Поскольку актуальность правки часто не отслеживается, есть смысл использовать порядок развития группы деревьев. Я бы расположил первой елку, как наиболее перспективную, последней сосну, которая доживает последние годы.

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

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

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

А вы говорите «проблема тегирования».