klopfcode, maptiles, quadtree

This commit is contained in:
2025-07-26 00:47:29 +02:00
parent 35272fc8a0
commit b109e5573e
2 changed files with 113 additions and 127 deletions

View File

@@ -207,12 +207,20 @@ def auswahl_verarbeiten():
elif auswahl == "Polybios dekodieren": elif auswahl == "Polybios dekodieren":
st.session_state.output_text = tools.polybios_decode(text, additional_parameter) st.session_state.output_text = tools.polybios_decode(text, additional_parameter)
st.session_state.map_data = None st.session_state.map_data = None
elif auswahl == "REPLACE": elif auswahl == "Klopfcode kodieren":
st.session_state.output_text = tools.REPLACE(text) st.session_state.output_text = tools.klopfcode_encode(text)
st.session_state.map_data = None st.session_state.map_data = None
elif auswahl == "REPLACE": elif auswahl == "Klopfcode dekodieren":
st.session_state.output_text = tools.REPLACE(text) st.session_state.output_text = tools.klopfcode_decode(text)
st.session_state.map_data = None st.session_state.map_data = None
elif auswahl == "Maptiles/Kachelkoord.":
output, mapd = tools.maptiles_kachelkoordinaten(text)
st.session_state.output_text = output
st.session_state.map_data = mapd
elif auswahl == "Quadtree/Quadkey":
output, mapd = tools.quadtreekoordinaten(text)
st.session_state.output_text = output
st.session_state.map_data = mapd
elif auswahl == "REPLACE": elif auswahl == "REPLACE":
st.session_state.output_text = tools.REPLACE(text) st.session_state.output_text = tools.REPLACE(text)
st.session_state.map_data = None st.session_state.map_data = None
@@ -299,9 +307,10 @@ option = st.sidebar.radio("hidden_label",
"Autokey-Chiffre", "Autokey-Chiffre",
"Polybios kodieren", "Polybios kodieren",
"Polybios dekodieren", "Polybios dekodieren",
"", "Klopfcode kodieren",
"", "Klopfcode dekodieren",
"", "Maptiles/Kachelkoord.",
"Quadtree/Quadkey",
"Dummy mit Karte", "Dummy mit Karte",
), ),
key='option', key='option',

View File

@@ -2317,25 +2317,20 @@ def polybios_decode(eingabetext, pw):
ausgabetext += f"|dekodiert|{ctext6}|\n" ausgabetext += f"|dekodiert|{ctext6}|\n"
return ausgabetext return ausgabetext
''' def klopfcode_encode(eingabetext):
def klopfcode_encode(): hilfetext = ('"### Klopfcode kodieren\nDer Klopfcode ist im Prinzip eine Polybios Chiffre mit einem festen '
hilfetext = """HILFE: [Klopfcode kodieren] 'Schlüsselquadrat bei welchem nicht I und J sondern C und K zusammengefasst werden. \n'
Der Klopfcode ist im Prinzip eine Polybios Chiffre 'siehe hier: \n'
mit einem festen Schlüsselquadrat bei welchem nicht '| |1|2|3|4|5|\n'
I und J sondern C und K zusammengefasst werden. '|-|-|-|-|-|-|\n'
siehe hier: '|1|A|B|C|D|E|\n'
1 2 3 4 5 '|2|F|G|H|I|J|\n'
1 A B C D E '|3|L|M|N|O|P|\n'
2 F G H I J '|4|Q|R|S|T|U|\n'
3 L M N O P '|5|V|W|X|Y|Z|')
4 Q R S T U
5 V W X Y Z
"""
eingabetext = Eingabe.get(1.0, END)
text = eingabetext.rstrip() text = eingabetext.rstrip()
if text == "": if text == "":
Ausgabe.insert(1.0, hilfetext + "\n") return hilfetext
else: else:
qz5 = [11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55] qz5 = [11, 12, 13, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55]
alpha = "ABCDEFGHIJLMNOPQRSTUVWXYZ" # k wird durch c ersetzt alpha = "ABCDEFGHIJLMNOPQRSTUVWXYZ" # k wird durch c ersetzt
@@ -2351,28 +2346,24 @@ siehe hier:
ctext = "" ctext = ""
for b in text5: for b in text5:
ctext += wb5[b] ctext += wb5[b]
Ausgabe.insert(1.0, ctext + "\n") ausgabetext = f"Klartext: {text5} \n"
Ausgabe.insert(1.0, "Klartext: " + text5 + "\n", "gr") ausgabetext += f"kodiert: {ctext}"
return ausgabetext
def klopfcode_decode(eingabetext):
def klopfcode_decode(): hilfetext = ('"### Klopfcode kodieren\nDer Klopfcode ist im Prinzip eine Polybios Chiffre mit einem festen '
hilfetext = """HILFE: [Klopfcode dekodieren] 'Schlüsselquadrat bei welchem nicht I und J sondern C und K zusammengefasst werden. \n'
Der Klopfcode ist im Prinzip eine Polybios Chiffre 'siehe hier: \n'
mit einem festen Schlüsselquadrat bei welchem nicht '| |1|2|3|4|5|\n'
I und J sondern C und K zusammengefasst werden. '|-|-|-|-|-|-|\n'
siehe hier: '|1|A|B|C|D|E|\n'
1 2 3 4 5 '|2|F|G|H|I|J|\n'
1 A B C D E '|3|L|M|N|O|P|\n'
2 F G H I J '|4|Q|R|S|T|U|\n'
3 L M N O P '|5|V|W|X|Y|Z|')
4 Q R S T U
5 V W X Y Z
"""
eingabetext = Eingabe.get(1.0, END)
text = eingabetext.rstrip() text = eingabetext.rstrip()
if text == "": if text == "":
Ausgabe.insert(1.0, hilfetext + "\n") return hilfetext
else: else:
qz5 = [11, 12, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55] qz5 = [11, 12, 14, 15, 21, 22, 23, 24, 25, 31, 32, 33, 34, 35, 41, 42, 43, 44, 45, 51, 52, 53, 54, 55]
alpha = "ABDEFGHIJLMNOPQRSTUVWXYZ" # k wird durch c ersetzt alpha = "ABDEFGHIJLMNOPQRSTUVWXYZ" # k wird durch c ersetzt
@@ -2387,100 +2378,86 @@ siehe hier:
if cc in wb: if cc in wb:
ctext += wb[cc] ctext += wb[cc]
ctext += " " ctext += " "
Ausgabe.insert(1.0, ctext + "\n") return f"Klopfcode dekodiert: \n{ctext}"
Ausgabe.insert(1.0, "Klopfcode dekodiert:\n", "bu")
def maptiles_kachelkoordinaten(eingabetext):
hilfetext = ('### Maptiles / Kachelkoordinaten\n'
'Bei vielen Online-Kartendiensten wie Openstreetmap oder Google-Maps erfolgt die Kartendarstellung '
'über vorberechnete "Kachel"-Grafikdateien, welche ein Adressierungssystem benötigen damit je nach '
'Koordinate und Zoomstufe auch der richtige Kartenausschnitt dargestellt wird und klar ist welche '
'Kacheln daneben darzustellen sind. \n'
'Solche Kacheln sind typischer Weise PNG-Grafiken mit 256x256 oder '
'512x512 Pixeln und je nach Zoomstufe ist eine unterschiedliche Anzahl solcher Kacheln/Tiles '
'notwendig um die ganze Welt abzubilden. Da je Zoomstufe sich die Anzahl der benötigten Kacheln '
'vervierfacht und damit auch die Datenmenge werden in der Praxis keine Zoomlevel über 20 '
'verwendet. \n'
'Um die einzelnen Kacheln beim tilemap-Server abzufragen braucht man die Zoomstufe, einen X- und '
'einen Y-Wert wobei dies alles ganzzahlige Werte sind. Abgerufen vom Tilemap-Server werden die '
'Kacheln dann nach dem Muster: `http://servername/Zoom/X/Y.png` Den Fernsehturm mit Zoomstufe 18 '
'findet man z.B. bei Openstreetmap hier: https://tile.openstreetmap.org/18/140836/85970.png \n'
'Die Funktion arbeitet hier auf die Art und Weise, dass man 2 durch ein Freizeichen getrennte Zahlen '
'eingibt. Handelt es sich bei den angegebenen Zahlen um "Kommazahlen" welche allerdings mit Punkt '
'anzugeben sind (Bsp: 52.520803 13.4088653 ) geht die Funktion davon aus, daß es sich um Koordinaten '
'in Dezimalgrad handelt und sofern es gültige Koordinaten sind erfolgt eine Ausgabe der X und Y Werte '
'für die Zoomstufen und 1-25. (Positive Zahlen stehen für Nord und Ost, negative für Süd und West) '
'Handelt es sich bei den beiden Zahlen um Ganzzahlen wird davon ausgegangen, dass es sich um X und Y '
'Werte handelt und es werden für alle Zoomstufen von 1-25 Koordinaten in Dezimalminuten und '
'Dezimalgrad ausgegeben, sofern dies sinnvolle Koordinaten ergibt und sie werden auf einer Karte '
'angezeigt.')
def maptiles_kachelkoordinaten():
hilfetext = """HILFE: [Maptiles / Kachelkoordinaten]
Bei vielen Online-Kartendiensten wie Openstreetmap oder Google-Maps erfolgt die
Kartendarstellung über vorberechnete "Kachel"-Grafikdateien, welche ein
Adressierungssystem benötigen damit je nach Koordinate und Zoomstufe auch der
richtige Kartenausschnitt dargestellt und klar ist welche Kacheln daneben
darzustellen ist wird.Bei OSM ist eine solche Kachel eine PNG-Grafik mit 256x256
Pixeln und je nach Zoomstufe ist eine unterschiedliche Anzahl solcher
Kacheln/Tiles notwendig um die ganze Welt abzubilden. Da je Zoomstufe sich die
Anzahl der benötigten Kacheln vervierfacht ist bei den meisten Diensten bei
Zoomlevel 18 Schluß, OSM geht bis Zoomlevel 19.
Um die einzelnen Kacheln beim tilemap-Server abzufragen braucht man die
Zoomstufe, einen X und einen Y-Wert wobei dies alles ganzzahlige Werte sind.
Aufgerufen von den Servern werden die Kacheln dann nach dem Muster:
"http://servername/Zoom/X/Y.png" Den Fernsehturm mit Zoomstufe 18 findet man
z.B. bei Openstreetmap hier:https://tile.openstreetmap.org/18/140836/85970.png
Die Funktion arbeitet hier auf die Art und Weise, daß man 2 durch ein
Freizeichen getrennte Zahlen eingibt. Handelt es sich bei den angegebenen Zahlen
um "Kommazahlen" welche allerdings mit Punkt anzugeben sind
(Bsp: 52.520803 13.4088653 ) geht die Funktion davon aus, daß es sich um
Koordinaten in Dezimalgrad handelt und sofern es gültige Koordinaten sind
erfolgt eine Ausgabe der X und Y Werte für die Zoomstufen und 1-30.
(Positive Zahlen stehen für Nord und Ost, negative für Süd und West)
Handelt es sich bei den beiden Zahlen um Ganzzahlen wird davon ausgegangen, daß
es sich um X und Y Werte handelt und es werde für alle Zoomstufen von 1-30
Koordinaten in Dezimalminuten und Dezimalgrad ausgegeben, sofern dies sinnvolle
Koordinaten ergibt.
"""
eingabetext = Eingabe.get(1.0, END)
text = eingabetext.rstrip() text = eingabetext.rstrip()
if text == "": if text == "":
Ausgabe.insert(1.0, hilfetext + "\n") return hilfetext, None
else: else:
text = text.split() text = text.split()
if "." in text[0] and len(text) == 2: if "." in text[0] and len(text) == 2:
for zoom in range(30, 0, -1): ausgabetext = "DEC -> Maptiles \n|Zoom|X|Y|\n|-|-|-|\n"
for zoom in range(1, 26):
try: try:
la = float(text[0]) la = float(text[0])
lo = float(text[1]) lo = float(text[1])
if not la < -180 and not la > 180 and not lo < -180 and not lo > 180: if not la < -85.05113 and not la > 85.05113 and not lo < -180 and not lo > 180:
x, y = helper.dec_to_maptiles(la, lo, zoom) x, y = helper.dec_to_maptiles(la, lo, zoom)
Ausgabe.insert(1.0, "Zoom:{:>2} X:{:<10} Y:{}\n".format(zoom, x, y)) ausgabetext += f"|{zoom:>2}|{x:<10}|{y}|\n"
except ValueError: except ValueError:
pass pass
Ausgabe.insert(1.0, "DEC -> Maptiles\n", "bu") return ausgabetext, None
elif len(text) == 2: elif len(text) == 2:
for zoom in range(30, 0, -1): ausgabetext = "Maptiles->DEG,DEC \n|Zoom|DEG|DEC|\n|-|-|-|\n"
lat_list, lon_list = [], []
for zoom in range(2, 26):
try: try:
la, lo = helper.maptiles_to_dec(int(text[0]), int(text[1]), zoom) la, lo = helper.maptiles_to_dec(int(text[0]), int(text[1]), zoom)
if not la < -180 and not la > 180 and not lo < -180 and not lo > 180: if not la < -85.05113 and not la > 85.05113 and not lo < -180 and not lo > 180:
Ausgabe.insert(1.0, "Zoom:{:>2} DEG: {:<23} DEC: {} {}\n".format(zoom, helper.dec_to_deg(la, lo), ausgabetext += f"|{zoom:>2}|{helper.dec_to_deg(la, lo):<23}|{round(la, 5)} {round(lo, 5)}| \n"
round(la, 5), round(lo, 5))) lat_list.append(la)
except ValueError: lon_list.append(lo)
except OverflowError:
pass pass
Ausgabe.insert(1.0, "Maptiles->DEG,DEC\n", "bu") return ausgabetext, pd.DataFrame({'lat': lat_list, 'lon': lon_list})
else: else:
Ausgabe.insert(1.0, "Zahlen konnten nicht ermittelt werden!\n", "re") return "Zahlen konnten nicht ermittelt werden!", None
def quadtreekoordinaten(eingabetext):
def quadtreekoordinaten(): hilfetext = ("### Quadtree-/Quadkeykoordinaten\n"
hilfetext = """HILFE: [Quadtree-/Quadkeykoordinaten] "Diese Koordinatenkodierung spielt in der alltäglichen Praxis eigentlich kaum noch ein Rolle, "
Diese Koordinatenkodierung spielt in der alltäglichen Praxis eigentlich "außer scheinbar bei bing-maps und beim Geocaching. Sie dient ähnlich wie das Maptiles-System dazu "
kaum noch ein Rolle, außer scheinbar bei bing-maps und beim Geocaching. "Grafikdateien für unterschiedliche Zoomstufen einer Karte zu adressieren. Die Länge der Zahl "
Sie dient ähnlich wie das Maptiles-System dazu Grafikdateien für "entspricht hier zugleich auch dem Detailgrad bzw. der Zoomstufe. Es finden nur die Zahlen 0,1,2 "
unterschiedliche Zoomstufen einer Karte zu adressieren. "und 3 Verwendung, wobei die 0 den Nordwestlichen Quadranten, 1 den Nordöstlichen, 2 SW und 3 SO. \n"
Die Länge der Zahl entspricht hier zugleich auch dem Detailgrad bzw. "Ein kleines Beispiel: 230 würde bedeuten es geht im südwestlichen Quadranten (2) um den "
der Zoomstufe. Es finden nur die Zahlen 0,1,2 und 3 Verwendung, wobei "südöstlichen Quadranten(3) und in diesem wiederum um den nordwestlichen Quadranten. Je länger "
die 0 den Nordwestlichen Quadranten, 1 den Nordöstlichen, 2 SW und 3 SO. "also diese Zahlenreihe aus 0,1,2 und 3 wird um so genauer wird ein bestimmter Ort angegeben. \n"
Ein kleines Beispiel: 230 würde bedeuten es geht im südwestlichen "Weitere Infos gibt es unter folgendem Link zu finden: "
Quadranten (2) um den südöstlichen Quadranten(3) und in diesem wiederum "https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system \n"
um den nordwestlichen Quadranten. "Die Funktion ermittelt aus einer Quadtreekoordinate die Maptileskoordinaten und die "
Je länger also diese Zahlenreihe aus 0,1,2 und 3 wird um so genauer wird "WGS84-Koordinaten und zeigt diese auf einer Karte an.")
ein bestimmter Ort angegeben.
Weitere Infos gibt es unter folgendem Link zu finden:
https://docs.microsoft.com/en-us/bingmaps/articles/bing-maps-tile-system
Die Funktion ermittelt aus einer Quadtreekoordinate die Maptileskoordinaten
und die WGS-Koordinaten.
"""
eingabetext = Eingabe.get(1.0, END)
text = eingabetext.rstrip() text = eingabetext.rstrip()
if text == "": if text == "":
Ausgabe.insert(1.0, hilfetext + "\n") return hilfetext, None
else: else:
tilex = 0 tile_x = 0
tiley = 0 tile_y = 0
quadkey = text quadkey = text
fehler = 0 fehler = 0
zoom = len(quadkey) zoom = len(quadkey)
@@ -2489,28 +2466,28 @@ und die WGS-Koordinaten.
if quadkey[zoom - i] == "0": if quadkey[zoom - i] == "0":
continue continue
if quadkey[zoom - i] == "1": if quadkey[zoom - i] == "1":
tilex |= mask tile_x |= mask
continue continue
if quadkey[zoom - i] == "2": if quadkey[zoom - i] == "2":
tiley |= mask tile_y |= mask
continue continue
if quadkey[zoom - i] == "3": if quadkey[zoom - i] == "3":
tilex |= mask tile_x |= mask
tiley |= mask tile_y |= mask
continue continue
else: else:
fehler += 1 fehler += 1
la, lo = maptiles_to_dec(tilex, tiley, zoom) la, lo = helper.maptiles_to_dec(tile_x, tile_y, zoom)
if fehler == 0: if fehler == 0:
Ausgabe.insert(1.0, "DEG: {}\n".format(dec_to_deg(la, lo))) ausgabetext = f"Maptiles: X:{tile_x} Y:{tile_y} Zoom:{zoom} \n"
Ausgabe.insert(1.0, "DEC: {} {}\n".format(round(la, 5), round(lo, 5))) ausgabetext += f"DEC: {round(la, 5)} {round(lo, 5)} \n"
Ausgabe.insert(1.0, "Maptiles: X:{} Y:{} Zoom:{}\n".format(tilex, tiley, zoom)) ausgabetext += f"DEG: {helper.dec_to_deg(la, lo)}"
return ausgabetext, pd.DataFrame({'lat': [la], 'lon': [lo]})
else: else:
Ausgabe.insert(1.0, return ("Es konnte keine gültige Quadtree-Koordinate erkannt werden. (eine Zahl die nur die Ziffern "
"Es konnte keine gültige Quadtree-Koordinate erkannt werden.\n" "0,1,2,3 enthält)"), None
"(eine Zahl die nur die Ziffern 0,1,2,3 enthält)\n")
'''
def chronogramm(): def chronogramm():
hilfetext = """HILFE: [Chronogramm/ römische Ziffern zählen] hilfetext = """HILFE: [Chronogramm/ römische Ziffern zählen]
Ein Chronogramm (oder Eteostichon) ist ein Satzteil, ein Satz, ein Sinnspruch Ein Chronogramm (oder Eteostichon) ist ein Satzteil, ein Satz, ein Sinnspruch