Modul:Mapframe
![]() | Denne modulen brukes på over 70 000 sider. Det anbefales at endringer testes i en sandkasse før de legges inn. Diskuter gjerne også endringer på diskusjonssiden først. |
Denne modulen benyttes av kartmalen {{Kart}}. Se dokumentasjonssiden til denne malen for bruk og instruksjoner.
local math_mod = require( "Module:Math" ) local p = {} function p.map(frame) -- return "<pre>" .. mw.text.jsonEncode(frame:getParent().args, mw.text.JSON_PRETTY) .. "</pre>" return map2(mw.getCurrentFrame():getParent().args) end function map2(args) local id = args['id'] or args[1] or nil if id == "" then id = nil end local entity = mw.wikibase.getEntity(id) if not id then if not entity then return "" end id = entity.id end local width = tonumber(args["width"]) or 350 local height = tonumber(args["height"]) or width local zoom = args["zoom"] or 8 local lat = args["latitude"] or args["lat"] local lon = args["longitude"] or args["lon"] local includeProperty = args["include property"] or nil local wdlat,wdlon = wdCoords(entity) if not lat or not lon then lat = wdlat lon = wdlon end if not lon or not lat then return "" end local text = args["text"] or mw.wikibase.label(id) local align = args["align"] or 'right' local geojson = {} local stroke = "#ff0000" local opacity = 0.1 if includeProperty then opacity = 0.0 end showEntity(geojson,id,entity,stroke,title,opacity) if args['marker'] and lat and lon then local point = mappoint(lat,lon) table.insert(geojson, point) end if includeProperty then includeProp(geojson,entity,includeProperty) end local newargs = { ['height'] = height, ['width'] = width, ['align'] = align, ['latitude'] = lat, ['longitude'] = lon, ['zoom'] = zoom or 8 } if frameless then newargs['frameless'] = 'frameless' end if text then newargs['text'] = text end return mw.getCurrentFrame():extensionTag('mapframe', mw.text.jsonEncode(geojson), newargs) -- return "<pre>" .. mw.text.jsonEncode(geojson, mw.text.JSON_PRETTY) .. "</pre>" end function includeProp(geojson,entity,prop) if not entity or not prop then return nil end local claims = entity.claims[prop] or nil if not claims then return nil end local stroke = "#ff0000" for idx,claim in pairs(claims) do local qualifiers = claim.qualifiers local endtime = nil if qualifiers then endtime = claim.qualifiers["P582"] or nil end -- todo: Test on end time simplified. This assumes that all end times are in the past if not endtime then local id = claim.mainsnak.datavalue.value['id'] or nil visEntity(geojson,id,stroke,0.1) end end return geojson end -- Visualize an entity through boundary, marker with name of entity. geojson updated by showEntity function visEntity(geojson,id,stroke,opacity) if not id then return nil end local entity = mw.wikibase.getEntity(id) if not entity then return nil end return showEntity(geojson,id,entity,stroke,nil,opacity,"createLink") end function showEntity(geojson,id,entity,stroke,title,opacity,createLink) local wdlat,wdlon = wdCoords(entity) local text = title or mw.wikibase.label(id) local link = mw.wikibase.sitelink(id) if createLink and text and link then text = "[[" .. link .. "|" .. text .. "]]" end description = nil if createLink then if entity.claims["P18"] then local claim = selectSingleClaim(entity.claims["P18"]) local image = claim.mainsnak.datavalue.value or nil if image then description = "[[File:" .. image .. "]]" end end end local shape = geoshape(id,stroke,opacity) table.insert(geojson, shape) local line = geoline(id,stroke) table.insert(geojson, line) if wdlat and wdlon then local point = mappoint(wdlat,wdlon,text,description) table.insert(geojson, point) end return geojson end function wdCoords(entity) local wdlat,wdlon = nil,nil if entity.claims["P625"] then local claim = selectSingleClaim(entity.claims["P625"]) local coord = claim.mainsnak.datavalue.value or nil wdlat = coord["latitude"] or nil wdlon = coord["longitude"] or nil end return wdlat,wdlon end function wdGeoShape(entity) local shape = nil if entity.claims["P3896"] then local claim = selectSingleClaim(entity.claims["P3896"]) local value = claim.mainsnak.datavalue.value or nil if value then local shape = { ["type"] = "ExternalData", ["service"] = "page", ["title"] = value } return shape end end return nil end function selectSingleClaim(claims) if not claims then return nil end local selectedClaim = nil for idx,claim in pairs(claims) do if claim.rank == 'preferred' then return claim end if claim.rank == 'normal' then if not selectedClaim then selectedClaim = claim end end end return selectedClaim end function mappoint(latitude,longitude,title,description) local point = {} point["type"] = "Feature" local geo = {} geo["type"] = "Point" local pos = {} geo["coordinates"] = pos -- ensure the coordinates are not too long for the geojson geo["coordinates"][1] = math_mod._round( longitude, 6 ) geo["coordinates"][2] = math_mod._round( latitude, 6 ) local prop = {} if title then prop["title"] = title end if description then prop["description"] = description end prop["marker-size"] = "small" point["properties"] = prop point["geometry"] = geo return point end function geoline(id,stroke) local line = { ["type"] = "ExternalData", ["service"] = "geoline", ["ids"] = id, ['properties'] = { ["stroke"] = stroke, ["stroke-width"]= 2 } } return line end function geoshape(id,stroke,opacity) local line = { ["type"] = "ExternalData", ["service"] = "geoshape", ["ids"] = id, ['properties'] = { ["stroke"] = stroke, ["stroke-width"]= 2, ["fill-opacity"] = opacity or 0.1 } } return line end return p