Exemplo n.º 1
0
def createmeteo(request, well):
    ''' Create datasources with meteo data for a well '''

    def docreate(name,closest,gen,start):
        instance = gen.get_class()()
        ploc, created = project.projectlocatie_set.get_or_create(name = name, defaults = {'description': name, 'location': closest.location})
        mloc, created = ploc.meetlocatie_set.get_or_create(name = name, defaults = {'description': name, 'location': closest.location})
        if created:
            logger.info('Meetlocatie {} aangemaakt'.format(name))   
        ds, created = mloc.datasources.get_or_create(name = name, defaults = {'description': name,'generator': gen, 'user': user, 'timezone': 'UTC',
                                                     'url': instance.url + '?stns={stn}&start={start}'.format(stn=closest.nummer,start=start)})
        if created:
            ds.download()
            ds.update_parameters()
            
            for p in ds.parameter_set.filter(name__in=candidates):
                try:
                    series, created = p.series_set.get_or_create(name = p.name, description = p.description, unit = p.unit, user = request.user)
                    series.replace()
                except Exception as e:
                    logger.error('ERROR creating series %s: %s' % (p.name, e))
    
    user = request.user

    candidates = ['PG', 'EV24', 'RD', 'RH', 'P', 'T']
    
    ploc = ProjectLocatie.objects.get(name=well.name)
    project = ploc.project
    
    gen = Generator.objects.get(classname__icontains='KNMI.meteo')
    closest = Station.closest(well.location)
    name = 'Meteostation {} (dagwaarden)'.format(closest.naam)
    docreate(name,closest,gen,'20140501')

    gen = Generator.objects.get(classname__icontains='KNMI.neerslag')
    closest = NeerslagStation.closest(well.location)
    name = 'Neerslagstation {}'.format(closest.naam)
    docreate(name,closest,gen,'20140501')

    gen = Generator.objects.get(classname__icontains='KNMI.uur')
    closest = Station.closest(well.location)
    name = 'Meteostation {} (uurwaarden)'.format(closest.naam)
    docreate(name,closest,gen,'2014050101')
Exemplo n.º 2
0
    def get_context_data(self, **kwargs):
        context = super(WellChartView, self).get_context_data(**kwargs)
        well = Well.objects.get(pk=context['pk'])
        name = unicode(well)
        options = {
             'rangeSelector': { 'enabled': True,
                               'inputEnabled': True,
                               },
            'navigator': {'adaptToUpdatedData': True, 'enabled': True},
            'chart': {'type': 'arearange', 'zoomType': 'x'},
            'title': {'text': name},
            'xAxis': {'type': 'datetime'},
            'yAxis': [{'title': {'text': 'Grondwaterstand\n(m tov NAP)'}}
                      ],
            'tooltip': {'valueSuffix': ' m',
                        'valueDecimals': 2,
                        'shared': True,
                       }, 
            'legend': {'enabled': True},
            'plotOptions': {'line': {'marker': {'enabled': False}}},            
            'credits': {'enabled': True, 
                        'text': 'acaciawater.com', 
                        'href': 'http://www.acaciawater.com',
                       },
            }
        series = []
        xydata = []
        for screen in well.screen_set.all():
            name = unicode(screen)
            data = screen.to_pandas(ref='nap')
            if data.size > 0:
                xydata = zip(data.index.to_pydatetime(), data.values)
                series.append({'name': name,
                            'type': 'line',
                            'data': xydata,
                            'lineWidth': 1,
                            'color': '#0066FF',
                            'zIndex': 2,
                            })
                mean = pd.expanding_mean(data)
                std = pd.expanding_std(data)
                a = (mean - std).dropna()
                b = (mean + std).dropna()
                ranges = zip(a.index.to_pydatetime(), a.values, b.values)
                series.append({'name': 'spreiding',
                            'data': ranges,
                            'type': 'arearange',
                            'lineWidth': 0,
                            'color': '#0066FF',
                            'fillOpacity': 0.2,
                            'linkedTo' : ':previous',
                            'zIndex': 0,
                            })

            data = screen.to_pandas(ref='nap',kind='HAND')
            if data.size > 0:
                hand = zip(data.index.to_pydatetime(), data.values)
                series.append({'name': 'handpeiling',
                            'type': 'scatter',
                            'data': hand,
                            'zIndex': 3,
                            'marker': {'symbol': 'circle', 'radius': 6, 'lineColor': 'white', 'lineWidth': 2, 'fillColor': 'red'},
                            })

        if len(xydata)>0:
            mv = []
            mv.append((xydata[0][0], screen.well.maaiveld))
            mv.append((xydata[-1][0], screen.well.maaiveld))
            series.append({'name': 'maaiveld',
                        'type': 'line',
                        'lineWidth': 2,
                        'color': '#009900',
                        'dashStyle': 'Dash',
                        'data': mv,
                        'zIndex': 4,
                        })

        # neerslag toevoegen
        try:
            closest = Station.closest(well.location)
            name = 'Meteostation {} (dagwaarden)'.format(closest.naam)
            neerslag = Series.objects.get(name='RH',mlocatie__name=name)
            data = neerslag.to_pandas(start=xydata[0][0], stop=xydata[-1][0]) / 10.0 # 0.1 mm -> mm
            data = zip(data.index.to_pydatetime(), data.values)
            series.append({'name': 'Neerslag '+ closest.naam,
                        'type': 'column',
                        'data': data,
                        'yAxis': 1,
                        'pointRange': 24 * 3600 * 1000, # 1 day
                        'pointPadding': 0.01,
                        'pointPlacement': 0.5,
                        'zIndex': 1,
                        'color': 'orange', 
                        'borderColor': '#cc6600', 
                        })
            options['yAxis'].append({'title': {'text': 'Neerslag (mm)'},
                                     'opposite': 1,
                                     'min': 0,
                                     })
        except:
            pass
        options['series'] = series
        context['options'] = json.dumps(options, default=lambda x: int(time.mktime(x.timetuple())*1000))
        context['object'] = well
        return context
Exemplo n.º 3
0
def createmeteo(request, well):
    ''' Create datasources with meteo data for a well '''
    def find(f, seq):
        """Return first item in sequence where f(item) == True."""
        for item in seq:
            if f(item):
                return item

    def docreate(name, closest, gen, start, candidates):
        instance = gen.get_class()()
        ploc, created = well.ploc.project.projectlocatie_set.get_or_create(
            name=name,
            defaults={
                'description': name,
                'location': closest.location
            })
        mloc, created = ploc.meetlocatie_set.get_or_create(name=name,
                                                           defaults={
                                                               'description':
                                                               name,
                                                               'location':
                                                               closest.location
                                                           })
        if created:
            logger.info('Meetlocatie {} aangemaakt'.format(name))
        ds, created = mloc.datasource_set.update_or_create(
            name=name,
            defaults={
                'description':
                name,
                'generator':
                gen,
                'user':
                user,
                'timezone':
                'UTC',
                'url':
                instance.url + '?stns={stn}&start={start}'.format(
                    stn=closest.nummer, start=start)
            })
        if created:
            ds.download()
            ds.update_parameters()

        series_set = []
        for key, value in candidates.items():
            try:
                series = None
                p = ds.parameter_set.get(name=key)
                series_name = '{} {}'.format(value, closest.naam)
                series, created = p.series_set.get_or_create(name=series_name,
                                                             mlocatie=mloc,
                                                             defaults={
                                                                 'description':
                                                                 p.description,
                                                                 'unit':
                                                                 p.unit,
                                                                 'user':
                                                                 request.user
                                                             })
                if created:
                    series.replace()
            except Parameter.DoesNotExist:
                logger.warning('Parameter %s not found in datasource %s' %
                               (key, ds.name))
            except Exception as e:
                logger.error('ERROR creating series %s: %s' % (key, e))
            series_set.append(series)
        return series_set

    user = request.user

    #candidates = ['PG', 'EV24', 'RD', 'RH', 'P', 'T']

    if not hasattr(well, 'meteo'):
        MeteoData.objects.create(well=well)

    meteo = well.meteo
    gen = Generator.objects.get(classname__icontains='KNMI.meteo')
    closest = Station.closest(well.location)
    name = 'Meteostation {} (dagwaarden)'.format(closest.naam)
    res = docreate(name, closest, gen, '20190101', {
        'TG': 'Temperatuur',
        'RH': 'Neerslag',
        'EV24': 'Verdamping'
    })
    if res:
        meteo.temperatuur = find(lambda s: s.name.startswith('Temperatuur'),
                                 res)
        meteo.neerslag = find(lambda s: s.name.startswith('Neerslag'), res)
        meteo.verdamping = find(lambda s: s.name.startswith('Verdamping'), res)

    gen = Generator.objects.get(classname__icontains='KNMI.neerslag')
    closest = NeerslagStation.closest(well.location)
    name = 'Neerslagstation {}'.format(closest.naam)
    docreate(name, closest, gen, '20190101', {'RD': 'Neerslag'})

    gen = Generator.objects.get(classname__icontains='KNMI.uur')
    closest = Station.closest(well.location)
    name = 'Meteostation {} (uurwaarden)'.format(closest.naam)
    res = docreate(name, closest, gen, '2019010101', {
        'P': 'Luchtdruk',
        'RH': 'Neerslag'
    })
    if res:
        meteo.baro = find(lambda s: s.name.startswith('Lucht'), res)
    #meteo.neerslag = find(lambda s: s.name.startswith('Neer'),res)

    meteo.save()