diff --git a/.htaccess b/.htaccess
index 231c089..a49aea1 100644
--- a/.htaccess
+++ b/.htaccess
@@ -30,8 +30,7 @@ RewriteRule ^([\w\d\._-]+)/.+?(\d+)/(\d+)/(\d+)\.(\w+)$ $1/$2/$3/$4.$5 [L]
# MBTiles support at /layer/z/x/y.ext - loads the tile from mbtiles with php
# TODO: serve also 404 errors for tiles
-RewriteCond %{REQUEST_FILENAME} !-f
-RewriteRule ^([^\/]+)\/(\d+)\/(\d+)\/(\d+)\.(\w+)$ tileserver-mbtiles.php?tileset=$1&z=$2&x=$3&y=$4&ext=$5 [L]
+RewriteRule ^([^\/]+\.mbtiles)\/.*?(\d+)\/(\d+)\/(\d+)\.(\w+)$ tileserver-mbtiles.php?tileset=$1&z=$2&x=$3&y=$4&ext=$5 [L]
# TODO: use mod_sqlite if available to map the tiles to URL directly by apache
# WMTS KVP
diff --git a/tileserver-mbtiles.for.php b/tileserver-mbtiles.for.php
new file mode 100644
index 0000000..fc9f680
--- /dev/null
+++ b/tileserver-mbtiles.for.php
@@ -0,0 +1,132 @@
+404 Not Found";
+ echo "TileServer.php could not found what you requested.";
+ die();
+ // TODO: if ($_GET['ext'] == 'png') { ...
+ // TODO: better image 256x256px !!!
+ // header("Content-type: image/png");
+ //print("\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x01\x00\x00\x00\x01\x08\x06\x00\x00\x00\x1f\x15\xc4\x89\x00\x00\x00\rIDAT\x08\xd7c````\x00\x00\x00\x05\x00\x01^\xf3*:\x00\x00\x00\x00IEND\xaeB`\x82");
+}
+
+if (isset($_GET['tileset']) && preg_match('/^[\w\d_-]+$/', $_GET['tileset'])) {
+ $tileset = $_GET['tileset'];
+ $flip = true;
+ try {
+ $db = new PDO('sqlite:' . $tileset . '.mbtiles', '', '', array(
+ PDO::ATTR_PERSISTENT => true
+ ));
+ if (!isset($db)) {
+ header('Content-type: text/plain');
+ print 'Not possible to connect to SQLite database in file: ' . $_GET['tileset'] . '.mbtiles';
+ exit;
+ }
+ // http://c.tile.openstreetmap.org/12/2392/1190.png
+ $z = floatval($_GET['z']);
+ $y = floatval($_GET['y']);
+ $x = floatval($_GET['x']);
+ if ($flip) {
+ $y = pow(2, $z) - 1 - $y;
+ }
+ $result = $db->query('select tile_data as t from tiles where zoom_level=' . $z . ' and tile_column=' . $x . ' and tile_row=' . $y);
+ $data = $result->fetchColumn();
+ if (!isset($data) || $data === FALSE) {
+ // TODO: Put here ready to use empty tile!!!
+ $png = imagecreatetruecolor(256, 256);
+ imagesavealpha($png, true);
+ $trans_colour = imagecolorallocatealpha($png, 0, 0, 0, 127);
+ imagefill($png, 0, 0, $trans_colour);
+ header('Content-type: image/png');
+ imagepng($png);
+ //header($_SERVER['SERVER_PROTOCOL'].' 404 Not Found');
+ } else {
+ $result = $db->query('select value from metadata where name="format"');
+ $resultdata = $result->fetchColumn();
+ $format = isset($resultdata) && $resultdata !== FALSE ? $resultdata : 'png';
+ if ($format == 'jpg')
+ $format = 'jpeg';
+ header('Content-type: image/' . $format);
+ print $data;
+ }
+ }
+ catch (PDOException $e) {
+ header('Content-type: text/plain');
+ print 'Error querying the database: ' . $e->getMessage();
+ }
+}
+/*
+?>
'.htmlspecialchars($params['description']).'
'; +print 'Type: '.$params['type'].', format: '.$params['format'].', version: '.$params['version'].'
'; +if( isset($params['bounds']) ) +print 'Bounds: '.str_replace(',', ', ',$params['bounds']).'
'; +print 'Zoom levels: '.implode(', ', $zooms).'
'; +print 'OpenLayers: new OpenLayers.Layer.OSM("'.htmlspecialchars($params['name']).'", "'.getbaseurl().preg_replace('/\.mbtiles/','',$file).'/${z}/${x}/${y}", {numZoomLevels: '.(end($zooms)+1).', isBaseLayer: '.($params['type']=='baselayer'?'true':'false').'});
'; +print 'TMS: http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/[^\/]+$/','/',$_SERVER['REQUEST_URI']).'1.0.0/'.preg_replace('/\.mbtiles/','',$file).'
'; +} catch( PDOException $e ) {} +} +} +} else { +print 'Error opening script directory.'; +} +} + +function getbaseurl() { +return 'http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/(1.0.0\/)?[^\/]*$/','/',$_SERVER['REQUEST_URI']); +} +*/ +function readparams($db) +{ + $params = array(); + $result = $db->query('select name, value from metadata'); + while ($row = $result->fetch(PDO::FETCH_ASSOC)) { + $params[$row['name']] = $row['value']; + } + return $params; +} + +function readzooms($db) +{ + $zooms = array(); + $result = $db->query('select zoom_level from tiles group by zoom_level order by zoom_level'); + while ($zoom = $result->fetchColumn()) { + $zooms[] = $zoom; + } + return $zooms; +} +?> + diff --git a/tileserver-mbtiles.php b/tileserver-mbtiles.php index 9f8b508..31aa51d 100644 --- a/tileserver-mbtiles.php +++ b/tileserver-mbtiles.php @@ -3,7 +3,7 @@ // Read: https://github.com/klokantech/tileserver-php/issues/1 // TODO: clean the code!!! -if (!is_file($_GET['tileset'].'.mbtiles')) { +if (!is_file($_GET['tileset'])) { header('HTTP/1.0 404 Not Found'); echo "'.htmlspecialchars($params['description']).'
'; - print 'Type: '.$params['type'].', format: '.$params['format'].', version: '.$params['version'].'
'; - if( isset($params['bounds']) ) - print 'Bounds: '.str_replace(',', ', ',$params['bounds']).'
'; - print 'Zoom levels: '.implode(', ', $zooms).'
'; - print 'OpenLayers: new OpenLayers.Layer.OSM("'.htmlspecialchars($params['name']).'", "'.getbaseurl().preg_replace('/\.mbtiles/','',$file).'/${z}/${x}/${y}", {numZoomLevels: '.(end($zooms)+1).', isBaseLayer: '.($params['type']=='baselayer'?'true':'false').'});
'; - print 'TMS: http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/[^\/]+$/','/',$_SERVER['REQUEST_URI']).'1.0.0/'.preg_replace('/\.mbtiles/','',$file).'
'; - } catch( PDOException $e ) {} - } - } - } else { - print 'Error opening script directory.'; - } -} - function getbaseurl() { return 'http://'.$_SERVER['HTTP_HOST'].preg_replace('/\/(1.0.0\/)?[^\/]*$/','/',$_SERVER['REQUEST_URI']); } diff --git a/tileserver-tms.php b/tileserver-tms.php index 7615260..f061122 100644 --- a/tileserver-tms.php +++ b/tileserver-tms.php @@ -26,7 +26,7 @@ if ($layer === ""):