Módulo:Prop latilong

De Wikipedia, la enciclopedia libre
Este módulo no tiene página de documentación[crear]
-- Módulo creado en marzo de 2024 para generar latitud y longitud a partir de las coordenadas contenidas en la propiedad p625
-- Se utiliza en la plantilla ficha de cráter lunar, debido a que latitud y longitud han desaparecido de Wikidata
 	
-- Se invoca de la siguiente manera:
-- * {{#invoke:Prop_latilong|PROLATI|1={{#property:P625}}}} (genera la LATITUD)
-- * {{#invoke:Prop_latilong|NOS    |1={{#property:P625}}}} (genera la posición Norte o Sur [N o S])
-- * {{#invoke:Prop_latilong|PROLONG|1={{#property:P625}}}} (genera la LONGITUD)
-- * {{#invoke:Prop_latilong|EOW    |1={{#property:P625}}}} (genera la posición Este u Oeste [E o O])

-- El parámetro 1 siempre serán las coordenadas recibidas de la llamada al módulo desde la propiedad P625
-- El valor de la propiedad P625 tiene este aspecto cuando se carga: "7°33'36"S, 87°40'12"E"
-- aunque puede tener menor precisión ("7°33'S, 87°40'E" o "7°S, 87°E")

local p = {}

function CoordsFromString(s)
	local	lat_deg, lat_min, lat_sec, lat_pos,
			lon_deg, lon_min, lon_sec, lon_pos
	lat_deg, lat_min, lat_sec, lat_pos, lon_deg, lon_min, lon_sec, lon_pos =
		mw.ustring.match(s, "([0-9]+)°([0-9]+)'([0-9]+)"([NS]), ([0-9]+)°([0-9]+)'([0-9]+)"([EW])", 0)
	if not lon_pos then
		lat_sec, lon_sec = 0, 0
		lat_deg, lat_min, lat_pos, lon_deg, lon_min, lon_pos =
			mw.ustring.match(s, "([0-9]+)°([0-9]+)'([NS]), ([0-9]+)°([0-9]+)'([EW])", 0)
		if not lon_pos then
			lat_min, lon_min = 0, 0
			lat_deg, lat_pos, lon_deg, lon_pos =
				mw.ustring.match(s, "([0-9]+)°([NS]), ([0-9]+)°([EW])", 0)
			if not lon_pos then
				-- lat_deg, lon_deg = 0, 0
				return nil, nil -- invalid coordinates
			end
		end
	end
	local lat, lon
	lat = tonumber(lat_deg) + tonumber(lat_min)/60 + tonumber(lat_sec)/3600
	if lat_pos == "S" then lat = -lat end
	lon = tonumber(lon_deg) + tonumber(lon_min)/60 + tonumber(lon_sec)/3600
	if lon_pos == "W" then lon = -lon end
	return lat, lon
end

function p.NOS(frame)
	local s = frame.args[1]
	if s then
		local lat, lon = CoordsFromString(s)
		if lat then
			if lat < 0 then
				return 'S'
			else
				return 'N'
			end
		end
	end
end

function p.EOW(frame)
	local s = frame.args[1]
	if s then
		local lat, lon = CoordsFromString(s)
		if lon then
			if lon < 0 then
				return 'W'
			else
				return 'E'
			end
		end
	end
end

function p.PROLATI(frame)
	local s = frame.args[1]
	if s then
		local lat, lon = CoordsFromString(s)
		if lat then
			return math.abs(lat)
		end
	end
end

function p.PROLONG(frame)
	local s = frame.args[1]
	if s then
		local lat, lon = CoordsFromString(s)
		if lon then
			return math.abs(lon)
		end
	end
end

return p