# -*- coding: utf-8 -*- """ 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: https://www.earthdata.nasa.gov/learn/find-data/near-real-time/firms/vnp14imgtdlnrt#ed-viirs-375m-attributes @author: faraway """ import sys import argparse import re import os.path import pickle import datetime as dt import webbrowser import requests import pandas as pd import folium from geopy.geocoders import Nominatim from geopy.extra.rate_limiter import RateLimiter def check_file_format(args_inputfile): pattern = re.compile(r'local_VIIRS_data-\d{4}-\d{2}-\d{2}.csv') if not re.match(pattern, args_inputfile): raise argparse.ArgumentTypeError return args_inputfile def get_address(data_frame, date): address_file = 'adressdump-' + date if not os.path.exists(address_file): address_list = [] geolocator = Nominatim(user_agent='blub browser') reverse = RateLimiter(geolocator.reverse, min_delay_seconds=5) for r in data_frame.iterrows(): location = (r[1]['latitude'], r[1]['longitude']) address_list.append(reverse(location, language='en')) with open(address_file, 'wb') as file: pickle.dump(address_list, file) else: with open(address_file, 'rb') as file: address_list = pickle.load(file) return address_list 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 not in_ukraine.empty: fire_map = folium.Map(location=in_ukraine[['latitude', 'longitude']].mean( ).to_list(), zoom_start=4, max_bounds=True, crs='EPSG3857') for r in in_ukraine.iterrows(): location = (r[1]['latitude'], r[1]['longitude']) folium.Marker(location=location, tooltip=( r[1].to_string())).add_to(fire_map) if address_list: for address in address_list: if address is not None: location = (address.raw['lat'], address.raw['lon']) folium.CircleMarker(location=location, tooltip=( str(address.raw['display_name'])), radius=10).add_to(fire_map) 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=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() main(args)