Тайловый сервер на 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) сохранено пересечение водотоков с болотами и ледниками. С точки зрения натуралиста река в болоте — это ахинея, но с точки зрения картографа приходится работать с теми данными, которые есть.

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

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

Козлиный досуг

Штирлиц за месяц порядочно вырос и присмирел. Но меня смущает его интеллект, проще говоря: козел совершенно тупой. За четыре недели он освоил только команды «Лежать» и «Гулять», да и те с грехом пополам. Я не жду от него умения решать интегралы, но ведь должна быть хоть малейшая искра сообразительности.

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

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

P.S. Пожалуйста, только не предлагайте мне купить второго козла.

Важнейший вопрос дня

Что придает пролежавшей несколько лет в земле лампе накаливания фиолетовый оттенок? Связано ли это с особенностями вольфрама или зависит от свойств стекла колбы? При каких условиях происходит изменение цвета?

Какой вывод следует из наличия фиолетовой лампы Ильича?

Феминизм откладывается

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

Зато появился дополнительный повод на рыбалку идти.

Идиотское видео

А с чего вы взяли, что на этом сайте можно обрести нечто полезное или хотя-бы занимательное? Мой формат прост — кайфовать от жизни во всех ее проявлениях:

Пропавшее котокафе

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

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

Теперь уже и СКК нет. Последний раз я посетил его в апреле девятнадцатого года, незадолго до разрушения. Вспомнил ночные гонки на рохлях, концерт КиШа за окнами и главное правило: три прогона — отсечка. О разрушении комплекса говорили много, но про кошек никто не вспомнил. Что с ними стало? Отравили? Завалило обломками? Разбежались по окрестным помойкам?

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