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):
def maptiles_kachelkoordinaten(): hilfetext = ('### Maptiles / Kachelkoordinaten\n'
hilfetext = """HILFE: [Maptiles / Kachelkoordinaten] 'Bei vielen Online-Kartendiensten wie Openstreetmap oder Google-Maps erfolgt die Kartendarstellung '
Bei vielen Online-Kartendiensten wie Openstreetmap oder Google-Maps erfolgt die 'über vorberechnete "Kachel"-Grafikdateien, welche ein Adressierungssystem benötigen damit je nach '
Kartendarstellung über vorberechnete "Kachel"-Grafikdateien, welche ein 'Koordinate und Zoomstufe auch der richtige Kartenausschnitt dargestellt wird und klar ist welche '
Adressierungssystem benötigen damit je nach Koordinate und Zoomstufe auch der 'Kacheln daneben darzustellen sind. \n'
richtige Kartenausschnitt dargestellt und klar ist welche Kacheln daneben 'Solche Kacheln sind typischer Weise PNG-Grafiken mit 256x256 oder '
darzustellen ist wird.Bei OSM ist eine solche Kachel eine PNG-Grafik mit 256x256 '512x512 Pixeln und je nach Zoomstufe ist eine unterschiedliche Anzahl solcher Kacheln/Tiles '
Pixeln und je nach Zoomstufe ist eine unterschiedliche Anzahl solcher 'notwendig um die ganze Welt abzubilden. Da je Zoomstufe sich die Anzahl der benötigten Kacheln '
Kacheln/Tiles notwendig um die ganze Welt abzubilden. Da je Zoomstufe sich die 'vervierfacht und damit auch die Datenmenge werden in der Praxis keine Zoomlevel über 20 '
Anzahl der benötigten Kacheln vervierfacht ist bei den meisten Diensten bei 'verwendet. \n'
Zoomlevel 18 Schluß, OSM geht bis Zoomlevel 19. 'Um die einzelnen Kacheln beim tilemap-Server abzufragen braucht man die Zoomstufe, einen X- und '
Um die einzelnen Kacheln beim tilemap-Server abzufragen braucht man die 'einen Y-Wert wobei dies alles ganzzahlige Werte sind. Abgerufen vom Tilemap-Server werden die '
Zoomstufe, einen X und einen Y-Wert wobei dies alles ganzzahlige Werte sind. 'Kacheln dann nach dem Muster: `http://servername/Zoom/X/Y.png` Den Fernsehturm mit Zoomstufe 18 '
Aufgerufen von den Servern werden die Kacheln dann nach dem Muster: 'findet man z.B. bei Openstreetmap hier: https://tile.openstreetmap.org/18/140836/85970.png \n'
"http://servername/Zoom/X/Y.png" Den Fernsehturm mit Zoomstufe 18 findet man 'Die Funktion arbeitet hier auf die Art und Weise, dass man 2 durch ein Freizeichen getrennte Zahlen '
z.B. bei Openstreetmap hier:https://tile.openstreetmap.org/18/140836/85970.png '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 '
Die Funktion arbeitet hier auf die Art und Weise, daß man 2 durch ein 'in Dezimalgrad handelt und sofern es gültige Koordinaten sind erfolgt eine Ausgabe der X und Y Werte '
Freizeichen getrennte Zahlen eingibt. Handelt es sich bei den angegebenen Zahlen 'für die Zoomstufen und 1-25. (Positive Zahlen stehen für Nord und Ost, negative für Süd und West) '
um "Kommazahlen" welche allerdings mit Punkt anzugeben sind 'Handelt es sich bei den beiden Zahlen um Ganzzahlen wird davon ausgegangen, dass es sich um X und Y '
(Bsp: 52.520803 13.4088653 ) geht die Funktion davon aus, daß es sich um 'Werte handelt und es werden für alle Zoomstufen von 1-25 Koordinaten in Dezimalminuten und '
Koordinaten in Dezimalgrad handelt und sofern es gültige Koordinaten sind 'Dezimalgrad ausgegeben, sofern dies sinnvolle Koordinaten ergibt und sie werden auf einer Karte '
erfolgt eine Ausgabe der X und Y Werte für die Zoomstufen und 1-30. 'angezeigt.')
(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