tr_snake_old.py 10.9 KB
#!/usr/bin/env python
# -*- coding: utf-8 -*-

# produit des cartes des trajectoires des spots dans des zones choisies 
# entre 2 dates a intervale de temps reglables.

from mpl_toolkits.basemap import Basemap
from time import gmtime, strftime
import matplotlib.pyplot as plt
import time
import datetime
import numpy as np
import pandas as pd
from mpl_toolkits.axes_grid1 import make_axes_locatable

# parametres modifiables --------------------------
region  = 'BDC'				# region (GSL / OHA / BDC / SLE)

day0  = 20150929		# jour de la premiere carte (fmt = YYYYMMDD)
h     = 2				# intervalle de temps entre les cartes (h)
day1  = 20151001		# jour de la derniere carte (fmt = YYYYMMDD)

start = 20150611		# date de debut de suivi de la saison

snake = 36				# nombre d'heure de suivi du serpent
# ================================================

ts = str(day0)
t0 = int(time.mktime(datetime.datetime.strptime(ts, "%Y%m%d").timetuple()))

tt = str(day1)
t1 = int(time.mktime(datetime.datetime.strptime(tt, "%Y%m%d").timetuple()))

tst = str(start)
tS = int(time.mktime(datetime.datetime.strptime(tst, "%Y%m%d").timetuple()))

sday  = 84600
shour = 3600
tint  = shour * h


# colormap
cmap=plt.get_cmap('OrRd')
lab1 = int(snake)
lab2 = int(snake*0.75)
lab3 = int(snake*0.5)
lab4 = int(snake*0.25)
lab5 = 0

# Base de donnees ----------------------------
df = pd.read_csv('/home/nicopa01/data/spot/spots_pos_flag_clean.csv',delimiter=';')
df = df.drop_duplicates(take_last=True)


for x in xrange(t0, t1, tint):
	
	timestamp = x							# temps unix
	dt = timestamp - shour * snake			# heure de debut de suivi
	diff = timestamp - dt					# intervale de suivi
	
	strtime = datetime.datetime.fromtimestamp(int(x)).strftime('%Y-%m-%d %H:%M')
	
	startt = datetime.datetime.fromtimestamp(int(tS)).strftime('%Y-%m-%d %H:%M')
	
	nametime  = datetime.datetime.fromtimestamp(int(x)).strftime('%Y%m%d%H%M')

	if region == 'SLE':
			
		# Estuaire du Saint-Laurent ---------------------------
		# traces des x derniers jours dans l'estuaire
		SLE = df.loc[(df.FLAG == "OCN")
			   & (df.TIME <= x) & (df.TIME > x - shour*snake)]
		
		# trace depuis le debut de l'ete
		SLE_start = df.loc[(df.FLAG == "OCN") & (df.TIME <= x) 
						& (df.TIME > tS)]
		
		fig, ax = plt.subplots()
		
		# caracteristiques de la carte
		m = Basemap(projection='stere',lon_0=-68.5,lat_0=48,\
		            llcrnrlat=47.8,urcrnrlat=49.5,\
		            llcrnrlon=-70,urcrnrlon=-67,\
		            rsphere=6371.2,resolution='h')
		
		m.drawmapboundary(fill_color='lightblue') # fill to edge
		m.drawcountries()
		m.fillcontinents(color='grey',lake_color='lightblue',zorder=0)
		m.drawrivers()
		m.drawcoastlines(linewidth=0.8)
		m.drawparallels(np.arange(40,60,0.5),labels=[1,0,0,0],linewidth=0.0)
		m.drawmeridians(np.arange(-80,-40,1),labels=[0,0,0,1],linewidth=0.0)
		
		
		for spot, group in SLE_start.groupby(['SPOT']):
			lat = group.LAT.values
			lon = group.LON.values
			x,y = m(lon, lat)
			cax = plt.plot(x,y,color='0.35',linewidth=0.7)
		
		# trace les chemins de bouees
		for spot, group in SLE.groupby(['SPOT']):
		    latitude = group.LAT.values
		    longitude = group.LON.values
		    t = (group.TIME.values - float(dt)) / diff
		    x,y = m(longitude, latitude)
		    cax = plt.scatter(x,y,c=t, s=45, cmap=cmap,linewidth=0,vmin=0, vmax=1)
			
		# colorbar
		cbar = fig.colorbar(cax,fraction=0.03, pad=0.03)
		cbar.set_ticks([0,0.25,0.5,0.75,1])
		cbar.update_ticks()
		cbar.ax.set_yticklabels([lab1,lab2,lab3,lab4,lab5])
		cbar.set_label('heures', rotation=270,labelpad=15)
		

		# legende
		plt.annotate(strtime + ' HAE', xy=(1, 1),  xycoords='data', size=20,
		            xytext=(0.9, 0.1), textcoords='axes fraction',
		            horizontalalignment='right', verticalalignment='top')
		plt.title(u"Dérive de surface (" + str(snake) + u" dernières heures)")
		#enregistrement
		#plt.savefig('/home/nicopa01/data/spot/suivi/SLE/SLE5_' + nametime + '.png',dpi=300)
		plt.savefig('/home/nicopa01/data/spot/suivi/SLE/SLE_' + nametime + '.jpg',dpi=300)
		plt.close()
		
	if region == 'BDC':
		
		bdc = df.loc[(df.SPOT == 24) | (df.SPOT == 23) | (df.SPOT == 52) |
				 (df.SPOT == 53) | (df.SPOT >= 700) &  (df.SPOT < 899)]
		
		# Baie des chaleurs ---------------------------
		# traces des x derniers jours dans la baie
		BDC = bdc.loc[(df.FLAG == "OCN") & (df.TIME <= x) & (df.TIME > x - shour*snake)]
		
		# selectionne les positions depuis le debut de l'ete
		BDC_start = bdc.loc[(df.FLAG == "OCN") & (df.TIME <= x) & (df.TIME > tS)]
  
		n = bdc.loc[(df.FLAG == "OCN") & (df.TIME <= x) & (df.TIME > tS)]
		number = str(n.TIME.count())
		
		fig, ax = plt.subplots()
		
		# caracteristiques de la carte
		m = Basemap(projection='stere',lon_0=-68.5,lat_0=48,\
		            llcrnrlat=47.5,urcrnrlat=48.9,\
		            llcrnrlon=-66.9,urcrnrlon=-63.8,\
		            rsphere=6371.2,resolution='h')
		
		m.drawmapboundary(fill_color='lightblue') # fill to edge
		m.drawcountries()
		m.fillcontinents(color='grey',lake_color='lightblue',zorder=0)
		m.drawrivers()
		m.drawcoastlines(linewidth=0.8)
		m.drawparallels(np.arange(40,60,0.5),labels=[1,0,0,0],linewidth=0.0)
		m.drawmeridians(np.arange(-80,-40,1),labels=[0,0,0,1],linewidth=0.0)

		# trace depuis le début de l'ete
		for spot, group in BDC_start.groupby(['SPOT']):
			lat = group.LAT.values
			lon = group.LON.values
			x,y = m(lon, lat)
			plt.plot(x,y,color='0.35',linewidth=0.7)		

		# trace les chemins de bouees
		for spot, group in BDC.groupby(['SPOT']):
		    latitude = group.LAT.values
		    longitude = group.LON.values
		    t = (group.TIME.values - float(dt)) / diff
		    x,y = m(longitude, latitude)
		    cax = plt.scatter(x,y,c=t, s=45, cmap=cmap,linewidth=0,vmin=0, vmax=1)

		# colorbar
		cbar = fig.colorbar(cax,fraction=0.03, pad=0.03)
		cbar.set_ticks([0,0.25,0.5,0.75,1])
		cbar.update_ticks()
		cbar.ax.set_yticklabels([lab1,lab2,lab3,lab4,lab5])
		cbar.set_label('heures', rotation=270,labelpad=15)
		

		# legende
		plt.annotate(strtime + ' HAE', xy=(1, 1),  xycoords='data', size=20,
		            xytext=(0.6, 0.1), textcoords='axes fraction',
		            horizontalalignment='right', verticalalignment='top')
		
		plt.annotate(number + ' positions depuis le ' + startt, xy=(1, 1),  
				    xycoords='data', size=13,
		            xytext=(0.68, 0.9), textcoords='axes fraction',
		            horizontalalignment='right', verticalalignment='top')    
		            
		plt.title(u"Dérive de surface (" + str(snake) + u" dernières heures)")
		#enregistrement
		#plt.savefig('/home/nicopa01/data/spot/suivi/BDC/BDC_' + nametime + '.png',dpi=300)
		plt.savefig('/home/nicopa01/data/spot/suivi/BDC/BDC_' + nametime + '.jpg',dpi=300)
		plt.close()
		
	if region == 'GSL':
			
		# Estuaire du Saint-Laurent ---------------------------
		# traces des x derniers jours dans l'estuaire
		GSL = df[(df.FLAG == "OCN") & (df.TIME <= x) & (df.TIME > dt)]
		
		GSL_start = df.loc[(df.FLAG == "OCN") & (df.TIME <= x) & (df.TIME > tS)]
		
		n = df.loc[(df.FLAG == "OCN") & (df.TIME <= x) & (df.TIME > tS)]
		number = str(n.TIME.count())

		fig, ax = plt.subplots()
		
		# caracteristiques de la carte
		
		
		m = Basemap(projection='stere',lon_0=-64.5,lat_0=48,\
            llcrnrlat=45.2,urcrnrlat=51.6,\
            llcrnrlon=-70,urcrnrlon=-56.5,\
            rsphere=6371.2,resolution='h')
            
		m.drawmapboundary(fill_color='lightblue') # fill to edge
		m.drawcountries()
		m.fillcontinents(color='grey',lake_color='lightblue',zorder=0)
		m.drawrivers()
		m.drawcoastlines(linewidth=0.8)
		m.drawparallels(np.arange(40,60,2),labels=[1,0,0,0],linewidth=0.0)
		m.drawmeridians(np.arange(-80,-40,2),labels=[0,0,0,1],linewidth=0.0)
		
		# trace depuis le début de l'ete
		for spot, group in GSL_start.groupby(['SPOT']):
			lat = group.LAT.values
			lon = group.LON.values
			x,y = m(lon, lat)
			plt.plot(x,y,color='0.35',linewidth=0.7)		
		
		# trace les chemins de bouees
		for spot, group in GSL.groupby(['SPOT']):
		    latitude = group.LAT.values
		    longitude = group.LON.values
		    t = (group.TIME.values - float(dt)) / diff
		    x,y = m(longitude, latitude)
		    cax = plt.scatter(x,y,c=t, s=45, cmap=cmap,linewidth=0,vmin=0, vmax=1)
		    plt.plot(x,y,'k-',linewidth=0.5)
			
		# colorbar
		cbar = fig.colorbar(cax,fraction=0.03, pad=0.03)
		cbar.set_ticks([0,0.25,0.5,0.75,1])
		cbar.update_ticks()
		cbar.ax.set_yticklabels([lab1,lab2,lab3,lab4,lab5])
		cbar.set_label('heures', rotation=270,labelpad=15)
		
		# legende
		plt.annotate(strtime + ' HAE', xy=(1, 1),  xycoords='data', size=20,
		            xytext=(0.9, 0.1), textcoords='axes fraction',
		            horizontalalignment='right', verticalalignment='top')    

		plt.title(u"Dérive de surface (" + str(snake) + u" dernières heures)")
		#enregistrement
		#plt.savefig('/home/nicopa01/data/spot/suivi/GSL/GSL_' + nametime + '.png',dpi=300)
		plt.savefig('/home/nicopa01/data/spot/suivi/GSL/GSL_' + nametime + '.jpg',dpi=300)
		plt.close()
		
	if region == 'OHA':
			
		# Estuaire du Saint-Laurent ---------------------------
		# traces des x derniers jours dans l'estuaire
		OHA = df[(df.FLAG == "OCN")
				& (df.TIME <= x) & (df.TIME > x - shour*snake)]
		
		OHA_start = df.loc[(df.FLAG == "OCN")
				& (df.TIME <= x) & (df.TIME > tS)]

		fig, ax = plt.subplots()
		
		# caracteristiques de la carte
		m = Basemap(projection='stere',lon_0=-60,lat_0=49,\
		            llcrnrlat=47,urcrnrlat=51.5,\
		            llcrnrlon=-63.8,urcrnrlon=-56.8,\
		            rsphere=6371.2,resolution='h')
		
		m.drawmapboundary(fill_color='lightblue') # fill to edge
		m.drawcountries()
		m.fillcontinents(color='grey',lake_color='lightblue',zorder=0)
		m.drawrivers()
		m.drawcoastlines(linewidth=0.8)
		m.drawparallels(np.arange(40,60,2),labels=[1,0,0,0],linewidth=0.0)
		m.drawmeridians(np.arange(-80,-40,2),labels=[0,0,0,1],linewidth=0.0)
		
		# trace depuis le début de l'ete
		for spot, group in OHA_start.groupby(['SPOT']):
			lat = group.LAT.values
			lon = group.LON.values
			x,y = m(lon, lat)
			plt.plot(x,y,color='0.35',linewidth=0.7)		
			
		# trace les chemins de bouees
		for spot, group in OHA.groupby(['SPOT']):
		    latitude = group.LAT.values
		    longitude = group.LON.values
		    t = (group.TIME.values - float(dt)) / diff
		    x,y = m(longitude, latitude)
		    cax = plt.scatter(x,y,c=t, s=45, cmap=cmap,linewidth=0,vmin=0, vmax=1)
			
		# colorbar
		cbar = fig.colorbar(cax,fraction=0.03, pad=0.03)
		cbar.set_ticks([0,0.25,0.5,0.75,1])
		cbar.update_ticks()
		cbar.ax.set_yticklabels([lab1,lab2,lab3,lab4,lab5])
		cbar.set_label('heures', rotation=270,labelpad=15)
		
		# legende
		plt.annotate(strtime + ' HAE', xy=(1, 1),  xycoords='data', size=16,
		            xytext=(0.55, 0.9), textcoords='axes fraction',
		            horizontalalignment='right', verticalalignment='top')
		plt.title(u"Dérive de surface (" + str(snake) + u" dernières heures)")
		#enregistrement
		#plt.savefig('/home/nicopa01/data/spot/suivi/OHA/OHA_' + nametime + '.png',dpi=300)
		plt.savefig('/home/nicopa01/data/spot/suivi/OHA/OHA_' + nametime + '.jpg',dpi=300)
		plt.close()