Картографический стиль «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 года вообще не указывает на присутствие обыкновенной гадюки в Ростовской области. Но это очень сомнительный подход.

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

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

Ответ ютубовским социолого-политико-экономическим экспертам

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


Живые системы. Часть 4

Добавим к системе пространств SX, SY третье пространство SZ, аналогично тому, как мы добавили простарнство SY к пространству SX. В такой системе пространств объекты возникают не только относительно каждого пространства, но и относительно друг друга. Иначе говоря, появляется наблюдатель — объект пространства SZ — взаимосвязь между пространствами SX и SY. Наблюдение — это состояние объекта при котором у него как части пространства изменяется относительная энергия (условия перехода из одного состояния в другое) и/или относительное количество возможных состояний.

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

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

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

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

Внезапно появляется человек готовый к диалогу. Возникает сущность для измерения, но нет критериев оценки. Общаетесь вы на уровне эксперта или на уровне человека, которому в школе попался туристический разговорник? Те, кого абстракции пугают, возразят: «Я же могу сравнить скорость подбора слов, длину и разнообразие предложений». Но кто сказал, что на языке зуриби следует говорить быстро и разнообразно? Это пример системы с двумя пространствами: есть что измерять, но нет для этого инструмента.

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

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