From bf7835f4a0ecb8da424f8a1eb541ea7ede85eb12 Mon Sep 17 00:00:00 2001 From: Jan-Pascal van Best Date: Sat, 20 Feb 2016 21:35:55 +0100 Subject: [PATCH] Store reverse geolocated addresses in database --- tweet/migrations/0009_tweet_address.py | 20 ++++++++++++++++++++ tweet/models.py | 6 +++++- tweet/streamrunner.py | 3 +++ tweet/utils.py | 3 ++- 4 files changed, 30 insertions(+), 2 deletions(-) create mode 100644 tweet/migrations/0009_tweet_address.py diff --git a/tweet/migrations/0009_tweet_address.py b/tweet/migrations/0009_tweet_address.py new file mode 100644 index 0000000..47c65aa --- /dev/null +++ b/tweet/migrations/0009_tweet_address.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.2 on 2016-02-18 22:53 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('tweet', '0008_auto_20160218_2208'), + ] + + operations = [ + migrations.AddField( + model_name='tweet', + name='address', + field=models.TextField(blank=True, default=None, max_length=1020, null=True, verbose_name='address'), + ), + ] diff --git a/tweet/models.py b/tweet/models.py index ec72eb8..3133409 100644 --- a/tweet/models.py +++ b/tweet/models.py @@ -53,6 +53,7 @@ class Tweet(models.Model): text = models.TextField('tweet text', max_length=140) latitude = models.FloatField('latitude', null=True) longitude = models.FloatField('longitude', null=True) + address = models.TextField('address', max_length=1020, null=True, blank=True, default=None) conforms_to_terms = models.BooleanField('tweet confirms to filters') def __str__(self): @@ -84,12 +85,15 @@ class Tweet(models.Model): (tweet.latitude,tweet.longitude) = status['geo']['coordinates'] return tweet - def location(self): + def fill_address(self): + if self.address is not None: + return self.address if self.latitude is not None and self.longitude is not None: try: geolocator = OpenMapQuest(api_key = settings.TWEET_MAPQUEST_API_KEY, timeout=10) #print("lat,long:[{},{}]".format(self.latitude,self.longitude)) location = geolocator.reverse((self.latitude, self.longitude), exactly_one=True) + self.address = location.address return location.address except GeocoderServiceError as e: logger.exception("Error during reverse geocoding") diff --git a/tweet/streamrunner.py b/tweet/streamrunner.py index f87de6c..da03107 100644 --- a/tweet/streamrunner.py +++ b/tweet/streamrunner.py @@ -27,6 +27,7 @@ class Streamer(TwythonStreamer): #logger.info("Stream tweet: {}".format(data)) tweet = Tweet.from_status(data) tweet.conforms_to_terms = check_match(data) + tweet.fill_address() tweet.save() self.count += 1 if self.count%100 == 0: @@ -93,6 +94,8 @@ def export_tweets(filename): exporter = ExcelExporter(filename) tweets = Tweet.objects.filter(conforms_to_terms=True).order_by('-pk') for tweet in tweets: + tweet.fill_address() + tweet.save(update_fields=['address']) exporter.add_tweet(tweet) exporter.close() diff --git a/tweet/utils.py b/tweet/utils.py index 33eb1d7..0451eff 100644 --- a/tweet/utils.py +++ b/tweet/utils.py @@ -62,7 +62,8 @@ class ExcelExporter: #self.worksheet.write(row, 6, tweet["user"]["name"]) if tweet.latitude is not None and tweet.longitude is not None: self.worksheet.write(row, 7, "{},{}".format(tweet.latitude, tweet.longitude)) - self.worksheet.write(row, 8, tweet.location()) + address = tweet.fill_address() + self.worksheet.write(row, 8, address) #self.worksheet.write(row, 19, tweet["user"]["location"]) -- 2.39.5