MediaWiki:Kartographer.js

From OpenStreetMap Wiki
Jump to navigation Jump to search

Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
/**********************************************************************
 * The JavaScript in this file is a CUSTOMIZATION of the Kartographer
 * extension for Wikivoyage.
 * It was taken from https://en.wikivoyage.org/wiki/MediaWiki:Kartographer.js
 * or more specifically https://en.wikivoyage.org/w/index.php?oldid=4193226
 *
 * For any information about Kartographer, visit the page:
 *     https://www.mediawiki.org/wiki/Extension:Kartographer
 *
 * WHAT IS IT DOING ?
 *
 * This code listens to a Kartographer extension hook `wikipage.maps`
 * and adds a few features onto the map:
 *
 * - Adds a control (top right) to select a different tile layer and toggle
 *   overlays:
 *     - Adds tile layers (mapnik, mapquestopen, mapquest, landscape)
 *     - Adds overlays (currently not implemented)
 *
 * HOW CAN YOU HELP ?
 *
 * We need to collect feedback, about the experimentation itself, about the
 * features, the design, the user experience, the code... We also need to
 * start tracking bugs and fixing them. Please help.
 *
 * To report a bug or an issue:
 *     https://phabricator.wikimedia.org/maniphest/task/create/?projects=maps
 *     https://phabricator.wikimedia.org/tag/maps
 *
 * To contribute to the code:
 *     https://phabricator.wikimedia.org/r/p/mediawiki/extensions/Kartographer;browse/master/
 *     https://github.com/wikimedia/mediawiki-extensions-Kartographer
 *
 **********************************************************************/
 
( function ( mw ) {

	var wv,
		ready,
	/* jscs:disable validateQuoteMarks, disallowQuotedKeysInObjects */
		maptiles = {
			"cyclosm": {
				"tilesUrl": "https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png",
				"options": {
					"wvIsExternal": true,
					"wvName": "CyclOSM",
					"subdomains": [
						"a",
						"b",
						"c"
					],
					"attribs": [
						{
							"url": "https://www.openstreetmap.org/copyright",
							"name": "OpenStreetMap contributors",
							"label": "Map data ©"
						},
						{
							"url": "https://github.com/cyclosm/cyclosm-cartocss-style/releases",
							"name": "CyclOSM v0.6",
							"label": " Map style"
						}
					]
				}
			},
			"cycle-map": {
				"tilesUrl": "https://tile.thunderforest.com/cycle/{z}/{x}/{y}.png?apikey=6170aad10dfd42a38d4d8c709a536f38",
				"options": {
					"wvIsExternal": true,
					"wvName": "Cycle Map",
					"attribs": [
						{
							"url": "https://www.openstreetmap.org/copyright",
							"name": "OpenStreetMap contributors",
							"label": "Map data ©"
						},
						{
							"url": "https://www.thunderforest.com/",
							"name": "Thunderforest",
							"label": " Map style"
						}
					]
				}
			},
			"transport-map": {
				"tilesUrl": "https://tile.thunderforest.com/transport/{z}/{x}/{y}.png?apikey=6170aad10dfd42a38d4d8c709a536f38",
				"options": {
					"wvIsExternal": true,
					"wvName": "Transport Map",
					"attribs": [
						{
							"url": "https://www.openstreetmap.org/copyright",
							"name": "OpenStreetMap contributors",
							"label": "Map data ©"
						},
						{
							"url": "https://www.thunderforest.com/",
							"name": "Thunderforest",
							"label": " Map style"
						}
					],
					"maxNativeZoom": 17
				}
			},
			"oepnv": {
				"tilesUrl": "https://tile.memomaps.de/tilegen/{z}/{x}/{y}.png",
				"options": {
					"wvIsExternal": true,
					"wvName": "ÖPNVKarte",
					"attribs": [
						{
							"url": "https://www.openstreetmap.org/copyright",
							"name": "OpenStreetMap contributors",
							"label": "Map data ©"
						},
						{
							"url": "https://memomaps.de/",
							"name": "MeMoMaps",
							"label": " Tiles courtesy of"
						}
					]
				}
			},
			"humanitarian": {
				"tilesUrl": "https://tile-{s}.openstreetmap.fr/hot/{z}/{x}/{y}.png",
				"options": {
					"wvIsExternal": true,
					"wvName": "Humanitarian",
					"subdomains": [
						"a",
						"b",
						"c"
					],
					"attribs": [
						{
							"url": "https://www.openstreetmap.org/copyright",
							"name": "OpenStreetMap contributors",
							"label": "Map data ©"
						},
						{
							"url": "https://hotosm.org/",
							"name": "Humanitarian OpenStreetMap Team",
							"label": " Map style"
						},
						{
							"url": "https://openstreetmap.fr/",
							"name": "OpenStreetMap France",
							"label": " hosted by"
						}
					]
				}
			}
		};
	/* jscs:enable validateQuoteMarks, disallowQuotedKeysInObjects */

	mw.hook( 'wikipage.maps' ).add( function ( maps ) {

		ready = ready || mw.loader.using( [ 'oojs-ui', 'ext.kartographer.wv' ] ).done( function () {
				wv = mw.loader.require( 'ext.kartographer.wv' );

				$.each( maptiles, function ( i, tile ) {
					wv.wikivoyage.addTileLayer( i, tile.tilesUrl, tile.options );
				} );
			} );

		// `maps` can be an array
		maps = $.isArray( maps ) ? maps : [ maps ];

		ready.done( function () {

			// customize each map
			$.each( maps, function ( i, map ) {

				var wvmap = new wv.WVMap( map );
				wvmap.controlLayers()
					.basemap( 'cyclosm' )
					.basemap( 'cycle-map' )
					.basemap( 'transport-map' )
					.basemap( 'oepnv' )
					.basemap( 'humanitarian' )
					.datalayer( map.dataLayers )
					.update();
			} );
		} );
	} );
} )( mediaWiki );