Naar inhoud springen

Module:OSM

Uit Wikipedia, de vrije encyclopedie
Dit is een oude versie van deze pagina, bewerkt door Polyglot (overleg | bijdragen) op 12 aug 2015 om 22:14. (verbeteringen ivm regex voor meerdere waardes + verbeteringen door o.a. Mr. Stradivarius op Engelse wikipedia + toevoeging timeout)
Deze versie kan sterk verschillen van de huidige versie van deze pagina.
Moduledocumentatie​[bekijk] [bewerk] [ververs] [geschiedenis]

Doel

Genereert een link naar een kaart van OpenStreetMap (OSM).

Gebruik

{{#invoke:OSM|wd}}
{{#invoke:OSM|overpass}}
{{#invoke:OSM|etym}}

Parameters

display
De tekst die getoond wordt
link
Standaard aan, maar kan op no gezet worden voor gebruik in andere sjablonen
id
Kan een of meerdere Q-nummers van een wikidata-item bevatten, zo niet gaat het over het artikel waar het sjabloon werd aangeroepen
coord
Coördinaten en een zoomfactor in het volgende formaat: C=47.0618984;15.4370248;17. Op basis hiervan wordt een gebied bepaald (bbox)
limitToBBOX
Standaard yes. Query bevat dan enkel elementen die binnen dat gebied vallen
prim
Hiermee kan worden aangegeven dat enkel nodes, ways en/of relaties moeten worden opgehaald
query
Dit laat toe om de query uit te breiden, zodat bijvoorbeeld enkel straten of grafzerken worden opgehaald

Testwaarden

Command Expected result Pass/Fail Result
OSM-objecten met afgeleide of verwijzende namen
{{#invoke:OSM|etym|display=Kaart}} Kaart fail Kaart
meerdere wikidata-items
{{#invoke:OSM|wd|display=Vresse en Florenville|id=Q650206;Q713300}} Vresse and Florenville fail Vresse en Florenville
met coördinaten, wat ervoor zorgt dat het zoeken in een kleiner gebied gebeurt.
{{#invoke:OSM|wd|display=Kerk van Vresse|id=Q20748715|coord=49.71513;5.23446;14}} Kerk van Vresse fail Kerk van Vresse

local function buildquery(frame, target)
	local textToDisplay, leftLink, rightLink, runQueryRightAway, itemID, query, coord, bbox, remark, overpassUrl, primitives
	local args = frame.args
	
	if args.display then
		-- text to display on link
		textToDisplay = ' ' .. args.display
	else
		textToDisplay = ''
	end
	if args.timeout then
		-- text to display on link
		timeout = '[timeout:' .. args.timeout .. '];\n'
	else
		timeout = '[timeout:15];\n'
	end
	if args.link and args.link == 'no' then
		-- just return the url
		leftLink = ''
		rightLink = ''
		textToDisplay = ''
	else
		leftLink = '['
		rightLink = ']'
	end
	if args.run and args.run == 'no' then
		-- don't run immediately
		runQueryRightAway = ''
	else
		runQueryRightAway = '&R'
	end
	if args.id then
		-- build query for specific Q-item(s) 
		itemID = args.id
	else
		itemID = mw.wikibase.getEntityObject()
		if itemID == nil then
			return "This page doesn't have a wikidata entry"
		end
		-- build query for current page
		itemID = itemID.id
	end
	if itemID:find(";") == nil then
		-- If there are no ; in the itemID, we only need to search for 1 value
		itemID = '"="' .. itemID
	else
		-- If more than 1 Q-number is provided, perform a regular expression based search instead
		itemID = '"~"^(' .. itemID:gsub(";", "\|") .. ')$'
	end
	if args.query then
		query = args.query
	else
		query = ''
	end
	if args.coord then
		-- The user can provide coordinates and a zoom factor
		coord = '&C=' .. args.coord
		-- In that case we can limit the search to the area in view
		bbox = '({{bbox}})'
		-- and tell them how to search wider.
		remark = ' // remove the ' .. bbox .. 'if you want the query to be executed globally'
	else
		coord = ''
		bbox = ''
		remark = ''
	end
	overpassUrl = timeout .. '(\n'
	-- if the user specifies prim(itives), but then leaves the string empty, abort
	if args.prim then
		if args.prim == '' then
			return "Please indicate which primitives you want to query for"
		end
		primitives = args.prim
	else
		primitives = 'nwr'
	end

	if primitives:find("n") then
		-- Include nodes
		overpassUrl = overpassUrl .. 'node["' .. target .. itemID ..'"]' .. query .. bbox .. ';' .. remark .. '\n'
	end
	if primitives:find("w") then
		-- Include ways
		overpassUrl = overpassUrl .. 'way["' .. target .. itemID .. '"]' .. query .. bbox .. ';\n'
	end
	if primitives:find("r") then
		-- Include relations
		overpassUrl = overpassUrl .. 'relation["' .. target .. itemID .. '"]' .. query .. bbox .. ';\n'
	end	
	overpassUrl = overpassUrl .. ');\n'
	overpassUrl = overpassUrl .. 'out geom;\n'
	return leftLink .. 'http://overpass-turbo.eu/?Q=' .. mw.uri.encode(overpassUrl, "PATH" ) .. coord .. runQueryRightAway .. textToDisplay .. rightLink
end

local p = {}

function p.overpass( frame )
	return buildquery(frame, '')
end

function p.wd( frame )
	return buildquery(frame, 'wikidata')
end

function p.etym( frame )
	return buildquery(frame, 'name:etymology:wikidata')
end

function p.subject( frame )
	return buildquery(frame, 'subject:wikidata')
end

function p.artist( frame )
	return buildquery(frame, 'artist:wikidata')
end

function p.architect( frame )
	return buildquery(frame, 'architect:wikidata')
end

function p.operator( frame )
	return buildquery(frame, 'operator:wikidata')
end

function p.brand( frame )
	return buildquery(frame, 'brand:wikidata')
end

return p