Einzelfunktionenexperimentierverzeichnis in git integriert

This commit is contained in:
2024-03-17 11:13:48 +01:00
parent 99bd1032c2
commit be9e204576
20 changed files with 1025 additions and 1 deletions

View File

@@ -0,0 +1,104 @@
#!/usr/bin/env python3
# -*- coding: utf8 -*-
import math
def dec_to_maptiles(lat_deg, lon_deg, zoom):
lat_rad = math.radians(lat_deg)
n = 2.0 ** zoom
xtile = int((lon_deg + 180.0) / 360.0 * n)
ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
return xtile, ytile
def maptiles_to_dec(xtile, ytile, zoom):
n = 2.0 ** zoom
lon_dec = xtile / n * 360.0 - 180.0
lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
lat_dec = math.degrees(lat_rad)
return lat_dec, lon_dec
def dec_to_deg(lat_dec, lon_dec): # Dezimalgrad in Dezimalminuten (Ausgabe als String)
if lat_dec < 0:
lat_pre = "S"
else:
lat_pre = "N"
if lon_dec < 0:
lon_pre = "W"
else:
lon_pre = "E"
lat = abs(lat_dec)
lon = abs(lon_dec)
lat_degree = int(lat)
lon_degree = int(lon)
lat_minutes = (lat - lat_degree) * 60
lon_minutes = (lon - lon_degree) * 60
return ("{}{} {} {}{} {}".format(lat_pre, lat_degree, round(lat_minutes, 3), lon_pre, lon_degree,
round(lon_minutes, 3)))
# text="2248563 1378644"
# text="8783 5384"
# text="52.357780217032044 12.995710372924805"
# text="-41.85 -87.64999999999998"
text = "52.520803 13.4088653"
# https://tile.openstreetmap.org/19/281070/172330.png
hilfetext = """
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 brauch
man die Zoomstufe, einen X und einen Y-Wert wobei dies alles
ganzahlige 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-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, daß es sich um X und Y Werte handelt und es werde für
alle Zoomstufen von 1-25 Koordinaten in Dezimalminuten und
Dezimalgrad ausgegeben, sofern dies sinnvolle Koordinaten ergibt.
"""
text = text.split()
if "." in text[0] and len(text) == 2:
print("DEC -> Maptiles")
for zoom in range(1, 26):
try:
la = float(text[0])
lo = float(text[1])
if not la < -180 and not la > 180 and not lo < -180 and not lo > 180:
x, y = dec_to_maptiles(la, lo, zoom)
print("Zoom:{} X:{} \tY:{}".format(zoom, x, y))
except:
pass
elif len(text) == 2:
print("Maptiles->DEG,DEC")
for zoom in range(1, 26):
try:
la, lo = 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:
print("Zoom: {} \tDEG: {} \tDEC: {} {}".format(zoom, dec_to_deg(la, lo), round(la, 5), round(lo, 5)))
except:
pass
else:
print("Zahlen konnten nicht ermittelt werden!")

View File

@@ -0,0 +1,24 @@
# https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Python
# Kachelkoordinaten umrechnen
import math
def deg2num(lat_deg, lon_deg, zoom):
lat_rad = math.radians(lat_deg)
n = 2.0 ** zoom
xtile = int((lon_deg + 180.0) / 360.0 * n)
ytile = int((1.0 - math.log(math.tan(lat_rad) + (1 / math.cos(lat_rad))) / math.pi) / 2.0 * n)
return xtile, ytile
def num2deg(xtile, ytile, zoom):
n = 2.0 ** zoom
lon_deg = xtile / n * 360.0 - 180.0
lat_rad = math.atan(math.sinh(math.pi * (1 - 2 * ytile / n)))
lat_deg = math.degrees(lat_rad)
return lat_deg, lon_deg
for i in range(22, 25):
x = num2deg(4496422252, 974119798, i)
print(i, x)