Модуль:WikidataCoords
WikidataCoords — модуль для шаблона {{Wikidata-coords}}. Он вызывает указанный шаблон и добавляет к его параметрам географические координаты из свойства географические координаты (P625) связанного элемента Викиданных, если координаты не были заданы вручную.
Модуль предназначен для использования через служебные шаблоны. Основной публичный интерфейс для страниц — {{Wikidata-coords}}; прямой вызов модуля не предполагается.
Основное:
- первый параметр {{Wikidata-coords}} задаёт шаблон, который будет вызван после подготовки координат;
- если
lat_degиcoordне указаны, координаты берутся из свойства P625 через Модуль:Wikidata; - пустой второй параметр означает передачу координат через
lat_*иlon_*; - значения
coord,12345678,23456789и345678910во втором параметре задают другие форматы передачи координат; coord, если он передан явно, используется как готовая строка координат и отключает преобразование по второму параметру;01используется для передачи первого числового параметра вызываемого шаблона.
Подробные сведения о режимах работы, зависимостях и параметрах приведены ниже.
Режимы работы
В модуле нет отдельных публичных функций для разных режимов: вся логика находится в execTplWithCoords. Режим определяется параметрами родительского шаблона.
Режим источника координат
| Режим | Условие | Что делает модуль |
|---|---|---|
Локальная строка coord |
Непустой параметр coord |
Не обращается к Викиданным и передаёт coord вызываемому шаблону.
|
Локальные lat_*/lon_* |
Непустой параметр lat_deg |
Не обращается к Викиданным; заполняет отсутствующие части координат значениями по умолчанию. |
| Викиданные | coord и lat_deg пустые |
Запрашивает P625 через Модуль:Wikidata с plain=true, затем раскладывает широту и долготу по параметрам.
|
Режим передачи координат
| Режим | Как выбирается | Результат |
|---|---|---|
| Именованный | Второй параметр пустой | Координаты остаются в lat_* и lon_*.
|
Числовой 12345678 |
Второй параметр равен 12345678 |
Координаты переносятся в параметры 1—8.
|
Числовой 23456789 |
Второй параметр равен 23456789 |
Координаты переносятся в параметры 2—9; 01 становится параметром 1.
|
Числовой 345678910 |
Второй параметр равен 345678910 |
Координаты переносятся в параметры 3—10; 01 становится параметром 1.
|
Строковый coord |
Второй параметр равен coord |
Координаты собираются в строку и записываются в параметр coord.
|
Если параметр coord уже был передан в родительском шаблоне, режим передачи по второму параметру не применяется: готовый coord передаётся дальше как есть.
Режим вызываемого шаблона
Модуль не содержит отдельного режима для {{coord}} или Модуль:Coordinates. Первый параметр родительского шаблона используется как имя шаблона для frame:expandTemplate.
При вызове {{wikidata-coords|coord|12345678|...}} модуль работает в числовом режиме 12345678 и затем раскрывает шаблон {{coord}}. Параметры display, scale, format, type:..., region:... и другие параметры вызываемого шаблона не разбираются кодом WikidataCoords; их дальнейшую обработку выполняют {{coord}}, Модуль:Coordinates и, при формировании метаданных координат, GeoData.
При вызове {{coord}} в формате 12345678 координаты занимают параметры 1—8, поэтому параметр 9 остаётся первым свободным числовым параметром {{coord}}. В типовых вызовах в него передаётся строка параметров координат:
|9 = type:edu
В рабочих включениях модуль используется для промежуточного вызова {{coord}}, {{ПозКарта}}, {{Геокар/Позкарта}}, {{НП/ПозКарта}}, {{Бывший НП/ПозКарта}}, {{Достопримечательность/Позкарты}} и {{НП/ПозКарта+}}.
Зависимости
- Модуль:Wikidata — прямая Lua-зависимость модуля; используется для получения значения свойства
P625. - Связанный элемент Викиданных текущей страницы, если координаты не переданы явно.
При вызове из этого модуля Модуль:Wikidata получает параметры property=P625 и plain=true. Для значения типа globecoordinate в таком режиме Модуль:Wikidata возвращает простую строку широта,долгота, а не оформленные координаты.
Вызов выполняется только в режиме plain=true; оформление координат средствами Модуль:Wikidata в данном модуле не используется.
Функции
execTplWithCoords
{{#invoke:WikidataCoords|execTplWithCoords}}
Функция читает параметры родительского шаблона, вызывает шаблон, указанный первым параметром, и передаёт ему исходные параметры вместе с координатами.
Функция рассчитана на вызов из служебного шаблона, поскольку берёт параметры из frame:getParent().args. На страницах следует использовать {{Wikidata-coords}}.
Прямой вызов вида {{#invoke:WikidataCoords|execTplWithCoords|...}} не является штатным способом использования, поскольку функция читает параметры родительского шаблона.
Алгоритм работы
- Читает параметры родительского шаблона через
frame:getParent().args. - Использует первый числовой параметр как имя вызываемого шаблона.
- Использует второй числовой параметр как формат передачи координат.
- Переносит параметр
01в числовой параметр1вызываемого шаблона. - При отсутствии
lat_degиcoordзапрашивает свойствоP625через Модуль:Wikidata. - Если координаты отсутствуют, возвращает пустую строку.
- Заполняет отсутствующие компоненты координат значениями по умолчанию.
- Преобразует координаты в выбранный формат передачи.
- Раскрывает вызываемый шаблон через
frame:expandTemplate.
Если координаты были заданы явно, а не получены из Викиданных, результат оборачивается в:
<span class="no-wikidata" data-wikidata-property-id="P625">...</span>
Параметры родительского шаблона
| Параметр | Описание |
|---|---|
1 |
Имя шаблона, который нужно вызвать. |
2 |
Формат передачи координат: 12345678, 23456789, 345678910 или coord.
|
01 |
Значение для первого числового параметра вызываемого шаблона. |
lat_deg |
Широта в градусах. Наличие непустого значения отключает запрос координат из Викиданных. |
lat_min |
Минуты широты. По умолчанию 0.
|
lat_sec |
Секунды широты. По умолчанию 0.
|
lat_dir |
Направление широты. По умолчанию N.
|
lon_deg |
Долгота в градусах. |
lon_min |
Минуты долготы. По умолчанию 0.
|
lon_sec |
Секунды долготы. По умолчанию 0.
|
lon_dir |
Направление долготы. По умолчанию E.
|
coord |
Готовая строка координат. Наличие непустого значения отключает запрос координат из Викиданных и преобразование по второму параметру. |
from |
Идентификатор элемента Викиданных, из которого нужно получить координаты. При автоматическом запросе P625 учитывается Модуль:Wikidata.
|
Все прочие параметры передаются в вызываемый шаблон без изменений.
Форматы вывода
| Формат | Поведение | Первый свободный числовой параметр после координат |
|---|---|---|
| не указан | Координаты передаются именованными параметрами lat_deg, lat_min, lat_sec, lat_dir, lon_deg, lon_min, lon_sec, lon_dir. |
Не меняется. |
12345678 |
Координаты передаются числовыми параметрами 1—8. Именованные параметры координат удаляются. |
9
|
23456789 |
Координаты передаются числовыми параметрами 2—9. Параметр 01, если он указан, остаётся первым числовым параметром. |
10
|
345678910 |
Координаты передаются числовыми параметрами 3—10. Параметр 01, если он указан, остаётся первым числовым параметром. |
11
|
coord |
Координаты собираются в строку lat_deg/lat_min/lat_sec/lat_dir/lon_deg/lon_min/lon_sec/lon_dir и передаются параметром coord. |
Не меняется. |
Если в вызове есть числовой параметр, номер которого входит в диапазон координат выбранного формата, это значение заменяется соответствующей частью координат. При формате 12345678 параметр 9 остаётся свободным; при формате 23456789 параметр 9 занят направлением долготы; при формате 345678910 первым свободным числовым параметром после координат становится 11.
Координаты из Викиданных
Модуль запрашивает свойство P625 через Модуль:Wikidata с параметром plain=true. Для координат это даёт строку широта,долгота. После получения строки модуль дополнительно удаляет все символы, кроме цифр, точки, запятой и минуса, после чего делит значение по запятой на широту и долготу.
Значения широты и долготы записываются в lat_deg и lon_deg как абсолютные значения в десятичных градусах. Направления определяются по знаку исходных координат: N/S для широты и E/W для долготы. Минуты и секунды получают значения по умолчанию 0.
Модуль рассчитан на одно значение P625. Если Модуль:Wikidata вернёт строку с несколькими значениями координат, корректная обработка такого результата не гарантируется.
Особенности и ограничения
- Запрос к Викиданным отключается только при непустом
lat_degилиcoord. Один лишьlon_degне считается полным локальным заданием координат. - Форматирование минут и секунд из десятичного значения не выполняется: координаты из Викиданных передаются как десятичные градусы, а
lat_min,lat_sec,lon_minиlon_secполучают значения по умолчанию0. - В числовых форматах
12345678,23456789и345678910именованные параметры координат удаляются перед вызовом целевого шаблона. - Если передан
coord, преобразование по второму параметру не выполняется.
Возвращаемое значение
Функция возвращает раскрытый вызываемый шаблон. Если координаты не заданы и их нет в Викиданных, возвращается пустая строка.
Служебные признаки вывода
Локально заданные координаты помечаются так:
<span class="no-wikidata" data-wikidata-property-id="P625">...</span>
Эта разметка позволяет отличать вывод, основанный на локальных параметрах, от вывода, полученного из Викиданных. Модуль не добавляет категорий отслеживания.
Пример вызова из Lua
В Lua-коде служебный шаблон может раскрываться через frame:expandTemplate. В этом случае схема параметров остаётся такой же, как при обычном шаблонном вызове:
frame:expandTemplate{
title = 'wikidata-coords',
args = {
'НП/ПозКарта',
['русское название'] = ...,
['страна'] = ...,
from = entityId,
}
}Примеры обычного использования шаблона и раскладка параметров по форматам описаны в документации {{Wikidata-coords}}.
См. также
local p = {};
-- Значения аргументов по умолчанию
local defaultArgs = {
['lat_deg'] = '',
['lat_min'] = '0',
['lat_sec'] = '0',
['lat_dir'] = 'N',
['lon_deg'] = '',
['lon_min'] = '0',
['lon_sec'] = '0',
['lon_dir'] = 'E'
};
-- Соотношение именованных и числовых параметров
local argsMap = {
'lat_deg',
'lat_min',
'lat_sec',
'lat_dir',
'lon_deg',
'lon_min',
'lon_sec',
'lon_dir'
};
-- Метод вызывает шаблон, добавляя к параметрам координаты из Викиданных
function p.execTplWithCoords(frame)
local moduleWikidata = require('Module:Wikidata');
local pFrame = frame:getParent();
local args = mw.clone(pFrame.args);
setmetatable(args, nil);
local template = mw.text.trim(args[1]);
args[1] = nil;
-- Формат вывода
local outType = args[2]
if outType then
outType = mw.text.trim(outType);
end
-- Переопределение 1 и 2 параметра
args[1] = args['01'];
args['01'] = nil;
args[2] = args['02'];
args['02'] = nil;
local isWikidata = false
if (not args.lat_deg or args.lat_deg == '') and (not args.coord or args.coord == '') then
isWikidata = true
-- Получение координат из Викиданных
frame.args = {
['property'] = 'p625',
['plain'] = true
};
local coords = moduleWikidata.formatProperty(frame);
-- Если параметры пустые, шаблон не вызывается
if not coords or coords == '' then
return '';
end
-- Удаляем возможные уточнения, вроде "около"
coords = mw.ustring.gsub(coords, '[^%d.,-]', "");
-- Преобразование координат в значения отдельных параметров
coords = mw.text.split(coords, ',', true);
local lat = tonumber(coords[1]);
local lon = tonumber(coords[2]);
if lat and lat ~= '' then
args.lat_deg = math.abs(lat);
if lat >= 0 then
args.lat_dir = 'N'
else
args.lat_dir = 'S'
end
end
if lon and lon ~= '' then
args.lon_deg = math.abs(lon);
if lon >= 0 then
args.lon_dir = 'E'
else
args.lon_dir = 'W'
end
end
end
-- Установка значений по умолчанию
for name, value in pairs(defaultArgs) do
if not args[name] or args[name] == '' then
args[name] = value;
end
end
-- Если параметры пустые, шаблон не вызывается
if (args.lat_deg == '' and args.lon_deg == '') and (not args.coord or args.coord == '') then
return '';
end
-- Если во втором параметре указан формат вывода
if outType and (not args.coord or args.coord == '') then
-- Нумерованные параметры, начиная с n-го
if outType == '12345678' or outType == '23456789' or outType == '345678910' then
local n = 0;
if outType == '23456789' then
n = 1;
elseif outType == '345678910' then
n = 2;
end
for i, name in ipairs(argsMap) do
args[i + n] = args[name];
args[name] = nil;
end
end
if outType == 'coord' then
args['coord'] = args.lat_deg ..
'/' ..
args.lat_min ..
'/' ..
args.lat_sec ..
'/' ..
args.lat_dir .. '/' .. args.lon_deg .. '/' .. args.lon_min .. '/' .. args.lon_sec .. '/' .. args.lon_dir
end
end
local out = frame:expandTemplate { title = template, args = args }
if not isWikidata then
out = '<span class="no-wikidata" data-wikidata-property-id="P625">' .. out .. '</span>'
end
return out
end
return p;