モジュール:WikidataCoord
表示
このモジュールは入力した経緯度を{{Coord}}に変換して返します。入力する経緯度はウィキデータから取得した値をそのまま渡すことができます。経緯度は変換を経て{{Coord}}に渡され、そのままテンプレートを展開して表示します。
引数の書式
[編集]ウィキデータから取得した経緯度は下記のように、分と秒がアポストロフィーとクォーテーションマークの表記になっています。これは、本モジュールへの入力として使用できます。
- 入力:
{{#property:P625|from=Q218501}}
- 出力(コード):
47°34'12"N, 52°40'55"W
- 出力(表示):47°34'12"N, 52°40'55"W
分と秒がプライムとダブルプライム(′
と″
)表記の場合も入力できます。
座標が10進法表記の場合も入力できます。
- 例:
53.67667°N 112.82861°W
座標オプション(region、scaleなど)はregion:JP_scale:10000
のように、第2引数でまとめて入力します。このモジュールでは特に変換せず、そのまま{{Coord}}に渡します。名前付き引数(|display=
、|name=
など)もそのまま{{Coord}}に渡します。
テンプレートでの使い方
[編集]ウィキデータから経緯度を取得して、座標を生成する使い方では下記のようにします。
{{#invoke:WikidataCoord|main|{{#property:P625|from={{{1|}}}}}|{{{2|}}}|display={{{display|}}}|format={{{format|}}}|name={{{name|}}}|notes={{{notes|}}}}}
require('strict')
local getArgs = require('Module:Arguments').getArgs
local patterns = {
'(%d+)°(%d+)'([%d%.]+)"([NS]),%s*(%d+)°(%d+)'([%d%.]+)"([EW])', -- if the returned data looks like 55°13'12"N, 23°17'17"E
'(%d+)°(%d+)'([NS]),%s*(%d+)°(%d+)'([EW])', -- if the returned data looks like 54°24'N, 25°25'E
'(%d+)°(%d+)[′\']([%d%.]+)[″\"]([NS]),?%s*(%d+)°(%d+)[′\']([%d%.]+)[″\"]([EW])', -- when args[1] is a dms string that uses quotes or primes
'(%d+)°(%d+)[′\']([NS]),?%s*(%d+)°(%d+)[′\']([EW])', -- when args[1] is a dms string that uses quotes or primes, bit shorter format
'(%d+%.?%d*)°([NS]),?%s*(%d+%.?%d*)°([EW])', -- when args[1] is a decimal degrees string
}
local params = {'display', 'format', 'name', 'notes'}; -- {{coord}} template paramters
--[[--------------------------< I S _ S E T >------------------------------------------------------------------
Whether variable is set or not. A variable is set when it is not nil and not empty.
]]
local function is_set( var )
return not (var == nil or var == '');
end
--[[--------------------------< M A I N >----------------------------------------------------------------------
Template entry point. This function takes up to two unnamed positional parameters:
1 = coordinate string typically from a call to Wikidata like this: {{#property:P625|from=Q...}}
2 = coordinate parameters; see Template:Coord
Also takes the named parameters |display=, |format=, |name=, |notes= which it passes on to {{coord}}
Reformats the Wikidata coordinate string into unnamed parameters for {{coord}}
{{#invoke:WikidataCoord|main|{{#property:P625|from={{{1}}}}}|{{{2}}}|display={{{display}}}|format={{{format}}}|name={{{name}}}|notes={{{notes}}}}}
]]
local function main (frame)
local args = getArgs(frame);
local lat_long = {}; -- table of lat/long coords extracted from wikidata return
if not is_set (args[1]) then -- in case wikidata returns nothing (happens when Q... is wrong)
return '<span style="font-size:100%" class="error">{{WikidataCoord}} – 座標データがありません</span>'; -- error message and quit
else
for _, pattern in ipairs (patterns) do
lat_long[1], lat_long[2], lat_long[3], lat_long[4], lat_long[5], lat_long[6], lat_long[7], lat_long[8] =
mw.ustring.match (args[1], pattern)
if lat_long[1] then
break;
end
end
end
if not lat_long[1] then
return '<span style="font-size:100%" class="error">{{WikidataCoord}} – 無効な座標データです</span>'; -- wikidata returned something else
end
if is_set (args[2]) then -- coordinate parameters are in second unnammed positional parameter
table.insert (lat_long, args[2]); -- add coordinate parameters as next positional parameter after coordnates
end
for _, param in ipairs (params) do
if is_set (args[param]) then
lat_long[param] = args[param]; -- add the named parameters if they have a value
end
end
if args._debug then
return table.concat ({'<code style="color:inherit; background:inherit; border:none;">{{coord|', table.concat (lat_long, '|' ), '}}</code>'});
end
return frame:expandTemplate ({title = 'coord' or 'coord2' , args=lat_long}); -- invoke template {{coord}} with wikidata lat/long
end
--[[--------------------------< E X P O R T E D F U N C T I O N >--------------------------------------------
]]
return {main = main}