Modul:Geo: Unterschied zwischen den Versionen

K
Entfernte den Schutz von „Modul:Geo
(getPLZList() optimiert)
K (Entfernte den Schutz von „Modul:Geo“)
 
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
local p = {}
local p = {}
local com = require("Module:Common")
local com = require("Modul:Common")
local que = require("Module:Queries")
local que = require("Modul:Queries")
local str = require("Modul:String")
local str = require("Modul:String")


Zeile 23: Zeile 23:
function p.GetHausnummerZahl(frame)
function p.GetHausnummerZahl(frame)
-- #invoke wrapper
-- #invoke wrapper
return p.getHausnummerZahl(frame.args[1])
return p.getHausnummerZahl(frame.args[1] or "")
end
end


function p.getHausnummerZahl(hausnummer)
function p.getHausnummerZahl(hausnummer)
-- Hausnummer ohne Buchstaben extrahieren, um damit PLZ zu ermitteln
-- Hausnummer ohne Buchstaben extrahieren, um damit PLZ zu ermitteln
local hausnr = ""
return tonumber(string.match("0" .. (hausnummer or ""), "%d+"))
if not com.isEmpty(hausnummer) then
hausnr = tonumber(string.match("0" .. hausnummer, "%d+"))
end
return hausnr
end
end


function p.GetPLZ(frame)
function p.GetPLZ(frame)
local strasseArg = frame.args["Straße"] or ""
-- Vorlage zum Testen in Konsole: =p.GetPLZ({args={["Straße"]="",["Hausnummer"]=""}})
local hausnrArg = tostring(frame.args["Hausnummer"]) or ""
local plz = ""
 
local strasse = frame.args["Straße"] or ""
local strassen = str.split(strasseArg, ";") or {}
local hausnummer = frame.args["Hausnummer"] or ""
local hausnummern = str.split(hausnrArg, ";") or {}
-- Nur die erste Hausnummer aus einer eventuellen Liste extrahieren
 
-- Bei Gebäude-Komplexen mit mehreren Hausnummern ist in Fürth nicht unbedingt anzunehmen,
-- Ned schön, funktioniert aber. Iterative Multistraßen-Lösung wäre fein!
-- Bei Gebäude-Komplexen mit mehreren Straßen ist in Fürth nicht unbedingt anzunehmen,
-- dass diese sich auf mehrere PLZs verteilen
-- dass diese sich auf mehrere PLZs verteilen
local strasse = str.strip(strassen[1])
hausnummer = str.splitAndStrip(hausnummer, ";")
local hausnummer = str.strip(hausnummern[1])
if #hausnummer > 0 then
 
hausnummer = hausnummer[1]
return p.getPLZ(strasse, hausnummer)
else
hausnummer = ""
end
plz = p.getPLZ(strasse, hausnummer)
return plz
end
end


function p.getPLZ(strasse, hausnummer)
function p.getPLZ(strasse, hausnummer)
local plz = 0;
-- mw.log("getPLZ(" .. (strasse or "nil") .. ", " .. (hausnummer or "nil") .. ")")
local plz = ""
local hausnummer = p.getHausnummerZahl(hausnummer) -- Buchstaben hinter der Nummer abschneiden


if not com.isEmpty(strasse) then
if    strasse == "Breslauer Straße" then plz = 90766 -- momentan gibt es keine Gebäude in 90768 Unterfürberg und eine Hausnummer-Grenze nicht bekannt
 
elseif strasse == "Brunnenweg" then -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
local hausnummerZahl = 0;
elseif strasse == "Brückenstraße" then plz = 90768 -- momentan gibt es keine Gebäude in 90765 Mannhof und eine Hausnummer-Grenze nicht bekannt
if not com.isEmpty(hausnummer) then
elseif strasse == "Frankenschnellweg" then -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
hausnummerZahl = p.getHausnummerZahl(hausnummer)
elseif strasse == "Fuchsstraße" then plz = 90768 -- momentan gibt es keine Gebäude in 90763 Südstadt und eine Hausnummer-Grenze nicht bekannt
end
elseif strasse == "Heckenweg" then plz = 90762 -- momentan gibt es keine Gebäude in 90766 Schwand/Eigenes Heim und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Höfener Straße" then plz = 90763 -- momentan gibt es keine Gebäude in 90762 Stadtgrenze und eine Hausnummer-Grenze nicht bekannt
if    strasse == "Breslauer Straße" then plz = 90766 -- momentan gibt es keine Gebäude in 90768 Unterfürberg und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Käppnerweg" then -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Brunnenweg" then plz = 0 -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Stadelner Straße" then plz = 90768 -- momentan gibt es keine Gebäude in 90765 Mannhof und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Brückenstraße" then plz = 90768 -- momentan gibt es keine Gebäude in 90765 Mannhof und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Südwesttangente" then -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Frankenschnellweg" then plz = 0 -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Südwesttangente" then -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Fuchsstraße" then plz = 90768 -- momentan gibt es keine Gebäude in 90763 Südstadt und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Schwabacher Straße" then
elseif strasse == "Heckenweg" then plz = 90762 -- momentan gibt es keine Gebäude in 90766 Schwand/Eigenes Heim und eine Hausnummer-Grenze nicht bekannt
if hausnummer % 2 == 0 then if hausnummer < 66 then plz = 90762 else plz = 90763 end -- gerade H.nr.
elseif strasse == "Höfener Straße" then plz = 90763 -- momentan gibt es keine Gebäude in 90762 Stadtgrenze und eine Hausnummer-Grenze nicht bekannt
elseif   hausnummer < 53 then plz = 90762 else plz = 90763 end -- ungerade H.nr.
elseif strasse == "Käppnerweg" then plz = 0 -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Vacher Straße" then
elseif strasse == "Stadelner Straße" then plz = 90768 -- momentan gibt es keine Gebäude in 90765 Mannhof und eine Hausnummer-Grenze nicht bekannt
if hausnummer % 2 == 0 then if hausnummer < 250 then plz = 90766 else plz = 90768 end -- gerade H.nr.
elseif strasse == "Südwesttangente" then plz = 0 -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif   hausnummer < 225 then plz = 90766 else plz = 90768 end -- ungerade H.nr.
elseif strasse == "Südwesttangente" then plz = 0 -- momentan gibt es keine Gebäude und eine Hausnummer-Grenze nicht bekannt
elseif strasse == "Würzburger Straße" then
elseif strasse == "Schwabacher Straße" then
if hausnummer % 2 == 0 then if hausnummer < 36 then plz = 90762 elseif hausnummer < 400 then plz = 90766 else plz = 90768 end -- gerade H.nr.
if hausnummerZahl % 2 == 0 then if hausnummerZahl < 66 then plz = 90762 else plz = 90763 end -- gerade H.nr.
elseif   hausnummer < 9 then plz = 90762 elseif hausnummer < 401 then plz = 90766 else plz = 90768 end -- ungerade H.nr.
elseif   hausnummerZahl < 53 then plz = 90762 else plz = 90763 end -- ungerade H.nr.
else
elseif strasse == "Vacher Straße" then
local plz_ask = que.getValues(strasse, "PLZ", true) -- alle anderen Straßen haben nur eine PLZ, die auf deren Seite vemerkt ist
if hausnummerZahl % 2 == 0 then if hausnummerZahl < 250 then plz = 90766 else plz = 90768 end -- gerade H.nr.
if #plz_ask == 1 then -- mehr als eine oder keine PLZ?
elseif   hausnummerZahl < 225 then plz = 90766 else plz = 90768 end -- ungerade H.nr.
plz = plz_ask[1]
elseif strasse == "Würzburger Straße" then
if hausnummerZahl % 2 == 0 then if hausnummerZahl < 36 then plz = 90762 elseif hausnummerZahl < 400 then plz = 90766 else plz = 90768 end -- gerade H.nr.
elseif   hausnummerZahl < 9 then plz = 90762 elseif hausnummerZahl < 401 then plz = 90766 else plz = 90768 end -- ungerade H.nr.
else
plz = que.getValues(strasse, "PLZ", true)[1] -- alle anderen Straßen haben nur eine PLZ, die auf deren Seite vemerkt ist
end
end
end
end
-- mw.log("plz = " .. plz)
return plz
return plz
end
end


function p.GetPLZList(frame)
function p.GetPLZList(frame)
local sep = frame.args.sep or ";"
return table.concat(p.getPLZList(), frame.args.sep or ";")
local plzTable = p.getPLZList()
local plzList = str.list(plzTable, sep)
return plzList
end
end


Zeile 103: Zeile 94:
function p.Stadtteil2PLZ(frame)
function p.Stadtteil2PLZ(frame)
-- mw.logObject(frame)
-- mw.logObject(frame)
local plzlist = ""
local plz = ""
local stadtteile = frame.args[1]
local stadtteile = frame.args[1] or ""
if not com.isEmpty(stadtteile) then
if stadtteile ~= "" then
local stadtteilTable = str.split(stadtteile, ";")
local stadtteile = str.splitAndStrip(stadtteile, ";")
local plztable = p.stadtteil2PLZ(stadtteilTable)
plz = p.stadtteil2PLZ(stadtteile)
plzlist = str.list(plztable, ";")
plz = table.concat(plz, ";")
end
end
-- mw.log(plzlist)
-- mw.log(plz)
return plzlist
return plz
end
end


function p.stadtteil2PLZ(stadtteile)
function p.stadtteil2PLZ(stadtteile)
-- gibt die Postleitzahlen der Stadtteile als table zurück
-- gibt die Postleitzahlen der Stadtteile als table zurück
local plztable = {}
local plz_table = {}
if not com.isEmpty(stadtteile) then
if type(stadtteile) == "table" then
if type(stadtteile) == "table" then
for _, s in pairs(stadtteile) do
for _, s in pairs(stadtteile) do
for _, p in pairs(que.getValues(s, "PLZ", true)) do -- p ist string
for _, p in pairs(que.getValues(s, "PLZ", true)) do -- p ist string
plz_table[tonumber(p)] = true -- diese Mechanik verhindert mehrfaches Einfügen der gleichen PLZ
plztable[tonumber(p)] = true -- diese Mechanik verhindert mehrfaches Einfügen der gleichen PLZ
end
end
end
else
plztable[tonumber(que.getValues(stadtteile, "PLZ", true)[1])] = true
end
end
elseif stadtteile ~= nil and stadtteile ~= "" then
plz_table[tonumber(que.getValues(stadtteile, "PLZ", true)[1])] = true
end
end
-- mw.logObject(plztable)
-- mw.logObject(plz_table)


local plzlist = {} -- Tabelle in sortierte Liste überführen
local plz = {} -- Tabelle in sortierte Liste überführen
for p, _ in pairs(plztable) do
for p, _ in pairs(plz_table) do
table.insert(plzlist, p)
table.insert(plz, p)
end
end
table.sort(plzlist)
table.sort(plz)
-- mw.logObject(plzlist)
-- mw.logObject(plz)
return plzlist
return plz
end
end


return p
return p