Модуль: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>&nbsp;</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],' ','&nbsp;')
				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],' ','&nbsp;')
				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],' ','&nbsp;')
				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],' ','&nbsp;')
				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],' ','&nbsp;')
				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