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:
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.
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.
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...
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...