Spot v2: Project Management

This commit is contained in:
2019-01-26 10:13:06 +01:00
parent b92c6fb5ed
commit 591a2c5bad
25 changed files with 1649 additions and 9510 deletions

View File

@@ -1,103 +1,109 @@
<?php
class Cacher extends PhpObject
{
const CACHE_FOLDER = 'cache/';
const DATA_RETENTION = 60 * 60 * 24 * 90; //3 months
private $sPattern;
//Params
private $sId;
private $iX;
private $iY;
private $iZ;
private $sToken;
private $asDomains;
public function __construct($sPattern, $sId='')
{
parent::__construct(__CLASS__, Settings::DEBUG);
$this->setPattern($sPattern);
$this->setId($sId);
$this->iX = 0;
$this->iY = 0;
$this->iZ = 0;
$this->sToken = '';
$this->asDomains = array();
}
public function setId($sId) {
$this->sId = $sId;
}
public function setPattern($sPattern) {
$this->sPattern = $sPattern;
}
public function setToken($sToken) {
$this->sToken = $sToken;
}
public function setDomains($asDomains) {
$this->asDomains = $asDomains;
}
public function setGeoPos($iX, $iY, $iZ) {
$this->iX = $iX;
$this->iY = $iY;
$this->iZ = $iZ;
}
public function pushTile($iX, $iY, $iZ) {
$this->setGeoPos($iX, $iY, $iZ);
$sTilePath = $this->getFilePath();
if(!$this->isFileAvailable($sTilePath)) {
$oCurl = curl_init();
curl_setopt($oCurl, CURLOPT_URL, $this->getUrl());
curl_setopt($oCurl, CURLOPT_HEADER, false);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($oCurl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($oCurl, CURLOPT_REFERER, 'http://spot.lutran.fr');
$sContent = curl_exec($oCurl);
curl_close($oCurl);
file_put_contents($sTilePath, $sContent);
}
else $sContent = file_get_contents($sTilePath);
header('Content-type: '.mime_content_type($sTilePath));
return $sContent;
}
public function getUrl() {
$asParams = $this->getUrlParams();
$sUrl = $this->sPattern;
foreach($asParams as $sParam=>$sValue) {
$sUrl = str_replace('{'.$sParam.'}', $sValue, $sUrl);
}
return $sUrl;
}
private function isFileAvailable($sTilePath) {
if(!file_exists($sTilePath)) return false;
else return (time() - filemtime($sTilePath) < self::DATA_RETENTION);
}
private function getFilePath() {
$asParams = $this->getUrlParams();
return self::CACHE_FOLDER.'/'.$asParams['id'].'_'.$asParams['x'].'_'.$asParams['y'].'_'.$asParams['z'].'.tile';
}
private function getUrlParams() {
return array(
'id' => $this->sId,
'x' => $this->iX,
'y' => $this->iY,
'z' => $this->iZ,
'token' => $this->sToken,
's' => empty($this->asDomains)?'':$this->asDomains[array_rand($this->asDomains)]
);
}
}
<?php
class Cacher extends PhpObject
{
const CACHE_FOLDER = 'cache/';
const DATA_RETENTION = 60 * 60 * 24 * 90; //3 months
private $sPattern;
//Params
private $sId;
private $iX;
private $iY;
private $iZ;
private $sToken;
private $asDomains;
private $sReferer;
public function __construct($sPattern, $sId='')
{
parent::__construct(__CLASS__, Settings::DEBUG);
$this->setPattern($sPattern);
$this->setId($sId);
$this->iX = 0;
$this->iY = 0;
$this->iZ = 0;
$this->sToken = '';
$this->asDomains = array();
$this->sReferer = '';
}
public function setId($sId) {
$this->sId = $sId;
}
public function setPattern($sPattern) {
$this->sPattern = $sPattern;
}
public function setToken($sToken) {
$this->sToken = $sToken;
}
public function setDomains($asDomains) {
$this->asDomains = $asDomains;
}
public function setReferer($sReferer) {
$this->sReferer = $sReferer;
}
public function setGeoPos($iX, $iY, $iZ) {
$this->iX = $iX;
$this->iY = $iY;
$this->iZ = $iZ;
}
public function pushTile($iX, $iY, $iZ) {
$this->setGeoPos($iX, $iY, $iZ);
$sTilePath = $this->getFilePath();
if(!$this->isFileAvailable($sTilePath)) {
$oCurl = curl_init();
curl_setopt($oCurl, CURLOPT_URL, $this->getUrl());
curl_setopt($oCurl, CURLOPT_HEADER, false);
curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($oCurl, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($oCurl, CURLOPT_REFERER, $this->sReferer);
$sContent = curl_exec($oCurl);
curl_close($oCurl);
file_put_contents($sTilePath, $sContent);
}
else $sContent = file_get_contents($sTilePath);
header('Content-type: '.mime_content_type($sTilePath));
return $sContent;
}
public function getUrl() {
$asParams = $this->getUrlParams();
$sUrl = $this->sPattern;
foreach($asParams as $sParam=>$sValue) {
$sUrl = str_replace('{'.$sParam.'}', $sValue, $sUrl);
}
return $sUrl;
}
private function isFileAvailable($sTilePath) {
if(!file_exists($sTilePath)) return false;
else return (time() - filemtime($sTilePath) < self::DATA_RETENTION);
}
private function getFilePath() {
$asParams = $this->getUrlParams();
return self::CACHE_FOLDER.'/'.$asParams['id'].'_'.$asParams['x'].'_'.$asParams['y'].'_'.$asParams['z'].'.tile';
}
private function getUrlParams() {
return array(
'id' => $this->sId,
'x' => $this->iX,
'y' => $this->iY,
'z' => $this->iZ,
'token' => $this->sToken,
's' => empty($this->asDomains)?'':$this->asDomains[array_rand($this->asDomains)]
);
}
}

111
inc/project.php Normal file
View File

@@ -0,0 +1,111 @@
<?php
class Project extends PhpObject {
//Spot Mode
const MODE_PREVIZ = 'P';
const MODE_BLOG = 'B';
const MODE_HISTO = 'H';
const MODES = array('previz'=>self::MODE_PREVIZ, 'blog'=>self::MODE_BLOG, 'histo'=>self::MODE_HISTO);
//Folders
const GEO_FOLDER = 'geo/';
//DB Tables
const PROJ_TABLE = 'projects';
/**
* Database Handle
* @var Db
*/
private $oDb;
private $iProjectId;
private $sMode;
private $sName;
private $sCodeName;
private $asActive;
private $sGeo;
public function __construct(Db &$oDb) {
parent::__construct(__CLASS__, Settings::DEBUG);
$this->oDb = $oDb;
}
public function setProjectId($iProjectId=0) {
if($iProjectId > 0) {
$this->iProjectId = $iProjectId;
}
else {
/**
* Project 1 [-----------------]
* Project 2 [---------------------------]
* Project 3 [-----------]
* Selected Project [-------Project 1-------][------------Project 2-------------][---------------Project 3------------------
* Mode --P--][--------B--------][--P--][-----------B---------------][---P---][-----B-----][---------H----------
*/
$sQuery = "SELECT MAX(id_project) FROM projects WHERE active_to = (SELECT MIN(active_to) FROM projects WHERE active_to > NOW() OR active_to = (SELECT MAX(active_to) FROM projects))";
$asResult = $this->oDb->getArrayQuery($sQuery, true);
$this->iProjectId = array_shift($asResult);
}
$this->setProjectInfo();
}
public function getMode() {
return $this->sMode;
}
public function getProjectId() {
return $this->iProjectId;
}
public function getProjectCodeName() {
return $this->sCodeName;
}
public function getActivePeriod($sFromTo='') {
return ($sFromTo=='')?$this->asActive:$this->asActive[$sFromTo];
}
public function getProjects($iProjectId=0) {
$asInfo = array(
'select'=> array(
Db::getId(self::PROJ_TABLE)." AS id",
'codename',
'name',
'active_from',
'active_to',
"IF(NOW() BETWEEN active_from AND active_to, 1, IF(NOW() < active_from, 0, 2)) AS mode",
'geofile',
'timezone'
),
'from' => self::PROJ_TABLE
);
if($iProjectId > 0) $asInfo['constraint'] = array(Db::getId(self::PROJ_TABLE)=>$iProjectId);
$asProjects = $this->oDb->selectRows($asInfo, 'codename');
foreach($asProjects as &$asProject) {
switch($asProject['mode']) {
case 0: $asProject['mode'] = self::MODE_PREVIZ; break;
case 1: $asProject['mode'] = self::MODE_BLOG; break;
case 2: $asProject['mode'] = self::MODE_HISTO; break;
}
$sGeoFilePath = self::GEO_FOLDER.$asProject['geofile'];
$asProject['geofile'] = file_exists($sGeoFilePath)?$asProject['geofile'].'?'.date("YmdHis", filemtime($sGeoFilePath)):$asProject['geofile'];
}
return $asProjects;
}
private function setProjectInfo() {
$asResult = $this->getProjects($this->iProjectId);
$asProject = reset($asResult);
$this->sMode = $asProject['mode'];
$this->asActive = array('from'=>$asProject['active_from'], 'to'=>$asProject['active_to']);
$this->sCodeName = key($asResult);
$this->sName = $asProject['name'];
$this->sGeo = array('file'=>$asProject['geofile'], 'timezone'=>$asProject['timezone']);
}
}

View File

@@ -2,10 +2,6 @@
class Spot extends Main
{
//Spot Mode
const MODE_HISTO = 'histo';
const MODE_BLOG = 'blog';
//Spot feed
const FEED_HOOK = 'https://api.findmespot.com/spot-main-web/consumer/rest-api/2.0/public/feed/';
const FEED_TYPE_XML = '/message.xml';
@@ -25,19 +21,27 @@ class Spot extends Main
const FEED_CHUNK_SIZE = 15;
/**
* Active Project
* @var Project
*/
private $oProject;
public function __construct($oClassManagement, $sProcessPage)
{
parent::__construct($oClassManagement, $sProcessPage);
$oClassManagement->incClass('cacher', true);
$asClasses = array(
array('name'=>'project', 'project'=>true),
array('name'=>'cacher', 'project'=>true)
);
parent::__construct($oClassManagement, $sProcessPage, $asClasses);
$this->oProject = new Project($this->oDb);
}
protected function install()
{
//Install DB
$this->oDb->install();
//Add feed
//$this->oDb->insertRow(self::FEED_TABLE, array('ref_feed_id'=>Settings::FEED_ID));
}
protected function getSqlOptions()
@@ -46,36 +50,44 @@ class Spot extends Main
(
'tables' => array
(
self::MSG_TABLE => array('ref_msg_id', Db::getId(self::FEED_TABLE), 'type', 'latitude', 'longitude', 'timestamp', 'unix_timestamp', 'content', 'battery_state'),
self::FEED_TABLE => array('ref_feed_id', Db::getId(self::SPOT_TABLE), 'name', 'description', 'status'),
self::SPOT_TABLE => array('ref_spot_id', 'name', 'model'),
self::POST_TABLE => array('name', 'content')
self::MSG_TABLE => array('ref_msg_id', Db::getId(self::FEED_TABLE), 'type', 'latitude', 'longitude', 'timestamp', 'unix_timestamp', 'content', 'battery_state'),
self::FEED_TABLE => array('ref_feed_id', Db::getId(self::SPOT_TABLE), Db::getId(Project::PROJ_TABLE), 'name', 'description', 'status', 'last_update'),
self::SPOT_TABLE => array('ref_spot_id', 'name', 'model'),
Project::PROJ_TABLE => array('name', 'codename', 'active_from', 'active_to', 'geofile', 'timezone'),
self::POST_TABLE => array(Db::getId(Project::PROJ_TABLE), 'name', 'content', 'timestamp')
),
'types' => array
(
'ref_msg_id' => "INT",
'type' => "VARCHAR(20)",
'latitude' => "DECIMAL(7,5)",
'longitude' => "DECIMAL(8,5)",
'timestamp' => "DATETIME",
'unix_timestamp'=> "INT",
'content' => "LONGTEXT",
'battery_state' => "VARCHAR(10)",
'ref_spot_id' => "VARCHAR(10)",
'name' => "VARCHAR(100)",
'model' => "VARCHAR(20)",
'ref_feed_id' => "VARCHAR(40)",
'description' => "VARCHAR(100)",
'status' => "VARCHAR(10)",
'ref_msg_id' => "INT",
'type' => "VARCHAR(20)",
'latitude' => "DECIMAL(7,5)",
'longitude' => "DECIMAL(8,5)",
'timestamp' => "DATETIME",
'unix_timestamp'=> "INT",
'content' => "LONGTEXT",
'battery_state' => "VARCHAR(10)",
'ref_spot_id' => "VARCHAR(10)",
'name' => "VARCHAR(100)",
'codename' => "VARCHAR(100)",
'model' => "VARCHAR(20)",
'ref_feed_id' => "VARCHAR(40)",
'description' => "VARCHAR(100)",
'status' => "VARCHAR(10)",
'active_from' => "DATETIME",
'active_to' => "DATETIME",
'geofile' => "VARCHAR(50)",
'timezone' => "VARCHAR(100)",
'last_update' => "DATETIME"
),
'constraints' => array
(
self::MSG_TABLE => "UNIQUE KEY `uni_ref_msg_id` (`ref_msg_id`)",
self::FEED_TABLE => "UNIQUE KEY `uni_ref_feed_id` (`ref_feed_id`)",
self::SPOT_TABLE => "UNIQUE KEY `uni_ref_spot_id` (`ref_spot_id`)",
self::MSG_TABLE => "INDEX(`ref_msg_id`)",
self::FEED_TABLE => "INDEX(`ref_feed_id`)",
self::SPOT_TABLE => "INDEX(`ref_spot_id`)",
self::MSG_TABLE => "UNIQUE KEY `uni_ref_msg_id` (`ref_msg_id`)",
self::FEED_TABLE => "UNIQUE KEY `uni_ref_feed_id` (`ref_feed_id`)",
self::SPOT_TABLE => "UNIQUE KEY `uni_ref_spot_id` (`ref_spot_id`)",
self::MSG_TABLE => "INDEX(`ref_msg_id`)",
self::FEED_TABLE => "INDEX(`ref_feed_id`)",
self::SPOT_TABLE => "INDEX(`ref_spot_id`)",
Project::PROJ_TABLE => "UNIQUE KEY `uni_proj_name` (`codename`)",
),
'cascading_delete' => array
(
@@ -89,10 +101,14 @@ class Spot extends Main
return parent::getMainPage(
array(
'vars' => array(
'feed_id' => Settings::FEED_ID,
'chunk_size'=> self::FEED_CHUNK_SIZE,
'mode' => Settings::MODE,
'mapbox_key'=> Settings::MAPBOX_KEY
'chunk_size' => self::FEED_CHUNK_SIZE,
'mapbox_key' => Settings::MAPBOX_KEY,
'default_project_codename' => $this->oProject->getProjectCodeName(),
'projects' => $this->oProject->getProjects()
),
'consts' => array(
'modes' => Project::MODES,
'geo_folder'=> Project::GEO_FOLDER
)
),
'index',
@@ -100,16 +116,22 @@ class Spot extends Main
);
}
/* Managing projects */
public function setProjectId($iProjectId=0) {
$this->oProject->setProjectId($iProjectId);
}
/* Getting & Storing messages */
private function getFeed($sRefFeedId=Settings::FEED_ID)
private function getFeed($sRefFeedId)
{
$sUrl = self::FEED_HOOK.$sRefFeedId.self::FEED_TYPE_JSON;
$sContent = file_get_contents($sUrl);
return json_decode($sContent, true);
}
private function updateFeed($sRefFeedId=Settings::FEED_ID)
private function updateFeed($sRefFeedId)
{
$asData = $this->getFeed($sRefFeedId);
$asMsgs = $asData['response']['feedMessageResponse']['messages'];
@@ -122,14 +144,15 @@ class Spot extends Main
$asSpotInfo = array('ref_spot_id'=>$asFirstMsg['messengerId'], 'name'=>$asFirstMsg['messengerName'], 'model'=>$asFirstMsg['modelId']);
$iSpotId = $this->oDb->insertUpdateRow(self::SPOT_TABLE, $asSpotInfo, array('ref_spot_id'));
//Update Feed Info
//Update Feed Info and last update date
$asFeedInfo = array(
'ref_feed_id' => $sRefFeedId,
Db::getId(self::SPOT_TABLE) => $iSpotId,
'name' => $asFeed['name'],
'description' => $asFeed['description'],
'status' => $asFeed['status'],
'led' => date(Db::MYSQL_TIMESTAMP) //update with current time
'ref_feed_id' => $sRefFeedId,
Db::getId(self::SPOT_TABLE) => $iSpotId,
Db::getId(Project::PROJ_TABLE) => $this->oProject->getProjectId(),
'name' => $asFeed['name'],
'description' => $asFeed['description'],
'status' => $asFeed['status'],
'last_update' => date(Db::TIMESTAMP_FORMAT)
);
$iFeedId = $this->oDb->insertUpdateRow(self::FEED_TABLE, $asFeedInfo, array('ref_feed_id'));
@@ -142,7 +165,7 @@ class Spot extends Main
'type' => $asMsg['messageType'],
'latitude' => $asMsg['latitude'],
'longitude' => $asMsg['longitude'],
'timestamp' => date(Db::MYSQL_TIMESTAMP, strtotime($asMsg['dateTime'])), //Stored in Local Time
'timestamp' => date(Db::TIMESTAMP_FORMAT, strtotime($asMsg['dateTime'])), //Stored in Local Time
'unix_timestamp' => $asMsg['unixTime'], //Stored in UNIX time
'content' => $asMsg['messageContent'],
'battery_state' => $asMsg['batteryState']
@@ -152,7 +175,7 @@ class Spot extends Main
}
}
public function getMessages($sRefFeedId=Settings::FEED_ID)
public function getMessages()
{
/* Adding another point to test
$test = $this->oDb->selectRow(self::MSG_TABLE, 1);
@@ -162,12 +185,7 @@ class Spot extends Main
$test['longitude'] = '172.1936';
$this->oDb->insertUpdateRow(self::MSG_TABLE, $test, array('ref_msg_id')); */
//Check last message & update feed if necessary (max once a day)
$sLastMsg = $this->oDb->selectValue(self::FEED_TABLE, 'led', array('ref_feed_id'=>$sRefFeedId));
if(Settings::MODE!=self::MODE_HISTO && mb_substr($sLastMsg, 0, 10) != date('Y-m-d')) $this->updateFeed($sRefFeedId);
//Extract messages
$asMessages = array_values($this->getSpotMessages());
$asMessages = $this->getSpotMessages();
$bSuccess = !empty($asMessages);
$sDesc = $bSuccess?'':self::NO_DATA;
@@ -202,22 +220,46 @@ class Spot extends Main
private function getSpotMessages()
{
$asInfo = array('from'=>self::MSG_TABLE, 'orderBy'=>array('timestamp'=>'ASC'));
if(Settings::MODE==self::MODE_HISTO) {
$asInfo['constraint'] = array('timestamp'=>Settings::HISTO_SPAN);
$asInfo['constOpe'] = array('timestamp'=>"BETWEEN");
//Get Feed IDs
$asFeeds = $this->oDb->selectRows(array(
'select' => array(Db::getId(self::FEED_TABLE), 'ref_feed_id', 'last_update'),
'from' => self::FEED_TABLE,
'constraint'=> array(Db::getId(Project::PROJ_TABLE) => $this->oProject->getProjectId()))
);
//Update on Blog Mode and not updated already today
$asAllFeedMessages = array();
foreach($asFeeds as $asFeed) {
//Feed updated once a day in Blog Mode
if($this->oProject->getMode() == Project::MODE_BLOG && mb_substr($asFeed['last_update'], 0, 10) != date('Y-m-d')) {
$this->updateFeed($asFeed['ref_feed_id']);
}
$asInfo = array(
'select' => array('id_message', 'ref_msg_id', 'type', 'latitude', 'longitude', 'timestamp', 'unix_timestamp'),
'from' => self::MSG_TABLE,
'constraint'=> array(
Db::getId(Spot::FEED_TABLE) => $asFeed[Db::getId(self::FEED_TABLE)],
'timestamp' => $this->oProject->getActivePeriod()),
'constOpe' => array(
Db::getId(Spot::FEED_TABLE) => "=",
'timestamp' => "BETWEEN"),
'orderBy' => array('timestamp'=>'ASC'));
$asMessages = $this->oDb->selectRows($asInfo);
foreach($asMessages as $asMessage)
{
$asMessage['unix_timestamp'] = (int) $asMessage['unix_timestamp'];
$asMessage['latitude'] = floatval($asMessage['latitude']);
$asMessage['longitude'] = floatval($asMessage['longitude']);
$asMessage['relative_time'] = Toolbox::getDateTimeDesc($asMessage['unix_timestamp']);
$asMessage['formatted_time'] = date(self::FORMAT_TIME, $asMessage['unix_timestamp']);
$asAllFeedMessages[] = $asMessage;
}
}
$asMessages = $this->oDb->selectRows($asInfo);
foreach($asMessages as $iKey=>$asMessage)
{
$asMessages[$iKey]['unix_timestamp'] = (int) $asMessages[$iKey]['unix_timestamp'];
$asMessages[$iKey]['latitude'] = floatval($asMessages[$iKey]['latitude']);
$asMessages[$iKey]['longitude'] = floatval($asMessages[$iKey]['longitude']);
$asMessages[$iKey]['relative_time'] = Toolbox::getDateTimeDesc($asMessages[$iKey]['unix_timestamp']);
$asMessages[$iKey]['formatted_time'] = date(self::FORMAT_TIME, $asMessages[$iKey]['unix_timestamp']);
}
return $asMessages;
return $asAllFeedMessages;
}
private function getPictures()
@@ -234,9 +276,8 @@ class Spot extends Main
//Get/Create thumbnail
$sThumbnailPath = self::getPicThumbnail($sPicPath);
//Filter on valid time interval (Histo mode only)
if( Settings::MODE != self::MODE_HISTO ||
$iPicTimeStamp >= strtotime(Settings::HISTO_SPAN['from']) && $iPicTimeStamp <= strtotime(Settings::HISTO_SPAN['to'])) {
//Filter on valid time interval
if($iPicTimeStamp >= strtotime($this->oProject->getActivePeriod('from')) && $iPicTimeStamp <= strtotime($this->oProject->getActivePeriod('to'))) {
$asPics[] = array(
'path' => $sPicPath,
@@ -253,15 +294,19 @@ class Spot extends Main
private function getPosts()
{
$asInfo = array('from'=>self::POST_TABLE);
if(Settings::MODE==self::MODE_HISTO) {
$asInfo['constraint'] = array('led'=>Settings::HISTO_SPAN);
$asInfo['constOpe'] = array('led'=>"BETWEEN");
$asInfo = array(
'from' => self::POST_TABLE,
'constraint'=> array(Db::getId(Project::PROJ_TABLE) => $this->oProject->getProjectId()),
'constOpe' => array(Db::getId(Project::PROJ_TABLE) => "=")
);
if($this->oProject->getMode()==Project::MODE_HISTO) {
$asInfo['constraint']['timestamp'] = $this->oProject->getActivePeriod();
$asInfo['constOpe']['timestamp'] = "BETWEEN";
}
$asPosts = $this->oDb->selectRows($asInfo);
foreach($asPosts as &$asPost) {
$iUnixTimeStamp = strtotime($asPost['led']);
$iUnixTimeStamp = strtotime($asPost['timestamp']);
$asPost['unix_timestamp'] = $iUnixTimeStamp;
$asPost['relative_time'] = Toolbox::getDateTimeDesc($iUnixTimeStamp);
$asPost['formatted_time'] = date(self::FORMAT_TIME, $iUnixTimeStamp);
@@ -320,7 +365,12 @@ class Spot extends Main
public function addPost($sName, $sPost)
{
$asData = array('name'=>mb_strtolower(trim($sName)), 'content'=>trim($sPost));
$asData = array(
Db::getId(Project::PROJ_TABLE) => $this->oProject->getProjectId(),
'name' => mb_strtolower(trim($sName)),
'content' => trim($sPost),
'timestamp' => date(Db::TIMESTAMP_FORMAT)
);
$iPostId = $this->oDb->insertRow(self::POST_TABLE, $asData);
return self::getJsonResult(($iPostId > 0), '');
}
@@ -337,6 +387,7 @@ class Spot extends Main
{
if(isset($_SERVER['HTTP_REFERER']) && $_SERVER['HTTP_REFERER'] == $this->asContext['serv_name']) {
$asDomains = array();
$sReferer = 'http://spot.lutran.fr';
switch($sMapId) {
case 'mapbox.satellite':
case 'mapbox.streets':
@@ -348,10 +399,19 @@ class Spot extends Main
$sToken = Settings::LINZ_KEY;
$asDomains = array('a', 'b', 'c', 'd');
break;
case 'ign.es':
$sPattern = 'http://www.ign.es/wmts/mapa-raster?request=getTile&format=image/png&layer=MTN&TileMatrixSet=GoogleMapsCompatible&TileMatrix={z}&TileCol={x}&TileRow={y}';
break;
case 'ign.fr':
$sPattern = 'https://wxs.ign.fr/{token}/geoportail/wmts?LAYER=GEOGRAPHICALGRIDSYSTEMS.MAPS&EXCEPTIONS=text/xml&FORMAT=image/jpeg&SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&STYLE=normal&TILEMATRIXSET=PM&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}';
$sToken = Settings::IGN_FR_KEY;
$sReferer = 'https://www.visugpx.com/yfJDwfuTlf';
break;
}
$oCacher = new Cacher($sPattern, $sMapId);
$oCacher->setToken($sToken);
$oCacher->setDomains($asDomains);
$oCacher->setReferer($sReferer);
return $oCacher->pushTile($iX, $iY, $iZ);
}