123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 |
- \documentclass[a4paper, 8pt]{article}
- \usepackage[utf8]{inputenc}
- \usepackage[T1]{fontenc}
- \usepackage[francais, english]{babel}
- \usepackage[a4paper]{geometry}
- \geometry{hmargin=2.5cm,vmargin=1.5cm}
- \usepackage{amssymb, amsmath,amsfonts,amsthm,mathrsfs}
- \usepackage{hyperref}
- \sloppy
- \title{\vspace{-2cm}Rapport du projet de \emph{Web Data Management}}
- \author{Shendan Jin \& Olivier Marty}
- \date\today
- \begin{document}
- \maketitle
- \section{Présentation du projet}
- Le but de ce projet est d'utiliser différentes sources d'informations sur
- internet qui concernent l'état d'un moyen de transport (lignes de
- métro, de train, stations vélo vide ou pleine, ou encore un bouchon sur
- l'autoroute (non implémenté)) afin de prévenir l'utilisateur lorsque celui-ci va
- les utiliser.
- Pour cela on se connecte à son agenda (Google Calendar), et on analyse ses emails
- (Gmail) pour prévoir ses déplacements, mais d'autres sources pourrait être
- ajoutées, de façon modulaire.
- Pour chaque événement, on géolocalise l'adresse avec l'API d'OpenStreetMap,
- puis on cherche les moyens de transport utile pour ce rendre à ces coordonnées~:
- lignes passant par une station proche, stations de vélos proches...
- En cas de problème sur l'un de ces moyens de transport, l'utilisateur est
- notifié par le medium de son choix (email, ou sms via l'API de free mobile).
- \section{Description globale}
- Le projet est divisé en trois principales composantes :
- \subsection{La classe Event}
- Cette classe représente un événement auquel l'utilisateur va se rendre.
- Elle présente quatre attributs : id, date, location, et description.
- Les instances sont produites à partir de deux sources : Google Calendar et
- Gmail.
- Les seuls mails aboutissant à la détection d'un événement sont ceux de la forme :\\
- "Rendez-vous\\
- le 22/02/2016 08h45\\
- à Université Paris Diderot\\
- pour le cours de WDM"
- \subsection{La classe Source}
- Cette classe représente une information provenant d'internet et qui concerne
- l'état d'un moyen de transport.
- Chaque instance doit fournir la méthode problem() (renvoie true si le moyen de
- transport encontre un problème), et les attributs id (identifiant de la source)
- et message (descriptif du problème).
- Nous avons implémenté plusieurs sources~: l'état des lignes de la RATP, du
- Transilien, et le nombre de vélos et de places libres dans les stations de
- jcdecaux\_vls (vélos en libre service disponibles dans de nombreuses villes).
- \paragraph{ratp\_trafic} Les données sont récupérées en scrapant l'url
- \url{http://ratp.fr/meteo/}.
- En effet la ratp ne fournit aucune API publique dynamique (l'API statique a
- cependant été utilisée pour obtenir la localisation des stations et les lignes
- les traversant).
- \paragraph{transilien} Les données sont récupérées en scrapant l'url \url{http://www.transilien.com/info-trafic/temps-reel}.
- La SNCF fournit une API pour chercher des itinéraires, ou avoir les prochains
- horaires, mais pas, à notre connaissance, pour avoir des informations de trafic.
- \paragraph{jcdecaux\_vls} Les données sont récupérées via l'API de jcdecaux\_vls
- (voir \url{https://developer.jcdecaux.com/#/opendata/vls}).
- \paragraph{} L'analyse des fichiers HTML ou JSON téléchargés est effectuée à
- l'aide de la bibliothèque Python
- \href{http://www.crummy.com/software/BeautifulSoup/bs4/doc/}{BeautifulSoup4}.
- Nous avions en premier lieu écrit des transformateurs en xquery pour formatter
- toutes les données dans un schéma commun, mais l'utilisation d'un logiciel
- externe (Saxon) rendait chaque requête très lente, d'autant que le résultat
- n'était pas un objet natif Python.
- \subsection{La boucle principale}
- Cette boucle articule les différents modules entre eux.
- Elle fonctionne à l'aide d'un tas qui contient des instances de la classe Event
- représentant les prochains événements dont le programme a connaissance.
- De temps en temps, elle appelle les générateurs d'événements (module event) pour
- vérifier si de nouveaux événements sont connus.
- Lorsqu'un un événement arrive à échéance (dans l'état actuel du code on vérifie une
- demi-heure avant l'échéance), on cherche la localisation de l'événement, puis
- une liste d'identifiants de sources qui peuvent être utiles pour ce rendre à cet
- événement (lignes passant auprès du lieu, stations vélos proches).
- Pour cela elle trie les sources pas distance croissante, prend les deux meilleures
- ainsi que celles qui sont à une distance comparable (au plus 100 mètres de plus
- que la plus petite distance),
- puis ne garde que celles qui sont moins de $2$km.
- Le module source récolte alors les informations, et si un problème est soulevé
- par l'une des sources, une notification est envoyée.
- \section{Fichiers python}
- Afin d'éxecuter un programme, il faut lancer la commande
- \texttt{python3 fichier.py}.
- Il faudra peut-être installer les dépendances python :
- \texttt{pip3 install -r requirements.txt}
- \paragraph{main.py} C'est le programme principal. Lors du premier lancement,
- il demandera l'autorisation de se connecter aux API Google Calendar et Gmail.
- \paragraph{demo.py} Lance une démonstration qui ignore les événements mais donne les
- notifications à partir d'une adresse. Il faut souvent appuyer sur
- \texttt{<enter>}
- \paragraph{find.py} Ce fichier fournit une aide
- pour trouver les identifiants utilisé en interne pour désigner une source.
- Il propose une recherche interactive dans les listes téléchargées depuis les
- différentes API.
- \paragraph{ratp\_preprocessing.py} Les données statiques fournies par la ratp
- n'était pas dans un format qui nous convenait, en plus de peser plus de 500Mo~!
- Ce fichier extrait de ces données la liste des stations et les lignes les
- traversant, le fichier final ne pesant que 500Ko.
- L'url ou l'on peut trouver les données brut est indiqué en
- commentaire.\\\\
- \small{Note: Après l'oral nous avons changé la démo pour afficher une carte avec un marqueur par
- source.}
- \end{document}
|