Skip to main content

Extract Weather data (In Norwegian)

Grid regionalt nivå: Twitter og vær-data

Region: Sør-Norge nord til Bergen (lengde/breddegrad 58.0, 5.1 til 60.5, 11.1). Mindre område enn dette vil gi for lite twitter-data til noen meningsfull analyse. Dele opp region i like store celler, f.eks et 10x10 grid. Twitter-data vil nødvendigvis være konsentrert rundt befolkningssentre, ikke alle celler vil ha særlig med data. Innsamling av twitter-meldinger på server er i gang, i overkant av 3000 meldinger (meldingstekst, tidsstempel, geo-koordinater) lagret i løpet av første uke. Bruker et python script med biblioteket tweepy (http://www.tweepy.org/) til innsamling, og lagrer i MongoDB.
Twitter data kan legges til grid med f.eks. ordtelling i cellene pr dag. Værdata kan samles inn fra Meteorologisk institutts webtjeneste (http://eklima.met.no/wsKlima/start/start_no.html). Alle observasjoner fra meteorologiske institutts stasjoner er tilgjengelige, historiske og oppdaterte hvis stasjonen er i drift. I den utvalgte regionen er det 429 aktive stasjoner. Aktuelle data kan være temperatur(døgnmiddeltemperatur/min/max), nedbør, lufttrykk. Bruker python og biblioteket suds (https://bitbucket.org/jurko/suds):

   from suds.client import Client
   from suds.xsd.doctor import ImportDoctor, Import
   from datetime import datetime, timedelta
   url = 'http://eklima.met.no/metdata/MetDataService?WSDL'
   imp = Import('http://schemas.xmlsoap.org/soap/encoding/')
   imp.filter.add('http://no.met.metdata/IMetDataService.xsd')
   doc = ImportDoctor(imp)
   c = Client(url, doctor = doc)


Eksempel, hente alle stasjoner i vår valgte region:

   s = c.service.getStationsProperties(,)
   ss = [x for x in s if x.toYear==0 and 58.0 < x.latDec < 60.5 and 5.1 <
   x.lonDec < 11.1]
   for x in ss:
   print(x.stnr, '\t', x.name)

Twitter-listener-kode: class MyListener(StreamListener):

    def on_data(self, data):
            fields = ('created_at', 'text', 'coordinates')
             try:
                  tweet=json.loads(data)
                  if tweet['coordinates']:
                  client = MongoClient()
                  db = client.espen
                  d = {k:v for k, v in tweet.items() if k in fields}
                  db.tweets.insert(d)
             except BaseException as e:
                     print("Error on_data: %s" % str(e))
             return True
     def on_error(self, status):
            print(status)
            return True


twitter_stream = Stream(auth, MyListener()) twitter_stream.filter(locations=[5.1,58.0,11.1,60.5])