Saltu al enhavo

Modulo:Wikidata/geografio

El Vikipedio, la libera enciklopedio
Dokumentado Dokumentado


Ŝablona programado Diskutoj Lua Testoj Subpaĝoj
Modulo Esperanto English Deutsch

Modulo: Dokumentado


Se vi havas demandon pri ĉi tiu Lua-modulo, tiam vi povas demandi en la diskutejo pri Lua-moduloj. La Intervikiaj ligiloj estu metataj al Vikidatumoj. (Vidu Helpopaĝon pri tio.)
-- 2024-05-14
-- jen helpa modulo por Wikidata, kiu uzas la samajn erarmesaĝojn kiel Wikidata kaj subtenas ID por testoj

-- aliaj moduloj
local wikidata = require ("Modulo:Wikidata")
local kalkuli = require( "Modulo:Math")

local p = {}

-- funkcio nombro por alteco
-- por #invoke
function p.alteco(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	local subf = frame.args["subf"] -- ĉu subfunkcio de alia modulo aŭ ne
	
	return p._alteco(id, showerrors, default, subf)	
end	
	
-- por moduloj	
function p._alteco(id, showerrors, default, subf)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local n = entity:getBestStatements( 'P2044' )
	if (#n == 0) or (n[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
	local x = n[1].mainsnak.datavalue.value.amount
	x=tonumber(x)
	return x
end	

-- por moduloj	
function p._altecoUnuo(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local n = entity:getBestStatements( 'P2044' )
	if (#n == 0) or (n[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
	local x = n[1].mainsnak.datavalue.value.unit
	-- x=tonumber(x)
	local y = string.sub(x,32)
	if y == "Q828224" then			-- kilometroj
		x = "km"
	elseif y == "Q11573" then		-- metroj
		x = "m"		
	elseif y == "Q174728" then		-- centimetroj
		x = "cm"			
	elseif y == "Q253276" then		-- mejloj
		x = "mi"
	elseif y == "Q3710" then		-- futoj
		x = "ft"
	else
		x = "km" 					-- kilometroj
	end
	return x
end

-- por moduloj
function p._altecoM(alteco, unuo)
	local r
	
	local testo = tonumber(alteco)
	
	if testo == nil then return alteco end
	
	if unuo == "m" then
		r = alteco
	elseif unuo == "km" then	
		r = alteco * 1000
	elseif unuo == "cm" then
		r = alteco / 100
	elseif unuo == "mi" then
		r = alteco * 1609.344
	elseif unuo == "ft" then
		r = alteco * 0.3048
	else			-- supozas, ke temas pri metroj
		r = alteco
	end
	
	return r
end	

-- funkcioj pri areo kaj ties mezurunuoj, aldone kun transkalkuladoj al km² kaj ha (por informkestoj)
-- funkcio nombro por areo
-- por #invoke
function p.areo(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	local subf = frame.args["subf"] -- ĉu subfunkcio de alia modulo aŭ ne
	
	return p._areo(id, showerrors, default, subf)
end	
	
-- por moduloj	
function p._areo(id, showerrors, default, subf)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local n = entity:getBestStatements( 'P2046' )
	if (#n == 0) or (n[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
	local x = n[1].mainsnak.datavalue.value.amount
	x=tonumber(x)
	if not subf then
		x= string.gsub(x,"%.",",") -- ŝanĝo de angla punkto al esperanta komo
	end
	return x
end

-- funkcio nombro por unuo de areo
-- por #invoke
function p.areoUnuo(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._areoUnuo(id, showerrors, default)
end	
	
-- por moduloj	
function p._areoUnuo(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local n = entity:getBestStatements( 'P2046' )
	if (#n == 0) or (n[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
	local x = n[1].mainsnak.datavalue.value.unit
	-- x=tonumber(x)
	local y = string.sub(x,32)
	if y == "Q71226" then			-- kvadrataj kilometroj
		x = "km²"
	elseif y == "Q35852" then		-- hektaro
		x = "ha" -- hektaro		
	elseif y == "Q25343" then		-- kvadrataj metroj
		x = "m²"		
	elseif y == "Q2486298" then		-- kvadrataj centimetroj
		x = "cm²"			
	elseif y == "Q232291" then		-- kvadrataj mejloj
		x = "mi²"
	elseif y == "Q81292"	then	-- akreoj
		x = "ac"
	elseif y == "Q1063786"	then	-- kvadrataj coloj
		x = "in²"
	else
		x = "km²" 					-- kvadrataj kilometroj
	end
	return x
end

-- transkalkulas al kvadrataj kilometroj
-- por #invoke
function p.areoKM2(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	local mode = frame.args["mode"]
	local rondumo = frame.args["round"]
	
	return p._areoKM2(id, showerrors, default, mode, rondumo)	
end

-- por moduloj	
function p._areoKM2(id, showerrors, default, mode, rondumo)	
	local a = p.areo({ args = { id = id, showerrors = showerrors, default=default, subf = "jes"  } })
	local u = p.areoUnuo({ args = { id = id, showerrors = showerrors, default=default  } })	
	local ru = "[[Kvadrata kilometro|km²]]"
	local rondumo = tonumber(rondumo)
	if rondumo == nil or rondumo == "" then
		rondumo = 0
	end	
	
	if a ~= nil and u ~= nil then
		local r = 1
		if u == "km²" then         			-- jam estas km²
			r = a
			r = kalkuli._round(r,rondumo)			
		elseif u == "ha" then				-- el hektaroj al km²     
			r = a / 100		
			r = kalkuli._round(r,rondumo)			
		elseif u == "m²" then 				-- el metroj al km²
			r = a / 1e6
			r = kalkuli._round(r,rondumo)
		elseif u == "cm²" then				-- el cm² al km²
			r = a / 1e10
			r = kalkuli._round(r,rondumo)
		elseif u == "mi²" then				-- el mi² (kvadrataj mejloj) al km²
			r = a * 2.589988110336
			r = kalkuli._round(r, rondumo)
		elseif u == "ac" then				-- el ac (akreoj) al km²
			r = a * 0.0040468564224
			r = kalkuli._round(r, rondumo)		
		elseif u == "in²" then				-- el in² (kvadrataj coloj) al km²
			r = a * 0.0000000006451600
			r = kalkuli._round(r, rondumo)				
		else								-- taksi kiel km²
			r = a
			-- r = kalkuli._round(r, rondumo)				
		end	
		if mode == "subfunkcio" then
			return r, unuo					-- en subfunkcio la mezurunuo devas esti transdonata aparte, por ke kalkulado eblu
		else	
			r= string.gsub(r,"%.",",")     		-- ŝanĝo de angla punkto al esperanta komo			
			return r .. " " .. ru			-- eldono kun unuo
		end
		
	else
		return "neniuj valoroj"
	end	
end	

-- transkalkulas al kvadrataj metroj
-- por #invoke
function p.areoM2(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	local mode = frame.args["mode"]
	local rondumo = frame.args["round"]
	
	return p._areoM2(id, showerrors, default, mode, rondumo)	
end

-- por moduloj	
function p._areoM2(id, showerrors, default, mode, rondumo)	
	local a = p.areo({ args = { id = id, showerrors = showerrors, default=default, subf = "jes"  } })
	local u = p.areoUnuo({ args = { id = id, showerrors = showerrors, default=default  } })	
	local ru = "[[Kvadrata metro|m²]]"
	local rondumo = tonumber(rondumo)
	if rondumo == nil or rondumo == "" then
		rondumo = 0
	end	
	
	if a ~= nil and u ~= nil then
		local r = 1
		if u == "m²" then         			-- jam estas m²
			r = a
			r = kalkuli._round(r,rondumo)			
		elseif u == "ha" then				-- el hektaroj al m²     
			r = a * 10000		
			r = kalkuli._round(r,rondumo)			
		elseif u == "km²" then 				-- el km² la metroj 
			r = a * 1e6
			r = kalkuli._round(r,rondumo)
		elseif u == "cm²" then				-- el cm² al m²
			r = a / 10000
			r = kalkuli._round(r,rondumo)
		elseif u == "mi²" then				-- el mi² (kvadrataj mejloj) al m²
			r = a * 2589988.110336
			r = kalkuli._round(r, rondumo)
		elseif u == "ac" then				-- el ac (akreoj) al m²
			r = a * 4046.8564224
			r = kalkuli._round(r, rondumo)		
		elseif u == "in²" then				-- el in² (kvadrataj coloj) al m²
			r = a * 0.0006451600
			r = kalkuli._round(r, rondumo)				
		else								-- taksi kiel m²
			r = a
			-- r = kalkuli._round(r, rondumo)				
		end	
		if mode == "subfunkcio" then
			return r, unuo					-- en subfunkcio la mezurunuo devas esti transdonata aparte, por ke kalkulado eblu
		else	
			r= string.gsub(r,"%.",",")     		-- ŝanĝo de angla punkto al esperanta komo			
			return r .. " " .. ru			-- eldono kun unuo
		end
		
	else
		return "neniuj valoroj"
	end	
end	


-- transkalkulas al hektaroj
-- #invoke
function p.areoHA(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	local mode = frame.args["mode"]	
	local rondumo = frame.args["round"]	
	
	return p._areoHA(id, showerrors, default, mode, rondumo)	
end	
	
-- por moduloj	
function p._areoHA(id, showerrors, default, mode, rondumo)	
	local a = p.areo({ args = { id = id, showerrors = showerrors, default=default, subf = "jes"  } })
	local u = p.areoUnuo({ args = { id = id, showerrors = showerrors, default=default  } })	
	local ru = "[[Hektaro|ha]]"
	local rondumo = tonumber(rondumo)
	if rondumo == nil or rondumo == "" then
		rondumo = 0
	end	
	
	if a ~= nil and u ~= nil then
		local r = 1
		if u == "km²" then					-- el km² al hektaroj
			r = a * 100
			r = kalkuli._round(r,rondumo)
		elseif u == "ha" then				-- jam hektaroj      
			r = a 			
			r = kalkuli._round(r,rondumo)			
		elseif u == "m²" then				-- el metroj al hektaroj
			r = a / 1e4
			r = kalkuli._round(r,rondumo)
		elseif u == "cm²" then				-- el cm² al hektaroj
			r = a / 1e8
			r = kalkuli._round(r,rondumo)
		elseif u == "mi²" then				-- el mi² (kvadrataj mejloj) al ha
			r = a * 258.988110336
			r = kalkuli._round(r, rondumo)			
		elseif u == "ac" then				-- el ac (akreoj) al ha
			r = a * 0.40468564224
			r = kalkuli._round(r, rondumo)		
		elseif u == "in²" then				-- el in² (kvadrataj coloj) al ha
			r = a * 0.00000006451600
			r = kalkuli._round(r, rondumo)				
		else								-- taksi kiel km² kaj kalkuli al ha
			r = a * 100
			-- r = kalkuli._round(r,rondumo)			
		end	
		if mode == "subfunkcio" then
			return r, unuo					-- en subfunkcio la mezurunuo devas esti transdonata aparte, por ke kalkulado eblu
		else	
			r= string.gsub(r,"%.",",")     		-- ŝanĝo de angla punkto al esperanta komo			
			return r .. " " .. ru			-- eldono kun unuo
		end	
	else
		return "neniuj valoroj"
	end	
end	


-- funkcio por legi la nombro da subdividoj (p150)
-- por #invoke
function p.NombroSubdividoj(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._NombroSubdividoj(id, showerrors, default)	
end	
	
-- por moduloj	
function p._NombroSubdividoj(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local subdividoj = entity:getBestStatements( 'P150' )
	if (#subdividoj == 0) then
		return nil
	end	
	return #subdividoj
end	

-- Listo de la subdividoj
-- por #invoke
function p.Subdividoj(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._Subdividoj(id, showerrors, default)	
end	

-- por moduloj
function p._Subdividoj(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local subdividoj = entity:getBestStatements( 'P150' )
	local n=#subdividoj
  	if n == 0 then return nil end
		
	 local q=''
	 local t={{}}

-- kreigo de la listo
for i=1,n do
            q= 'Q' .. subdividoj[i].mainsnak.datavalue.value["numeric-id"]
			local x=mw.wikibase.label(q)
	        if x ~= nil then
				local z=mw.wikibase.sitelink(q) or 'ne konata'
				if x~=z and z~='ne konata' then x=z..'|'..x end
				t[i]=x
			else
			    t[i] =  ':d:'..q..''
			end --x ~= nil
 	end -- for
 
 -- klasifikigo de la listo
 	table.sort(t)
 	local y='[['..t[1]..']]'
   	for i=2,n-1  do y=y .. ', [[' .. t[i] .. ']]'	end
   	y=y .. ' kaj [[' .. t [n] .. ']]'
return y
end--Subdividoj

-- Legi la administran unuon de la administra unuo
-- por #invoke
function p.administraUnuo(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._administraUnuo(id, showerrors, default)
end	
	
-- por moduloj	
function p._administraUnuo(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local unuo= entity:getBestStatements( 'P131' ) 
	if (#unuo == 0) or (unuo[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    q= 'Q' .. unuo[1].mainsnak. datavalue.value["numeric-id"] 
	local x=mw.wikibase.label(q)
	local z=mw.wikibase.sitelink(q) or 'ne konata'
	if x~=z and z~='ne konata' then x='[['.. z..'|'..x..']]' end
	return x
end--AdministraUnuo

-- aldonoj de 2024-04-26, 2024-04-27

-- redonu la latitudon de objekto
-- por #invoke
function p.latitudo(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._latitudo(id, showerrors, default)	
end	

-- por moduloj	
function p._latitudo(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end	
    local koord= entity:getBestStatements( 'P625' ) 
    if (#koord == 0) or (koord[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    local lat = koord[1].mainsnak. datavalue.value["latitude"] 
    if lat ~= nil then 
    	return lat
    else 
    	return nil
    end	
	
end	

-- redonu longitudon de objekto
-- por #invoke
function p.longitudo(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._longitudo(id, showerrors, default)
end	
	
-- por moduloj	
function p._longitudo(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end	
    local koord= entity:getBestStatements( 'P625' ) 
    if (#koord == 0) or (koord[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    local long = koord[1].mainsnak. datavalue.value["longitude"] 
    if long ~= nil then 
    	return long
    else 
    	return nil
    end	
	
end	



-- redonu la latitudon de plej alta punkto
-- por #invoke
function p.plejaltalat(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._plejaltalat(id, showerrors, default)
end	
	
-- por moduloj	
function p._plejaltalat(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local plejalta= entity:getBestStatements( 'P610' ) 
	if (#plejalta == 0) or (plejalta[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    q= 'Q' .. plejalta[1].mainsnak. datavalue.value["numeric-id"] 
    -- get wikidata entity
	local entity2 = mw.wikibase.getEntity(q)
	if not entity2 then return nil end
    local koord= entity2:getBestStatements( 'P625' ) 
    if (#koord == 0) or (koord[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    local lat = koord[1].mainsnak. datavalue.value["latitude"] 
    if lat ~= nil then 
    	return lat
    else 
    	return nil
    end

end

-- redonu la longitudon de plej alta punkto
-- por #invoke
function p.plejaltalong(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]

	return 	p._plejaltalong(id, showerrors, default)
end	

-- por moduloj 
function p._plejaltalong(id, showerrors, default)
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local plejalta= entity:getBestStatements( 'P610' ) 
	if (#plejalta == 0) or (plejalta[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    q= 'Q' .. plejalta[1].mainsnak. datavalue.value["numeric-id"] 
    -- get wikidata entity
	local entity2 = mw.wikibase.getEntity(q)
	if not entity2 then return nil end
    local koord= entity2:getBestStatements( 'P625' ) 
    if (#koord == 0) or (koord[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    local long = koord[1].mainsnak. datavalue.value["longitude"] 
    if long ~= nil then 
    	return long
    else 
    	return nil
    end    
    
end


-- redonu la latitudon de plej malalta punkto
-- por #invoke
function p.plejmalaltalat(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._plejmalaltalat(id, showerrors, default)
end	

-- por moduloj	
function p._plejmalaltalat(id, showerrors, default)
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local plejalta= entity:getBestStatements( 'P1589' ) 
	if (#plejalta == 0) or (plejalta[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    q= 'Q' .. plejalta[1].mainsnak. datavalue.value["numeric-id"] 
    -- get wikidata entity
	local entity2 = mw.wikibase.getEntity(q)
	if not entity2 then return nil end
    local koord= entity2:getBestStatements( 'P625' ) 
    if (#koord == 0) or (koord[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    local lat = koord[1].mainsnak. datavalue.value["latitude"] 
    if lat ~= nil then 
    	return lat
    else 
    	return nil
    end

end

-- redonu la longitudon de plej malalta punkto
-- por #invoke
function p.plejmalaltalong(frame)
	local id = frame.args["id"]	
	local showerrors = frame.args["showerrors"]
	local default = frame.args["default"]
	
	return p._plejmalaltalong(id, showerrors, default)
end	

-- por moduloj	
function p._plejmalaltalong(id, showerrors, default)	
	if default then showerrors = nil end

	-- get wikidata entity
	local entity = mw.wikibase.getEntity(id)
	if not entity then
		if showerrors then return wikidata.printError("entity-not-found") else return default end
	end
	local plejalta= entity:getBestStatements( 'P1589' ) 
	if (#plejalta == 0) or (plejalta[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    q= 'Q' .. plejalta[1].mainsnak. datavalue.value["numeric-id"] 
    -- get wikidata entity
	local entity2 = mw.wikibase.getEntity(q)
	if not entity2 then return nil end
    local koord= entity2:getBestStatements( 'P625' ) 
    if (#koord == 0) or (koord[1].mainsnak.snaktype ~= "value") then
		return nil
	end	
    local long = koord[1].mainsnak. datavalue.value["longitude"] 
    if long ~= nil then 
    	return long
    else 
    	return nil
    end    
    
end

return p