Тайловый сервер на PHP и MBTiles

Ума не приложу, откуда у меня на сервере этот код, но он, зараза, изумительно хорош. Помогает передавать файлы mbtiles в лефлет или OL. Загружаете файл exampleFile.mbtiles на сервер, прописываете необходимые пути и у вас отображаются нужные тайлы.

Файл MBTiles можно получить из QGIS или скачать для примера образец.

HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
<!DOCTYPE html>
<html>
	<head>
		<title>PHP Map Server</title>
		<meta charset="utf-8" />
		<link rel="stylesheet" href=".../leaflet.css"/>
		<script src=".../leaflet.js"></script>
		<script src=".../script.js"></script>
	</head>
	<body>
		<div id="map"></div>
	</body>
</html>

JavaScript (файл script.js)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
let map = new L.Map("map",{
			zoomControl:false, 
			zoom: 10, 
			center: [55.741126, 37.489289]
			})
let mapquestOSM = 
	new L.TileLayer('http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', {
		attribution: '...'}).addTo(map)
let mbTiles = 
   new L.tileLayer('tileserver/mbtiles.php?db=exampleFile.mbtiles&z={z}&x={x}&y={y}',{
		tms: true,
		attribution: '...',
		opacity: 1.0
		}).addTo(map)
 
let baseLayers = {"OpenStreetMap": mapquestOSM,}
let overlays = {"Local MBTiles File": mbTiles,}
layersControl = new L.Control.Layers(baseLayers, overlays).addTo(map)

PHP (файл tileserver/mbtiles.php)

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
<?php
$zoom = $_GET['z'];
$column = $_GET['x'];
$row = $_GET['y'];
$db = $_GET['db'];
  try
  {
    // Open the database
    $conn = new PDO("sqlite:$db");
 
    // Query the tiles view and echo out the returned image
	$sql = "SELECT * FROM tiles WHERE 
			zoom_level = $zoom AND 
			tile_column = $column AND 
			tile_row = $row";
	$q = $conn->prepare($sql);
	$q->execute();
 
	$q->bindColumn(1, $zoom_level);
	$q->bindColumn(2, $tile_column);
	$q->bindColumn(3, $tile_row);
	$q->bindColumn(4, $tile_data, PDO::PARAM_LOB);
 
	while($q->fetch())
	{
	header("Content-Type: image/png");
	echo $tile_data;
	}
  }
  catch(PDOException $e)
  {
    print 'Exception : '.$e->getMessage();
  }
?>

Водотоки из OpenStreetMap

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

Продолжая работу с гидрографией OSM, подготовил два шейпа с водотоками России. В них включены лишь вменяемо именованные реки, каналы и ручьи. Полные и сокращенные названия типов приведены в отдельных полях («канал» и «кан.»). Оригинальные ключи OSM сохранил, но я не слишком бы им доверял. Помимо исходной субъективности, в них присутствует элемент случайности, поскольку фрагментарные водотоки объединены.

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

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

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

Водоемы из OpenStreetMap

Помню, нахлынула на меня кручина и я часами обрисовывал в OSM водоемы вокруг озера Варчато. Теперь в озерном Ямало-Ненцком округе рябит голубое пятно и таких мест в OpenStreetMap не сосчитать. А еще существет вечный спор о наименованиях. Как правильно писать: «оз. Умбозеро», «озеро Умбозеро» или просто «Умбозеро»?

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

В процессе редактирования старался не жестить и правил только гидронимы на русском языке. Их я хотя бы выговорить могу, в отличие от озер Алятпильгынгытгын и Ляккылькэтыпорыльто. Среди русских топонимов тоже попалось много занятного, начиная от постоянного слова «катлаван» и заканчивая такими шедеврами как: «подземная база подводных лодок», «пока нет названия», «Отмыться после 30 маршрута», «Большие Дурманцы (на Яндекс картах)», «Убитая баба», «Ч1ат!абяр», «Верхнеафипский Лох-Несс», «Сети не ставить!!!», «Тощая щука» и «Озеро нашей любви».

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

Помимо поля «name», где указано название водоема, существуют еще поля: «type» — тип водоема (например, «озеро или «водохранилище») и «shorttype», где дано сокращение (например, «оз.» или «вдхр.»). Оригинальные значения ключей оставил в поле «fclass», площадь полигонов в «area». Актуальность данных — апрель 2021 года.

Вектор в шейпе EPSG:4326. Кроме него в архиве текстовый и экселевский файлы с таблицами. Данные могут быть полезны разработчикам картографических стилей и специалистам по топонимике.

Повод праздновать

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

Было бы обидно оставить в памяти подобное совпадение банальным распитием коньяков. А потому я собрал всю свою волю и за сорок часов непрерывного кодинга довел программу Colombo до состояния релиза. Да, это тот самый концепт, который фигурировал в докладе на последней «Схемотехнике».

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

Работы предстоит еще много. Тут и проблема дисторсии, и морока с интерфейсом, и бесконечные тесты. Хелп и тот надо до ума доводить. Но это все задачи будущего. А в настоящем у нас праздник.

feeneek

Feeneek — простая открытая библиотека для совместного картирования

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

Библиотека написана на JavaScript (нативная версия) с небольшой серверной частью на PHP. Для отображения тайлов использована библиотека leaflet.js, для вывода графиков — Chart.js.

Для установки достаточно скопировать архив и распаковать его на своем сервере. По всем вопросам и замечаниям рекомендую писать в телеграм (@openstreetmapper), почту (schwejk-rpnt@rambler.ru) или в комментарии к этому посту.

Обзор библиотеки

Старые версии библиотеки

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

Дата сборки Ссылка на скачивание Демо-версия
22_02_2016 (Butko Sonne) Скачать Демо-версия
03_02_2016 («McClane Lichtgestalt») Скачать Демо-версия
03_06_2015 («McClane Lichtgestalt») Скачать Демо-версия

Политический детектив

Политический детектив

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

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

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

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

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

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

Перед нами три карты: большая политическая и две малых, скорее всего топографических. Политическая интереса не представляет, там все-равно ничего не разобрать, зато остальные крайне любопытны. Судя по стилю, они обе из одного источника (конечно, с некоторой вероятностью). На той, что слева внизу угадывается Томск от безымянного острова перед Коммунальным мостом до острова Энеков. Что-ж, это ожидаемо. Но что на другой карте, которая справа вверху? Неужели район гостиницы «Ксандер», где произошло отравление? А может знаменитое село Кафтанчиково, где купался Навальный? А вот хрен. Ближайшее, хоть сколько-нибудь похожее место — в северо-западном пригороде Томска: город Северск.

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

Конечно, все сказанное хрень, но оцените какой сюжет! А вместо этого — история про то как трусы измазали. Как зритель, я совершенно недоволен, однако с педагогической точки зрения признаю: все верно. Нет лучшего подарка для молодых исследователей, чем лишний раз напомнить цитату Жванецкого: «Тщательнее надо, ребята. Формулы вам дали, только надо руки помыть тому пацану, который колбу держит. А то потравим друг друга окончательно».

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Классификатор основных объектов на карте

Группа Объект
Админ. деление Государственная принадлежность
Админ. деление Границы государств
Админ. деление Спорные границы государств
Админ. деление Границы областей, штатов
Админ. деление Границы районов
Админ. деление Крупные города
Админ. деление Средние города
Админ. деление Мелкие города
Админ. деление Городские районы
Админ. деление Деревни
Админ. деление Отдельные дворы, хутора
Админ. деление Дачные и садовые участки
Админ. деление Постоянные стоянки кочевых поселений
Админ. деление Разрушенные и оставленные населенные пункты
Админ. деление Именованные места
Админ. деление Прочие границы
Админ. деление Количество жителей
Барьеры Ворота
Барьеры Шлагбаум
Барьеры Мусор
Барьеры Стена
Барьеры Блок
Барьеры Траншея
Барьеры Забор
Гидрография естественная Океаны и моря
Гидрография естественная Озера
Гидрография естественная Реки
Гидрография естественная Ручьи
Гидрография естественная Болота проходимые
Гидрография естественная Болота непроходимые
Гидрография естественная Водопады
Гидрография естественная Гейзеры
Гидрография естественная Источники необорудованные
Гидрография естественная Пороги
Гидрография естественная Котловины высохших водоемов
Гидрография естественная Мели
Гидрография естественная Области прилива
Гидрография естественная Острова
Гидрография естественная Зоны затопления, разлива
Гидрография естественная Места скопления плавника
Гидрография естественная Характер береговой линии
Гидрография естественная Рифы
Гидрография естественная Архипелаг
Гидрография искусственная Бассейны
Гидрография искусственная Водохранилища
Гидрография искусственная Дамбы
Гидрография искусственная Плотины
Гидрография искусственная Плотины подводные
Гидрография искусственная Каналы несудоходные
Гидрография искусственная Каналы судоходные
Гидрография искусственная Шлюзы
Гидрография искусственная Молы, пристани и причалы
Гидрография искусственная Доки
Гидрография искусственная Волноломы и буны
Гидрография искусственная Источники оборудованные
Гидрография искусственная Колодцы, колонки и скважины
Гидрография искусственная Каналы мелиоративные
Гидрография искусственная Водозаборы, водосборные и водораспределительные устройства
Гидрография искусственная Акведуки
Гидрография искусственная Пожарные водоемы
Гидрография искусственная Бакены, буи, сигнальные огни
Дороги автомобильные Автомагистрали
Дороги автомобильные Шоссе
Дороги автомобильные Улучшенные грунтовые дороги
Дороги автомобильные Грунтовые проселочные дороги
Дороги автомобильные Полевые и лесные дороги
Дороги автомобильные Зимники
Дороги автомобильные Улицы
Дороги автомобильные Проезды
Дороги автомобильные Подвесные дороги
Дорожная инфраструктура Автомойка
Дорожная инфраструктура Зарядная станция для электромобилей
Общественные места Продуктовые магазины
Общественные места Магазины по продаже газа
Дорожная инфраструктура Автомагазин
Дорожная инфраструктура АЗС
Дорожная инфраструктура Стоянки транспорта и отстойники
Дорожная инфраструктура СТО
Дорожная инфраструктура Место отдыха
Элементы дорог Круговое движение
Элементы дорог Знак «стоп»
Элементы дорог Светофор
Элементы дорог Платный въезд
Элементы дорог Уступи дорогу
Землепользование Деловые районы
Землепользование Места торговли
Землепользование Промышленные территории
Землепользование Сельскохозяйственные территории
Землепользование Жилая зона
Землепользование Стройки
Землепользование Кладбища без растительности
Землепользование Кладбища с растительностью
Землепользование Мусорные свалки
Землепользование Запретные зоны (армия, тюрьмы и др.)
Землепользование Религиозные территории
Землепользование Заповедники и национальные парки
Землепользование Охотничьи угодья
Землепользование Зоны с особым режимом использования территории
Землепользование Ограничения по доступу
Землепользование Места боевых действий, минные поля
Землепользование Иные опасные районы
Общественные места Религиозные строения
Общественные места Здания социально-культурного назначения
Общественные места Места развлечений
Общественные места Пункты связи (телеграф, телефон, почта)
Общественные места Специальное места для выгула и дрессировки собак
Общественные места Костровища
Общественные места Места для рыбалки
Общественные места Места аренды транспортной техники
Общественные места Банкоматы и банки
Общественные места Ветеринарные клиники
Общественные места Публичные дома, стриптиз клубы
Общественные места Места передержки животных
Общественные места Посольства
Общественные места Места сбора отходов вторичной переработки
Общественные места Сауна (баня)
Общественные места Урны для мусора
Общественные места Офис лесничества, лесного или охот. хозяйства
Общественные места Офис гидов по организации экскурсий
Общественные места Мастерская по ремонту лодок
Общественные места Кемпинги и места отдыха на природе
Общественные места Информационные стенды
Общественные места Смотровые площадки, места с хорошим обзором
Общественные места Музеи
Общественные места Зоопарки
Общественные места Места археологических раскопок
Общественные места Места проката спорт. инвентаря
Общественные места Заведения общественного питания
Общественные места Отели, гостиницы, охотничьи и рыболовные базы
Общественные места Супермаркеты
Общественные места Магазины напитков
Общественные места Универмаги
Общественные места Бытовые магазины
Общественные места Магазины по продаже снаряжения
Общественные места Рыборловный магазин
Общественные места Охотничий магазин
Общественные места Зоомагазин
Общественные места Табачный магазин
Общественные места Место наблюдения за дикой природой
Опасности Опасные берега
Опасности Крутые склоны
Опасности Скотомогильники
Опасности Полицейкие участки
Опасности Спасательные станции
Опасности Точка экстренной помощи
Опасности Больницы и медицинские пункты
Опасности Военные сооружения
Ориентиры Ветряные двигатели
Ориентиры Водомерные посты
Ориентиры Выброшенные суда
Ориентиры Выдающиеся части зданий (шпили)
Ориентиры Памятники
Ориентиры Вышки легкого типа
Ориентиры Градирни
Ориентиры Деревья — ориентиры
Ориентиры Заводские и фабричные трубы
Ориентиры Капитальные сооружения башенного типа
Ориентиры Километровые знаки
Ориентиры Кладбища кораблей
Ориентиры Мазары, субурганы, обо
Ориентиры Радио- и телемачты
Ориентиры Футштоки
Ориентиры Рощи ориентиры
Ориентиры Крест, не имеющий большого религиозного значения
Ориентиры Геодезические ориентиры
Ориентиры Списанный самолет, используемый не по назначению
Ориентиры Списанное оружие и тяжелая техника, используемая не по назначению
Ориентиры Списанная ж/д техника, использхуемая не по назначению
Ориентиры Списанные суда, используемые не по назначению
Ориентиры Виселицы
Пешеходные пути Караванные пути и вьючные тропы
Пешеходные пути Перевалы
Пешеходные пути Фуникулеры
Пешеходные пути Подземные переходы
Пешеходные пути Овринги
Пешеходные пути Лестницы
Пешеходные пути Мосты пешеходные
Пешеходные пути Тротуары
Пешеходные пути Тропы
Пешеходные пути Велодорожка
Пешеходные пути Дорожки для верховой езды
Промышленность Ветроэлектростанции
Промышленность Гидроэлектростанции
Промышленность Тепловые электростанции
Промышленность Атомные электростанции
Промышленность Геотермальные электростанции
Промышленность Приливные электростанции
Промышленность Солнечные электростанции
Промышленность Нефтяные и газовые промыслы
Промышленность Рудники, прииски, копи
Промышленность Шахты
Промышленность Торфоразработки
Промышленность Открытые соляные разработки
Промышленность Промышленные предприятия без труб
Промышленность Промышленные предприятия с трубами
Промышленность Мельницы ветряные
Промышленность Мельницы водяные
Промышленность Склады закрытого типа
Промышленность Склады открытого типа
Промышленность Линии электропередач
Промышленность Краны козловые
Промышленность Краны мачтовые, стационарные
Промышленность Ствол шахты
Растительность Бамбук
Растительность Буреломы
Растительность Высокотравная растительность
Растительность Колки
Растительность Кустарники колючие
Растительность Кустарники обычные
Растительность Кустарниковая обсадка
Растительность Леса вырубленные
Растительность Леса горелые и сухостойные
Растительность Леса густые низкорослые
Растительность Леса густые высокие
Растительность Леса редкие низкорослые
Растительность Леса редкие высокие
Растительность Лесные питомники и молодые посадки
Растительность Луговая растительность
Растительность Мангровые заросли
Растительность Моховая и лишайниковая растительность
Растительность Обсадка вдоль дорог, рек, ручьев
Растительность Пальмовые рощи
Растительность Полукустарники
Растительность Поляны
Растительность Поросль леса
Растительность Иная древесная растительность
Растительность Камышовая и тростниковая растительность
Растительность Саксаул
Растительность Стланик
Растительность Степная травянистая растительность
Растительность Водоросли
Растительность Деревья (не имеющие ориентировочного значения)
Растительность Тип растительности
Растительность Просеки
Растительность Лесные кварталы
Растительность Пустоши
Растительность Альпийские луга
Растительность Гольцы
Рельеф Пляжи
Рельеф Насыпи
Рельеф Абсолютная высота
Рельеф Обрывистые (скалистые) берега без пляжа
Рельеф Берега с укрепленными откосами
Рельеф Бровка обрыва
Рельеф Бугры
Рельеф Береговые валы
Рельеф Исторические валы
Рельеф Прочие валы
Рельеф Выемки
Рельеф Выходы ископаемых льдов
Рельеф Галечники и гравийные поверхности
Рельеф Глина
Рельеф Горизонтали основные
Рельеф Горизонтали утолщенные
Рельеф Ледники
Рельеф Фирновые поля
Рельеф Гряды камней
Рельеф Дайки и крутостенные гряды
Рельеф Задернованные уступы
Рельеф Дюны
Рельеф Изрытые места
Рельеф Сухие канавы
Рельеф Каменные реки
Рельеф Каменистые поверхности
Рельеф Каменистые россыпи и щебеночные поверхности
Рельеф Карстовые и термокарстовые воронки
Рельеф Карьеры
Рельеф Грунты
Рельеф Кочковатые поверхности
Рельеф Грязевые вулканы
Рельеф Обычные вулканы
Рельеф Курганы
Рельеф Лавовые покровы
Рельеф Лавовые потоки
Рельеф Ледниковые трещины
Рельеф Морены
Рельеф Овраги
Рельеф Оползни
Рельеф Осыпи твердых пород
Рельеф Отвалы
Рельеф Отдельно лежащие камни
Рельеф Барханы
Рельеф Бугристые пески
Рельеф Пески лунковые и ячеистые
Рельеф Пески ровные
Рельеф Пески зыбучие
Рельеф Промоины
Рельеф Скалы и скалистые обрывы
Рельеф Скалы-останцы
Рельеф Скопление камней
Рельеф Солончаки
Рельеф Сухие русла
Рельеф Такыры
Рельеф Терриконы
Рельеф Характер породы
Рельеф Ямы
Рельеф Пещеры естественные
Рельеф Пещеры искусственные
Рельеф Вершины гор, холмов
Свойства Строящиеся объекты
Свойства Пересыхающие объекты
Свойства Глубина
Свойства Дебит
Свойства Качество воды
Свойства Направление течения
Свойства Отметки высоты уреза воды
Свойства Номер дороги
Свойства Номер съезда
Свойства Высота проезда
Свойства Грузоподъемность
Свойства Количество полос на дороге
Свойства Номер лесного квартала
Свойства Напряжение ЛЭП
Свойства Толщина деревьев
Свойства Расстояние между деревьями
Свойства Ширина
Свойства Материал сооружения
Свойства Номер дома, шурфа и до.
Свойства Объем
Свойства Относительная высота
Свойства Период доступности, затопленности
Свойства Плотность (тип) застройки
Свойства Площадь
Свойства Проходимость
Свойства Скорость
Свойства Состояние
Свойства Характеристики сухих канав
Свойства Расстояние
Свойства Ширина покрытия, проезда
Свойства Покрытые дорог
Общественные места Спортивные сооружения крытые
Общественные места Поля для гольфа
Общественные места Спортивные площадки
Общественные места Спортивные сооружения открытого типа
Общественные места Стадионы
Строения Древние исторические стены
Строения Казармы на ж/д
Строения Ограждения капитальные
Строения Ограждения легкие
Строения Легкие придорожные сооружения
Строения Отдельные строения невыдающиеся
Строения Отдельные строения разрушенные
Строения Охотничьи вышки, засидки
Строения Элеватор
Строения Бункеры ГСМ
Строения Летние лагери
Строения Альпинистские укрытия и зимовья
Строения Замки, форты, крепости
Строения Историческая усадьба
Строения Многоквартирный жилой дом
Строения Сельскохозяйственные здания
Строения Частный жилой дом
Строения Плавучий дом
Строения Дача, бунгало
Строения Деловое здание
Строения Промышленное здание
Строения Маяки
Строения Водонапорные башни
Строения Навесы, шалаши и другие легкие укрытия
Сельское хозяйство Сельскохозяйственные предприятия
Сельское хозяйство Пасека
Сельское хозяйство Пашни
Сельское хозяйство Виноградники
Сельское хозяйство Загоны для скота
Сельское хозяйство Парники, теплицы, оранжереи
Сельское хозяйство Плантации древесно-технических культур
Сельское хозяйство Плантации кустарниковых-технических культур
Сельское хозяйство Плантации травянистых технических культур
Сельское хозяйство Рисовые поля увлажняемые
Сельское хозяйство Рисовые поля затопляемые
Сельское хозяйство Фруктовые и цитрусовые сады
Сельское хозяйство Ягодные сады
Транспорт Аэропорты, аэродромы
Транспорт Блокпосты
Транспорт Вокзалы
Транспорт Гаражи
Транспорт Депо
Транспорт Железные дороги монорельсовые
Транспорт Железные дороги узкоколейные
Транспорт Железные дороги ширококолейные
Транспорт Место выхода метро на поверхность
Транспорт Морские порты, гавани
Транспорт Набережные
Транспорт Остановочные пункты
Транспорт Паромы железнодорожные
Транспорт Платформы
Транспорт Поворотные круги
Транспорт Полотно разобранных железных дорог
Транспорт Путепроводы прочие
Транспорт Речные порты
Транспорт Станции всех классов
Транспорт Станции метрополитена
Транспорт Станции на узкоколейной ж/д
Транспорт Станционные пути
Транспорт Створные знаки
Транспорт Трамвайные линии
Транспорт Число путей
Элементы дорог Съезды с автодорог
Элементы дорог Транспортные развязки
Элементы дорог Броды
Элементы дорог Паромные переправы
Элементы дорог Виадуки, путепроводы, эстакады
Элементы дорог Туннели
Элементы дорог Мосты подъемные и разводные
Элементы дорог Мосты прочие
Элементы дорог Лифт