a little bit of refactoring

This commit is contained in:
faraway 2022-07-28 17:06:10 +02:00
parent d3bbd76fef
commit cc40a8c282
1 changed files with 73 additions and 54 deletions

View File

@ -1,34 +1,35 @@
# -*- coding: utf-8 -*- # -*- 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 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. 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 https://www.earthdata.nasa.gov/learn/find-data/near-real-time/firms/vnp14imgtdlnrt#ed-viirs-375m-attributes
@author: Cybermancer @author: faraway
""" """
import sys import sys
import argparse import argparse
import re import re
import os.path import os.path
import requests import pickle
import datetime as dt import datetime as dt
import webbrowser
import requests
import pandas as pd import pandas as pd
import folium import folium
import webbrowser
from geopy.geocoders import Nominatim from geopy.geocoders import Nominatim
from geopy.extra.rate_limiter import RateLimiter 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') pattern = re.compile(r'local_VIIRS_data-\d\d\d\d-\d\d-\d\d.csv')
if not re.match(pattern, args_inputfile): if not re.match(pattern, args_inputfile):
raise argparse.ArgumentTypeError raise argparse.ArgumentTypeError
return args_inputfile return args_inputfile
def getAdress(data_frame, date): def get_address(data_frame, date):
address_file = 'adressdump-' + date address_file = 'adressdump-' + date
if not os.path.exists(address_file): if not os.path.exists(address_file):
address_list = [] address_list = []
@ -45,51 +46,12 @@ def getAdress(data_frame, date):
return address_list return address_list
def main(args): def render_map(in_ukraine, address_list, date):
date = str(dt.date.today())
bounding = [44.184598, 52.3797464, 22.137059, 40.2275801]
src = ('https://gibs.earthdata.nasa.gov/wmts-webmerc/VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1/' + src = ('https://gibs.earthdata.nasa.gov/wmts-webmerc/VIIRS_SNPP_CorrectedReflectance_BandsM11-I2-I1/' +
'default/{time}/GoogleMapsCompatible_Level9/{z}/{y}/{x}.jpg') '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: if not in_ukraine.empty:
fire_map = folium.Map(location=in_ukraine[['latitude', 'longitude']].mean( fire_map = folium.Map(location=in_ukraine[['latitude', 'longitude']].mean(
).to_list(), zoom_start=4, max_bounds=True, crs='EPSG3857') ).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(): for r in in_ukraine.iterrows():
location = (r[1]['latitude'], r[1]['longitude']) location = (r[1]['latitude'], r[1]['longitude'])
folium.Marker(location=location, tooltip=( folium.Marker(location=location, tooltip=(
@ -97,19 +59,76 @@ def main(args):
if address_list: if address_list:
for address in address_list: for address in address_list:
if address is not None: if address is not None:
location = (adress.raw['lat'], adress.raw['lon']) location = (address.raw['lat'], address.raw['lon'])
folium.CircleMarker(location=location, tooltip=(str(adress.raw['display_name'])), folium.CircleMarker(location=location,
tooltip=(
str(address.raw['display_name'])),
radius=10).add_to(fire_map) radius=10).add_to(fire_map)
if not os.path.exists(html_file): else:
fire_map.save(html_file)
webbrowser.open_new(html_file) 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) sys.exit(0)
if __name__ == '__main__': if __name__ == '__main__':
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument( 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', parser.add_argument('-nr', '--noreversegeolocation', action='store_true',
help='Disable reverse geolocation') help='Disable reverse geolocation')
args = parser.parse_args() args = parser.parse_args()