Holgers Sammelsurium

Fotografie, Reisen, Nerdkrams

Data-Mining im Foto-Ordner (Teil 2)

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…


Beitrag veröffentlicht am

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert