Тайловый сервер на 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();
  }
?>