Gestern habe ich bereits ein wenig über mein kleines privates „GPS-Data-Mining-Projekt“ geschrieben. Abgesehen davon, dass man sich eine recht lustige Karte seiner Reisen/Fotosessions erstellen lassen kann, kann man die Daten auch etwas gezielter einsetzen.
Wenn man z.B. in eine Stadt oder ein Gebiet reist, in dem man schon einmal war, besteht die Gefahr, dass man immer wieder die gleichen Ecken erkundet. Aus dem Datensatz, der alle aus den Fotos extrahierten Koordinaten enthält, lässt sich relativ einfach eine Karte erstellen, in der die bereits „abgegrasten“ Flächen eingezeichnet sind. So kann man ggf. etwas gezielter unbekanntes Gebiet erkunden.
Das entsprechende Skript ist eine kleine Abwandlung des schon bekannten und sieht wie folgt aus
import numpy, math, folium
from geopy.geocoders import Nominatim
def cleanPins(file, center, distance):
cleanedPins = {}
pins = numpy.load(file)
for pin in pins:
lat, lon = pin
if calculate_distance(center, pin) < distance:
latc = round(lat, 4)
lonc = round(lon, 4)
pinc = (latc, lonc)
if pinc not in cleanedPins:
cleanedPins[pinc] = 1
else:
cleanedPins[pinc] += 1
else:
pass
return cleanedPins
def getCoordinates(locationName):
geolocator = Nominatim(user_agent="my_app")
location_info = geolocator.geocode(locationName)
return [location_info.latitude, location_info.longitude]
def calculate_distance(pos1, pos2):
lat1, lon1 = map(math.radians, pos1)
lat2, lon2 = map(math.radians, pos2)
dlon = lon2 - lon1
dlat = lat2 - lat1
a = math.sin(dlat/2)**2 + math.cos(lat1) * math.cos(lat2) * math.sin(dlon/2)**2
c = 2 * math.asin(math.sqrt(a))
distance = 6371 * c
return distance
def makeMap(location, distance=10, zoom=10):
center = getCoordinates(location)
pins = cleanPins("pins.npy", center, distance)
map = folium.Map(location=center, zoom_start=zoom)
for pin in pins:
lat, lon = pin
n = pins[pin]
max = 200
marker = folium.CircleMarker(location=[lat, lon], popup=f"{n}", color="red", fill=True)
marker.add_to(map)
return map
Das upgedatete Script bestimmt zunächst aus einem Namen wie „Berlin“ oder „Mallorca“ eine Art Start-Koordinate. Anschließend durchsucht es den Datensatz nach Koordinaten, die in einem bestimmten Umkreis von der Start-Koordinate liegen. Die Formel, die die Distanz zwischen den Koordinaten berechnet, habe ich übrigens chatGPT implementieren lassen. ? Die auf diese Weise gefundenen Koordinaten werden wie üblich in eine Karte eingetragen und als HTML-Dokument gespeichert.
Rufe ich z.B. das Skript mit makeMap("Mallorca", 75, 9)
auf errechnet es mir die Karte weiter oben. Ich hätte schwören können, dass ich schon mal im Süden von Malle war, was aber scheinbar falsch ist…
Schreibe einen Kommentar