-
-
Notifications
You must be signed in to change notification settings - Fork 1
/
tilesCOVER.php
97 lines (83 loc) · 4.55 KB
/
tilesCOVER.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
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
<?php
ob_start(); // попробуем перехватить любой вывод скрипта
chdir(__DIR__); // задаем директорию выполнение скрипта
require('params.php'); // пути и параметры
$x = intval($_REQUEST['x']);
$y = filter_var($_REQUEST['y'],FILTER_SANITIZE_URL); // 123456.png
$z = intval($_REQUEST['z']);
$r = filter_var($_REQUEST['r'],FILTER_SANITIZE_FULL_SPECIAL_CHARS); // имя карты, покрытие которой надо получить, без _COVER
//$x=618; $y=321; $z=10;
//$x=143; $y=74; $z=8;
//$r='OpenTopoMap'; // имя карты, но может быть с путём к подкартам
// http://192.168.10.10/tileproxy/tilesCOVER.php?z=5&x=19&y=8&r=C-MAP
if((!$x) OR (!$y) OR (!$z) OR (!$r)) {
goto END;
}
$mapAddPath = strstr($r,'/'); // путь к подкартам
$r = substr($r,0,strlen($r)-strlen($mapAddPath)); // имя карты
//echo "x=$x; y=$y; z=$z; r=$r;<br>\n";
require('mapsourcesVariablesList.php'); // потому что в файле источника они могут быть не все, и для новой карты останутся старые
if(! include("$mapSourcesDir/$r.php")) goto END; // параметры карты
//if($z+8>$maxZoom) goto END; // нет смысла считать покрытие тайлов, которых заведомо нет. Зато есть смысл посмотреть номера тайлов масштаба $loaderMaxZoom
$path_parts = pathinfo($y); //
$y = $path_parts['filename'];
// Расширение из конфига имеет преимущество!
if(!$ext) $ext = $path_parts['extension']; // в конфиге источника не указано расширение -- используем из запроса
if(!$ext) $ext='png'; // совсем нет -- умолчальное
//echo "ext=$ext;<br>\n";
$img = imagecreatetruecolor(256,256); // картинка пустая
imagesavealpha($img,TRUE);
//imagealphablending($img,TRUE);
$yesColor = imagecolorallocatealpha($img,1,1,1,80);
$noColor = imagecolorallocatealpha($img,0,0,0,127); // цвет, обозначающий, что нет
$bigZoomColor = imagecolorallocatealpha($img,0,0,255,112); //
//imagecolortransparent($img,$noColor); // этот цвет будет прозрачным
imagefill($img, 0, 0, $noColor); // закрасим весь тайл
//$testColor = imagecolorallocate($img,255,0,255); //
//imagerectangle($img,0,0,255,255,$testColor);
$bigZ = $loaderMaxZoom-$z; //
if($bigZ<8){ // будем показывать тайлы масштаба $loaderMaxZoom при более крупных, чем +8 масштабах просмотра
// левый верхний тайл масштаба 16
$tiles = 2**$bigZ; // тайлов по координате 16 масштаба в тайле данного масштаба
$squareSize = 256/$tiles; // пикселей в изображении тайла 16 масштаба
$coverX = $tiles*$x;
$coverY = $tiles*$y;
$coverZ = $loaderMaxZoom;
//echo "tiles=$tiles; coverX=$coverX; coverY=$coverY; coverZ=$coverZ;\n";
for($ix=$coverX;$ix<($coverX+$tiles);$ix++){
for($jy=$coverY;$jy<($coverY+$tiles);$jy++){
$tileName = "$tileCacheDir/$r$mapAddPath/$coverZ/$ix/$jy.$ext";
$tileSize = @filesize($tileName);
//echo "$tileName $tileSize\n";
//echo (($ix-$coverX)*$squareSize).",".(($jy-$coverY)*$squareSize)." ".(($ix-$coverX)*$squareSize+$squareSize).",".(($jy-$coverY)*$squareSize+$squareSize)."\n";
if($tileSize){
imagefilledrectangle($img,($ix-$coverX)*$squareSize,($jy-$coverY)*$squareSize,($ix-$coverX)*$squareSize+$squareSize,($jy-$coverY)*$squareSize+$squareSize,$bigZoomColor);
}
}
}
}
if($z+8<=$maxZoom){ // нет смысла считать покрытие тайлов, которых заведомо нет
// левый верхний тайл масштаба +8
$coverX = 2**8*$x;
$coverY = 2**8*$y;
$coverZ = $z+8;
//echo "$coverZ: $coverX / $coverY\n";
for($ix=$coverX;$ix<$coverX+256;$ix++){
for($jy=$coverY;$jy<$coverY+256;$jy++){
$tileName = "$tileCacheDir/$r$mapAddPath/$coverZ/$ix/$jy.$ext";
$tileSize = @filesize($tileName);
//$tileSize = file_exists($tileName);
//echo "$tileName $tileSize<br>\n";
//echo ($ix-$coverX).",".($jy-$coverY)."\n";
if($tileSize){
imagesetpixel($img,$ix-$coverX,$jy-$coverY,$yesColor);
}
}
}
}
ob_clean(); // очистим, если что попало в буфер
header ("Content-Type: image/png");
imagepng($img);
END:
return;
?>