md
Données de marée au Canada avec Python
Dernière mise à jour: 2019-05-27. Première version 2019-05-18
<-Autres IPA météorologiques --

En regardant la rivière à midi, je me demandais si la marée était montante ou descendante. Il n’existe aucun moyen évident de répondre à cette question, sauf peut-être en comparant le niveau actuel de l’eau avec celui qu'on peut apercevoir sur un cliché pris une heure auparavant. Si la maison se trouvait sur la côte est du Nouveau-Brunswick (à environ 70 km), je pourrais probablement m'en rendre compte par le sens de l'écoulement de l'eau, car l'amplitude des marées peut atteindre jusqu'à 17 mètres à certains endroits de la baie de Fundy. Cependant, "notre" rivière, la rivière Shediac, se jette dans la baie de Shediac dans le détroit de Northumberland et l'amplitude des marées dans cette baie est d'un peu plus d'un mètre. Voici les prévisions des marées pour aujourd'hui.

Heures et hauteurs des pleines et basses mers
baie de Shediac, 2019-05-18
HeureHauteur (m)
03h441,10
09h351,20
16h340,50

Comme on peut le constater, le niveau de l’eau baissait de 10 cm par heure vers midi (approximation linéaire peu précise). Il est très douteux que je puisse percevoir une baisse de 8 mm du niveau de la rivière sur une période de cinq minutes à une distance de 30 mètres. En réalité, la baisse était encore plus petite, car les eaux de marée doivent remonter la rivière sur 4 ou 5 km, de sorte que l’amplitude des marées est probablement beaucoup moins importante devant la maison.

Je pourrais essayer de suivre une feuille ou un autre objet flottant dans la rivière. Cependant, des vents même légers peuvent influer sur le débit des eaux de surface et même renverser la direction du mouvement de ces eaux. les seules méthodes infaillibles que je puisse imaginer pour répondre à la question sont les suivantes :

Ces deux solutions m'intéressent, mais je vais parler de la première option ici.

Tables des marées et 
des courants du Canada, volume 2: Golfe du Saint-Laurent

Jeune homme, j'ai étudié les marées et la bonne méthode pour interpoler les données qu'on trouvait dans des tables des marées imprimées. À l'époque, cela était fait en ajustant une courbe sinusoïdale aux données horaires prévisionnelles. Si je me souviens bien, les navigateurs utilisaient une table sinusoïdale pour interpoler les données, tandis que les ingénieurs utilisaient peut-être une règle à calcul. Voilà qui révèle mon âge, car de nos jours l'on doit se servir d'une application qui probablement ajuste un type de spline aux données.

Bien que les tables des marées annuelles soient toujours imprimées et vendues à un prix raisonnable (voir l’illustration à droite), je suis trop radin pour dépenser 6,50 $ CAN pour les Tables des marées et des courants du Canada, volume 2: Golfe du Saint-Laurent. Y a-t-il un marché pour cette publication, lorsque les données sont disponibles gratuitement auprès du Service hydrographique du Canada (SHC) rattaché au ministère Pêches et Océans Canada ? Il existe un service téléphonique sans frais: les niveaux d’eau au bout des doigts ! et une page Web pour chaque station au Canada; voici les prévisions de 2019 des marées de la baie de Shediac. Une année complète de prévisions est peut-être plus que nécessaire à un moment donné. Il y a une autre page à Pêches et Océans qui indique l'heure et la hauteur prévues des mers hautes et basses ainsi que les prévisions horaires sur 7 jours des hauteurs de l'eau : baie de Shediac * (n ° 1805), prévisions de marée de 7 jours. Les données peuvent être affichées sous forme de graphique, de tableau ou de texte. Il ne serait pas trop difficile de « capter ces données » surtout quand elles sont présentées sous forme de texte. De plus, il est possible d’obtenir les niveaux d’eau observés dans la baie de Shediac 24 heures sur 24, toutes les 15 minutes, à partir de la même page.

Il n’était pas difficile de déterminer le format de la requête HTML pour obtenir les prévisions de CHS.

http://www.tides.gc/ca/{LANG}/station?type={TYPE}&date={YYYY}%2F{MM}%2F{DD}&sid={ID}&tz={TZ}&pres={MODE}

ParamValeur
LANGeng | fraAnglais ou français
TYPE0 | 1Prévisions ou observations (#)
YYYYAnnée - 4 chiffres
MMMois - 2 chiffres
DDJour - 2 chiffres
IDnuméro d'identification de la stationSee Index des localités
TZUTC | NDT | NST | ADT | AST | EDT | EST | CDT | CST | MDT | MST | PDT | PST
MODE0 | 1 | 2 Graphique, tableau ou texte

(#) Les observations sont disponibles uniquement pour les stations, telles que la baie de Shediac, dont le nom est entièrement en majuscules dans l'index des localités. L’heure locale dans les six fuseaux horaires canadiens est définie par rapport au Temps universel coordonné (UTC).

Heure avancéeHeure normale
FuseauHeure locale  FuseauHeure locale
Terre-NeuveHATNUTC -2:30HNTNUTC -3:30
AtlantiqueHAAUTC -3:00HNAUTC -4:00
EstHAEUTC -4:00HNEUTC -5:00
CentreHACUTC -5:00HNCUTC -6:00
RocheusesHARUTC -6:00HNRUTC -7:00
PacifiqueHAPUTC -7:00HNPUTC -8:00

Étrangement, Pêches et Océans définit l' heure normale de l' Atlantique comme étant HNA (Z+4) Heure Normale de l'Atlantique, où Z = Zulu est le nom militaire de GMT (Greenwich Mean Time, prédécesseur de l'UTC). Or Shediac est à l'ouest de Greenwich et l'heure locale y est Z-4. Ce n'est qu'une petite erreur, les heures locales indiquées dans le tableau, les graphiques, etc. sur le site sont correctes.

L'URL permettant d'obtenir un graphique des niveaux d'eau pendant 7 jours à compter du 18 mai 2019 dans la baie de Shediac en français à l'aide de l'heure avancée de l'Atlantique est la suivante:

http://www.tides.gc.ca/fra/station?type=0&date=2019%2F05%2F18&sid=1805&tz=ADT&pres=0

Voici la partie pertinente de la sortie.

graph

L'idée de faire de la capture de données sur l'écran n'est pas très attrayante. J'espérais trouver une interface de programmation (API) REST bien définie pour obtenir les données souhaitées de la même manière que les informations météorologiques peuvent être obtenues (voir L'IPA météorologique de Yahoo en Free Pascal et Autres IPA météorologiques). Contrairement aux informations météorologiques, je ne pouvais pas trouver un site proposant des données de marée (quasi) « universelles » pour utilisation personnelle gratuite. Heureusement, et sans surprise, compte tenu de ce qui précède, le Service hydrographique du Canada (SHC) accorde un accès gratuit à ses services Web sur les niveaux d'eau tant que le Contrat de licence est respecté. De nombreux sites proposant des informations sur les marées pour la baie de Shediac ne mentionnent pas le SHC. Soit ils obtiennent leurs informations d'une autre source, que je n'ai pas pu identifier, soit qu'ils ignorent carrément licence qui stipule clairement:

4. L’usager accepte les conditions suivantes régissant l’utilisation des données et du Service :
  1. Le droit d’auteur des données est la propriété de Sa Majesté la Reine du chef du Canada, représentée par la ministre des Pêches et des Océans, au nom du Service hydrographique du Canada. Le droit d’auteur NE peut PAS faire l’objet d’une vente, d’une licence, d’une location, d’une cession ou d’un don à un tiers.
  2. L’utilisateur a le droit d’utiliser le Service, de reproduire et de diffuser les données, et de créer ou de faire créer, de vendre ou de faire vendre et d’octroyer ou de faire octroyer de licences des fichiers, des produits ou des publications dérivés ou intégrés ou par tout autre moyen, d’utiliser les données et le Service, en tout ou en partie (« produits dérivés ») et d’octroyer une sous­licence pour utiliser et reproduire les données et le Service, AUX CONDITIONS SUIVANTES :
    • L’utilisateur reconnaît le SHC comme le détenteur du droit d’auteur des données sur toutes les reproductions des données.
    • L’utilisateur inclut l’avis suivant dans un endroit bien en vue de tout produit dérivé contenant des données : « Ce produit a été conçu par ou pour le compte de (insérer la dénomination sociale de l’entreprise de l’utilisateur) et comprend les données et les services offerts par le Service hydrographique du Canada de Pêches et Océans Canada. L’inclusion de données provenant du Service hydrographique du Canada de Pêches et Océans Canada dans ce produit NE signifie PAS que ce Service ou Pêches et Océans Canada appuie ce produit. »
    • ...

Comme j'ai déjà reproduit les données de marée du SHC, j'espère que ce qui précède satisfait aux conditions du contrat.

Au début, il semblait qu'il serait difficile d'accéder aux données du site Web de la SCH, car il utilise des technologies qui me semblaient anciennes et obscures.

Les trois services web utilisent SOAP et XML comme protocole de communication et la langue anglaise pour l’appel des méthodes et l’échange des données. Chacun des trois services possède une description en XML accessible en langage WSDL (i.e. : https://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl). Cette description est utile pour générer automatiquement (à l’aide d’outils comme WSDL2Java d’Apache Axis) du code pour communiquer avec les services.
Source

Aucune API REST? Pas de sortie au format JSON? WSDL? Tout cela me dépasse. Cependant, il y a une référence à un cookbook (un livre de recettes) sur sourceforge dans les Spécifications techniques pour l’accès aux services web de niveaux d’eau. Ce livre contient un exemple d'utilisation du service en 5 lignes du langage Python.

import sys from SOAPpy import WSDL server = WSDL.Proxy(sys.argv[1] + "?wsdl") #connect bnds = server.getBoundarySpatial() #call print "lat: (%.2f, %.2f) lon: (%.2f, %.2f)" (bnds.latitude.min, bnds.latitude.max, bnds.longitude.min, bnds.longitude.max)

C'était suffisant pour commencer. Le module SOAPpy n'est installé ni dans la version 2.7 de Python ni dans la version 3.6 fournie avec Ubuntu 18.04. Avant de l'installer, il semblait judicieux de faire une petite recherche et j'ai choisi d'installer le module Zeep, un client SOAP uniquement, car il est activement mis à jour et disponible pour les deux versions de Python. Les dernières mises à jour SOAPpy remontent à cinq ans et le module est plus ambitieux puisqu'il implémente également un serveur SOAP. Voici l'exemple de CHS utilisant Zeep et sa sortie.

from zeep import Client client = Client("https://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl") bnds = client.service.getBoundarySpatial() print ('latitude bounds: from', bnds.latitude.min, 'to', bnds.latitude.max) print ('longitude bounds: from', bnds.longitude.min, 'to', bnds.longitude.max)

michel@hp:~$ python3 chs_example.py latitude bounds: from -54.31735 to 83.1166666666667 longitude bounds: from -138.916666666667 to 130.324083333333

Cette région limitrophe occupe une grande partie de la surface de la Terre. Je ne suis pas sûr ce qu'elle représente, certainement pas le Canada, mais cela n'a pas d'importance, car des données ont été obtenues à partir du site du SHC. La fonction importante pour mon but s'appelle search. Il est documenté avec quelques exemples aux pages 7, 8 et 9 des Spécifications techniques pour l’accès aux services web de niveaux d’eau. Grâce à cette information, j'ai pu bricoler un script qui affiche les heures et les hauteurs en mètres des marées hautes et basses dans la baie de Shediac pour durant une journée donnée.

#!/usr/bin/env python3 # coding: utf8 ## Script to get the times and height of low and high tides in a given day ## at a given place. ## Will work with Python 2.x with a slight change in the last line and ## removing '3' at end of the top line shebang from zeep import Client from datetime import datetime, timedelta # Parameters, these should be command line arguments # TZ = -3 # ADT, -4 for AST date = "2019-05-18" stationID = "01805" stationName = "shediac" # One or the other of stationID or stationName must be given. # The stationName does not have to be a perfect match to the actual name # found in the Index of Sites: http://www.tides.gc.ca/eng/station/list # For example 'shediac' will match 'Shediac Bay *'. # Need UTC time for start and end of the date start_dt = datetime.strptime(date + " 00:00:00", "%Y-%m-%d %H:%M:%S") - timedelta(hours=TZ) end_dt = datetime.strptime(date + " 23:59:59", "%Y-%m-%d %H:%M:%S") - timedelta(hours=TZ) # Convert the times to strings as needed for the search sdt = start_dt.strftime("%Y-%m-%d %H:%M:%S") edt = end_dt.strftime("%Y-%m-%d %H:%M:%S") client = Client("https://ws-shc.qc.dfo-mpo.gc.ca/predictions?wsdl") # The geographic coordinates in the search correspond to earth as a whole; # the metadata station_id or stations_name will be used to select the area # Using station_id metadata #rest = client.service.search("hilo", -90.0, 90.0, -180.0, 180.0, 0.0, 0.0, sdt, edt, 1, 5, True,"station_id="+stationID, "asc") # Using station_name metadata rest = client.service.search("hilo", -90.0, 90.0, -180.0, 180.0, 0.0, 0.0, sdt, edt, 1, 5, True,"station_name="+stationName, "asc") data = rest.data # Recover the name in case station_id was used to select the area # or the "official" station name if station_name was used to select the area meta = data[0].metadata where = meta[1].value ## Print header as per CHS web page # English header print("Times and Heights for High and Low Tides") # French header #print("Heures et hauteurs des pleines et basses mers") # get rid of * marking available observations print(where.replace("*", "")) print(date) # print data for x in data: dt = datetime.strptime(x.boundaryDate.max, "%Y-%m-%d %H:%M:%S") + timedelta(hours=TZ) print (dt.strftime(" %H:%M "), x.value, "(m)") #print dt.strftime(" %H:%M "), x.value, "(m)" ## for pretty print in python 2

Version téléchargeable du script: tide.py.

Encore une fois, je ne prétends pas écrire de beaux scripts Python, mais au moins celui-ci fonctionne:

michel@hp:~ $ chmod +x tide.py once only michel@hp:~ $ ./tide.py Times and Heights for High and Low Tides Shediac Bay 2019-05-18 03:44 1.10 (m) 09:35 1.20 (m) 16:34 0.50 (m)

Bien entendu, il ne s'agit que d'un script de validation conceptuelle. La partie difficile reste à faire :

La bonne nouvelle en ce qui concerne le premier point est que le script tide.py fonctionne sur un Raspberry Pi sous Raspbian. La mauvaise nouvelle est que l'installation de Zeep a été très compliquée. J'ai essayé beaucoup de choses pour installer le module et il faudrait partir d'une nouvelle copie du système d'exploitation pour essayer de déterminer ce qui doit vraiment être fait pour réaliser cette installation. C’est là que les choses se corsent parfois lorsque, pour des raisons inconnues, il semble impossible d’installer un paquet correctement une deuxième fois. On verra.

Il est relativement facile d'installer Zeep sur Raspbian pour utiliser tide.py. Il fallait lire les instructions de Michael van Telligent l'auteur principal du module après avoir installé libxslt1.1 exigé par lxml.

pi@raspberrypi:~ $ sudo apt install libxslt1.1 -y ... pi@raspberrypi:~ $ pip install lxml==4.2.5 zeep

Les modules pip et son homologue pour Python 3, pip3, ne sont pas contenus dans la version Stretch Lite de Raspbian. Ils sont peut-être inclus dans la version complète de Stretch. En revanche, pip est automatiquement disponible dans chaque environnement Python virtuel.

Qu'importe ce que j'ai essayé, je n'ai pu installer lxml dans Armbian 5.83 sur un Orange Pi Zero. Il me restait qu'à compiler le module à partir de sa source quand j'ai trouvé une autre solution qui consiste à utiliser le module suds plutôt que Zeep. Le module original est vieux (circa fin 2007 avec une dernière mise à jour le 31 avril 2009), mais il existe de nombreuses fourches dont suds-community qui semble la plus active. Sa dernière mise à jour date du 7 février dernier. Son installation ne pouvait pas être plus simple.

user@orangepizero:~ $ pip install suds-community

Le script tide.py fonctionnera exactement comme avant si l'on change

from zeep import Client

à

#from zeep import Client from suds.client import Client
<-Autres IPA météorologiques --