WIP.
This commit is contained in:
parent
fa8fbd06cf
commit
322728cf16
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
namespace StaticMapLite\MapCache;
|
namespace StaticMapLite\MapCache;
|
||||||
|
|
||||||
|
use StaticMapLite\Canvas\CanvasInterface;
|
||||||
use StaticMapLite\Printer\PrinterInterface;
|
use StaticMapLite\Printer\PrinterInterface;
|
||||||
|
|
||||||
class MapCache
|
class MapCache
|
||||||
@ -31,9 +32,10 @@ class MapCache
|
|||||||
|
|
||||||
public function checkMapCache(): bool
|
public function checkMapCache(): bool
|
||||||
{
|
{
|
||||||
|
return false;
|
||||||
$this->mapCacheID = md5($this->serializeParams());
|
$this->mapCacheID = md5($this->serializeParams());
|
||||||
|
|
||||||
$filename = $this->mapCacheIDToFilename();
|
$filename = $this->getFilename();
|
||||||
|
|
||||||
return file_exists($filename);
|
return file_exists($filename);
|
||||||
}
|
}
|
||||||
@ -42,8 +44,8 @@ class MapCache
|
|||||||
{
|
{
|
||||||
return join('&', [
|
return join('&', [
|
||||||
$this->printer->getZoom(),
|
$this->printer->getZoom(),
|
||||||
$this->printer->getCenterLatitude(),
|
$this->printer->getLatitude(),
|
||||||
$this->printer->getCenterLongitude(),
|
$this->printer->getLongitude(),
|
||||||
$this->printer->getWidth(),
|
$this->printer->getWidth(),
|
||||||
$this->printer->getHeight(),
|
$this->printer->getHeight(),
|
||||||
serialize($this->printer->getMarkers()),
|
serialize($this->printer->getMarkers()),
|
||||||
@ -55,11 +57,52 @@ class MapCache
|
|||||||
public function mapCacheIDToFilename()
|
public function mapCacheIDToFilename()
|
||||||
{
|
{
|
||||||
if (!$this->mapCacheFile) {
|
if (!$this->mapCacheFile) {
|
||||||
$this->mapCacheFile = $this->mapCacheBaseDir . "/" . $this->maptype . "/" . $this->zoom . "/cache_" . substr($this->mapCacheID, 0, 2) . "/" . substr($this->mapCacheID, 2, 2) . "/" . substr($this->mapCacheID, 4);
|
$this->mapCacheFile = sprintf(
|
||||||
|
'%s/%s/%s/cache_%/%s/%s',
|
||||||
|
$this->mapCacheBaseDir,
|
||||||
|
$this->printer->getMaptype(),
|
||||||
|
$this->printer->getZoom(),
|
||||||
|
substr($this->mapCacheID, 0, 2),
|
||||||
|
substr($this->mapCacheID, 2, 2),
|
||||||
|
substr($this->mapCacheID, 4)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
$filename = sprintf('%s.%s', $this->mapCacheFile, $this->mapCacheExtension);
|
$filename = sprintf('%s.%s', $this->mapCacheFile, $this->mapCacheExtension);
|
||||||
|
|
||||||
return $filename;
|
return $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function cache(CanvasInterface $canvas)
|
||||||
|
{
|
||||||
|
$this->mkdir_recursive(dirname($this->mapCacheIDToFilename()), 0777);
|
||||||
|
imagepng($canvas->getImage(), $this->mapCacheIDToFilename(), 9);
|
||||||
|
$this->sendHeader();
|
||||||
|
if (file_exists($this->mapCacheIDToFilename())) {
|
||||||
|
return file_get_contents($this->mapCacheIDToFilename());
|
||||||
|
} else {
|
||||||
|
return imagepng($canvas->getImage());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function mkdir_recursive($pathname, $mode)
|
||||||
|
{
|
||||||
|
is_dir(dirname($pathname)) || $this->mkdir_recursive(dirname($pathname), $mode);
|
||||||
|
return is_dir($pathname) || @mkdir($pathname, $mode);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function getFilename(): string
|
||||||
|
{
|
||||||
|
return $this->mapCacheIDToFilename();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function sendHeader()
|
||||||
|
{
|
||||||
|
header('Content-Type: image/png');
|
||||||
|
$expires = 60 * 60 * 24 * 14;
|
||||||
|
header("Pragma: public");
|
||||||
|
header("Cache-Control: maxage=" . $expires);
|
||||||
|
header('Expires: ' . gmdate('D, d M Y H:i:s', time() + $expires) . ' GMT');
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
15
src/MapCache/MapCacheInterface.php
Normal file
15
src/MapCache/MapCacheInterface.php
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Created by PhpStorm.
|
||||||
|
* User: maltehuebner
|
||||||
|
* Date: 14.02.18
|
||||||
|
* Time: 09:31
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace StaticMapLite\MapCache;
|
||||||
|
|
||||||
|
|
||||||
|
interface MapCacheInterface
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
@ -3,10 +3,15 @@
|
|||||||
namespace StaticMapLite\Printer;
|
namespace StaticMapLite\Printer;
|
||||||
|
|
||||||
use StaticMapLite\Canvas\CanvasInterface;
|
use StaticMapLite\Canvas\CanvasInterface;
|
||||||
|
use StaticMapLite\MapCache\MapCache;
|
||||||
|
use StaticMapLite\MapCache\MapCacheInterface;
|
||||||
use StaticMapLite\TileResolver\TileResolverInterface;
|
use StaticMapLite\TileResolver\TileResolverInterface;
|
||||||
|
|
||||||
abstract class AbstractPrinter implements PrinterInterface
|
abstract class AbstractPrinter implements PrinterInterface
|
||||||
{
|
{
|
||||||
|
/** @var MapCacheInterface $mapCache */
|
||||||
|
protected $mapCache;
|
||||||
|
|
||||||
/** @var int $maxWidth */
|
/** @var int $maxWidth */
|
||||||
protected $maxWidth = 1024;
|
protected $maxWidth = 1024;
|
||||||
|
|
||||||
@ -39,14 +44,19 @@ abstract class AbstractPrinter implements PrinterInterface
|
|||||||
/** @var bool $useTileCache */
|
/** @var bool $useTileCache */
|
||||||
protected $useTileCache = true;
|
protected $useTileCache = true;
|
||||||
|
|
||||||
|
/** @var int $zoom */
|
||||||
protected $zoom;
|
protected $zoom;
|
||||||
|
|
||||||
protected $lat;
|
/** @var float $latitude */
|
||||||
|
protected $latitude;
|
||||||
|
|
||||||
protected $lon;
|
/** @var float $longitude */
|
||||||
|
protected $longitude;
|
||||||
|
|
||||||
|
/** @var int $width */
|
||||||
protected $width;
|
protected $width;
|
||||||
|
|
||||||
|
/** @var int $height */
|
||||||
protected $height;
|
protected $height;
|
||||||
|
|
||||||
protected $image;
|
protected $image;
|
||||||
@ -187,26 +197,26 @@ abstract class AbstractPrinter implements PrinterInterface
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLat(): float
|
public function getLatitude(): float
|
||||||
{
|
{
|
||||||
return $this->lat;
|
return $this->latitude;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setLat(float $lat): PrinterInterface
|
public function setLatitude(float $latitude): PrinterInterface
|
||||||
{
|
{
|
||||||
$this->lat = $lat;
|
$this->latitude = $latitude;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getLon(): float
|
public function getLongitude(): float
|
||||||
{
|
{
|
||||||
return $this->lon;
|
return $this->longitude;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setLon(float $lon): PrinterInterface
|
public function setLongitude(float $longitude): PrinterInterface
|
||||||
{
|
{
|
||||||
$this->lon = $lon;
|
$this->longitude = $longitude;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
@ -8,6 +8,7 @@ use StaticMapLite\Element\Marker\AbstractMarker;
|
|||||||
use StaticMapLite\Element\Polyline\Polyline;
|
use StaticMapLite\Element\Polyline\Polyline;
|
||||||
use StaticMapLite\ElementPrinter\Marker\ExtraMarkerPrinter;
|
use StaticMapLite\ElementPrinter\Marker\ExtraMarkerPrinter;
|
||||||
use StaticMapLite\ElementPrinter\Polyline\PolylinePrinter;
|
use StaticMapLite\ElementPrinter\Polyline\PolylinePrinter;
|
||||||
|
use StaticMapLite\MapCache\MapCache;
|
||||||
use StaticMapLite\TileResolver\CachedTileResolver;
|
use StaticMapLite\TileResolver\CachedTileResolver;
|
||||||
use StaticMapLite\Util;
|
use StaticMapLite\Util;
|
||||||
|
|
||||||
@ -16,12 +17,13 @@ class Printer extends AbstractPrinter
|
|||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->zoom = 0;
|
$this->zoom = 0;
|
||||||
$this->lat = 0;
|
$this->latitude = 0;
|
||||||
$this->lon = 0;
|
$this->longitude = 0;
|
||||||
$this->width = 500;
|
$this->width = 500;
|
||||||
$this->height = 350;
|
$this->height = 350;
|
||||||
$this->maptype = $this->tileDefaultSrc;
|
$this->maptype = $this->tileDefaultSrc;
|
||||||
|
|
||||||
|
$this->mapCache = new MapCache($this);
|
||||||
$this->tileResolver = new CachedTileResolver();
|
$this->tileResolver = new CachedTileResolver();
|
||||||
$this->tileResolver->setTileLayerUrl($this->tileSrcUrl[$this->maptype]);
|
$this->tileResolver->setTileLayerUrl($this->tileSrcUrl[$this->maptype]);
|
||||||
}
|
}
|
||||||
@ -42,8 +44,8 @@ class Printer extends AbstractPrinter
|
|||||||
|
|
||||||
public function setCenter(float $latitude, float $longitude): Printer
|
public function setCenter(float $latitude, float $longitude): Printer
|
||||||
{
|
{
|
||||||
$this->lat = $latitude;
|
$this->latitude = $latitude;
|
||||||
$this->lon = $longitude;
|
$this->longitude = $longitude;
|
||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
@ -64,7 +66,7 @@ class Printer extends AbstractPrinter
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setZoom(int $zoom): AbstractPrinter
|
public function setZoom(int $zoom): PrinterInterface
|
||||||
{
|
{
|
||||||
$this->zoom = $zoom;
|
$this->zoom = $zoom;
|
||||||
|
|
||||||
@ -75,7 +77,7 @@ class Printer extends AbstractPrinter
|
|||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function setMapType(string $mapType): AbstractPrinter
|
public function setMapType(string $mapType): PrinterInterface
|
||||||
{
|
{
|
||||||
$this->maptype = $mapType;
|
$this->maptype = $mapType;
|
||||||
|
|
||||||
@ -86,8 +88,8 @@ class Printer extends AbstractPrinter
|
|||||||
|
|
||||||
public function initCoords()
|
public function initCoords()
|
||||||
{
|
{
|
||||||
$this->centerX = Util::lonToTile($this->lon, $this->zoom);
|
$this->centerX = Util::lonToTile($this->longitude, $this->zoom);
|
||||||
$this->centerY = Util::latToTile($this->lat, $this->zoom);
|
$this->centerY = Util::latToTile($this->latitude, $this->zoom);
|
||||||
|
|
||||||
$this->offsetX = floor((floor($this->centerX) - $this->centerX) * $this->tileSize);
|
$this->offsetX = floor((floor($this->centerX) - $this->centerX) * $this->tileSize);
|
||||||
$this->offsetY = floor((floor($this->centerY) - $this->centerY) * $this->tileSize);
|
$this->offsetY = floor((floor($this->centerY) - $this->centerY) * $this->tileSize);
|
||||||
@ -136,32 +138,11 @@ class Printer extends AbstractPrinter
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function checkMapCache()
|
|
||||||
{
|
|
||||||
$this->mapCacheID = md5($this->serializeParams());
|
|
||||||
$filename = $this->mapCacheIDToFilename();
|
|
||||||
if (file_exists($filename)) return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function serializeParams()
|
|
||||||
{
|
|
||||||
return join("&", array($this->zoom, $this->lat, $this->lon, $this->width, $this->height, serialize($this->markers), $this->maptype));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function mapCacheIDToFilename()
|
|
||||||
{
|
|
||||||
if (!$this->mapCacheFile) {
|
|
||||||
$this->mapCacheFile = $this->mapCacheBaseDir . "/" . $this->maptype . "/" . $this->zoom . "/cache_" . substr($this->mapCacheID, 0, 2) . "/" . substr($this->mapCacheID, 2, 2) . "/" . substr($this->mapCacheID, 4);
|
|
||||||
}
|
|
||||||
return $this->mapCacheFile . "." . $this->mapCacheExtension;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function copyrightNotice()
|
public function copyrightNotice()
|
||||||
{
|
{
|
||||||
$logoImg = imagecreatefrompng($this->osmLogo);
|
$logoImg = imagecreatefrompng($this->osmLogo);
|
||||||
imagecopy($this->canvas->getImage(), $logoImg, imagesx($this->canvas->getImage()) - imagesx($logoImg), imagesy($this->canvas->getImage()) - imagesy($logoImg), 0, 0, imagesx($logoImg), imagesy($logoImg));
|
imagecopy($this->canvas->getImage(), $logoImg, imagesx($this->canvas->getImage()) - imagesx($logoImg), imagesy($this->canvas->getImage()) - imagesy($logoImg), 0, 0, imagesx($logoImg), imagesy($logoImg));
|
||||||
}
|
}
|
||||||
|
|
||||||
public function sendHeader()
|
public function sendHeader()
|
||||||
{
|
{
|
||||||
header('Content-Type: image/png');
|
header('Content-Type: image/png');
|
||||||
@ -191,23 +172,16 @@ class Printer extends AbstractPrinter
|
|||||||
|
|
||||||
public function showMap()
|
public function showMap()
|
||||||
{
|
{
|
||||||
if ($this->useMapCache) {
|
if ($this->mapCache) {
|
||||||
// use map cache, so check cache for map
|
// use map cache, so check cache for map
|
||||||
if (!$this->checkMapCache()) {
|
if (!$this->mapCache->checkMapCache()) {
|
||||||
// map is not in cache, needs to be build
|
// map is not in cache, needs to be build
|
||||||
$this->makeMap();
|
$this->makeMap();
|
||||||
$this->mkdir_recursive(dirname($this->mapCacheIDToFilename()), 0777);
|
$this->mapCache->cache($this->canvas);
|
||||||
imagepng($this->canvas->getImage(), $this->mapCacheIDToFilename(), 9);
|
|
||||||
$this->sendHeader();
|
|
||||||
if (file_exists($this->mapCacheIDToFilename())) {
|
|
||||||
return file_get_contents($this->mapCacheIDToFilename());
|
|
||||||
} else {
|
|
||||||
return imagepng($this->canvas->getImage());
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// map is in cache
|
// map is in cache
|
||||||
$this->sendHeader();
|
$this->sendHeader();
|
||||||
return file_get_contents($this->mapCacheIDToFilename());
|
return file_get_contents($this->mapCache->getFilename());
|
||||||
}
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
@ -218,10 +192,4 @@ class Printer extends AbstractPrinter
|
|||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public function mkdir_recursive($pathname, $mode)
|
|
||||||
{
|
|
||||||
is_dir(dirname($pathname)) || $this->mkdir_recursive(dirname($pathname), $mode);
|
|
||||||
return is_dir($pathname) || @mkdir($pathname, $mode);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -37,11 +37,11 @@ interface PrinterInterface
|
|||||||
public function getZoom(): int;
|
public function getZoom(): int;
|
||||||
public function setZoom(int $zoom): PrinterInterface;
|
public function setZoom(int $zoom): PrinterInterface;
|
||||||
|
|
||||||
public function getLat(): float;
|
public function getLatitude(): float;
|
||||||
public function setLat(float $lat): PrinterInterface;
|
public function setLatitude(float $lat): PrinterInterface;
|
||||||
|
|
||||||
public function getLon(): float;
|
public function getLongitude(): float;
|
||||||
public function setLon(float $lon): PrinterInterface;
|
public function setLongitude(float $lon): PrinterInterface;
|
||||||
|
|
||||||
public function getWidth(): int;
|
public function getWidth(): int;
|
||||||
public function setWidth($width): PrinterInterface;
|
public function setWidth($width): PrinterInterface;
|
||||||
|
Loading…
Reference in New Issue
Block a user