All checks were successful
		
		
	
	continuous-integration/drone/push Build is passing
				
			
		
			
				
	
	
		
			535 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			535 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| {
 | |
|  "cells": [
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "437fa01c",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "# Métadonnées d'une image\n",
 | |
|     "\n",
 | |
|     "Dans ce TP, vous allez manipuler les métadonnées d'images pour ensuite les placer sur une carte.\n",
 | |
|     "\n",
 | |
|     "## Extraction des métadonnées\n",
 | |
|     "\n",
 | |
|     "Pour manipuler les images, on a besoin d'une librairie de manipulation d'images."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "5c9c7e32",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "from PIL import Image, ExifTags"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "960941d7",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Vous venez d'importer deux modules qui vous permettrons de manipuler des images et les metadonnées (les tags exifs).\n",
 | |
|     "\n",
 | |
|     "### Image\n",
 | |
|     "\n",
 | |
|     "Pour importer une image"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "cc05608c",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "image1 = Image.open(\"image1.jpg\")\n",
 | |
|     "image1"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "28e7d3fe",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Pour obtenir les données exifs on pourra utiliser la méthode `._getexif()` sur l'image."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "75ad9d0a",
 | |
|    "metadata": {
 | |
|     "scrolled": true
 | |
|    },
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "image1._getexif()"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "8bddb206",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Quel type de données est utilisé pour stocker les données exifs?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "7fb64ce8",
 | |
|    "metadata": {},
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "4b9c1b9e",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Quelles sont les informations que l'on peut trouver dans les métadonnées d'une image?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "7211efe2",
 | |
|    "metadata": {},
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "f6496594",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Quels problèmes a-t-on pour comprendre ce dictionnaire?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "c1ea645c",
 | |
|    "metadata": {},
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "356814cc",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "### Comprendre les données exifs\n",
 | |
|     "\n",
 | |
|     "Pour donner un sens aux clés du dictionnaire des données exifs, le module `ExifTags` a un attribut `.TAGS`."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "04a8f787",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "ExifTags.TAGS"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "545f1db5",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Quel est ce type de données?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "d5ede170",
 | |
|    "metadata": {},
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "a7564aaa",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "À quelle caractéristique correspond la clé `34853`?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "00d8d07d",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "9b695442",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "À quelle caractéristique correspond la clé `272`?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "c3d05add",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "1eb8842b",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "À quelle caractéristique correspond la clé `306`?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "0ff2023d",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "b14e7a73",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Faire une boucle sur les données exifs de l'`image1` en affichant la description de la donnée et la donnée. "
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "99f357bc",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "95afa782",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Ecrire une fonction `extrait_exit` qui prend en argument une image et qui renvoie un dictionaire contenant les données exifs (avec le clés qui doivent être la description de la donnée)."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "ce958419",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "96fb0759",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "3b677187",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "### Données GPS\n",
 | |
|     "\n",
 | |
|     "On s'interesse plus précisement aux données GPS de l'image.\n",
 | |
|     "\n",
 | |
|     "Afficher les données `'GPSInfo'` de l'`image1`."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "5b901411",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "image1._getexif()[34853]"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "033a1730",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Quel type est utilisé pour stocker les données GPS?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "086ee50f",
 | |
|    "metadata": {},
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "322a9278",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Quel est le type des clés?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "a140e2fd",
 | |
|    "metadata": {},
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "f4f06f4c",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Pour donner un sens à ces clés, le module `ExifTags` a un attibut `GPSTAGS` pour leur donner un sens."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "e13b29a0",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "ExifTags.GPSTAGS"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "732ece8c",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Ecrire une fonction `extrait_gps` qui prend en argument une image et qui renvoie un dicitonnaire avec les données GPS (avec des clés compréhensibles)"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "dbd0945a",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "7a282a17",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "77ecc152",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "La longitude et la latitude sont données sous forme de tuple (degré, minute, secondes).\n",
 | |
|     "\n",
 | |
|     "Pour les transformer en forme décimale, vous pouvez utiliser la fonction suivante"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "c0d9ca0f",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "def gps_to_degre(gps:tuple) -> float:\n",
 | |
|     "    \"\"\"Converti des données GPS en notation décimale\n",
 | |
|     "    \n",
 | |
|     "    :param gps: tuple de données GPS (degré, minute, secondes)\n",
 | |
|     "    :return: gps en décimal\n",
 | |
|     "    \n",
 | |
|     "    :example:\n",
 | |
|     "    >>> gps_to_degre((48.0, 50.0, 44.85))\n",
 | |
|     "    48.84579166666667\n",
 | |
|     "    \n",
 | |
|     "    \"\"\"\n",
 | |
|     "    return gps[0] + gps[1]/60 + gps[2]/3600"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "1d3726cd",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Ecrire une fonction `ajoute_degre` qui prend en argument un dictionnaire contenant toutes les données gps et qui renvoie ces données où l'on a ajouté les clés `degreLattitude` et `degreLongitude` (calculés avec la fonction `gps_to_degre`)"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "d3e048d8",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "02fc0400",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "bbe16539",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Extraire les données GPS des images \n",
 | |
|     "\n",
 | |
|     "- `image2.jpg`\n",
 | |
|     "- `image3.jpg`\n",
 | |
|     "- `image4.jpg`"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "8e6348e6",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "ccb0bb48",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "27e2647c",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "66c525f8",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "2b0004af",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "## Folium\n",
 | |
|     "\n",
 | |
|     "Folium est une librairie qui permet de manipuler des cartes."
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "b4e23b6c",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "from folium import Map, Marker"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "ad5694a8",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "Créer une carte"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "a5822416",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "carte = Map(location=[45.5236, -122.6750])\n",
 | |
|     "marqueur = Marker(location=[45.5236, -122.6750])\n",
 | |
|     "marqueur.add_to(carte)"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "7ce827c7",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": [
 | |
|     "carte"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "e8ca713b",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "À quoi correspond la liste de nombres passés en argument de la fonction `Map` ou de `Marker`?"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "raw",
 | |
|    "id": "281f1e36",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     " "
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "markdown",
 | |
|    "id": "21c54fff",
 | |
|    "metadata": {},
 | |
|    "source": [
 | |
|     "À vous de géolocaliser les images suivantes:\n",
 | |
|     "\n",
 | |
|     "- `image1.jpg`\n",
 | |
|     "- `image2.jpg`\n",
 | |
|     "- `image3.jpg`\n",
 | |
|     "- `image4.jpg`"
 | |
|    ]
 | |
|   },
 | |
|   {
 | |
|    "cell_type": "code",
 | |
|    "execution_count": null,
 | |
|    "id": "ae1323d6",
 | |
|    "metadata": {},
 | |
|    "outputs": [],
 | |
|    "source": []
 | |
|   }
 | |
|  ],
 | |
|  "metadata": {
 | |
|   "kernelspec": {
 | |
|    "display_name": "Python 3 (ipykernel)",
 | |
|    "language": "python",
 | |
|    "name": "python3"
 | |
|   },
 | |
|   "language_info": {
 | |
|    "codemirror_mode": {
 | |
|     "name": "ipython",
 | |
|     "version": 3
 | |
|    },
 | |
|    "file_extension": ".py",
 | |
|    "mimetype": "text/x-python",
 | |
|    "name": "python",
 | |
|    "nbconvert_exporter": "python",
 | |
|    "pygments_lexer": "ipython3",
 | |
|    "version": "3.10.10"
 | |
|   }
 | |
|  },
 | |
|  "nbformat": 4,
 | |
|  "nbformat_minor": 5
 | |
| }
 |