<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://skandinavien-wiki.net/w/index.php?action=history&amp;feed=atom&amp;title=Modul%3AMapframe</id>
	<title>Modul:Mapframe - Versionsgeschichte</title>
	<link rel="self" type="application/atom+xml" href="https://skandinavien-wiki.net/w/index.php?action=history&amp;feed=atom&amp;title=Modul%3AMapframe"/>
	<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:Mapframe&amp;action=history"/>
	<updated>2026-05-14T13:16:27Z</updated>
	<subtitle>Versionsgeschichte dieser Seite in skandinavien-wiki.net</subtitle>
	<generator>MediaWiki 1.39.10</generator>
	<entry>
		<id>https://skandinavien-wiki.net/w/index.php?title=Modul:Mapframe&amp;diff=9941&amp;oldid=prev</id>
		<title>Xineohp1506: 1 Version von :wikivoyage:Modul:Mapframe importiert</title>
		<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:Mapframe&amp;diff=9941&amp;oldid=prev"/>
		<updated>2023-01-19T13:31:38Z</updated>

		<summary type="html">&lt;p&gt;1 Version von &lt;a href=&quot;https://de.wikivoyage.org/wiki/Modul:Mapframe&quot; class=&quot;extiw&quot; title=&quot;wikivoyage:Modul:Mapframe&quot;&gt;wikivoyage:Modul:Mapframe&lt;/a&gt; importiert&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;de&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Nächstältere Version&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Version vom 19. Januar 2023, 15:31 Uhr&lt;/td&gt;
				&lt;/tr&gt;
&lt;!-- diff cache key d03bbfb2:diff::1.12:old-9940:rev-9941 --&gt;
&lt;/table&gt;</summary>
		<author><name>Xineohp1506</name></author>
	</entry>
	<entry>
		<id>https://skandinavien-wiki.net/w/index.php?title=Modul:Mapframe&amp;diff=9940&amp;oldid=prev</id>
		<title>wikivoyage&gt;RolandUnger: mu.getSize</title>
		<link rel="alternate" type="text/html" href="https://skandinavien-wiki.net/w/index.php?title=Modul:Mapframe&amp;diff=9940&amp;oldid=prev"/>
		<updated>2023-01-14T08:50:52Z</updated>

		<summary type="html">&lt;p&gt;mu.getSize&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Neue Seite&lt;/b&gt;&lt;/p&gt;&lt;div&gt;-- inserting a mapframe map&lt;br /&gt;
-- This edition was made for the special needs of Wikivoyage. For a use at a&lt;br /&gt;
-- Wikipedia please use https://en.wikipedia.org/wiki/Module:Mapframe&lt;br /&gt;
&lt;br /&gt;
-- documentation&lt;br /&gt;
local Mapframe = {&lt;br /&gt;
	suite  = &amp;#039;Mapframe&amp;#039;,&lt;br /&gt;
	serial = &amp;#039;2023-01-14&amp;#039;,&lt;br /&gt;
	item   = 52554979&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- module import&lt;br /&gt;
-- require( &amp;#039;strict&amp;#039; )&lt;br /&gt;
local cd = require( &amp;#039;Module:Coordinates&amp;#039; )&lt;br /&gt;
local mg = mw.loadData( &amp;#039;Module:Marker utilities/Groups&amp;#039; )&lt;br /&gt;
local mi = require( &amp;#039;Module:Mapshape utilities/i18n&amp;#039; )&lt;br /&gt;
local mp = require( &amp;#039;Module:Mapframe/Params&amp;#039; )&lt;br /&gt;
local mu = require( &amp;#039;Module:Mapshape utilities&amp;#039; )&lt;br /&gt;
local wu = require( &amp;#039;Module:Wikidata utilities&amp;#039; )&lt;br /&gt;
local yn = require( &amp;#039;Module:Yesno&amp;#039; )&lt;br /&gt;
&lt;br /&gt;
-- module variable and administration&lt;br /&gt;
local mf = {&lt;br /&gt;
	content  = {},&lt;br /&gt;
	entityId = nil,&lt;br /&gt;
	wikilang = nil,&lt;br /&gt;
	moduleInterface = Mapframe&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- return decimal coordinate if possible&lt;br /&gt;
local function toDec( coord, dir )&lt;br /&gt;
	if mu.isSet( coord ) then&lt;br /&gt;
		local t = cd.toDec( coord, dir, 6 )&lt;br /&gt;
		if t.error == 0 then&lt;br /&gt;
			return t.dec&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- split coordinates to latitude and longitude&lt;br /&gt;
local function _parseCoords( coords )&lt;br /&gt;
	local lat = nil&lt;br /&gt;
	local long = nil&lt;br /&gt;
	if not mu.isSet( coords ) then&lt;br /&gt;
		return nil, nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	coords = coords:upper()&lt;br /&gt;
	local count&lt;br /&gt;
	if not coords:find( &amp;#039;[,]&amp;#039; ) and coords:find( &amp;#039;[NS]&amp;#039; ) then&lt;br /&gt;
		coords, count = coords:gsub( &amp;#039;([NS])&amp;#039;, &amp;#039;%1,&amp;#039; ) -- adding separator&lt;br /&gt;
	end&lt;br /&gt;
	local parts = mw.text.split( coords, &amp;#039;,&amp;#039;, true )&lt;br /&gt;
	if #parts == 2 or #parts == 3 then -- 3: including elevation&lt;br /&gt;
		lat = mw.text.trim( parts[ 1 ] )&lt;br /&gt;
		long = mw.text.trim( parts[ 2 ] )&lt;br /&gt;
		-- check for mask borders&lt;br /&gt;
		if lat:find( &amp;#039;36000&amp;#039;, 1, true ) and long:find( &amp;#039;180&amp;#039;, 1, true ) then&lt;br /&gt;
			lat = tonumber( lat )&lt;br /&gt;
			long = tonumber( long )&lt;br /&gt;
		else&lt;br /&gt;
			lat = toDec( lat, &amp;#039;lat&amp;#039; )&lt;br /&gt;
			long = toDec( long, &amp;#039;long&amp;#039; )&lt;br /&gt;
		end&lt;br /&gt;
		if not lat or not long then&lt;br /&gt;
			return nil, nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return lat, long&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- parse set of coordinates&lt;br /&gt;
-- programmer of function: user Yurik (Yuri Astrakhan), see Modul:Map&lt;br /&gt;
local function parseCoords( geoType, coords )&lt;br /&gt;
	local geoTypes = {&lt;br /&gt;
		Point           = { levels = 1, min = 1 },&lt;br /&gt;
		MultiPoint      = { levels = 1, min = 2 },&lt;br /&gt;
		LineString      = { levels = 1, min = 2 },&lt;br /&gt;
		MultiLineString = { levels = 2, min = 2 },&lt;br /&gt;
		Polygon         = { levels = 2, min = 4 },&lt;br /&gt;
		MultiPolygon    = { levels = 3, min = 4 }&lt;br /&gt;
	}&lt;br /&gt;
	local levels = geoTypes[ geoType ].levels&lt;br /&gt;
	local min = geoTypes[ geoType ].min&lt;br /&gt;
&lt;br /&gt;
	local results = {}&lt;br /&gt;
	for i = 1, levels, 1 do&lt;br /&gt;
		results[ i ] = {}&lt;br /&gt;
	end&lt;br /&gt;
	local gap = 0&lt;br /&gt;
	local errors = &amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
	local closeArrays = function( gap )&lt;br /&gt;
		if #results[ levels ] &amp;lt; min then&lt;br /&gt;
			errors = errors .. mw.ustring.format( mi.mfMinValues, min ) .. &amp;#039; &amp;#039;&lt;br /&gt;
		elseif min == 1 and #results[ levels ] ~= 1 then -- Point&lt;br /&gt;
			errors = errors .. mi.mfExactlyOne .. &amp;#039; &amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
        for i = levels, levels-gap+1, -1 do&lt;br /&gt;
            table.insert( results[ i-1 ], results[ i ] )&lt;br /&gt;
            results[ i ] = {}&lt;br /&gt;
        end&lt;br /&gt;
        return 0 -- reset gap&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
	local points = mw.text.split( coords, &amp;#039;;&amp;#039;, true )&lt;br /&gt;
	local lat, long, val&lt;br /&gt;
	for i = 1, #points, 1 do&lt;br /&gt;
		val = mw.text.trim( points[ i ] )&lt;br /&gt;
		if val == &amp;#039;&amp;#039; then&lt;br /&gt;
			gap = gap + 1&lt;br /&gt;
			if gap &amp;gt;= levels then&lt;br /&gt;
				errors = errors .. mi.mfTooManyLevels .. &amp;#039; &amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			lat, long = _parseCoords( val )&lt;br /&gt;
			if lat and long then&lt;br /&gt;
				if gap &amp;gt; 0 then&lt;br /&gt;
					gap = closeArrays( gap )&lt;br /&gt;
				end&lt;br /&gt;
				table.insert( results[ levels ], { long, lat } )&lt;br /&gt;
			else&lt;br /&gt;
				errors = errors .. mi.mfBadData .. &amp;#039; &amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	closeArrays( levels - 1 )&lt;br /&gt;
	if errors == &amp;#039;&amp;#039; then&lt;br /&gt;
		return geoType == &amp;#039;Point&amp;#039; and results[ 1 ][ 1 ] or results[ 1 ], errors&lt;br /&gt;
	else&lt;br /&gt;
		return nil, errors&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- get individual coordinate from Wikidata&lt;br /&gt;
local function getWdCoords( id )&lt;br /&gt;
	if mu.isSet( id ) then&lt;br /&gt;
		local c = wu.getValue( id, &amp;#039;P625&amp;#039; )&lt;br /&gt;
		if c ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			return c.latitude, c.longitude&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil, nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- preparing title and description for geoJSON object&lt;br /&gt;
local function getTitle( title, description, image, firstId, ids, service )&lt;br /&gt;
	local function geomaskTitle()&lt;br /&gt;
		if service == &amp;#039;geomask&amp;#039; then&lt;br /&gt;
			title = mw.ustring.format( mi.geomask, title )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	-- getting title if only one id&lt;br /&gt;
	if title == &amp;#039;&amp;#039; then&lt;br /&gt;
		title = nil&lt;br /&gt;
	end&lt;br /&gt;
	if mu.isSet( firstId ) and firstId == ids then&lt;br /&gt;
		title = mu.addLink( title or mu.getTitle( firstId ), firstId,&lt;br /&gt;
			mf.entityId, mf.wikiLang )&lt;br /&gt;
		geomaskTitle()&lt;br /&gt;
		if not mu.isSet( description ) and not mu.isSet( image ) then&lt;br /&gt;
			image = mu.getImage( firstId )&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		title = title or mw.title.getCurrentTitle().subpageText&lt;br /&gt;
		geomaskTitle()&lt;br /&gt;
	end&lt;br /&gt;
	if not mu.isSet( description ) and mu.isSet( image ) then&lt;br /&gt;
		description = &amp;#039;[[File:&amp;#039; .. image .. &amp;#039;|100x100px]]&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return title, description&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- check for mapshapes Wikidata ids&lt;br /&gt;
local function idMatch( only, exclude, id )&lt;br /&gt;
	only = only or &amp;#039;&amp;#039;&lt;br /&gt;
	exclude = exclude or &amp;#039;&amp;#039;&lt;br /&gt;
	if only == &amp;#039;&amp;#039; and exclude == &amp;#039;&amp;#039; then&lt;br /&gt;
		return true&lt;br /&gt;
 	end&lt;br /&gt;
&lt;br /&gt;
	local function isIn( list )&lt;br /&gt;
	 	local parts = mw.text.split( list, &amp;#039;,&amp;#039;, true )&lt;br /&gt;
		for i = 1, #parts, 1 do&lt;br /&gt;
			if mw.text.trim( id ) == mw.text.trim( parts[ i ] ) then&lt;br /&gt;
				return true&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
 	if only ~= &amp;#039;&amp;#039; then&lt;br /&gt;
 		return isIn( only )&lt;br /&gt;
	else&lt;br /&gt;
		return not isIn( exclude )&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- make GeoJSON object for tag call&lt;br /&gt;
local function makeGeoJSON( args, argIndex )&lt;br /&gt;
	local service = &amp;#039;&amp;#039;&lt;br /&gt;
	for key, value in pairs( mp.services ) do&lt;br /&gt;
		for key2, value2 in ipairs( value ) do&lt;br /&gt;
			if args.service == value2 then&lt;br /&gt;
				service = key&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if service ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if service == &amp;#039;&amp;#039; then&lt;br /&gt;
		return mi.mfNoService&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local world = &amp;#039;36000,-180;36000,180;-36000,180;-36000,-180;36000,-180;;&amp;#039;&lt;br /&gt;
	local coordinates, description, errors, firstId, geojson, geoType, i, id&lt;br /&gt;
	local ids, image, lat, link, long, properties, rgb, stroke, title, values&lt;br /&gt;
&lt;br /&gt;
	-- default title and description&lt;br /&gt;
	if service ~= &amp;#039;page&amp;#039; then&lt;br /&gt;
		title = args.title&lt;br /&gt;
		description = args.description&lt;br /&gt;
		image = args.image&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- processing coordinate data instead of Wikidata IDs&lt;br /&gt;
	args.coord = mw.ustring.gsub( args.coord or &amp;#039;&amp;#039;, &amp;#039;;*$&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
	if mu.isSet( args.coord ) and service ~= &amp;#039;page&amp;#039; and service ~= &amp;#039;shapes&amp;#039; then&lt;br /&gt;
		if mu.isSet( args.wikidata ) then&lt;br /&gt;
			return mi.mfTogether&lt;br /&gt;
		end&lt;br /&gt;
		if service == &amp;#039;point&amp;#039; then&lt;br /&gt;
			args.coord = mw.ustring.gsub( args.coord, &amp;#039;;;*&amp;#039;, &amp;#039;;&amp;#039; )&lt;br /&gt;
			if mw.ustring.find( args.coord, &amp;#039;;&amp;#039;, 1, true ) then&lt;br /&gt;
				geoType = &amp;#039;MultiPoint&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				geoType = &amp;#039;Point&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif service == &amp;#039;geoline&amp;#039; then&lt;br /&gt;
			args.coord = mw.ustring.gsub( args.coord, &amp;#039;;;;*&amp;#039;, &amp;#039;;;&amp;#039; )&lt;br /&gt;
			if mw.ustring.find( args.coord, &amp;#039;;;&amp;#039;, 1, true ) then&lt;br /&gt;
				geoType = &amp;#039;MultiLineString&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				geoType = &amp;#039;LineString&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif service == &amp;#039;geoshape&amp;#039; or service == &amp;#039;geomask&amp;#039; then&lt;br /&gt;
			if service == &amp;#039;geomask&amp;#039; then&lt;br /&gt;
				args.coord = world .. args.coord&lt;br /&gt;
			end&lt;br /&gt;
			args.coord = mw.ustring.gsub( args.coord, &amp;#039;;;;;*&amp;#039;, &amp;#039;;;;&amp;#039; )&lt;br /&gt;
			if mw.ustring.find( args.coord, &amp;#039;;;&amp;#039;, 1, true ) then&lt;br /&gt;
				geoType = &amp;#039;MultiPolygon&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				geoType = &amp;#039;Polygon&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		coordinates, errors = parseCoords( geoType, args.coord )&lt;br /&gt;
		if not coordinates then&lt;br /&gt;
			return errors&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		title, description =&lt;br /&gt;
			getTitle( title, description, image, nil, nil, service )&lt;br /&gt;
&lt;br /&gt;
		if geoType == &amp;#039;Point&amp;#039; or geoType == &amp;#039;MultiPoint&amp;#039; then&lt;br /&gt;
			properties = {&lt;br /&gt;
				title = title,&lt;br /&gt;
				description = description,&lt;br /&gt;
				[ &amp;#039;marker-symbol&amp;#039; ] = mu.getParameter( args.marker, nil ),&lt;br /&gt;
				[ &amp;#039;marker-color&amp;#039; ] = mu.getParameter( args.markerColor, mi.defaultMarkerColor )&lt;br /&gt;
			}&lt;br /&gt;
		else&lt;br /&gt;
			stroke = args.stroke or &amp;#039;&amp;#039;&lt;br /&gt;
			if stroke == &amp;#039;&amp;#039; then&lt;br /&gt;
				stroke = mi.defaultStroke&lt;br /&gt;
			end&lt;br /&gt;
			properties = {&lt;br /&gt;
				title = title,&lt;br /&gt;
				description = description,&lt;br /&gt;
				fill = mu.getParameter( args.fill, mi.defaultFill ),&lt;br /&gt;
				[ &amp;#039;fill-opacity&amp;#039; ] = mu.getNumber( args.fillOpacity, mi.defaultFillOpacity ),&lt;br /&gt;
				stroke = stroke,&lt;br /&gt;
				[ &amp;#039;stroke-width&amp;#039; ] = mu.getNumber( args.strokeWidth, mi.defaultStrokeWidth ),&lt;br /&gt;
				[ &amp;#039;stroke-opacity&amp;#039; ] = mu.getNumber( args.strokeOpacity, mi.defaultStrokeOpacity )&lt;br /&gt;
			}&lt;br /&gt;
		end&lt;br /&gt;
		geojson = {&lt;br /&gt;
			type = &amp;#039;Feature&amp;#039;,&lt;br /&gt;
			geometry = {&lt;br /&gt;
				type = geoType,&lt;br /&gt;
				coordinates = coordinates&lt;br /&gt;
			},&lt;br /&gt;
			properties = properties&lt;br /&gt;
		}		&lt;br /&gt;
		table.insert( mf.content, mw.text.jsonEncode( geojson ) )&lt;br /&gt;
		return &amp;#039;&amp;#039; -- no errors&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	-- processing Wikidata and Wikimedia Commons data&lt;br /&gt;
	if service == &amp;#039;shapes&amp;#039; and not mi.excludeOSM then	&lt;br /&gt;
		-- in case of shapes multiple GeoJSON objects are returned&lt;br /&gt;
		if not mu.isSet( args.wikidata ) then&lt;br /&gt;
			return mi.mfNoWikidata&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		values = mu.getMapshapes( args.wikidata )&lt;br /&gt;
		if #values == 0 then&lt;br /&gt;
			return mi.mfNoParts&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		args.defaultType = mu.getParameter( args.defaultType, &amp;#039;geoline&amp;#039; )&lt;br /&gt;
		stroke = args.stroke or &amp;#039;&amp;#039;&lt;br /&gt;
		if stroke == &amp;#039;&amp;#039; then&lt;br /&gt;
			stroke = args.defaultColor or &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		if stroke == &amp;#039;&amp;#039; then&lt;br /&gt;
			stroke = mi.defaultStroke&lt;br /&gt;
		end&lt;br /&gt;
		if not string.find( stroke, &amp;#039;#&amp;#039;, 1, true ) then&lt;br /&gt;
			stroke = &amp;#039;#&amp;#039; .. stroke&lt;br /&gt;
		end&lt;br /&gt;
				&lt;br /&gt;
		for i = 1, #values, 1 do&lt;br /&gt;
			id = values[ i ].id&lt;br /&gt;
			if idMatch( args.only, args.exclude, id ) then&lt;br /&gt;
				title = mu.addLink( mw.wikibase.label( id ) or id, id,&lt;br /&gt;
					mf.entityId, mf.wikiLang )&lt;br /&gt;
				description = mu.getImage( id )&lt;br /&gt;
				if description == &amp;#039;&amp;#039; then&lt;br /&gt;
					description = nil&lt;br /&gt;
--				else&lt;br /&gt;
--					description = &amp;#039;[[File:&amp;#039; .. description .. &amp;#039;|141px]]&amp;#039;&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				rgb = mu.getColor( id )&lt;br /&gt;
				if rgb == &amp;#039;&amp;#039; then&lt;br /&gt;
					rgb = stroke&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				geojson = {&lt;br /&gt;
					type = &amp;#039;ExternalData&amp;#039;,&lt;br /&gt;
					service = args.defaultType,&lt;br /&gt;
					ids = id,&lt;br /&gt;
					properties = {&lt;br /&gt;
						title = title,&lt;br /&gt;
						description = description,&lt;br /&gt;
						fill = mu.getParameter( args.fill, mi.defaultFill ),&lt;br /&gt;
						[ &amp;#039;fill-opacity&amp;#039; ] = mu.getNumber( args.fillOpacity, mi.defaultFillOpacity ),&lt;br /&gt;
						stroke = rgb,&lt;br /&gt;
						[ &amp;#039;stroke-width&amp;#039; ] = mu.getNumber( args.strokeWidth, mi.defaultShapesWidth ),&lt;br /&gt;
						[ &amp;#039;stroke-opacity&amp;#039; ] = mu.getNumber( args.strokeOpacity, mi.defaultShapesOpacity )&lt;br /&gt;
					}&lt;br /&gt;
				}&lt;br /&gt;
				-- collecting multiple geojson codes&lt;br /&gt;
				table.insert( mf.content, mw.text.jsonEncode( geojson ) )&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return &amp;#039;&amp;#039; -- objects already inserted, no errors&lt;br /&gt;
&lt;br /&gt;
	elseif service == &amp;#039;page&amp;#039; then -- data from Wikimedia Commons&lt;br /&gt;
		if args.commons then&lt;br /&gt;
			geojson = {&lt;br /&gt;
				type = &amp;#039;ExternalData&amp;#039;,&lt;br /&gt;
				service = &amp;#039;page&amp;#039;,&lt;br /&gt;
				title = mw.ustring.gsub( args.commons, &amp;#039;[Dd]ata:&amp;#039;, &amp;#039;&amp;#039; )&lt;br /&gt;
			}&lt;br /&gt;
		else&lt;br /&gt;
			return mi.mfNoCommons&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif service == &amp;#039;point&amp;#039; then&lt;br /&gt;
		ids = mw.text.split( args.wikidata, &amp;#039;,&amp;#039;, true )&lt;br /&gt;
		coordinates = {}&lt;br /&gt;
		for i = 1, #ids, 1 do&lt;br /&gt;
			id = mw.text.trim( ids[ i ] )&lt;br /&gt;
			if id ~= &amp;#039;&amp;#039; and mw.wikibase.isValidEntityId( id ) then&lt;br /&gt;
				lat, long = getWdCoords( id )&lt;br /&gt;
				if lat and long then&lt;br /&gt;
					table.insert( coordinates, { long, lat } )&lt;br /&gt;
					if #coordinates == 1 then&lt;br /&gt;
						title, description =&lt;br /&gt;
							getTitle( title, description, image, id, id, service )&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if #coordinates == 0 then&lt;br /&gt;
			return mi.mfNoWdCoord&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		i = #coordinates == 1&lt;br /&gt;
		geojson = {&lt;br /&gt;
			type = &amp;#039;Feature&amp;#039;,&lt;br /&gt;
			geometry = {&lt;br /&gt;
				type = i and &amp;#039;Point&amp;#039; or &amp;#039;MultiPoint&amp;#039;,&lt;br /&gt;
				coordinates = i and coordinates[ 1 ] or coordinates&lt;br /&gt;
			},&lt;br /&gt;
			properties = {&lt;br /&gt;
				title = title,&lt;br /&gt;
				description = description,&lt;br /&gt;
				[ &amp;#039;marker-symbol&amp;#039; ] = mu.getParameter( args.marker, nil ),&lt;br /&gt;
				[ &amp;#039;marker-color&amp;#039; ] = mu.getParameter( args.markerColor, mi.defaultMarkerColor )&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	-- geoline or geoshape/geomask&lt;br /&gt;
	elseif not mi.excludeOSM then&lt;br /&gt;
		if mu.isSet( args.wikidata ) then&lt;br /&gt;
			ids = args.wikidata&lt;br /&gt;
		else&lt;br /&gt;
			ids = mf.entityId&lt;br /&gt;
		end&lt;br /&gt;
		if not mu.isSet( ids ) then&lt;br /&gt;
			return mi.mfNoWikidata&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		-- getting first id&lt;br /&gt;
		firstId = mu.getFirstId( ids )&lt;br /&gt;
&lt;br /&gt;
		title, description =&lt;br /&gt;
			getTitle( title, description, image, firstId, ids, service )&lt;br /&gt;
				&lt;br /&gt;
		-- getting color from first id&lt;br /&gt;
		stroke = args.stroke or &amp;#039;&amp;#039;&lt;br /&gt;
		if stroke == &amp;#039;&amp;#039; then&lt;br /&gt;
			stroke = mu.getColor( firstId )&lt;br /&gt;
			if stroke == &amp;#039;&amp;#039; then&lt;br /&gt;
				stroke = mi.defaultStroke&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if service == &amp;#039;geoshape&amp;#039; and argIndex &amp;gt; 0 then&lt;br /&gt;
			args.fill = mu.getParameter( args.fill, mi.defaultColors[ argIndex ] )&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		geojson = {&lt;br /&gt;
			type = &amp;#039;ExternalData&amp;#039;,&lt;br /&gt;
			service = service,&lt;br /&gt;
			ids = ids,&lt;br /&gt;
			properties = {&lt;br /&gt;
				title = title,&lt;br /&gt;
				description = description,&lt;br /&gt;
				fill = mu.getParameter( args.fill, mi.defaultFill ),&lt;br /&gt;
				[ &amp;#039;fill-opacity&amp;#039; ] = mu.getNumber( args.fillOpacity, mi.defaultFillOpacity ),&lt;br /&gt;
				stroke = stroke,&lt;br /&gt;
				[ &amp;#039;stroke-width&amp;#039; ] = mu.getNumber( args.strokeWidth, mi.defaultStrokeWidth ),&lt;br /&gt;
				[ &amp;#039;stroke-opacity&amp;#039; ] = mu.getNumber( args.strokeOpacity, mi.defaultStrokeOpacity )&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.insert( mf.content, mw.text.jsonEncode( geojson ) )&lt;br /&gt;
	return &amp;#039;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- processing multiple shape definitions&lt;br /&gt;
local function makeTagContent( args )&lt;br /&gt;
	local errors = &amp;#039;&amp;#039;&lt;br /&gt;
	local r = mu.getParameter( args.raw, nil )&lt;br /&gt;
	if r then&lt;br /&gt;
		return r, false, errors&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local err = false&lt;br /&gt;
	local commons, service, single, wikidata&lt;br /&gt;
&lt;br /&gt;
	local function mergeArgs( indx )&lt;br /&gt;
		service = args[ &amp;#039;type&amp;#039; .. indx ] or &amp;#039;&amp;#039;&lt;br /&gt;
		commons = args[ &amp;#039;page&amp;#039; .. indx ] or &amp;#039;&amp;#039;&lt;br /&gt;
		if commons ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			service = &amp;#039;page&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		wikidata = args[ &amp;#039;wikidata&amp;#039; .. indx ] or &amp;#039;&amp;#039;&lt;br /&gt;
		if service == &amp;#039;&amp;#039; and wikidata ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			service = &amp;#039;geomask&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- mapgroup parameters&lt;br /&gt;
	if args.groupWikidata ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		single = {&lt;br /&gt;
			service = &amp;#039;geomask&amp;#039;,&lt;br /&gt;
			wikidata = args.groupWikidata,&lt;br /&gt;
			fill = args.fillMask&lt;br /&gt;
		}&lt;br /&gt;
		errors = errors .. makeGeoJSON( single, 0 )&lt;br /&gt;
	end&lt;br /&gt;
	if args.highlightWikidata ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		single = {&lt;br /&gt;
			service = &amp;#039;geoshape&amp;#039;,&lt;br /&gt;
			wikidata = args.highlightWikidata,&lt;br /&gt;
			fill = mu.getParameter( args.fill, mi.defaultHighlight )&lt;br /&gt;
		}&lt;br /&gt;
		errors = errors .. makeGeoJSON( single, 0 )&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local argsIndex = &amp;#039;&amp;#039;&lt;br /&gt;
	mergeArgs( argsIndex )&lt;br /&gt;
	while service ~= &amp;#039;&amp;#039; do&lt;br /&gt;
		-- remove index from args parameters and copy them to single&lt;br /&gt;
		single = {&lt;br /&gt;
			commons = commons,&lt;br /&gt;
			wikidata = wikidata,&lt;br /&gt;
			service = service&lt;br /&gt;
		}&lt;br /&gt;
		if commons ~= &amp;#039;&amp;#039; and wikidata ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			err = true&lt;br /&gt;
		end&lt;br /&gt;
		for k, v in pairs( args ) do&lt;br /&gt;
			if v == &amp;#039;&amp;#039; then&lt;br /&gt;
				v = nil&lt;br /&gt;
			end&lt;br /&gt;
			if string.match( k, &amp;#039;^[%a\-]+&amp;#039; .. argsIndex .. &amp;#039;$&amp;#039; ) then&lt;br /&gt;
				single[ string.gsub( k, argsIndex, &amp;#039;&amp;#039; ) ] = v&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if argsIndex == &amp;#039;&amp;#039; then&lt;br /&gt;
			argsIndex = 1&lt;br /&gt;
		end&lt;br /&gt;
		errors = errors .. makeGeoJSON( single, argsIndex )&lt;br /&gt;
&lt;br /&gt;
		argsIndex = argsIndex + 1&lt;br /&gt;
		mergeArgs( argsIndex )&lt;br /&gt;
		-- stop if there is no service anymore&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if #mf.content == 0 then&lt;br /&gt;
		return nil, err, errors&lt;br /&gt;
	elseif #mf.content == 1 then&lt;br /&gt;
		return mf.content[ 1 ], err, errors&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;[&amp;#039; .. table.concat( mf.content, &amp;#039;,&amp;#039;) .. &amp;#039;]&amp;#039;, err, errors&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- calling mapframe/maplink tag; addings shapes&lt;br /&gt;
local function _mapframe( args, frame )&lt;br /&gt;
	local tagArgs = {}&lt;br /&gt;
	mf.entityId = mw.wikibase.getEntityIdForCurrentPage()&lt;br /&gt;
	mf.wikiLang = mw.getContentLanguage():getCode()&lt;br /&gt;
&lt;br /&gt;
	-- auto-center if tagArgs.latitude = nil or tagArgs.longitude = nil&lt;br /&gt;
	tagArgs.latitude = toDec( args.lat, &amp;#039;lat&amp;#039; )&lt;br /&gt;
	tagArgs.longitude = toDec( args.long, &amp;#039;long&amp;#039; )&lt;br /&gt;
	if not tagArgs.latitude or not tagArgs.longitude then&lt;br /&gt;
		if args.coords ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			tagArgs.latitude, tagArgs.longitude = _parseCoords( args.coords )&lt;br /&gt;
		else&lt;br /&gt;
			tagArgs.latitude = nil&lt;br /&gt;
			tagArgs.longitude = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	tagArgs.zoom = tonumber( args.zoom )&lt;br /&gt;
	-- auto-zoom if tagArgs.zoom = nil&lt;br /&gt;
	if tagArgs.zoom then&lt;br /&gt;
		tagArgs.zoom = math.floor( tagArgs.zoom )&lt;br /&gt;
		if tagArgs.zoom &amp;lt; 1 or tagArgs.zoom &amp;gt; mi.maxZoomLevel then&lt;br /&gt;
			tagArgs.zoom = nil&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if tagArgs.latitude and tagArgs.longitude and not tagArgs.zoom then&lt;br /&gt;
		tagArgs.zoom = mi.defaultZoom&lt;br /&gt;
	end&lt;br /&gt;
	if args.tagName == &amp;#039;mapframe&amp;#039; then&lt;br /&gt;
		tagArgs.align = mu.getParameter( args.align, &amp;#039;right&amp;#039; )&lt;br /&gt;
		if args.width == &amp;#039;full&amp;#039; then&lt;br /&gt;
			tagArgs.width = &amp;#039;full&amp;#039;&lt;br /&gt;
			tagArgs.align = &amp;#039;center&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			tagArgs.width = mu.getSize( args.width, mi.defaultWidth )&lt;br /&gt;
				+ mi.borderAdjustment -- 2px: inside borders&lt;br /&gt;
		end&lt;br /&gt;
		tagArgs.height = mu.getSize( args.height, mi.defaultHeight )&lt;br /&gt;
	end&lt;br /&gt;
	tagArgs.show = args.show&lt;br /&gt;
	if tagArgs.show ~= &amp;#039;&amp;#039; then&lt;br /&gt;
		if args.group ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			tagArgs.group = args.group&lt;br /&gt;
		else&lt;br /&gt;
			if not tagArgs.show:find( &amp;#039;,&amp;#039; ) then&lt;br /&gt;
				tagArgs.group = tagArgs.show&lt;br /&gt;
			else&lt;br /&gt;
				tagArgs.group = mi.defaultGroup&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		tagArgs.show = mg.showAll&lt;br /&gt;
		tagArgs.group = mu.checkGroup( args.group )&lt;br /&gt;
	end&lt;br /&gt;
	tagArgs.group = mu.translateGroup( tagArgs.group )&lt;br /&gt;
	if not mw.ustring.find( tagArgs.show, tagArgs.group ) then&lt;br /&gt;
		tagArgs.show = tagArgs.show .. &amp;#039;,&amp;#039; .. tagArgs.group&lt;br /&gt;
	end&lt;br /&gt;
	if yn( args.plain, false ) then&lt;br /&gt;
		tagArgs.frameless = &amp;#039;1&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		tagArgs.text = args.name&lt;br /&gt;
		if tagArgs.text == &amp;#039;&amp;#039; and args.tagName == &amp;#039;mapframe&amp;#039; then&lt;br /&gt;
			tagArgs.text = string.format( mi.mapOf, mw.title.getCurrentTitle().subpageText )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	tagArgs.class = args.class&lt;br /&gt;
	if args.tagName == &amp;#039;maplink&amp;#039; then&lt;br /&gt;
		if tagArgs.class == &amp;#039;&amp;#039; and ( tagArgs.text == &amp;#039;&amp;#039; or tagArgs.text == &amp;#039;&amp;quot;&amp;quot;&amp;#039; ) then&lt;br /&gt;
			-- Hide pushpin icon in front of an empty text link&lt;br /&gt;
			tagArgs.class = &amp;#039;no-icon&amp;#039;&lt;br /&gt;
    	end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local tagContent, err, errors = makeTagContent( args )&lt;br /&gt;
&lt;br /&gt;
	local result = frame:extensionTag( args.tagName, tagContent, tagArgs )&lt;br /&gt;
	if err then&lt;br /&gt;
		result = result .. mi.mfTogether2&lt;br /&gt;
	end&lt;br /&gt;
	if mu.isSet( errors ) then&lt;br /&gt;
		result = result .. &amp;#039;&amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;&amp;#039; .. errors .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
			.. mi.mfErrorCateg&lt;br /&gt;
	end&lt;br /&gt;
	-- adding maintenance categories&lt;br /&gt;
	if mw.title.getCurrentTitle().namespace == 0 then&lt;br /&gt;
		if mi.usePropertyCategs then&lt;br /&gt;
			result = result .. wu.getCategories( mi.properties )&lt;br /&gt;
				.. mu.getCategories( mi.properties )&lt;br /&gt;
		end&lt;br /&gt;
		if tagContent then&lt;br /&gt;
			result = result .. mi.mfWithShapes&lt;br /&gt;
		end&lt;br /&gt;
		if args.tagName == &amp;#039;mapframe&amp;#039; and ( tagArgs.width == &amp;#039;full&amp;#039; or&lt;br /&gt;
			tagArgs.width ~= mi.defaultWidth + mi.borderAdjustment or &lt;br /&gt;
			tagArgs.height ~= mi.defaultHeight ) then&lt;br /&gt;
			result = result .. mi.mfWithSize&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- for Mapframe template&lt;br /&gt;
function mf.mapframe( frame )&lt;br /&gt;
	local args, errors =&lt;br /&gt;
		mu.checkParams( frame:getParent().args, mp.params, &amp;#039;Mapframe&amp;#039;, mi.mfUnknown )&lt;br /&gt;
	args.tagName = &amp;#039;mapframe&amp;#039;&lt;br /&gt;
	return _mapframe( args, frame ) .. errors&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- for Maplink template&lt;br /&gt;
function mf.maplink( frame )&lt;br /&gt;
	local args, errors =&lt;br /&gt;
		mu.checkParams( frame:getParent().args, mp.params, &amp;#039;Mapframe&amp;#039;, mi.mfUnknown )&lt;br /&gt;
	local isMapframe = yn( args.frame, false ) -- wp compatibility&lt;br /&gt;
	if isMapframe then&lt;br /&gt;
		args.tagName = &amp;#039;mapframe&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		args.tagName = &amp;#039;maplink&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return _mapframe( args, frame ) .. errors&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return mf&lt;/div&gt;</summary>
		<author><name>wikivoyage&gt;RolandUnger</name></author>
	</entry>
</feed>