Zum Inhalt springen
Wikipedia Die freie Enzyklopädie

Benutzer:Antonsusi/Spielwiese/Modul:Coordinate

aus Wikipedia, der freien Enzyklopädie

--

 local p = {} 
 local LuaWiki = require( "Module:LuaWiki" )
 --[=[
 function LatRange(fNumber)
 if not tonumber(fNumber) then
 ErrMsg(ErrCode='NAN', ErrFun='LatRange',ErrData= "input=".. tostring(fNumber))
 return nil
 end
 if fNumber > 90 then return 90; end
 if fNumber < -90 then return -90; end
 return fNumber;
 end
 function WGS84toCH1903(label,lat,lon,prec)
 local b_lbl = (label or "" ) ~= "";
 local n = floor (tonumber(prec) or 0);
 if( lat < 45.7 or lat > 47.9 or lon < 5.8 or lon > 10.6 ) then
 ErrMsg(ErrCode='OOR', ErrFun='WGS84toCH1903',ErrData="keine")
 end
 -- genaue Berechnung, Lua kann sich das leisten
 local phi = (lat * 3600 - 169028.66 ) /10000;
 local lambda = (lon * 3600 - 26782.5) / 10000;
 local x = 200147.07 + 308807.95 * phi + 3745.25 * lambda^2 + 76.63 * phi^2 + 119.79 * phi^3 - 194.56 * lambda^2 * phi;
 local y = 600072.37 + 211455.93 * lambda - 10938.51 * lambda * phi - 0.36 * lambda * phi^2 - 44.54 * lambda^3;
 x = (floor(x* 10^n + 0.5))/10^n;
 y = (floor(y* 10^n + 0.5))/10^n;
 return x,y;
 end
 ]=]
 local function ErrMsg(ErrCode, ErrFun, ErrData)
 local ErrText = ""
 local T_Error ={
 ['NAN'] = "Keine Zahl", -- not a number
 ['OOR'] = "Wert nicht im gültigen Bereich", -- out of range
 ['BSTR'] = "Ungültiger Parameterstring", -- bad text
 ['BPAR'] = "Ungültiger Parametername", -- bad parameter
 ['DIVZ'] = "Division durch Null!" -- Muss abgefangen werden
 }
 -- ErrCode = nil ? Dann "Fehler in Fehlermeldung"
 if not ErrCode then
 return nil
 end
 ErrText = "<span class='error'>Funktion " .. ErrFun .. ": " ..T_Error[ErrCode]
 if ErrData then
 ErrText = ErrText .. " Daten: <code>".. ErrData .."</code>"
 end
 ErrText = ErrText .."</span>"
 return ErrText
 end
 local function DMS2dez(Grad,Min,Sek) -- voellig, egal, wenn einer 61 Min eingibt!
 Grad = tonumber(Grad)
 Min = tonumber(Min)
 Sek = tonumber(Sek)
 if not Grad or not Min or not Sek then
 return 0,false
 end
 return Grad + Min /60 + Sek /3600 , true
 end
 local function LatDMS(tbl)
 local data = 0;
 if not (tbl[4]=="N" or tbl[4]=="S") then
 data = tostring(tbl[4])
 ErrMsg("BSTR","LatDMS", data)
 return 0, false
 end
 data = DMS2dez(tbl[1],tbl[2],tbl[3])
 if not data then
 ErrMsg('NAN','LatDMS',table.concat(tbl," ! "))
 return 0, false
 end
 if tbl[4]=="S" then data = 0 - data; end
 if data < -90 or data >90 then
 ErrMsg('OOR', 'LatDMS',data)
 return 0, false
 end
 return data,true
 end
 local function LonDMS(tbl)
 local data = 0
 if not (tbl[4]=="O" or tbl[4]=="E" or tbl[4]=="O" )then
 data = tostring(tbl[4])
 ErrMsg('BPAR', 'LonDMS',data)
 return 0, false
 end
 data = DMS2dez(tbl[1],tbl[2],tbl[3])
 if not data then
 ErrMsg('NAN','LonDMS', table.concat(tbl," ! "))
 return 0, false
 end
 if tbl[4]=="W" then data = 0 - data; end
 if data < -180 or data >180 then
 ErrMsg('OOR','LonDMS',"data=" .. tostring(data))
 return 0, false
 end
 return data, true
 end
 -- function wb: kurz fuer "wikibool". Emulation der Wikilogik: Gibt true zurueck, wenn para nicht leer ist.
 local function wb(para)
 return (para or "") ~= "";
 end
 -- function splitbyslash: Emulation von titleparts. Rückgabe per table.
 local function splitbyslash(para)
 local tbl = {};
 local rest= para;
 local teil=""
 local pos
 for idx= 1,4 do
 pos = string.find(rest,'/',1,true);
 if not pos then
 table.insert(tbl,rest)
 if idx == 2 then
 table.insert(tbl,2,'0')
 table.insert(tbl,2,'0')
 end
 if idx == 3 then
 table.insert(tbl,3,'0')
 end
 break
 end
 if pos == 1 then
 table.insert(tbl,"")
 rest = string.sub(rest,2,-1)
 else
 teil = string.sub(rest, 1,pos-1)
 rest = string.sub(rest,pos+1, -1)
 table.insert(tbl,teil)
 end
 end
 if tonumber(tbl[1]) and tonumber(tbl[2]) and tonumber(tbl[3]) and not tonumber(tbl[4]) then
 return tbl, true
 end
 return tbl, false
 end
 function p.Execute(frame)
 local lat = 0
 local lon = 0
 local T_Para = {} -- nimmt die Parameter auf
 local T_bPara = {} -- logischer Wert nach Wikilogik
 local T_temp = {}
 -- Einzelzuweisung fuer benannte Indices und damit auch ganz fehlende Parameter (nil) als Leerstring eingefuegt werden.
 T_Para['NS'] = frame.args['NS'] or "";
 T_Para['EW'] = frame.args['EW'] or "";
 T_Para['type'] = frame.args['type'] or "";
 T_Para['region'] = frame.args['region'] or "";
 T_Para['globe'] = frame.args['globe'] or "";
 T_Para['dim'] = frame.args['dim'] or "";
 T_Para['elevation'] = frame.args['elevation'] or "";
 T_Para['pop'] = frame.args['pop'] or "";
 T_Para['name'] = frame.args['name'] or "";
 T_Para['simple'] = frame.args['simple'] or "";
 T_Para['article'] = frame.args['article'] or "";
 T_Para['text'] = frame.args['text'] or "";
 T_Para['sortkey'] = frame.args['sortkey'] or "";
 T_Para['tooltip'] = frame.args['tooltip'] or "";
 T_Para['tooltipformat'] = frame.args['tooltipformat'] or "";
 T_Para['map'] = frame.args['map'] or "";
 T_Para['mapsize'] = frame.args['mapsize'] or "";
 T_Para['maplevel'] = frame.args['maplevel'] or "";
 T_Para['maptype'] = frame.args['maptype'] or "";
 T_Para['maplabel'] = frame.args['maplabel'] or "";
 T_Para['maplayer'] = frame.args['maplayer'] or "";
 for sidx, str in pairs(T_Para) do
 T_bPara[sidx] = wb(T_Para[sidx]) -- str nicht genutzt
 end
 if not T_bPara['NS'] or not T_bPara['EW'] then
 ErrMsg('BPAR','Execute','no NS or no EW') -- NS und EW sind zwingend noetig
 return "",false
 end
 if not tonumber(T_Para['NS']) then
 T_temp = splitbyslash(T_Para['NS'])
 if #T_temp < 4 then
 ErrMsg('BTXT','Execute','zu wenig Teile im Slashstring NS')
 return "",false
 end
 lat = LatDMS(T_temp)
 else
 lat = tonumber(T_Para['NS'])
 end
 if not tonumber(T_Para['EW']) then
 T_temp = splitbyslash(T_Para['EW'])
 if #T_temp < 4 then
 ErrMsg('BSTR','Execute','zu wenig Teile im Slashstring EW')
 return "",false
 end
 lon = LonDMS(T_temp)
 else
 lon = tonumber(T_Para['EW'])
 end
 -- Rest fehlt noch
 return tostring(lat) .. "\n" .. tostring(lon)
 end
 return p
 -- 

AltStyle によって変換されたページ (->オリジナル) /