Direkt zum Hauptbereich

Python-HowTo: Geodaten aus Tweets extrahieren

Geodaten aus Sozialen Medien extrahieren und analysieren, das ist ein spannendes Thema. Daher schauen wir uns heute mal an, wie man mit Python thematische Geodaten aus Twitter extrahiert und in QGIS visualisieren kann:

Als erstes benötigt Ihr einen Twitter-Account und müsst Eure Applikation registrieren, das geht über diese Seite: https://apps.twitter.com/ (Ihr benötigt hierzu einen Twitter-Account).

Um die Twitter-Daten in Python auszulesen, benötigt man eine entsprechende Bibliothek in Python. Weit verbreitet und gut dokumentiert ist Tweepy:

pip install tweepy==3.3.0

Das folgende Code-Beispiel zeigt nun, wie man z.B: alle Tweets mit dem Begriff 'earthquake' über einen stream in eine JSON Datei schreibt.  Damit das Script mit der Twitter-Api kommunizieren kann, müsst Ihr Eure registrierten Consumer-Keys und Acccess-Tokens in das Script einfügen.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
# -*- coding: utf-8 -*-
from __future__ import absolute_import, print_function

from tweepy.streaming import StreamListener
from tweepy import OAuthHandler
from tweepy import Stream

# Go to http://apps.twitter.com and create an app.
# The consumer key and secret will be generated for you after
consumer_key= "myConsumerKey"
consumer_secret="myConsumerSecret"

# After the step above, you will be redirected to your app's page.
# Create an access token under the the "Your access token" section
access_token="myAccessToken"
access_token_secret="myAccessTokenSecret"
keyword = 'earthquake'

class StdOutListener(StreamListener):
    """ A listener handles tweets that are received from the stream.
    This is a basic listener that just writes tweets into a file.
    """
    def on_data(self, data):
        print(data)
        # return True
        try:
            with open(keyword+'_tweets.json', 'a') as f:
                f.write(data)
                return True
        except BaseException as e:
            print("Error on_data: %s" % str(e))
        return True  

    def on_error(self, status):
        print(status)

if __name__ == '__main__':
    l = StdOutListener()
    auth = OAuthHandler(consumer_key, consumer_secret)
    auth.set_access_token(access_token, access_token_secret)

    stream = Stream(auth, l)
    stream.filter(track=[keyword])

Das obige script streamt nun also alle Tweets und schreibt die, mit dem Schlüsselwort EARTHQUAKE in eine Datei 'earthquake_tweets.json'. In dieser stehen jetzt alle tweets, mit oder ohne Geobezug, auch solche mit dem Inhalt "The concert with Justin Bieber was like an earthquake...".

Im nächsten Schritt müssen wir also sämtliche Tweets mit geographischen Koordinaten extrahieren und in eine neue Datei schreiben. Dazu dient das folgende Script, welches mit dem Dateinamen aus dem ersten Script als Argument aufgerufen wird.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import json
from sys import argv

script, filename = argv
# Tweets are stored in "filename"
with open(filename, 'r') as f:
    geo_data = {
        "type": "FeatureCollection",
        "features": []
    }
    for line in f:
        tweet = json.loads(line)
        if tweet['coordinates']:
            geo_json_feature = {
                "type": "Feature",
                "geometry": tweet['coordinates'],
                "properties": {
                    "text": tweet['text'],
                    "created_at": tweet['created_at']
                }
            }
            geo_data['features'].append(geo_json_feature)
 
# Save geo data
with open('geo_'+filename, 'w') as fout:
    fout.write(json.dumps(geo_data, indent=4))

Die Ergebnisse des obigen Scripts stehen jetzt in der Datei geo_earthquake_tweets.json. Diese können wir nun direkt in QGIS Laden und uns das Ergebnis ansehen:
 
Das Ergebnis von 1 Woche Earthquake-Tweets-streaming passt sehr gut zur Plattentektonischen Karte der Erde...

Beliebte Posts aus diesem Blog

QGIS-Tipp: ZIP-Dateien direkt öffnen

Oft bekommt man Geodaten - die häufig groß sind - gezippt bereitgestellt. Der normale Arbeitsweg geht dann so, dass man die Datei entzippt und anschließend in QGIS visualisiert. Bereits seit der Version 1.8 bietet QGIS die Möglichkeit ZIP-Dateien direkt zu Laden. Um diese Feature zu aktivieren, öffne QGIS -> Einstellungen -> Optionen -> Datenquellen und setze bei den Einstellungen " Inhalt komprimierter Dateien (.zip) im Browser durchsuchen " mindestens auf " Grundsuche ". Anschließend können ZIP-Dateien direkt über den Browser geladen werden, der Inhalt wird gemäß seiner Art entsprechend im Browser angezeigt (Raster/Vektor):

QGIS-Tipp: Spatial Joins mit virtuellen Layern

Virtuelle Layer bieten die zusätzliche Möglichkeit verschiedene Layer miteinander zu verbinden (Spatial Join). Spatial Joins sind sozusagen das "Salz in der Suppe" von räumlichen Datenbanken. Spatial Joins ermöglichen es, zwei oder mehr räumliche Datensätze in Abhängigkeit ihrer räumlichen Relation zu kombinieren. Der folgende Beitrag gibt einen kurzen Überblick über die Möglichkeiten, dies in QGIS mit virtuellen Layern zu realisieren. Für die folgenden Beispiele verwende ich Daten von Natural Earth ( http://www.naturalearthdata.com/ ). Airports Countries Als erstes wollen wir die Flughäfen in Deutschland aus den Layern "Airports" und "Countries" ermitteln. Der klassische Weg in QGIS wäre, eine Verschneidung der beiden Layer durchzuführen um einen neuen Layer zu erhalten, der beide Informationen enthält. Über einen Virtuellen Layer, lässt sich das ebenfalls sehr elegant in QGIS erledigen. Mit folgender Abfrage erhalten wir dann das Ergebnis: sel...