Module:Titled coords
Appearance
This module is rated as alpha. It is ready for third-party input, and may be used on a few pages to see if problems arise, but should be watched. Suggestions for new features or changes in their input and output mechanisms are welcome. |
Description
[edit]This module generates titled coordinates from raw coordinates extracted from Wikidata. Currently, {{Wikidata}} does not support adding a title when requesting coordinates. So, when {{GeoGroup}} is used on a page with coordinates directly from Wikidata, the OpenStreetMap page will show an ordinal number as the title for each listed coordinate rather than a useful title. Using this module fixes the problem.
Pages should not call this module directly but rather use {{Titled_coords}} as it supports both named and unnamed parameters. The template also extracts the raw coordinates from Wikidata using {{Wikidata}}. |
Usage
[edit]{{#invoke:Titled coords|main|Wikidata raw coords|title|options}}
Wikidata raw coords is the unformatted raw coordinates where each field is separated by an underscore.
e.g. 50_27_40_N_122_17_42_W
This module uses the Wikidata property:
-- *** Version 1.1 (Alpha) ***
local p = {}
function p.main(frame)
local raw_coords = frame.args[1]
local title = frame.args[2] or ""
local options = frame.args[3] or ""
local has_seconds = 1
local output = "", coords, sidx, eidx
local lat_d, lat_m, lat_s, lat_NS, lon_d, lon_m, lon_s, lon_WE
-- ** Display the raw coordinates obtained from {{wikidata}} **
if string.find(options,"raw") ~= nil then
output = output .. "raw_coords:" .. raw_coords
end
-- ** Extract the individual fields from the raw coordinates **
-- ** See https://www.lua.org/manual/5.3/manual.html#6.4.1 **
sidx, _, lat_d, lat_m, lat_s, lat_NS, lon_d, lon_m, lon_s, lon_WE =
string.find(raw_coords, "(%d+)/(%d+)/(%d+%.?%d*)/(%a)/(%d+)/(%d+)/(%d+%.?%d*)/(%a)")
if sidx == nil then -- extract without seconds
sidx, eidx, lat_d, lat_m, lat_NS, lon_d, lon_m, lon_WE =
string.find(raw_coords, "(%d+)/(%d+)/(%a)/(%d+)/(%d+)/(%a)")
if sidx == nil then
return output .. "<br/>Error: Failed to process raw_coords: " .. raw_coords
end
if string.find(options,"idx") ~= nil then
output = output .. "<br/>start: " .. sidx .. " end: " .. eidx .. " lat_d: " .. lat_d
return output
end
has_seconds = 0
end
if string.find(options,"debug") ~= nil then
if has_seconds == 1 then
output = output .. "<br/>raw_coords:" .. raw_coords .. "<br/>lat dms = " .. lat_d .. "|" .. lat_m .. "|" .. lat_s .. "|" .. lat_NS ..
"<br/>lon dms = " .. lon_d .. "|" .. lon_m .. "|" .. lon_s .. "|" .. lon_WE
else
output = output .. "<br/>raw_coords:" .. raw_coords .. "<br/>lat dm = " .. lat_d .. "|" .. lat_m .. "|" .. lat_NS ..
"<br/>lon dms = " .. lon_d .. "|" .. lon_m .. "|" .. lon_WE
end
end
-- ** URL encode spaces in the title with + **
local enc_title = title:gsub(" ", "+")
-- ** Call {{coord}} passing individual fields and setting the title **
local type_title = "type:mountain&title=" .. enc_title
if has_seconds == 1 then
coords = frame:expandTemplate{title='coord', args= { lat_d, lat_m, lat_s, lat_NS, lon_d, lon_m, lon_s, lon_WE, type_title}}
else
coords = frame:expandTemplate{title='coord', args= { lat_d, lat_m, lat_NS, lon_d, lon_m, lon_WE, type_title}}
-- ** Doesn't like me adding these args **
--"type:mountain","format=dms","name=" .. name}}
end
if output ~= "" then
return output .. "<br/>" .. coords
end
return coords
end
return p
--[[ Tried to invoke {{wikidata}} directly but not working:
local raw_coords = frame:expandTemplate{title='wikidata', args={'property','page=' .. page,'raw','coord'}}
]]