Module:OSM

local function buildquery(frame, target)

local textToDisplay, leftLink, rightLink, runQueryRightAway, itemObject, itemID, query, coord, bbox, remark, overpassUrl, primitives, timeout, style, logo

local args = frame.args

if args.display then

-- text to display on link

textToDisplay = ' ' .. args.display

else

textToDisplay = ''

end

if args.timeout then

timeout = '[timeout:' .. args.timeout .. '][out:json];\n'

else

timeout = '[timeout:20][out:json];\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 frame.args.overpass then

itemID = ""

itemObject = nil

else

if args.id then

-- build query for specific Q-item(s)

itemID = args.id

pcall(function () itemObject = mw.wikibase.getEntityObject(mw.text.split(itemID,";")[1]) end)

else

itemObject = mw.wikibase.getEntityObject()

if itemObject == nil then

return "This page doesn't have a wikidata entry"

end

-- build query for current page

itemID = itemObject.id

end

end

-- Always perform a regular expression based search

-- The data may contain multiple values

if frame.args.overpass == nil then

itemID = '"~"(^|;)(' .. itemID:gsub(";", "\|") .. ')(;|$)'

leftbracket = '["'

rightbracket = '"]'

else

leftbracket = ''

rightbracket = ''

end

if args.query then

-- user can add their own tags to filter on

query = args.query

else

if frame.args.overpass then

return "If you invoke with overpass, you have to include a query="

end

query = ''

end

if args.coord and not(args.limitToBBOX=='no') 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' .. leftbracket .. target .. itemID .. rightbracket .. query .. bbox .. ';' .. remark .. '\n'

end

if primitives:find("w") then

-- Include ways

overpassUrl = overpassUrl .. 'way' .. leftbracket .. target .. itemID .. rightbracket .. query .. bbox .. ';\n'

end

if primitives:find("r") then

-- Include relations

overpassUrl = overpassUrl .. 'relation' .. leftbracket .. target .. itemID .. rightbracket .. query .. bbox .. ';\n>>;\n'

end

overpassUrl = overpassUrl .. ');\n'

overpassUrl = overpassUrl .. 'out geom;\n'

if args.style then

style = args.style

else

if args.logo then

logo = " icon-image: url(" .. args.logo .. ');\n'

else

if itemObject then

logo = tostring(itemObject:formatPropertyValues('P154')['value']):gsub("'", "'")

end

if logo and not(logo == '') then

logo = ' icon-image: url("https://commons.wikimedia.org/wiki/Special:Redirect/file/'.. logo .. '");\n'

end

end

if logo then

style = "node [".. target .."]{\n text: name;\n".. logo .. " icon-width: 32;}"

end

end

if style then

overpassUrl = overpassUrl .. '{{style:\n' .. style .. '\n}}\n'

end

return leftLink .. 'http://overpass-turbo.eu/?Q=' .. mw.uri.encode(overpassUrl, "PATH" ) .. coord .. runQueryRightAway .. textToDisplay .. rightLink

end

local p = {}

function p.overpass( frame )

frame.args.overpass = true

return buildquery(frame, '')

end

function p.wd( frame )

return buildquery(frame, 'wikidata')

end

function p.pt( frame )

frame.args.style = "node {\n opacity: 0;\n fill-opacity: 0;}\nnode[highway=bus_stop], way[highway=bus_stop]{\n text: name;\n icon-image: url('icons/maki/bus-18.png');\n icon-width: 18;}"

frame.args.prim = "r"

frame.args.timeout = 50

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