1628e43ccSMark Prins<?php 2628e43ccSMark Prins/* 3*d2f1674eSMark Prins * Copyright (c) 2008-2022 Mark C. Prins <mprins@users.sf.net> 4628e43ccSMark Prins * 5628e43ccSMark Prins * Permission to use, copy, modify, and distribute this software for any 6628e43ccSMark Prins * purpose with or without fee is hereby granted, provided that the above 7628e43ccSMark Prins * copyright notice and this permission notice appear in all copies. 8628e43ccSMark Prins * 9628e43ccSMark Prins * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10628e43ccSMark Prins * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11628e43ccSMark Prins * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12628e43ccSMark Prins * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13628e43ccSMark Prins * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14628e43ccSMark Prins * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15628e43ccSMark Prins * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1657f8d5bbSMark Prins * 1757f8d5bbSMark Prins * @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps 18628e43ccSMark Prins */ 1957f8d5bbSMark Prins 20*d2f1674eSMark Prinsuse dokuwiki\plugin\openlayersmap\StaticMap; 21*d2f1674eSMark Prins 22628e43ccSMark Prins/** 23cc74a83cSMark Prins * DokuWiki Plugin openlayersmap (staticmap Helper Component). 24cc74a83cSMark Prins * This provides the interface to generate a static map based on predefined OSM layers. 25628e43ccSMark Prins * 26628e43ccSMark Prins * @author Mark Prins 27628e43ccSMark Prins */ 28628e43ccSMark Prinsclass helper_plugin_openlayersmap_staticmap extends DokuWiki_Plugin { 296eb3157eSMark Prins /** maximum width of the resulting image. */ 30628e43ccSMark Prins private $maxWidth = 1024; 316eb3157eSMark Prins /** maximum heigth of the resulting image. */ 32628e43ccSMark Prins private $maxHeight = 1024; 33cc74a83cSMark Prins 346eb3157eSMark Prins /** 356eb3157eSMark Prins * Provide metadata of the public methods of this class. 366eb3157eSMark Prins * 376eb3157eSMark Prins * @return array Information to all provided methods. 386eb3157eSMark Prins */ 3957f8d5bbSMark Prins public function getMethods(): array { 40628e43ccSMark Prins $result = array(); 41628e43ccSMark Prins $result[] = array( 42628e43ccSMark Prins 'name' => 'getMap', 43628e43ccSMark Prins 'desc' => 'returns url to the image', 44628e43ccSMark Prins 'params' => array( 45d2f4772aSMark Prins 'lat' => 'float', 46d2f4772aSMark Prins 'lon' => 'float', 47628e43ccSMark Prins 'zoom' => 'integer', 48628e43ccSMark Prins 'size' => 'string', 49628e43ccSMark Prins 'maptype' => 'string', 50628e43ccSMark Prins 'markers' => 'string', 51628e43ccSMark Prins 'gpx' => 'string', 526914b920SMark Prins 'kml' => 'string', 53d2f4772aSMark Prins 'geojson' => 'string', 5457f8d5bbSMark Prins 'apikey' => 'string' 5557f8d5bbSMark Prins ), 56628e43ccSMark Prins 'return' => array('image' => 'string'), 57628e43ccSMark Prins ); 58628e43ccSMark Prins return $result; 59628e43ccSMark Prins } 60628e43ccSMark Prins 61628e43ccSMark Prins /** 62628e43ccSMark Prins * Create the map. 63628e43ccSMark Prins * 6457f8d5bbSMark Prins * @param float $lat the latitude of the map's center, eg. 40.714728 6557f8d5bbSMark Prins * @param float $lon the longitude of the map's center, eg -73.998672 6657f8d5bbSMark Prins * @param int $zoom the zoom level in the tile cache, eg. 14 6757f8d5bbSMark Prins * @param string $size the size in WxH px, eg. 512x512 6857f8d5bbSMark Prins * @param string $maptype the maptype, eg. cycle 6957f8d5bbSMark Prins * @param array $markers associative array of markers, array('lat'=>$lat,'lon'=>$lon,'type'=>$iconStyle), 7057f8d5bbSMark Prins * eg. array('lat'=>40.702147,'lon'=>-74.015794,'type'=>lightblue1); 7157f8d5bbSMark Prins * @param string $gpx media link 7257f8d5bbSMark Prins * @param string $kml media link 7357f8d5bbSMark Prins * @param string $geojson media link 7457f8d5bbSMark Prins * @param string $apikey optional API key eg. for Thunderforest maps 75628e43ccSMark Prins * 7657f8d5bbSMark Prins * @return string 77628e43ccSMark Prins */ 7857f8d5bbSMark Prins public function getMap( 7957f8d5bbSMark Prins float $lat, 8057f8d5bbSMark Prins float $lon, 8157f8d5bbSMark Prins int $zoom, 8257f8d5bbSMark Prins string $size, 8357f8d5bbSMark Prins string $maptype, 8457f8d5bbSMark Prins array $markers, 8557f8d5bbSMark Prins string $gpx, 8657f8d5bbSMark Prins string $kml, 8757f8d5bbSMark Prins string $geojson, 8857f8d5bbSMark Prins string $apikey = '' 8957f8d5bbSMark Prins ): string { 90628e43ccSMark Prins global $conf; 916eb3157eSMark Prins // dbglog($markers,'helper_plugin_openlayersmap_staticmap::getMap: markers :'); 92628e43ccSMark Prins 93628e43ccSMark Prins // normalize zoom 9457f8d5bbSMark Prins $zoom = $zoom ?: 0; 9557f8d5bbSMark Prins if($zoom > 18) { 9657f8d5bbSMark Prins $zoom = 18; 9757f8d5bbSMark Prins } 98628e43ccSMark Prins // normalize WxH 99c81a89cdSMark Prins list($width, $height) = explode('x', $size); 10057f8d5bbSMark Prins $width = (int) $width; 10157f8d5bbSMark Prins if($width > $this->maxWidth) { 10257f8d5bbSMark Prins $width = $this->maxWidth; 10357f8d5bbSMark Prins } 10457f8d5bbSMark Prins $height = (int) $height; 10557f8d5bbSMark Prins if($height > $this->maxHeight) { 10657f8d5bbSMark Prins $height = $this->maxHeight; 10757f8d5bbSMark Prins } 1086eb3157eSMark Prins 109e61425c7SMark Prins // cleanup/validate gpx/kml 110e61425c7SMark Prins $kml = $this->mediaIdToPath($kml); 1116eb3157eSMark Prins // dbglog($kml,'helper_plugin_openlayersmap_staticmap::getMap: kml file:'); 112e61425c7SMark Prins $gpx = $this->mediaIdToPath($gpx); 1136eb3157eSMark Prins // dbglog($gpx,'helper_plugin_openlayersmap_staticmap::getMap: gpx file:'); 1146914b920SMark Prins $geojson = $this->mediaIdToPath($geojson); 1156c6bb022SMark Prins 116628e43ccSMark Prins // create map 11757f8d5bbSMark Prins $map = new StaticMap( 11857f8d5bbSMark Prins $lat, $lon, $zoom, $width, $height, $maptype, 1196914b920SMark Prins $markers, $gpx, $kml, $geojson, $conf['mediadir'], $conf['cachedir'], 120b63742deSMark Prins $this->getConf('autoZoomMap'), $apikey 121628e43ccSMark Prins ); 1222d11d700SMark Prins 123628e43ccSMark Prins // return the media id url 12457f8d5bbSMark Prins // $mediaId = str_replace('/', ':', $map->getMap()); 125fc16f3cdSMark Prins // if($this->startsWith($mediaId,':')) { 126fc16f3cdSMark Prins // $mediaId = substr($mediaId, 1); 127fc16f3cdSMark Prins // } 12857f8d5bbSMark Prins // return $mediaId; 12957f8d5bbSMark Prins return str_replace('/', ':', $map->getMap()); 130e61425c7SMark Prins } 131e61425c7SMark Prins 132cc74a83cSMark Prins /** 133cc74a83cSMark Prins * Constructs the path to a file. 134cc74a83cSMark Prins * @param string $id the DW media id 13557f8d5bbSMark Prins * @return string the path to the file 136cc74a83cSMark Prins */ 13757f8d5bbSMark Prins private function mediaIdToPath(string $id): string { 138e61425c7SMark Prins global $conf; 139e61425c7SMark Prins if(empty($id)) { 140e61425c7SMark Prins return ""; 141e61425c7SMark Prins } 14257f8d5bbSMark Prins $id = str_replace(array("[[", "]]"), "", $id); 14357f8d5bbSMark Prins if((strpos($id, ':') === 0)) { 144e61425c7SMark Prins $id = substr($id, 1); 145e61425c7SMark Prins } 146e61425c7SMark Prins $id = str_replace(":", "/", $id); 147e61425c7SMark Prins return $conf['mediadir'] . '/' . $id; 148e61425c7SMark Prins } 149628e43ccSMark Prins} 150