From cc40a8c28288e5a85834dd73efca4ab2975f6a32 Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 28 Jul 2022 17:06:10 +0200 Subject: [PATCH] a little bit of refactoring --- VIIRSdownloader.py | 127 ++++++++++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 54 deletions(-) diff --git a/VIIRSdownloader.py b/VIIRSdownloader.py index 65724ce..1dd058e 100644 --- a/VIIRSdownloader.py +++ b/VIIRSdownloader.py @@ -1,34 +1,35 @@ # -*- coding: utf-8 -*- """ -Downloads the actual active fire csv from +Downloads the actual active fire csv from https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_Europe_24h.csv and displays it on a map. -Description of data displayed: +Description of data displayed: https://www.earthdata.nasa.gov/learn/find-data/near-real-time/firms/vnp14imgtdlnrt#ed-viirs-375m-attributes -@author: Cybermancer +@author: faraway """ import sys import argparse import re import os.path -import requests +import pickle import datetime as dt +import webbrowser +import requests import pandas as pd import folium -import webbrowser + from geopy.geocoders import Nominatim from geopy.extra.rate_limiter import RateLimiter -import pickle -def fileFormat(args_inputfile): +def check_file_format(args_inputfile): pattern = re.compile(r'local_VIIRS_data-\d\d\d\d-\d\d-\d\d.csv') if not re.match(pattern, args_inputfile): raise argparse.ArgumentTypeError return args_inputfile -def getAdress(data_frame, date): +def get_address(data_frame, date): address_file = 'adressdump-' + date if not os.path.exists(address_file): address_list = [] @@ -45,51 +46,12 @@ def getAdress(data_frame, date): return address_list -def main(args): - date = str(dt.date.today()) - bounding = [44.184598, 52.3797464, 22.137059, 40.2275801] +def render_map(in_ukraine, address_list, date): src = ('https://gibs.earthdata.nasa.gov/wmts-webmerc/VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1/' + 'default/{time}/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg') - if args.inputfile: - local_file = args.inputfile - date = re.search(r'\d{4}-\d\d-\d\d', args.inputfile).group(0) - else: - local_file = 'local_VIIRS_data-' + date + '.csv' - if not os.path.exists(local_file): - try: - remote_url = r'https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_Europe_24h.csv' - data = requests.get(remote_url, allow_redirects=True) - with open(local_file, 'wb') as file: - file.write(data.content) - except: - SystemExit(2) - - html_file = local_file.split('.')[0] + '.html' - data_frame = pd.read_csv(local_file) - data_frame = data_frame.astype({'confidence': 'string'}) - in_ukraine = data_frame[data_frame['latitude'].between(bounding[0], bounding[1]) & data_frame['longitude'].between( - bounding[2], bounding[3]) & (data_frame['confidence'].str.contains('nominal') | data_frame['confidence'].str.contains('high'))] - - if not args.noreversegeolocation: - address_list = getAdress(in_ukraine, date) - else: - address_list = [] - if not in_ukraine.empty: fire_map = folium.Map(location=in_ukraine[['latitude', 'longitude']].mean( ).to_list(), zoom_start=4, max_bounds=True, crs='EPSG3857') - folium.raster_layers.TileLayer( - tiles=src, - subdomains='abc', - name='VIIRS CorrectedReflectance_BandsM11-I2-I1', - attr='NASA VIIRS', - overlay=True, - layer='VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1', - tileMatrixSet='GoogleMapsCompatible_Level9', - time=str(dt.date.fromisoformat(date) - dt.timedelta(days=1)), - tileSize=256, - ).add_to(fire_map) - folium.LayerControl().add_to(fire_map) for r in in_ukraine.iterrows(): location = (r[1]['latitude'], r[1]['longitude']) folium.Marker(location=location, tooltip=( @@ -97,19 +59,76 @@ def main(args): if address_list: for address in address_list: if address is not None: - location = (adress.raw['lat'], adress.raw['lon']) - folium.CircleMarker(location=location, tooltip=(str(adress.raw['display_name'])), + location = (address.raw['lat'], address.raw['lon']) + folium.CircleMarker(location=location, + tooltip=( + str(address.raw['display_name'])), radius=10).add_to(fire_map) - if not os.path.exists(html_file): - fire_map.save(html_file) - webbrowser.open_new(html_file) + else: + + fire_map = folium.Map(location=[(44.184598 + 52.3797464)/2, (22.137059 + 40.2275801)/2], + zoom_start=4, max_bounds=True, crs='EPSG3857') + + folium.raster_layers.TileLayer( + tiles=src, + subdomains='abc', + name='VIIRS CorrectedReflectance_BandsM11-I2-I1', + attr='NASA VIIRS', + overlay=True, + layer='VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1', + tileMatrixSet='GoogleMapsCompatible_Level9', + time=str(dt.date.fromisoformat(date) - dt.timedelta(days=1)), + tileSize=256, + ).add_to(fire_map) + folium.LayerControl().add_to(fire_map) + return fire_map + + +def main(args): + bounding = [44.184598, 52.3797464, 22.137059, 40.2275801] + if args.inputfile: + local_file = args.inputfile + date = re.search(r'\d{4}-\d{2}-\d{2}', args.inputfile).group(0) + else: + date = str(dt.date.today()) + local_file = 'local_VIIRS_data-' + date + '.csv' + if not os.path.exists(local_file): + try: + remote_url = r'https://firms.modaps.eosdis.nasa.gov/data/active_fire/suomi-npp-viirs-c2/csv/SUOMI_VIIRS_C2_Europe_24h.csv' + data = requests.get(remote_url, allow_redirects=True) + try: + with open(local_file, 'wb') as file: + file.write(data.content) + except OSError as e: + raise SystemExit(e) + except requests.exceptions.RequestException as e: + raise SystemExit(e) + + html_file = local_file.split('.')[0] + '.html' + data_frame = pd.read_csv(local_file) + data_frame = data_frame.astype({'confidence': 'string'}) + in_ukraine = data_frame[data_frame['latitude'].between(bounding[0], bounding[1]) + & data_frame['longitude'].between(bounding[2], + bounding[3]) + & (data_frame['confidence'].str.contains('nominal') + | data_frame['confidence'].str.contains('high'))] + + if not args.noreversegeolocation: + address_list = get_address(in_ukraine, date) + else: + address_list = [] + + fire_map = render_map(in_ukraine, address_list, date) + fire_map.save(html_file) + webbrowser.open_new(html_file) sys.exit(0) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument( - '-i', '--inputfile', type=fileFormat, help='Specify the cvs file containing the satellite data to be displayed. INPUTFILE must match local_VIIRS_data-YYYY-MM-DD.csv') + '-i', '--inputfile', type=check_file_format, + help='Specify the cvs file containing the satellite data to be displayed. INPUTFILE must match local_VIIRS_data-YYYY-MM-DD.csv') parser.add_argument('-nr', '--noreversegeolocation', action='store_true', help='Disable reverse geolocation') args = parser.parse_args()