105 lines
4.0 KiB
Python
105 lines
4.0 KiB
Python
#!/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!")
|