Модуль:USGS GeoJSON (Bk;rl,&USGS GeoJSON)
Перейти к навигации
Перейти к поиску
Этот модуль оценён как альфа-версия. Он готов для тестирований и может быть использован на небольшом количестве страниц для обнаружения проблем. Предложения по изменениям и дополнениям приветствуются. |
Этот модуль требует отладки. Не применяйте его широко, пока не протестируете. |
Модуль используется в шаблоне {{USGS_GeoJSON}}.
Функции
[править код]- wikitable — возвращает таблицу Wikitable, основанную на данных USGS и Wikidata.
- 1 параметр — год, за который нужно построить таблицу.
Исходные данные
[править код]Пример файла с данными USGS:
- c:Data:USGS.gov/Earthquakes of 2010.map — загружается с ресурса USGS в формате GeoJSon.
Маппинг USGS с Wikidata:
- c:Data:USGS_Earthquakes.tab — обновляется ботом TabulistBot.
Пример использования
[править код]{{#invoke:USGS_GeoJSON|wikitable|2010}}
local p = {};
function p.wikitable (frame)
local p_year = assert(frame.args[1],"Не указан параметр 'year!'")
local datapage = "USGS.gov/Earthquakes_of_"..p_year..".map"
local sourcetable = mw.ext.data.get(datapage).data.features
local wdtabdata = "USGS_Earthquakes.tab"
local catdat = "CATDAT_EQ_"..p_year..".tab"
local wd = mw.ext.data.get(wdtabdata).data
local cd = mw.ext.data.get(catdat).data
local content = ""
local counter=0
function spairs(t, order)
-- collect the keys
local keys = {}
for k in pairs(t) do keys[#keys+1] = k end
-- if order function given, sort by it by passing the table and keys a, b,
-- otherwise just sort the keys
if order then
table.sort(keys, function(a,b) return order(t, a, b) end)
else
table.sort(keys)
end
-- return the iterator function
local i = 0
return function()
i = i + 1
if keys[i] then
return keys[i], t[keys[i]]
end
end
end
function getquid(usgs)
for x, y in pairs(wd) do
if type(y[2])~='nil' then
if mw.text.trim(y[2])==mw.text.trim(usgs) then
--mw.log(usgs.." x="..x.." y="..y[9].."#")
return y[1]
end
end
end
return null
end;
function _getcatdatitem(usgs)
for x, y in pairs(cd) do
if mw.text.trim(usgs)==y[2] then
return y
end
end
return null
end;
function _getlangrange (lng)
local range = 1
if lng=='ruwiki' then range=1
elseif lng=='enwiki' then range=2
elseif lng=='eswiki' or lng=='dewiki' then range=3
else range=4
end
return range;
end;
-- getSitelinks returns the collection of sitelinks for qid and the number of sitelinks
local _getsitelinks = function(qid, entity)
local label, lng
local rulabel = mw.wikibase.getLabelByLang(qid, 'ru' )
local slinks = entity.sitelinks
if not slinks then return rulabel, 'ruwiki'
end
for k, v in spairs(slinks, function(t, a, b) return _getlangrange(t[b].site) > _getlangrange(t[a].site) end) do
label=v.title;
lng=v.site;
break;
end
return label, lng, rulabel
end
function makerow (e)
--e.id <- USGS ID, will be required for wikidata later
local tm = tonumber(mw.ustring.sub(e.properties.time,1,10)) --Unix epochtime in millisecondslocal geojson = mw.text.jsonEncode(g)
local pr = {}
local st = 'style="white-space: nowrap;" data-sort-value="'..tm..'|'
local language = mw.getLanguage('ru')
local cde = _getcatdatitem(e.id)
local val
-- заполнение таблицы
-- wikidata --
local qid = getquid(e.id)
local entity = mw.wikibase.getEntity(qid)
for i=1,15 do pr[i]='—' end
pr[1] = counter
pr[3] = frame:expandTemplate{ title = 'coord', args = {e.geometry.coordinates[1],e.geometry.coordinates[0]}}
pr[4] = language:formatNum(e.properties.mag)
pr[5] = language:formatNum(e.geometry.coordinates[2])
pr[7] = e.properties.sig
pr[15] = frame:extensionTag{
name = 'ref',
args = {name=e.id, group='usgs'},
content =
frame:expandTemplate{title = 'cite web',
args = {
url='https://earthquake.usgs.gov/earthquakes/eventpage/'..e.id,
title=e.properties.place,
website='earthquake.usgs.gov',
accessdate='2019-01-06',
lang='en'
}}
}
if cde then
pr[6]=frame:expandTemplate{ title = 'Флагификация',args = {cde[11]}} --cde country
pr[8]=cde[1] --cde num
pr[9]=cde[14] --cde deaths
pr[10]=cde[15] -- cde injured
pr[11]=cde[16] -- cde homeless
pr[12]=cde[19] --economic loss
pr[13]=cde[20] --insurance loss
end
if not entity then --no wikidata
pr[2] = st..frame:callParserFunction( '#time: d.m.Y H:i:s', '@'..tm, 'ru')
else --with wikidata
local wd_label, wd_lang, wd_rulabel = _getsitelinks(qid, entity)
if not wd_label then wd_label="На Wikidata не указана метка на русском языке" end
if wd_lang=='ruwiki' then
pr[2] = st..'[['..wd_label..'|'..frame:callParserFunction( '#time: d.m.Y H:i:s', '@'..tm, 'ru')..']]'
else
pr[2] = st..frame:expandTemplate{ title = 'iw',args = {wd_rulabel,frame:callParserFunction( '#time: d.m.Y H:i:s', '@'..tm, 'ru'),string.sub(wd_lang,1,2),wd_label}}
end
-- 6 country
local country
for k, v in pairs(mw.wikibase.getBestStatements( qid, 'P17' )) do
country=mw.wikibase.getLabel(v.mainsnak.datavalue.value.id)
end
qargs = {
property='P17',
from=qid,
plain=false,
['claim-module'] = 'Wikidata/Places',
['claim-function'] = 'formatCountryClaimWithFlag',
before = '',
separator = '</br>',
conjunction = '</br>',
after = ''
}
pr[6] = 'data-sort-value="'..country..'"|'..frame:expandTemplate{ title = 'wikidata', args = qargs }
--14 image
local claims18 = entity.claims["P18"]
local claims242 = entity.claims["P242"]
local prop
if claims18 then prop="P18" end
if claims242 then prop="P242" end --P242 (map) will be found if there are both properties, P18 and P242
if claims18 or claims242 then
qargs = {
property=prop,
from=qid,
size="100x100px"
}
pr[14]=frame:expandTemplate{ title = 'wikidata', args = qargs } --wikidata image
else
pr[14]='<div class="zoom_img" >[[Файл:Earthquake - The Noun Project gray.svg|50px]]</div>' --wikidata image
end
--wikidata source
pr[15]=pr[15]..'\n[[Файл:Wikidata_stamp_rec_light.png|50px|link=d:'..qid..']]'
end
return table.concat(pr,'||')
end
for f, e in spairs(sourcetable, function(t, a, b) return t[b].properties.time > t[a].properties.time end) do
local tm = tonumber(mw.ustring.sub(e.properties.time,1,10))
-- each earthquake data is a table too
counter = counter + 1
content = content..'|-\n' --new line
content = content..'|'..makerow(e)..'\n' -- CELL DATA
--if counter==5 then break end --DEBUG
end;
-- Create table
table_content = '{| class="wikitable sortable"; style="font-size: 73%; width: 40%;" \n'
table_content = table_content .. '|+ Перечень значительных и разрушительных землетрясений '..p_year..' года по данным Геологической службы США'..
frame:extensionTag{
name = 'ref',
args = {name="earthquakes2010", group='usgs'},
content =
frame:expandTemplate{title = 'cite web',
args = {
url='https://earthquake.usgs.gov/earthquakes/browse/significant.php?year=2010#sigdef',
title='Significant Earthquakes - 2010',
website='earthquake.usgs.gov',
accessdate='2019-01-06',
lang='en'
}}
}..' и CATDAT'..
frame:extensionTag{
name = 'ref',
args = {name="JD"}
}..'\n'
table_content = table_content .. '! N !! Дата !! Эпицентр !! Магнитуда !! Глубина, км !! Страна !! К.знач. USGS !! № CATDAT !! Жертвы !! Ранения !! Лишённые крова !! Экономический ущерб, млн$ !! Страховой убыток, млн$ !! Изображение !! Источники\n'
table_content = table_content .. '\n' .. content
table_content = table_content .. '\n|}'
return table_content
end
function p.listeriarow ()
local pr,usgs_e,cd_e,noaa_e = {},{},{},{}
local frame = mw.getCurrentFrame()
local args = frame:getParent().args
local p_year = string.sub(args.tm,1,4)
local datapage = "USGS.gov/Earthquakes_of_"..p_year..".map"
local sourcetable = mw.ext.data.get(datapage).data.features
local catdat = "CATDAT_EQ_"..p_year..".tab"
local cd = mw.ext.data.get(catdat).data
local noaadat = "NOAA_Earthquakes_"..p_year..".tab"
local noaa = mw.ext.data.get(noaadat).data
local language = mw.getLanguage('ru')
local flg
local usgs_ID = mw.text.killMarkers(args.p3196)
--USGS table
usgs_e = null;
for x, y in pairs(sourcetable) do
if y.id==usgs_ID then
usgs_e=y
end
end
--CATDAT table
cd_e = null;
for x, y in pairs(cd) do
if y[2]==usgs_ID then
cd_e=y
end
end
--NOAA table
noaa_e = null;
for x, y in pairs(noaa) do
--mw.log('^'..usgs_ID..'^'..x..'^'..y[1]..'^')
if y[1]==usgs_ID then
noaa_e=y
end
end
if not usgs_e then -- в таблице с данными USGS должны быть указаны все землетрясения, как с sig>600, так и включенные в другие источники (например CATDAT)
--mw.log(usgs_ID)
return
end
for i=1,16 do pr[i]='—' end
if usgs_e then
local tm = tonumber(mw.ustring.sub(usgs_e.properties.time,1,10)) --Unix epochtime in millisecondslocal geojson = mw.text.jsonEncode(g)
local st = 'data-sort-value="'..tm..'|'
local tmstr = frame:callParserFunction( '#time: d.m.Y H:i:s', '@'..tm, 'ru')
tmstr = mw.ustring.gsub(tmstr,'%s','<br/>')
pr[1] = '|-style="font-size: 100%";\n'..'|'..args.number
--pr[2] = st..frame:callParserFunction( '#time: d.m.Y H:i:s', '@'..tm, 'ru')
if args.lang and args.lang ~='ru' then
pr[2] = st..frame:expandTemplate{title = 'iw',args = {args.label,tmstr,args.lang,args.sname}}
else
if mw.ustring.find(args.label,'[[',1,true) then
args.label = mw.ustring.gsub(args.label,'[%[%]]','')
args.label = mw.ustring.gsub(args.label,'|.*','')
--pr[2] = st..mw.ustring.gsub(args.label,'[%[%]]','')
end
pr[2] = st..'[['..args.label..'|'..tmstr..']]'
end
pr[3] = 'style="width: 50px"|'..frame:expandTemplate{ title = 'coord', args = {usgs_e.geometry.coordinates[1],usgs_e.geometry.coordinates[0]}}--эпицентр
pr[4] = language:formatNum(usgs_e.properties.mag) --магнитуда
pr[5] = language:formatNum(usgs_e.geometry.coordinates[2]) --гипоцентр
local countrytab = mw.text.split(args.clabels,',',true)
local flgarg = args.cflags
flgarg = mw.ustring.gsub(flgarg,'http://commons.wikimedia.org/wiki/Special:FilePath/','[[Файл:')
flgarg = mw.ustring.gsub(flgarg,'|.*','')
flgarg = mw.ustring.gsub(flgarg,'.svg','.svg|20px]]')
local flgtab = mw.text.split(flgarg,',',true)
for x,country in pairs(countrytab) do
country = mw.text.trim(country)
if pr[6]=='—' then
pr[6] = 'data-sort-value="'..country..'"|'
end
if country ~='открытое море' then
if flgtab[x] then
flg = mw.text.trim(flgtab[x])
end
country = '<span class="nowrap"><span class="flagicon">'..flg..'</span> </span><span class="wrap">[['..country..']]</span>'
--country = frame:expandTemplate {title='Флагификация', args={country}}
else
country = '[['..country..']]'
end
pr[6]= pr[6]..country..'\n'
end
pr[7] = usgs_e.properties.sig--USGS Ksig
--CATDAT data
if cd_e then
pr[8]=cd_e[1] --cde num
local keysort = cd_e[14]
local pos = mw.ustring.find(keysort,'—')
if pos==nil then pos=0 end
keysort = mw.ustring.sub(keysort,pos+1)
keysort = mw.ustring.gsub(keysort,'[^0-9,]','')
keysort = tonumber(keysort,10)
if not keysort then keysort=0 end
cd_e[14]=mw.ustring.gsub(cd_e[14],' ',' ')
pr[10]='data-sort-value="'..keysort..'|'..cd_e[14] --cde deaths
keysort = cd_e[15]
keysort = mw.ustring.gsub(keysort,'[^0-9,]','')
keysort = tonumber(keysort,10)
if not keysort then keysort=0 end
cd_e[15]=mw.ustring.gsub(cd_e[15],' ',' ')
pr[11]='data-sort-value="'..keysort..'|'..cd_e[15] --cde injured
--cde homeless
keysort = cd_e[16]
keysort = mw.ustring.gsub(keysort,',.*','')
keysort = mw.ustring.gsub(keysort,'[^0-9,]','')
keysort = tonumber(keysort,10)
if not keysort then keysort=0 end
cd_e[16]=mw.ustring.gsub(cd_e[16],' ',' ')
pr[12]='data-sort-value="'..keysort..'|'..'<span class="nowrap">'..mw.ustring.gsub(cd_e[16],',.*','')..'<\span>'
--making comment
pos = mw.ustring.find(cd_e[16],',')
if pos~=nil then
local comment = 'Статистика посчитана по итогам всех подземных толчков (в т.ч. форшоков и афтершоков), и отражена по отношению к основному землетрясению, произошедшему '..mw.ustring.sub(cd_e[16],pos+1)
local tag = frame:extensionTag{name = 'ref',args = {group='k'}, content = comment}
pr[12]=pr[12]..tag
end
keysort = cd_e[19]
pos = mw.ustring.find(keysort,'—')
if pos==nil then pos=0 end
keysort = mw.ustring.sub(keysort,pos+1)
keysort = mw.ustring.gsub(keysort,',','.')
keysort = mw.ustring.gsub(keysort,'[^0-9,.]','')
keysort = tonumber(keysort,10)
if not keysort then keysort=0 end
cd_e[19]=mw.ustring.gsub(cd_e[19],' ',' ')
pr[13]='data-sort-value="'..keysort..'|'..mw.ustring.gsub(cd_e[19],'%.',',') --cde economic loss
keysort = cd_e[20]
pos = mw.ustring.find(keysort,'—')
if pos==nil then pos=0 end
keysort = mw.ustring.sub(keysort,pos+1)
keysort = mw.ustring.gsub(keysort,',','.')
keysort = mw.ustring.gsub(keysort,'[^0-9,.]','')
keysort = tonumber(keysort,10)
if not keysort then keysort=0 end
cd_e[20]=mw.ustring.gsub(cd_e[20],' ',' ')
pr[14]='data-sort-value="'..keysort..'|'..mw.ustring.gsub(cd_e[20],'%.',',') --cde insurance loss
--exceptions
if mw.ustring.find(cd_e[20],'обращений',1,true) or mw.ustring.find(cd_e[20],'ущерба',1,true) then
tag = frame:extensionTag{name = 'ref',args = {group='k'}, content = cd_e[20]}
pr[14]='н/д'..tag
end
end
if noaa_e then
pr[9]=noaa_e[2] --noaa ID
end
pr[15] = args.pct
local wditem
wditem = mw.ustring.gsub(args.item,'[%[%]]','')
wditem = mw.ustring.gsub(wditem,'|.*','')
--[==[
pr[16] = frame:extensionTag{
name = 'ref',
args = {name=usgs_e.id, group='usgs'},
content =
frame:expandTemplate{title = 'cite web',
args = {
url='https://earthquake.usgs.gov/earthquakes/eventpage/'..usgs_e.id,
title=usgs_e.properties.place,
website='earthquake.usgs.gov',
accessdate='2019-01-06',
lang='en'
}}
}
--]==]
pr[16] = frame:extensionTag{
name = 'ref',
args = {name=usgs_e.id, group='usgs'},
content = '[https://earthquake.usgs.gov/earthquakes/eventpage/'..usgs_e.id..' '..usgs_e.properties.place..'] <i>earthquake.usgs.gov</i>. Проверено 6 января 2019.'
}
--+ NOAA
if noaa_e then
pr[16] = pr[16]..'\n'..frame:extensionTag{
name = 'ref',
args = {name=noaa_e[13]..noaa_e[2], group='noaa'},
content = '[https://www.ngdc.noaa.gov/nndc/struts/results?eq_0='..noaa_e[2]..'&t=101650&s=13&d=22,26,13,12&nd=display Significant earthquake '..noaa_e[13]..'] <i>www.ngdc.noaa.gov</i>. Проверено 7 февраля 2019.'
}
end
pr[16] = pr[16]..'<br/>'..'[[Файл:Wikidata_stamp_rec_light.png|50px|link='..wditem..']]'
end
return table.concat(pr,'||')
end
return p