1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49: 50: 51: 52: 53: 54: 55: 56: 57: 58: 59: 60: 61: 62: 63: 64: 65: 66: 67: 68: 69: 70: 71: 72: 73: 74: 75: 76: 77: 78: 79: 80: 81: 82: 83: 84: 85: 86: 87: 88: 89: 90: 91: 92: 93: 94: 95: 96: 97: 98: 99: 100: 101: 102: 103: 104: 105: 106: 107: 108: 109: 110: 111: 112: 113: 114: 115: 116: 117: 118: 119: 120: 121: 122: 123: 124: 125: 126: 127: 128: 129: 130: 131: 132: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281: 282: 283: 284: 285: 286: 287: 288: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576: 577: 578: 579: 580: 581: 582: 583: 584: 585: 586: 587: 588: 589: 590: 591: 592: 593: 594: 595: 596: 597: 598: 599: 600: 601: 602: 603: 604: 605: 606: 607: 608: 609: 610: 611: 612: 613: 614: 615: 616: 617: 618: 619: 620: 621: 622: 623: 624: 625: 626: 627: 628: 629: 630: 631: 632: 633: 634: 635: 636: 637: 638: 639: 640: 641: 642: 643: 644: 645: 646: 647: 648: 649: 650: 651: 652: 653: 654: 655: 656: 657: 658: 659: 660: 661: 662: 663: 664: 665: 666: 667: 668: 669: 670: 671: 672: 673: 674: 675: 676: 677: 678: 679: 680: 681: 682: 683: 684: 685: 686: 687: 688: 689: 690: 691: 692: 693: 694: 695: 696: 697: 698: 699: 700: 701: 702: 703: 704: 705: 706: 707: 708: 709: 710: 711: 712: 713: 714: 715: 716: 717: 718: 719: 720: 721: 722: 723: 724: 725: 726: 727: 728: 729: 730: 731: 732: 733: 734: 735: 736: 737: 738: 739: 740: 741: 742: 743: 744: 745: 746: 747: 748: 749: 750: 751: 752: 753: 754: 755: 756: 757: 758: 759: 760: 761: 762: 763: 764: 765: 766: 767: 768: 769: 770: 771: 772: 773: 774: 775: 776: 777: 778: 779: 780: 781: 782: 783: 784: 785: 786: 787: 788: 789: 790: 791: 792: 793: 794: 795: 796: 797: 798: 799: 800: 801: 802: 803: 804: 805: 806: 807: 808: 809: 810: 811: 812: 813: 814: 815: 816: 817: 818: 819: 820: 821: 822: 823: 824: 825: 826: 827: 828: 829: 830: 831: 832: 833: 834: 835: 836: 837: 838: 839: 840: 841: 842: 843: 844: 845: 846: 847: 848: 849: 850: 851: 852: 853: 854: 855: 856: 857: 858: 859: 860: 861: 862: 863: 864: 865: 866: 867: 868: 869: 870: 871: 872: 873: 874: 875: 876: 877: 878: 879: 880: 881: 882: 883: 884: 885: 886: 887: 888: 889: 890: 891: 892: 893: 894: 895: 896: 897: 898: 899: 900: 901: 902: 903: 904: 905: 906: 907: 908: 909: 910: 911: 912: 913: 914: 915: 916: 917: 918: 919: 920: 921: 922: 923: 924: 925: 926: 927: 928: 929: 930: 931: 932: 933: 934: 935: 936: 937: 938: 939: 940: 941: 942: 943: 944: 945: 946: 947: 948: 949: 950: 951: 952: 953: 954: 955: 956: 957: 958: 959: 960: 961: 962: 963: 964: 965: 966: 967: 968: 969: 970: 971: 972: 973: 974: 975: 976: 977: 978: 979: 980: 981: 982: 983: 984: 985: 986: 987: 988: 989: 990: 991: 992: 993: 994: 995: 996: 997: 998: 999: 1000: 1001: 1002: 1003: 1004: 1005: 1006: 1007: 1008: 1009: 1010: 1011: 1012: 1013: 1014: 1015: 1016: 1017: 1018: 1019: 1020: 1021: 1022: 1023: 1024: 1025: 1026: 1027: 1028: 1029: 1030: 1031: 1032: 1033: 1034: 1035: 1036: 1037: 1038: 1039: 1040: 1041: 1042: 1043: 1044: 1045: 1046: 1047: 1048: 1049: 1050:
<?php
$plugin_is_filter = 5 | THEME_PLUGIN;
$plugin_description = gettext("A Zenphoto plugin for displaying OpenStreetMap based maps using LeafletJS for images or images from albums with embeded geodata.");
$plugin_author = "Malte Müller (acrylian), Fred Sondaar (fretzl), gjr, Vincent Bourganel (vincent3569)";
$plugin_notice = gettext('Privacy note: This plugin uses external third party sources');
$option_interface = 'openStreetMapOptions';
$plugin_category = gettext('Misc');
zp_register_filter('theme_head', 'openStreetMap::scripts');
class openStreetMapOptions {
function __construct() {
renameOption('osmap_controlpos', 'osmap_zoomcontrolpos');
renameOption('osmap_maptiles', 'osmap_defaultlayer');
setOptionDefault('osmap_width', '100%');
setOptionDefault('osmap_height', '300px');
setOptionDefault('osmap_zoom', 4);
setOptionDefault('osmap_minzoom', 2);
setOptionDefault('osmap_maxzoom', 18);
setOptionDefault('osmap_zoomcontrolpos', 'topleft');
setOptionDefault('osmap_defaultlayer', 'OpenStreetMap.Mapnik');
setOptionDefault('osmap_clusterradius', 40);
setOptionDefault('osmap_markerpopup', 1);
setOptionDefault('osmap_markerpopup_title', 1);
setOptionDefault('osmap_markerpopup_desc', 1);
setOptionDefault('osmap_markerpopup_thumb', 1);
setOptionDefault('osmap_showlayerscontrol', 0);
setOptionDefault('osmap_layerscontrolpos', 'topright');
$layerslist = openStreetMap::getLayersList();
foreach ($layerslist as $layer_dbname) {
setOptionDefault($layer_dbname, 0);
}
setOptionDefault('osmap_showscale', 1);
setOptionDefault('osmap_showalbummarkers', 0);
setOptionDefault('osmap_showminimap', 0);
setOptionDefault('osmap_minimap_width', 100);
setOptionDefault('osmap_minimap_height', 100);
setOptionDefault('osmap_minimap_zoom', -5);
setOptionDefault('osmap_cluster_showcoverage_on_hover', 0);
if (class_exists('cacheManager')) {
cacheManager::deleteCacheSizes('openstreetmap');
cacheManager::addCacheSize('openstreetmap', 150, NULL, NULL, NULL, NULL, NULL, NULL, true, NULL, NULL, NULL);
}
}
function getOptionsSupported() {
$providers = array_combine(openStreetMap::getTileProviders(), openStreetMap::getTileProviders());
$layerslist = openStreetMap::getLayersList();
$options = array(
gettext('Map dimensions—width') => array(
'key' => 'osmap_width',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 1,
'desc' => gettext("Width of the map including the unit name e.g 100% (default for responsive map), 100px or 100em.")),
gettext('Map dimensions—height') => array(
'key' => 'osmap_height',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 2,
'desc' => gettext("Height of the map including the unit name e.g 100% (default for responsive map), 100px or 100em.")),
gettext('Map zoom') => array(
'key' => 'osmap_zoom',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 3,
'desc' => gettext("Default zoom level.")),
gettext('Map minimum zoom') => array(
'key' => 'osmap_minzoom',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 5,
'desc' => gettext("Default minimum zoom level possible.")),
gettext('Map maximum zoom') => array(
'key' => 'osmap_maxzoom',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 6,
'desc' => gettext("Default maximum zoom level possible. If no value is defined, use the maximum zoom level of the map used (may be different for each map).")),
gettext('Default layer') => array(
'key' => 'osmap_defaultlayer',
'type' => OPTION_TYPE_SELECTOR,
'order' => 7,
'selections' => $providers,
'desc' => gettext('The default map tile provider to use. Only free providers are included.'
. ' Some providers (Here, Mapbox, Thunderforest, Geoportail) require access credentials and registration.'
. ' More info on <a href="https://github.com/leaflet-extras/leaflet-providers">leaflet-providers</a>')),
gettext('Zoom controls position') => array(
'key' => 'osmap_zoomcontrolpos',
'type' => OPTION_TYPE_SELECTOR,
'order' => 8,
'selections' => array(
gettext('Top left') => 'topleft',
gettext('Top right') => 'topright',
gettext('Bottom left') => 'bottomleft',
gettext('Bottom right') => 'bottomright'
),
'desc' => gettext('Position of the zoom controls')),
gettext('Cluster radius') => array(
'key' => 'osmap_clusterradius',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 9,
'desc' => gettext("The radius when marker clusters should be used.")),
gettext('Show cluster coverage on hover') => array(
'key' => 'osmap_cluster_showcoverage_on_hover',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 10,
'desc' => gettext("Enable if you want to the bounds of a marker cluster on hover.")),
gettext('Marker popups') => array(
'key' => 'osmap_markerpopup',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 11,
'desc' => gettext("Enable this if you wish info popups on the map markers. Only for album context or custom geodata.")),
gettext('Marker popups with thumbs') => array(
'key' => 'osmap_markerpopup_thumb',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 12,
'desc' => gettext("Enable if you want to show thumb of images in the marker popups. Only for album context.")),
gettext('Marker popups with title') => array(
'key' => 'osmap_markerpopup_title',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 13,
'desc' => gettext("Enable if you want to show title of images in the marker popups. Only for album context.")),
gettext('Marker popups with description') => array(
'key' => 'osmap_markerpopup_desc',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 14,
'desc' => gettext("Enable if you want to show desc of images in the marker popups. Only for album context.")),
gettext('Show layers controls') => array(
'key' => 'osmap_showlayerscontrol',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 14.2,
'desc' => gettext("Enable if you want to show layers controls with selected layers list below.")),
gettext('Layers list') => array(
'key' => 'osmap_layerslist',
'type' => OPTION_TYPE_CHECKBOX_UL,
'order' => 14.4,
'checkboxes' => $layerslist,
'desc' => gettext("Choose layers list to show in layers controls. No need to select the default layer again, otherwise it will be de-duplicated.")),
gettext('Layers controls position') => array(
'key' => 'osmap_layerscontrolpos',
'type' => OPTION_TYPE_SELECTOR,
'order' => 14.6,
'selections' => array(
gettext('Top left') => 'topleft',
gettext('Top right') => 'topright',
gettext('Bottom left') => 'bottomleft',
gettext('Bottom right') => 'bottomright'
),
'desc' => gettext('Position of the layers controls')),
gettext('Show scale') => array(
'key' => 'osmap_showscale',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 15,
'desc' => gettext("Enable if you want to show scale overlay (kilometers and miles).")),
gettext('Show cursor position') => array(
'key' => 'osmap_showcursorpos',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 16,
'desc' => gettext("Enable if you want to show the coordinates if moving the cursor over the map.")),
gettext('Show album markers') => array(
'key' => 'osmap_showalbummarkers',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 17,
'desc' => gettext("Enable if you want to show the map on the single image page not only the marker of the current image but all markers from the album. The current position will be highlighted.")),
gettext('Mini map') => array(
'key' => 'osmap_showminimap',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 18,
'desc' => gettext("Enable if you want to show an overview mini map in the lower right corner.")),
gettext('Mini map: width') => array(
'key' => 'osmap_minimap_width',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 19,
'desc' => gettext("Pixel width")),
gettext('Mini map: height') => array(
'key' => 'osmap_minimap_height',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 20,
'desc' => gettext("Pixel height")),
gettext('Mini map: Zoom level') => array(
'key' => 'osmap_minimap_zoom',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 21,
'desc' => gettext("The offset applied to the zoom in the minimap compared to the zoom of the main map. Can be positive or negative, defaults to -5.")),
gettext('HERE - App id') => array(
'key' => 'osmap_here_appid',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 22,
'desc' => ''),
gettext('HERE - App code') => array(
'key' => 'osmap_here_appcode',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 23,
'desc' => ''),
gettext('Mapbox - Access token') => array(
'key' => 'osmap_mapbox_accesstoken',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 24,
'desc' => ''),
gettext('Thunderforest - ApiKey') => array(
'key' => 'osmap_thunderforest_apikey',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 25,
'desc' => ''),
gettext('GeoportailFrance - ApiKey') => array(
'key' => 'osmap_geoportailfrance_apikey',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 26,
'desc' => ''),
);
return $options;
}
}
class openStreetMap {
var $geodata = NULL;
var $geodatajs = NULL;
var $fitbounds = NULL;
var $center = NULL;
var $class = '';
var $mode = NULL;
var $showalbummarkers = false;
var $mapcenter = NULL;
var $mapnumber = '';
var $width = NULL;
var $height = NULL;
var $zoom = NULL;
var $minzoom = NULL;
var $maxzoom = NULL;
var $defaultlayer = NULL;
var $layerslist = NULL;
var $layer = NULL;
var $clusterradius = NULL;
var $markerpopup = false;
var $markerpopup_title = false;
var $markerpopup_desc = false;
var $markerpopup_thumb = false;
var $showmarkers = true;
var $showminimap = false;
var $minimap_width = NULL;
var $minimap_height = NULL;
var $minimap_zoom = NULL;
var $zoomcontrolpos = NULL;
var $showscale = NULL;
var $showcursorpos = NULL;
var $obj = NULL;
var $tileproviders = NULL;
function __construct($geodata = NULL, $obj = NULL) {
global $_zp_gallery_page, $_zp_current_album, $_zp_current_image;
$this->showalbummarkers = getOption('osmap_showalbummarkers');
$this->tileproviders = self::getTileProviders();
if (is_object($obj)) {
if (isImageClass($obj)) {
$this->obj = $obj;
$this->mode = 'single';
} else if (isAlbumClass($obj)) {
$this->obj = $obj;
$this->mode = 'cluster';
}
} else {
if (is_array($geodata)) {
if (count($geodata) < 1) {
$this->mode = 'single';
} else {
$this->mode = 'cluster';
}
$this->geodata = $geodata;
} else {
switch ($_zp_gallery_page) {
case 'image.php':
if ($this->showalbummarkers) {
$this->obj = $_zp_current_album;
$this->mode = 'single-cluster';
} else {
$this->obj = $_zp_current_image;
$this->mode = 'single';
}
break;
case 'album.php':
case 'favorites.php':
$this->obj = $_zp_current_album;
$this->mode = 'cluster';
$this->markerpopup_title = getOption('osmap_markerpopup_title');
$this->markerpopup_desc = getOption('osmap_markerpopup_desc');
$this->markerpopup_thumb = getOption('osmap_markerpopup_thumb');
case 'search.php':
$this->mode = 'cluster';
$this->markerpopup_title = getOption('osmap_markerpopup_title');
$this->markerpopup_desc = getOption('osmap_markerpopup_desc');
$this->markerpopup_thumb = getOption('osmap_markerpopup_thumb');
break;
}
}
}
$this->center = $this->getCenter();
$this->fitbounds = $this->getFitBounds();
$this->geodata = $this->getGeoData();
$this->width = getOption('osmap_width');
$this->height = getOption('osmap_height');
$this->zoom = getOption('osmap_zoom');
$this->minzoom = getOption('osmap_minzoom');
$this->maxzoom = getOption('osmap_maxzoom');
$this->zoomcontrolpos = getOption('osmap_zoomcontrolpos');
$this->defaultlayer = $this->setMapTiles(getOption('osmap_defaultlayer'));
$this->clusterradius = getOption('osmap_clusterradius');
$this->cluster_showcoverage_on_hover = getOption('osmap_cluster_showcoverage_on_hover');
$this->markerpopup = getOption('osmap_markerpopup');
$this->markerpopup_title = getOption('osmap_markerpopup_title');
$this->markerpopup_desc = getOption('osmap_markerpopup_desc');
$this->markerpopup_thumb = getOption('osmap_markerpopup_thumb');
$this->showlayerscontrol = getOption('osmap_showlayerscontrol');
$selectedlayerslist = array();
$layerslist = self::getLayersList();
if ($layerslist) {
foreach ($layerslist as $layer => $layer_dbname) {
if (getOption($layer_dbname)) {
$selectedlayerslist[$layer] = $layer;
}
}
}
unset($selectedlayerslist[array_search($this->defaultlayer, $selectedlayerslist)]);
$this->layerslist = $selectedlayerslist;
$this->layerscontrolpos = getOption('osmap_layerscontrolpos');
$this->showscale = getOption('osmap_showscale');
$this->showcursorpos = getOption('osmap_showcursorpos');
$this->showminimap = getOption('osmap_showminimap');
$this->minimap_width = getOption('osmap_minimap_width');
$this->minimap_height = getOption('osmap_minimap_height');
$this->minimap_zoom = getOption('osmap_minimap_zoom');
}
static function scripts() {
?>
<link rel="stylesheet" type="text/css" href="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/leaflet.css" />
<link rel="stylesheet" type="text/css" href="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/MarkerCluster.css" />
<link rel="stylesheet" type="text/css" href="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/MarkerCluster.Default.css" />
<link rel="stylesheet" type="text/css" href="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/openstreetmap.css" />
<?php
if (getOption('osmap_showcursorpos')) {
?>
<link rel="stylesheet" type="text/css" href="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/L.Control.MousePosition.css" />
<?php
}
if (getOption('osmap_showminimap')) {
?>
<link rel="stylesheet" type="text/css" href="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/Control.MiniMap.min.css" />
<?php
}
?>
<script src="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/leaflet.js"></script>
<script src="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/leaflet.markercluster.js"></script>
<script src="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/leaflet-providers.js"></script>
<?php
if (getOption('osmap_showcursorpos')) {
?>
<script src="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/L.Control.MousePosition.js"></script>
<?php
}
if (getOption('osmap_showminimap')) {
?>
<script src="<?php echo FULLWEBPATH . '/' . ZENFOLDER . '/' . PLUGIN_FOLDER; ?>/openstreetmap/Control.MiniMap.min.js"></script>
<?php
}
}
function getImageGeodata($image) {
global $_zp_current_image;
$result = array();
$gps = $image->getGeodata();
if ($gps) {
$thumb = "<a href='" . $image->getLink() . "'><img src='" . $image->getCustomImage(150, NULL, NULL, NULL, NULL, NULL, NULL, true) . "' alt='' /></a>";
$current = 0;
if ($this->mode == 'single-cluster' && isset($_zp_current_image) && ($image->filename == $_zp_current_image->filename && $image->getAlbumname() == $_zp_current_image->getAlbumname())) {
$current = 1;
}
$result = array(
'lat' => $gps['lat'],
'long' => $gps['long'],
'title' => shortenContent($image->getTitle(), 50, '...') . '<br />',
'desc' => shortenContent($image->getDesc(), 100, '...'),
'thumb' => $thumb,
'current' => $current
);
}
return $result;
}
function getAlbumGeodata($album) {
$result = array();
$images = $album->getImages(0, 0, null, null, false);
foreach ($images as $an_image) {
$image = newImage($album, $an_image);
$imggeodata = $this->getImageGeodata($image);
if (!empty($imggeodata)) {
$result[] = $imggeodata;
}
}
return $result;
}
function getGeoData() {
global $_zp_current_image, $_zp_current_album;
$geodata = array();
if (!is_null($this->geodata)) {
return $this->geodata;
}
switch ($this->mode) {
case 'single':
$imggeodata = $this->getImageGeodata($this->obj);
if (!empty($imggeodata)) {
$geodata = array($imggeodata);
}
break;
case 'single-cluster':
case 'cluster':
$albgeodata = $this->getAlbumGeodata($this->obj);
if (!empty($albgeodata)) {
$geodata = $albgeodata;
}
break;
}
if (empty($geodata)) {
return NULL;
} else {
return $this->geodata = $geodata;
}
}
function getGeoDataJS() {
if (!is_null($this->geodatajs)) {
return $this->geodatajs;
}
$geodata = $this->getGeoData();
if (!empty($geodata)) {
$count = -1;
$js_geodata = '';
foreach ($geodata as $geo) {
$count++;
$js_geodata .= ' geodata[' . $count . '] = {
lat : "' . $geo['lat'] . '",
long : "' . $geo['long'] . '",
title : "' . js_encode(shortenContent($geo['title'], 50, '...')) . '",
desc : "' . js_encode(shortenContent($geo['desc'], 100, '...')) . '",
thumb : "' . $geo['thumb'] . '",
current : "' . $geo['current'] . '"
};';
}
return $this->geodatajs = $js_geodata;
}
}
function getFitBounds() {
if (!is_null($this->fitbounds)) {
return $this->fitbounds;
}
$geodata = $this->getGeoData();
if (!empty($geodata)) {
$geocount = count($geodata);
$bounds = '';
$count = '';
foreach ($geodata as $g) {
$count++;
$bounds .= '[' . $g['lat'] . ',' . $g['long'] . ']';
if ($count < $geocount) {
$bounds .= ',';
}
}
$this->fitbounds = $bounds;
}
return $this->fitbounds;
}
function getCenter() {
if (!is_null($this->center)) {
return $this->center;
}
$geodata = $this->getGeoData();
if (!empty($geodata)) {
switch ($this->mode) {
case 'single':
$this->center = array($geodata[0]['lat'], $geodata[0]['long']);
break;
case 'single-cluster':
foreach ($geodata as $geo) {
if ($geo['current'] == 1) {
$this->center = array($geo['lat'], $geo['long']);
break;
}
}
break;
case 'cluster':
$this->center = array($geodata[0]['lat'], $geodata[0]['long']);
break;
}
} else {
$this->center = '';
}
if(empty($this->center[0]) || empty($this->center[1])) {
$this->center = '';
}
return $this->center;
}
function getTileLayerJS() {
$maptile = explode('.', $this->layer);
switch ($maptile[0]) {
case 'MapBox':
return "L.tileLayer.provider('" . $maptile[0] . "', {"
. "id: '" . strtolower($this->layer) . "', "
. "accessToken: '" . getOption('osmap_mapbox_accesstoken') . "'"
. "})";
case 'HERE':
return "L.tileLayer.provider('" . $this->layer . "', {"
. "app_id: '" . getOption('osmap_here_appid') . "', "
. "app_code: '" . getOption('osmap_here_appcode') . "'"
. "})";
case 'Thunderforest':
return "L.tileLayer.provider('" . $this->layer . "', {"
. "apikey: '" . getOption('osmap_thunderforest_apikey') . "'"
. "})";
case 'GeoportailFrance':
return "L.tileLayer.provider('" . $this->layer . "', {"
. "apikey: '" . getOption('osmap_geoportailfrance_apikey') . "'"
. "})";
default:
return "L.tileLayer.provider('" . $this->layer . "')";
}
}
function printMap() {
$class = '';
if (!empty($this->class)) {
$class = ' class="' . $this->class . '"';
}
$geodataJS = $this->getGeoDataJS();
if (!empty($geodataJS) && !empty($this->center)) {
?>
<div id="osm_map<?php echo $this->mapnumber; ?>"<?php echo $class; ?> style="width:<?php echo $this->width; ?>; height:<?php echo $this->height; ?>;"></div>
<script>
var geodata = new Array();
<?php echo $geodataJS; ?>
var map = L.map('osm_map<?php echo $this->mapnumber; ?>', {
center: [<?php echo $this->center[0]; ?>, <?php echo $this->center[1]; ?>],
zoom: <?php echo $this->zoom; ?>,
zoomControl: false,
minZoom: <?php echo $this->minzoom; ?>,
<?php if (!empty($this->maxzoom)) { ?>
maxZoom: <?php echo $this->maxzoom; ?>
<?php } ?>
});
<?php
if (!$this->showlayerscontrol) {
$this->layer = $this->defaultlayer;
echo $this->getTileLayerJS() . '.addTo(map);';
} else {
$defaultlayer = $this->defaultlayer;
$layerslist = $this->layerslist;
$layerslist[$defaultlayer] = $defaultlayer;
ksort($layerslist);
$baselayers = "";
foreach ($layerslist as $layer) {
if ($layer == $defaultlayer) {
$baselayers = $baselayers . "'" . $defaultlayer . "': defaultLayer,\n";
} else {
$this->layer = $layer;
$baselayers = $baselayers . "'" . $layer . "': " . $this->getTileLayerJS() . ",\n";
}
}
?>
var defaultLayer = <?php $this->layer = $this->defaultlayer; echo $this->getTileLayerJS(); ?>.addTo(map);
var baseLayers = {
<?php echo $baselayers; ?>
};
L.control.layers(baseLayers, null, {position: '<?php echo $this->layerscontrolpos; ?>'}).addTo(map);
<?php
}
if ($this->mode == 'cluster' && $this->fitbounds) {
?>
map.fitBounds([<?php echo $this->fitbounds; ?>]);
<?php
}
if ($this->showminimap) {
?>
var osmUrl = 'https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png';
var osm2 = new L.TileLayer(osmUrl);
var miniMap = new L.Control.MiniMap(osm2, {
toggleDisplay: true,
zoomLevelOffset: <?php echo $this->minimap_zoom; ?>,
width: <?php echo $this->minimap_width; ?>,
height: <?php echo $this->minimap_height; ?>
}).addTo(map);
<?php
}
if ($this->showscale) {
?>
L.control.scale().addTo(map);
<?php } ?>
L.control.zoom({position: '<?php echo $this->zoomcontrolpos; ?>'}).addTo(map);
<?php if ($this->showcursorpos) { ?>
L.control.mousePosition().addTo(map);
<?php
}
if ($this->showmarkers) {
switch ($this->mode) {
case 'single':
?>
var marker = L.marker([geodata[0]['lat'], geodata[0]['long']]).addTo(map);
<?php
break;
case 'single-cluster':
case 'cluster':
?>
var markers_cluster = new L.MarkerClusterGroup({
maxClusterRadius: <?php echo $this->clusterradius; ?>,
showCoverageOnHover: <?php echo $this->cluster_showcoverage_on_hover; ?>
});
$.each(geodata, function (index, value) {
var text = '';
<?php if ($this->markerpopup) { ?>
<?php if ($this->markerpopup_title) { ?>
text = value.title;
<?php } ?>
<?php if ($this->markerpopup_thumb) { ?>
text += value.thumb;
<?php } ?>
<?php if ($this->markerpopup_desc) { ?>
text += value.desc;
<?php } ?>
<?php } ?>
if (text === '') {
markers_cluster.addLayer(L.marker([value.lat, value.long]));
} else {
markers_cluster.addLayer(L.marker([value.lat, value.long]).bindPopup(text));
}
});
map.addLayer(markers_cluster);
<?php
break;
}
}
?>
</script>
<?php
}
}
static function getLayersList() {
$providers = openStreetMap::getTileProviders();
foreach ($providers as $provider) {
$provider_dbname = 'osmap_layer_' . str_replace(".", "_", $provider);
$layers_list[$provider] = $provider_dbname;
}
return $layers_list;
}
function setMapTiles($tileprovider = null) {
if (in_array($tileprovider, $this->tileproviders)) {
return $tileprovider;
} else {
return $this->tileproviders[0];
}
}
static function getTileProviders() {
return array(
'OpenStreetMap.Mapnik',
'OpenStreetMap.DE',
'OpenStreetMap.France',
'OpenStreetMap.HOT',
'OpenTopoMap',
'Thunderforest.OpenCycleMap',
'Thunderforest.TransportDark',
'Thunderforest.SpinalMap',
'Thunderforest.Landscape',
'Hydda.Full',
'MapBox.streets',
'MapBox.light',
'MapBox.dark',
'MapBox.satellite',
'MapBox.streets-satellite',
'MapBox.wheatpaste',
'MapBox.streets-basic',
'MapBox.comic',
'MapBox.outdoors',
'MapBox.run-bike-hike',
'MapBox.pencil',
'MapBox.pirates',
'MapBox.emerald',
'MapBox.high-contrast',
'Stamen.Watercolor',
'Stamen.Terrain',
'Stamen.TerrainBackground',
'Stamen.TopOSMRelief',
'Stamen.TopOSMFeatures',
'Esri.WorldStreetMap',
'Esri.DeLorme',
'Esri.WorldTopoMap',
'Esri.WorldImagery',
'Esri.WorldTerrain',
'Esri.WorldShadedRelief',
'Esri.WorldPhysical',
'Esri.OceanBasemap',
'Esri.NatGeoWorldMap',
'Esri.WorldGrayCanvas',
'HERE.normalDay',
'HERE.normalDayCustom',
'HERE.normalDayGrey',
'HERE.normalDayMobile',
'HERE.normalDayGreyMobile',
'HERE.normalDayTransit',
'HERE.normalDayTransitMobile',
'HERE.normalNight',
'HERE.normalNightMobile',
'HERE.normalNightGrey',
'HERE.normalNightGreyMobile',
'HERE.basicMap',
'HERE.mapLabels',
'HERE.trafficFlow',
'HERE.carnavDayGrey',
'HERE.hybridDay',
'HERE.hybridDayMobile',
'HERE.pedestrianDay',
'HERE.pedestrianNight',
'HERE.satelliteDay',
'HERE.terrainDay',
'HERE.terrainDayMobile',
'FreeMapSK',
'MtbMap',
'CartoDB.Positron',
'CartoDB.PositronNoLabels',
'CartoDB.PositronOnlyLabels',
'CartoDB.DarkMatter',
'CartoDB.DarkMatterNoLabels',
'CartoDB.DarkMatterOnlyLabels',
'HikeBike.HikeBike',
'HikeBike.HillShading',
'BasemapAT.basemap',
'BasemapAT.grau',
'BasemapAT.highdpi',
'BasemapAT.orthofoto',
'NLS',
'GeoportailFrance.ignMaps',
'GeoportailFrance.orthos',
);
}
}
function printOpenStreetMap($geodata = NULL, $width = NULL, $height = NULL, $mapcenter = NULL, $zoom = NULL, $fitbounds = NULL, $class = '', $mapnumber = NULL, $obj = NULL, $minimap = false) {
if (!empty($class)) {
$class = ' class="' . $class . '"';
}
$map = new openStreetMap($geodata, $obj);
if (!is_null($width)) {
$map->width = $width;
}
if (!is_null($height)) {
$map->height = $height;
}
if (!is_null($mapcenter)) {
$map->center = $mapcenter;
}
if (!is_null($zoom)) {
$map->zoom = $zoom;
}
if (!is_null($fitbounds)) {
$map->fitbounds = $fitbounds;
}
if (!is_null($class)) {
$map->class = $class;
}
if (!is_null($mapnumber)) {
$map->mapnumber = $mapnumber;
}
if ($minimap) {
$map->showminimap = true;
}
$map->printMap();
}