Benutzer:Antonsusi/Spielwiese/Modul:Coordinate
--
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 --