Modul:Ortsfakta
Utseende
Dokumentation [visa] [redigera] [historik] [rensa sidcachen]
p = {}
local wikidata = require('Modul:Wikidata2').formatStatementsFromLua
local aux = require('Modul:Ortsfakta/Aux').aux
function lankod2lan(lankod)
local lan = ''
if lankod == '01' then lan = 'Stockholm'
elseif lankod == '03' then lan = 'Uppsala'
elseif lankod == '04' then lan = 'Södermanland'
elseif lankod == '05' then lan = 'Östergötland'
elseif lankod == '06' then lan = 'Jönköping'
elseif lankod == '07' then lan = 'Kronoberg'
elseif lankod == '08' then lan = 'Kalmar'
elseif lankod == '09' then lan = 'Gotland'
elseif lankod == '10' then lan = 'Blekinge'
elseif lankod == '12' then lan = 'Skåne'
elseif lankod == '13' then lan = 'Halland'
elseif lankod == '14' then lan = 'Västra Götaland'
elseif lankod == '17' then lan = 'Värmland'
elseif lankod == '18' then lan = 'Örebro'
elseif lankod == '19' then lan = 'Västmanland'
elseif lankod == '20' then lan = 'Dalarna'
elseif lankod == '21' then lan = 'Gävleborg'
elseif lankod == '22' then lan = 'Västernorrland'
elseif lankod == '23' then lan = 'Jämtland'
elseif lankod == '24' then lan = 'Västerbotten'
elseif lankod == '25' then lan = 'Norrbotten'
else lan = ''
end
return lan
end
function lankod(frame) -- hämtar länskod från i första hand det län och i andra hand den kommun som objektet ingår i
local INOM_ADMINISTRATIVT_OMRADE = 'P131'
local INOM_NUVARANDE_ADMINISTRATIVT_OMRADE = 'P3842'
local SVERIGES_LAN = 'Q200547'
local SVERIGES_KOMMUNER = 'Q127448'
local LANSKOD = 'P507'
local KOMMUNKOD_I_SVERIGE = 'P525'
local t = {}
t = wikidata({entityId=frame.args.item, property=INOM_NUVARANDE_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_LAN,raw='ja'}) -- hämta län som objektet ingår i
if t and t[1] then
return wikidata({property=LANSKOD,noref='ja',nolink='ja',entityId=t[1].item}) -- returnera länskoden
end
t = wikidata({entityId=frame.args.item, property=INOM_NUVARANDE_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_KOMMUNER,raw='ja'}) -- hämta kommun om län ej var angivet
if t and t[1] then
k = wikidata({property=KOMMUNKOD_I_SVERIGE,noref='ja',nolink='ja',entityId=t[1].item,avoidqualifier='P582'})
if k then
return mw.ustring.sub(k,1,2) -- returnera de två första siffrorna i kommunkoden
end
end
t = wikidata({entityId=frame.args.item, property=INOM_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_LAN,raw='ja'}) -- hämta län som objektet ingår i
if t and t[1] then
return wikidata({property=LANSKOD,noref='ja',nolink='ja',entityId=t[1].item}) -- returnera länskoden
end
t = wikidata({entityId=frame.args.item, property=INOM_ADMINISTRATIVT_OMRADE,noref='ja',nolink='ja',getonly=SVERIGES_KOMMUNER,raw='ja'}) -- hämta kommun om län ej var angivet
if t and t[1] then
k = wikidata({property=KOMMUNKOD_I_SVERIGE,noref='ja',nolink='ja',entityId=t[1].item,avoidqualifier='P582'})
if k then
return mw.ustring.sub(k,1,2) -- returnera de två första siffrorna i kommunkoden
end
end
return ''
end
function p.positionskartnamn(frame) -- kartbild för länet som objektet tillhör. används av till exempel mallen "Ortsfakta Sverige WD"
return mw.getCurrentFrame():preprocess('{{Kartposition Sverige '..lankod2lan(lankod(frame))..'|bild}}')
end
function p.positionskarta(frame) -- kartlokalisering (Geolocator) för länet som objektet tillhör. används av till exempel mallen "Ortsfakta Sverige WD"
return lankod2lan(lankod(frame))
end
function rat(data, precision)
local s = {}
if not data then
return s
end
s.lat_dec = math.abs(data.latitude)
s.long_dec = math.abs(data.longitude)
if data.latitude > 0 then
s.lat_NS = 'N'
else
s.lat_NS = 'S'
end
if data.longitude > 0 then
s.long_EW = 'E'
else
s.long_EW = 'W'
end
local frac = 0
local prec = data.precision
if precision == 'grad' then
prec = 1
end
if precision == 'minut' then
prec = 0.016666666666667
end
if precision == 'sekund' then
prec = 0.00027777777777778
end
if prec < (data.precision or 0) then
-- TODO, här kan man varna för att den begärda precisionen är "finare" än precisionen som finns i Wikidata
-- TODO2, hur bäst ta hänsyn till siffror utan precision?
end
if prec == 1 then
s.lat_g, frac = math.modf(math.abs(data.latitude) + 0.5)
s.long_g, frac = math.modf(math.abs(data.longitude) + 0.5)
else
if prec == 0.016666666666667 then
s.lat_g, frac = math.modf(math.abs(data.latitude))
s.lat_m, frac = math.modf(frac * 60 + 0.5)
if s.lat_m>=60 then
s.lat_m = 0
s.lat_g = s.lat_g + 1
end
s.long_g, frac = math.modf(math.abs(data.longitude))
s.long_m, frac = math.modf(frac * 60 + 0.5)
if s.long_m>=60 then
s.long_m = 0
s.long_g = s.long_g + 1
end
else
if prec == 0.00027777777777778 then
s.lat_g, frac = math.modf(math.abs(data.latitude))
s.lat_m, frac = math.modf(frac * 60)
s.lat_s, frac = math.modf(frac * 60 + 0.5)
if s.lat_s >= 60 then
s.lat_s = 0
s.lat_m = s.lat_m + 1
end
if s.lat_m >= 60 then
s.lat_m = 0
s.lat_g = s.lat_g + 1
end
s.long_g, frac = math.modf(math.abs(data.longitude))
s.long_m, frac = math.modf(frac * 60)
s.long_s, frac = math.modf(frac * 60 + 0.5)
if s.long_s >= 60 then
s.long_s = 0
s.long_m = s.long_m + 1
end
if s.long_m >= 60 then
s.long_m = 0
s.long_g = s.long_g + 1
end
else
if prec == 0.000027777777777778 then
s.lat_g, frac = math.modf(math.abs(data.latitude))
s.lat_m, frac = math.modf(frac * 60)
s.lat_s, frac = math.modf(frac * 600 + 0.5)/10
if s.lat_s >= 60 then
s.lat_s = 0
s.lat_m = s.lat_m + 1
end
if s.lat_m >= 60 then
s.lat_m = 0
s.lat_g = s.lat_g + 1
end
s.long_g, frac = math.modf(math.abs(data.longitude))
s.long_m, frac = math.modf(frac * 60)
s.long_s, frac = math.modf(frac * 600 + 0.5)/10
if s.long_s >= 60 then
s.long_s = 0
s.long_m = s.long_m + 1
end
if s.long_m >= 60 then
s.long_m = 0
s.long_g = s.long_g + 1
end
else
s.lat_g = math.abs(data.latitude)
s.long_g = math.abs(data.longitude)
end
end
end
end
return s
end
function p.data(frame)
return data(frame.args)
end
function data(args)
if args[1] == 'ref' then
if not args.index then
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518'})
if data then
return data[1].ref
else
return nil
end
else
local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw ='true'})
if not vilken or #vilken == 0 then
return nil
end
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', rank = 'valid', preferqualifiervalue = vilken[1].item, modifyqualifiertime = 'Y'})
if not data or #data == 0 then
return nil
end
return data[1].ref
end
end
if args[1] == 'year' then
if not args.index then
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518', noref='true', modifyqualifiertime = 'Y'})
if data then
return data[1].datum
else
return nil
end
else
local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true'})
if not vilken or #vilken == 0 then
return nil
end
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', noref='true', rank = 'valid', preferqualifiervalue = vilken[1].item, modifyqualifiertime = 'Y'})
if not data or #data == 0 then
return nil
end
return data[1].datum
end
end
if args[1] == 'number' then
if not args.index then
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518', noref='true'})
if not data then
return nil
end
local data2 = tostring(data[1].amount)
if string.sub(data2, 1, 1) == '+' then
return string.sub(data2, 2)
else
return data2
end
else
local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true'})
if not vilken or #vilken == 0 then
return nil
end
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', noref='true', rank = 'valid', preferqualifiervalue = vilken[1].item})
if not data or #data == 0 then
return nil
end
local data2 = tostring(data[1].amount)
if string.sub(data2, 1, 1) == '+' then
return string.sub(data2, 2)
else
return data2
end
end
end
if args[1] == 'unit' then
if not args.index then
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', avoidqualifier='P518', noref='true'})
if data and #data > 0 then
return data[1].unit
else
return nil
end
else
local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true'})
if not vilken or #vilken == 0 then
return nil
end
local data = wikidata({entityId = args.item, property = args.property, sortbytime = 'chronological', enbarten = 'yes', raw = 'true', preferqualifier ='P518', noref='true', rank = 'valid', preferqualifiervalue = vilken[1].item})
if not data or #data == 0 then
return nil
end
return data[1].unit
end
end
if args[1] == 'plats' then
local vilken = wikidata({entityId = args.item, property = args.rangeproperty, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index, raw =' true', nolink = 'true'})
if vilken and #vilken > 0 then
return vilken[1].value
end
end
if args[1] == 'kommun' then
if tonumber(args.limit) and tonumber(args.limit) > 0 then
if (wikidata({entityId = args.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ, numberofclaims = 'true'}) or 0) > tonumber(args.limit) then
return nil
end
end
local s = {}
local data = wikidata({entityId = args.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ, claimindex=args.index})
return data
end
if args[1] == 'bild' then
local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'en'})
if data and #data >0 then
data = data[1]
if data then
return data.value
end
end
end
if args[1] == 'bild2' then
local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'en'})
if #data > 1 then
data = data[2]
if data then
return data.value
end
end
end
if args[1] == 'bildtext' then
local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'sv'})
if #data > 0 then
data = data[1]
if data then
return data.bildtext
end
end
end
if args[1] == 'bildtext2' then
local data = wikidata({entityId = args.item, property = 'P18', raw = 'true', noref='true', enbarten = 'true', langpref = 'sv'})
if #data > 1 then
data = data[2]
if data then
return data.bildtext
end
end
end
return nil
end
function p.data2(frame)
local args = frame.args
local q = data(args)
local index = tonumber(args.index)
if q and q ~= '' then
return q
end
local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true', nolink = 'true'})
local s = {}
local s2 = ''
if qw and #qw > 0 then
for i, j in pairs( qw ) do
args.item = j.item
local s1 = 1
repeat
args.index = tostring(s1)
s1 = s1 + 1
local a = data(args)
if a and a ~= '' then
local f = false
for i2, j2 in pairs(s) do
if a == j2 then
f = true
end
end
if not f then
table.insert(s, a)
end
end
until not a or a == ''
end
return s[index]
end
end
function p.coord(frame)
local args = frame.args
local data = wikidata({entityId = args.item, property = 'P625', raw = 'true', noref='true', enbarten = 'true', nogeodataparser = 'true'})
if not data or #data == 0 then
return nil
end
local s = rat(data[1], args.precision or '')
local a = s.lat_g .. '°'
if s.lat_m then
a = a .. s.lat_m .. '′'
end
if s.lat_s then
a = a .. s.lat_s .. '″'
end
a = a .. s.lat_NS
local a = a .. ',' .. s.long_g .. '°'
if s.long_m then
a = a .. s.long_m .. '′'
end
if s.long_s then
a = a .. s.long_s .. '″'
end
a = a .. s.long_EW
if not args[1] then
return a
end
return s[args[1]]
end
function auto(args)
local f = tonumber(data({ 'number', item = args.item, property = 'P1082', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
local a = tonumber(data({ 'number', item = args.item, property = 'P2046', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
if not f or not a then
return nil
end
if a == 0 then
return 'NaN'
end
local b = f/a
if b > 100 then
return math.modf(b+0.5)
else
if b > 10 then
return math.modf(b*10 + 0.5)/10
else
if b < 0.1 then
return math.modf(b*10000 + 0.5)/10000
else
if b < 1 then
return math.modf(b*1000 + 0.5)/1000
end
end
end
end
return math.modf(b*100 + 0.5)/100
end
function p.auto(frame)
local args = frame.args
return auto(args)
end
function lan(args)
local s = {}
local data = wikidata({entityId = args.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ, raw = 'true'})
if not data then
return nil
end
for i, j in pairs(data) do
local data2 = {}
data2 = wikidata({entityId = j.item, property = args.property, noref='true', avoidqualifier='P582', getonly=args.typ2, raw = 'true', nolink = args.nolink})
for i2, j2 in pairs(data2) do
local traff = false
for i3, j3 in pairs(s) do
if j3 == j2.value then
traff = true
end
end
if not traff then
table.insert(s, j2.value)
end
end
end
if args.index and tonumber(args.index) and tonumber(args.index) <= #s then
return s[tonumber(args.index)]
else
return nil
end
end
function p.lan(frame)
local args = frame.args
return lan(args)
end
function p.bestar(frame)
local args = frame.args
if args[1] == 'plats2' then
local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true', nolink = 'true'})
return aux(qw[1].item, qw[1].value) or '-'
elseif args[1] == 'auto' then
local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true'})
if not qw or #qw == 0 then
return nil
end
return auto({item = qw[1].item})
elseif args[1] == 'annat' then
local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true'})
if not qw or #qw == 0 then
return nil
end
return wikidata({entityId = qw[1].item, property = args.property})
else
local qw = wikidata({entityId = args.item, property = 'P527', raw = true, claimindex = args.turindex, raw = 'true'})
if not qw or #qw == 0 then
return nil
end
return data({ args[1], item = qw[1].item, property = args.property})
end
end
function p.autom(frame)
local args = frame.args
local f = tonumber(data({ 'number', item = args.item, property = 'P1082', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
local a = tonumber(data({ 'number', item = args.item, property = 'P2046', index = args.index, typ = args.typ, rangeproperty = args.rangeproperty}))
if not f or not a then
return nil
end
if a == 0 then
return 'NaN'
end
local b = f/a
if b > 100 then
return math.modf(b+0.5)
else
if b > 10 then
return math.modf(b*10 + 0.5)/10
else
if b < 0.1 then
return math.modf(b*10000 + 0.5)/10000
else
if b < 1 then
return math.modf(b*1000 + 0.5)/1000
end
end
end
end
return math.modf(b*100 + 0.5)/100
end
function p.label(frame)
local l = frame.args.label
local qid = frame.args.item
if not l or l == '' then
if not qid or qid == '' then
l = mw.wikibase.label()
else
l = mw.wikibase.label(qid)
end
end
if not l then
l = mw.title.getCurrentTitle().text
end
return l
end
function p.rat(data, precision)
return rat(data, precision)
end
return p
Kategorier:
- Ortsfakta WD
- Mallar och moduler som använder Property:P18
- Mallar och moduler som använder Property:P131
- Mallar och moduler som använder Property:P507
- Mallar och moduler som använder Property:P525
- Mallar och moduler som använder Property:P527
- Mallar och moduler som använder Property:P582
- Mallar och moduler som använder Property:P625
- Mallar och moduler som använder Property:P1082
- Mallar och moduler som använder Property:P2046
- Mallar och moduler som använder Property:P3842