xref: /plugin/openlayersmap/helper/staticmap.php (revision 57f8d5bb7862220bc86367226edbe0c27b689270)
1628e43ccSMark Prins<?php
2628e43ccSMark Prins/*
3*57f8d5bbSMark Prins * Copyright (c) 2008-2021 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.
16*57f8d5bbSMark Prins *
17*57f8d5bbSMark Prins * @phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps
18628e43ccSMark Prins */
19*57f8d5bbSMark Prins
20628e43ccSMark Prins/**
21cc74a83cSMark Prins * DokuWiki Plugin openlayersmap (staticmap Helper Component).
22cc74a83cSMark Prins * This provides the interface to generate a static map based on predefined OSM layers.
23628e43ccSMark Prins *
24628e43ccSMark Prins * @author Mark Prins
25628e43ccSMark Prins */
26628e43ccSMark Prinsclass helper_plugin_openlayersmap_staticmap extends DokuWiki_Plugin {
276eb3157eSMark Prins    /** maximum width of the resulting image. */
28628e43ccSMark Prins    private $maxWidth = 1024;
296eb3157eSMark Prins    /** maximum heigth of the resulting image. */
30628e43ccSMark Prins    private $maxHeight = 1024;
31cc74a83cSMark Prins
326eb3157eSMark Prins    /**
336eb3157eSMark Prins     * Provide metadata of the public methods of this class.
346eb3157eSMark Prins     *
356eb3157eSMark Prins     * @return array Information to all provided methods.
366eb3157eSMark Prins     */
37*57f8d5bbSMark Prins    public function getMethods(): array {
38628e43ccSMark Prins        $result   = array();
39628e43ccSMark Prins        $result[] = array(
40628e43ccSMark Prins            'name'   => 'getMap',
41628e43ccSMark Prins            'desc'   => 'returns url to the image',
42628e43ccSMark Prins            'params' => array(
43d2f4772aSMark Prins                'lat'     => 'float',
44d2f4772aSMark Prins                'lon'     => 'float',
45628e43ccSMark Prins                'zoom'    => 'integer',
46628e43ccSMark Prins                'size'    => 'string',
47628e43ccSMark Prins                'maptype' => 'string',
48628e43ccSMark Prins                'markers' => 'string',
49628e43ccSMark Prins                'gpx'     => 'string',
506914b920SMark Prins                'kml'     => 'string',
51d2f4772aSMark Prins                'geojson' => 'string',
52*57f8d5bbSMark Prins                'apikey'  => 'string'
53*57f8d5bbSMark Prins            ),
54628e43ccSMark Prins            'return' => array('image' => 'string'),
55628e43ccSMark Prins        );
56628e43ccSMark Prins        return $result;
57628e43ccSMark Prins    }
58628e43ccSMark Prins
59628e43ccSMark Prins    /**
60628e43ccSMark Prins     * Create the map.
61628e43ccSMark Prins     *
62*57f8d5bbSMark Prins     * @param float  $lat     the latitude of the map's center, eg. 40.714728
63*57f8d5bbSMark Prins     * @param float  $lon     the longitude of the map's center, eg -73.998672
64*57f8d5bbSMark Prins     * @param int    $zoom    the zoom level in the tile cache, eg. 14
65*57f8d5bbSMark Prins     * @param string $size    the size in WxH px, eg. 512x512
66*57f8d5bbSMark Prins     * @param string $maptype the maptype, eg. cycle
67*57f8d5bbSMark Prins     * @param array  $markers associative array of markers, array('lat'=>$lat,'lon'=>$lon,'type'=>$iconStyle),
68*57f8d5bbSMark Prins     *                        eg. array('lat'=>40.702147,'lon'=>-74.015794,'type'=>lightblue1);
69*57f8d5bbSMark Prins     * @param string $gpx     media link
70*57f8d5bbSMark Prins     * @param string $kml     media link
71*57f8d5bbSMark Prins     * @param string $geojson media link
72*57f8d5bbSMark Prins     * @param string $apikey  optional API key eg. for Thunderforest maps
73628e43ccSMark Prins     *
74*57f8d5bbSMark Prins     * @return string
75628e43ccSMark Prins     */
76*57f8d5bbSMark Prins    public function getMap(
77*57f8d5bbSMark Prins        float $lat,
78*57f8d5bbSMark Prins        float $lon,
79*57f8d5bbSMark Prins        int $zoom,
80*57f8d5bbSMark Prins        string $size,
81*57f8d5bbSMark Prins        string $maptype,
82*57f8d5bbSMark Prins        array $markers,
83*57f8d5bbSMark Prins        string $gpx,
84*57f8d5bbSMark Prins        string $kml,
85*57f8d5bbSMark Prins        string $geojson,
86*57f8d5bbSMark Prins        string $apikey = ''
87*57f8d5bbSMark Prins    ): string {
88628e43ccSMark Prins        global $conf;
896eb3157eSMark Prins        // dbglog($markers,'helper_plugin_openlayersmap_staticmap::getMap: markers :');
90628e43ccSMark Prins
91628e43ccSMark Prins        // normalize zoom
92*57f8d5bbSMark Prins        $zoom = $zoom ?: 0;
93*57f8d5bbSMark Prins        if($zoom > 18) {
94*57f8d5bbSMark Prins            $zoom = 18;
95*57f8d5bbSMark Prins        }
96628e43ccSMark Prins        // normalize WxH
97c81a89cdSMark Prins        list($width, $height) = explode('x', $size);
98*57f8d5bbSMark Prins        $width = (int) $width;
99*57f8d5bbSMark Prins        if($width > $this->maxWidth) {
100*57f8d5bbSMark Prins            $width = $this->maxWidth;
101*57f8d5bbSMark Prins        }
102*57f8d5bbSMark Prins        $height = (int) $height;
103*57f8d5bbSMark Prins        if($height > $this->maxHeight) {
104*57f8d5bbSMark Prins            $height = $this->maxHeight;
105*57f8d5bbSMark Prins        }
1066eb3157eSMark Prins
107e61425c7SMark Prins        // cleanup/validate gpx/kml
108e61425c7SMark Prins        $kml = $this->mediaIdToPath($kml);
1096eb3157eSMark Prins        // dbglog($kml,'helper_plugin_openlayersmap_staticmap::getMap: kml file:');
110e61425c7SMark Prins        $gpx = $this->mediaIdToPath($gpx);
1116eb3157eSMark Prins        // dbglog($gpx,'helper_plugin_openlayersmap_staticmap::getMap: gpx file:');
1126914b920SMark Prins        $geojson = $this->mediaIdToPath($geojson);
1136c6bb022SMark Prins
114628e43ccSMark Prins        // create map
115*57f8d5bbSMark Prins        require_once DOKU_PLUGIN.'openlayersmap/StaticMap.php';
116*57f8d5bbSMark Prins        $map = new StaticMap(
117*57f8d5bbSMark Prins            $lat, $lon, $zoom, $width, $height, $maptype,
1186914b920SMark Prins            $markers, $gpx, $kml, $geojson, $conf['mediadir'], $conf['cachedir'],
1195c603532SMark Prins            $this->getConf('autoZoomMap'),
120d2f4772aSMark Prins            $apikey
121628e43ccSMark Prins        );
1222d11d700SMark Prins
123628e43ccSMark Prins        // return the media id url
124*57f8d5bbSMark Prins        // $mediaId = str_replace('/', ':', $map->getMap());
125fc16f3cdSMark Prins        // if($this->startsWith($mediaId,':')) {
126fc16f3cdSMark Prins        //     $mediaId = substr($mediaId, 1);
127fc16f3cdSMark Prins        // }
128*57f8d5bbSMark Prins        // return $mediaId;
129*57f8d5bbSMark 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
135*57f8d5bbSMark Prins     * @return string the path to the file
136cc74a83cSMark Prins     */
137*57f8d5bbSMark Prins    private function mediaIdToPath(string $id): string {
138e61425c7SMark Prins        global $conf;
139e61425c7SMark Prins        if(empty($id)) {
140e61425c7SMark Prins            return "";
141e61425c7SMark Prins        }
142*57f8d5bbSMark Prins        $id = str_replace(array("[[", "]]"), "", $id);
143*57f8d5bbSMark 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