Commit c05490da authored by Roelandt nicolas's avatar Roelandt nicolas
Browse files

Merge branch 'cours_pyqgis' into 'master'

Update cours PyQGIS

See merge request !6
parents 5fb5f916 7c6aec53
Pipeline #385985 passed with stages
in 51 seconds
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......@@ -228,6 +228,7 @@ une bonne source d’information.</p>
<li><a href="https://docs.qgis.org/testing/en/docs/pyqgis_developer_cookbook/">PyQGIS Developer Cookbook</a></li>
<li><a href="https://anitagraser.com/pyqgis-101-introduction-to-qgis-python-programming-for-non-programmers/">PyQGIS 101 : introduction to QGIS Python programming for non programmers</a></li>
<li><a href="https://locatepress.com/ppg3">The PyQGIS Programmer’s Guide</a></li>
<li><a href="https://hg-map.fr/tutos/73-qgis-et-python">HG-map - Tutoriel avancé QGIS et Python</a></li>
</ul>
</div>
......
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......@@ -210,7 +210,7 @@ code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warni
<div id="header">
<h1 class="title">Introduction à pyQGIS</h1>
<p class="author"><em>Nicolas Roelandt</em></p>
<p class="date"><em>2021-01-31</em></p>
<p class="date"><em>2021-02-03</em></p>
</div>
<div id="a-propos" class="section level1 unnumbered">
<h1>A propos</h1>
......
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......@@ -254,7 +254,7 @@ accessible depuis la console python:</p>
</div>
<div id="création-dun-script-simple" class="section level2">
<h2><span class="header-section-number">2.2</span> Création d’un script simple</h2>
<p>Créons un script simple qui va trouver les stations de métro à moins de 500 mètres de la gare de Lyon Part-Dieu.</p>
<p>Créeons un script simple qui va trouver les stations de métro à moins de 1000 mètres de la gare de Lyon Part-Dieu.</p>
<div id="importation-des-bibliothèques" class="section level3">
<h3><span class="header-section-number">2.2.1</span> Importation des bibliothèques</h3>
<p>Pour réaliser notre tache, nous allons avoir besoin d’accèder aux algorithmes de
......@@ -287,6 +287,8 @@ Chargeons aussi les arrondissments de la ville de Lyon pour avoir un peu de cont
<a class="sourceLine" id="cb13-4" data-line-number="4"> crs <span class="op">=</span> layer.crs().authid()</a>
<a class="sourceLine" id="cb13-5" data-line-number="5"> <span class="bu">print</span>(<span class="st">&quot;</span><span class="sc">{}</span><span class="st"> : </span><span class="sc">{}</span><span class="st">&quot;</span>.<span class="bu">format</span>(layer.name(), crs))</a></code></pre></div>
<p>Il apparait qu’une couche n’est pas projetée en Lambert93 comme les autres, il convient de la reprojeter.</p>
<p>Selon la version de QGIS, la projection RGF93/Lambert93 pourra être désignée
par <code>EPSG:2154</code> ou <code>IGNF:LAMB93</code>.</p>
<div class="sourceCode" id="cb14"><pre class="sourceCode python"><code class="sourceCode python"><a class="sourceLine" id="cb14-1" data-line-number="1"><span class="co">## gares sncf n&#39;est pas dans la même projection,</span></a>
<a class="sourceLine" id="cb14-2" data-line-number="2"><span class="co"># il faut la reprojeter</span></a>
<a class="sourceLine" id="cb14-3" data-line-number="3">gares_reproject <span class="op">=</span> processing.runAndLoadResults(</a>
......@@ -306,7 +308,7 @@ Chargeons aussi les arrondissments de la ville de Lyon pour avoir un peu de cont
<a class="sourceLine" id="cb16-2" data-line-number="2">expression <span class="op">=</span> <span class="st">&quot;nom = &#39;Gare de Lyon Part-Dieu&#39;&quot;</span></a>
<a class="sourceLine" id="cb16-3" data-line-number="3">partdieu <span class="op">=</span> processing.runAndLoadResults(<span class="st">&quot;native:extractbyexpression&quot;</span>,</a>
<a class="sourceLine" id="cb16-4" data-line-number="4">{<span class="st">&#39;INPUT&#39;</span>:gares_reproject, <span class="st">&#39;EXPRESSION&#39;</span>: expression,<span class="st">&#39;OUTPUT&#39;</span>:<span class="st">&#39;memory&#39;</span>})[<span class="st">&#39;OUTPUT&#39;</span>]</a></code></pre></div>
<p>Une fois notre gare extraite, nous pouvons créer notre zone tampon de 500 mètres.</p>
<p>Une fois notre gare extraite, nous pouvons créer notre zone tampon de 1000 mètres.</p>
</div>
<div id="création-de-la-zone-tampon" class="section level3">
<h3><span class="header-section-number">2.2.5</span> Création de la zone tampon</h3>
......@@ -323,8 +325,10 @@ Chargeons aussi les arrondissments de la ville de Lyon pour avoir un peu de cont
</div>
<div id="renommer-la-couche-finale" class="section level3">
<h3><span class="header-section-number">2.2.6</span> Renommer la couche finale</h3>
<p>Pour renommer une couche nous devons l’identifier puis la retrouver dans la liste des couches portant le nom ‘Intersection’ .
Par chance, nous n’avons fait qu’une intersection, c’est donc le premier élément de la liste.</p>
<p>Pour renommer une couche nous devons l’identifier puis la retrouver dans la
liste des couches portant le nom ‘Intersection’ .
Par chance, nous n’avons fait qu’une intersection, c’est donc le premier élément
de la liste.</p>
<div class="sourceCode" id="cb19"><pre class="sourceCode python"><code class="sourceCode python"><a class="sourceLine" id="cb19-1" data-line-number="1"><span class="co"># Renommer la couche intersectée</span></a>
<a class="sourceLine" id="cb19-2" data-line-number="2"><span class="co">## identifier la couche</span></a>
<a class="sourceLine" id="cb19-3" data-line-number="3">project <span class="op">=</span> QgsProject.instance()</a>
......@@ -602,6 +606,8 @@ Notamment les classes permettant les traitements et l’ajout de paramètres.</p
<a class="sourceLine" id="cb22-6" data-line-number="6"> QgsProcessingParameterFeatureSource,</a>
<a class="sourceLine" id="cb22-7" data-line-number="7"> QgsProcessingParameterFeatureSink)</a>
<a class="sourceLine" id="cb22-8" data-line-number="8"><span class="im">from</span> qgis <span class="im">import</span> processing</a></code></pre></div>
<p><strong>Attention</strong>: pour QGIS 3.4, <code>from qgis import processing</code> devra être remplacé
par <code>import processing</code>.</p>
<p>Ajoutez les classes<code>QgsProcessingParameterVectorDestination</code> et
<code>QgsProcessingParameterDistance</code> aux imports depuis <code>qgis.core</code></p>
<p>Le script fournit aussi une classe <code>ExampleProcessingAlgorithm()</code>.</p>
......@@ -652,8 +658,8 @@ algortihme.</p>
C’est cette méthode qui va permettre de récupérer les paramètres.</p>
<p>Nous allons avoir besoin de charger 2 couches vectorielles, récupérer la taille
de la zone tampon et la destination du résultat.</p>
<p>Supprimez les lignes contenues dans <code>InitAlgorithm</code> et saissisez les nouvelles lignes
suivantes:</p>
<p>Supprimez les lignes contenues dans <code>InitAlgorithm</code> et saissisez les nouvelles
lignes suivantes:</p>
<div class="sourceCode" id="cb27"><pre class="sourceCode python"><code class="sourceCode python"><a class="sourceLine" id="cb27-1" data-line-number="1"> <span class="kw">def</span> initAlgorithm(<span class="va">self</span>, config<span class="op">=</span><span class="va">None</span>):</a>
<a class="sourceLine" id="cb27-2" data-line-number="2"> <span class="co">&quot;&quot;&quot;</span></a>
<a class="sourceLine" id="cb27-3" data-line-number="3"><span class="co"> Initialisation de l&#39;algorithme: définition des</span></a>
......@@ -697,8 +703,8 @@ suivantes:</p>
<a class="sourceLine" id="cb27-41" data-line-number="41"> )</a></code></pre></div>
<p>Une fois nos paramètres obtenus, nous pouvons passer à l’algorithme.
Pour cela, nous devons modifier la méthode <code>processAlgorithm</code>.</p>
<p>Dans un premier temps, nous récupérons les informations concernant le fichier de sortie
<code>outputFile</code> et de la taille du tampon <code>bufferdist</code>.</p>
<p>Dans un premier temps, nous récupérons les informations concernant le fichier de
sortie <code>outputFile</code> et de la taille du tampon <code>bufferdist</code>.</p>
<p>Puis nous insérons le traitement de la zone tampon puis celui faisant l’intersection
entre la couche source et la zone tampon.</p>
<p>Enfin le résultat est retourné.</p>
......@@ -734,6 +740,8 @@ entre la couche source et la zone tampon.</p>
<a class="sourceLine" id="cb28-30" data-line-number="30"> </a>
<a class="sourceLine" id="cb28-31" data-line-number="31"> <span class="co"># Retourn le résultat</span></a>
<a class="sourceLine" id="cb28-32" data-line-number="32"> <span class="cf">return</span> {<span class="va">self</span>.OUTPUT: intersection}</a></code></pre></div>
<p><strong>Attention</strong>: suivant la version de QGIS, <code>'BUFFER_OUTPUT'</code> devra être remplacer
par <code>'TEMPORARY_BUFFER'</code>.</p>
</div>
<div id="test-du-script" class="section level3">
<h3><span class="header-section-number">2.4.2</span> Test du script</h3>
......@@ -757,8 +765,8 @@ de la Part-Dieu et reprojection en 2154).</p>
</div>
<p>Le résultat devrait ressembler à cela:</p>
<div class="figure">
<img src="images/22_resutlat_script.png" alt="Résultat de" />
<p class="caption">Résultat de</p>
<img src="images/22_resutlat_script.png" alt="Résultat du traitement" />
<p class="caption">Résultat du traitement</p>
</div>
</div>
<div id="ajout-du-script-dans-la-boite-à-outils" class="section level3">
......@@ -783,6 +791,7 @@ Cliquez sur <code>Ajouter un script à la boite à outils</code></p>
<img src="images/21_ajout_script_toolbox3.png" alt="Script Objets à proximité disponible dans la boite à outils." />
<p class="caption">Script <code>Objets à proximité</code> disponible dans la boite à outils.</p>
</div>
<p>Pour plus d’informations sur la manière d’écrire des scripts dans le <a href="https://docs.qgis.org/3.16/fr/docs/user_manual/processing/scripts.html">QGIS user manual</a></p>
</div>
<div id="exercice-propice" class="section level3">
<h3><span class="header-section-number">2.4.4</span> Exercice</h3>
......
This diff is collapsed.
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......@@ -309,7 +309,8 @@ Il nous faut recourir à deux méthodes :</p>
</div>
<div id="afficher-des-données" class="section level3">
<h3><span class="header-section-number">1.3.3</span> Afficher des données</h3>
<p>Là encore une boucle <code>for</code> va permettre de parcourir les entités de la couche et d’afficher le contenu du champ <code>libofficie</code>.</p>
<p>Là encore une boucle <code>for</code> va permettre de parcourir les entités de la couche et
d’afficher le contenu du champ <code>libofficie</code>.</p>
<p>La méthode <code>.getFeatures()</code> retourne les entités de la couche.
Une boucle sur ces dernières permet d’afficher leur contenu.</p>
<div class="sourceCode" id="cb6"><pre class="sourceCode python"><code class="sourceCode python"><a class="sourceLine" id="cb6-1" data-line-number="1"><span class="cf">for</span> entite <span class="kw">in</span> arrondissements.getFeatures():</a>
......@@ -340,7 +341,8 @@ Code INSEE de Lyon 6e Arrondissement : 69386</code></pre>
<h2><span class="header-section-number">1.5</span> Réaliser un géotraitement</h2>
<p>Voyons tout d’abord comment réaliser un géotraitement en
utilisant l’interface graphique.</p>
<p>Si nous voulons exécuter un géotraitement, nous pouvons utiliser les outils proposés par le menu <code>Vecteur</code> -&gt; <code>Outils de géométrie</code> -&gt; <code>Centroïdes</code>.
<p>Si nous voulons exécuter un géotraitement, nous pouvons utiliser les outils
proposés par le menu <code>Vecteur</code> -&gt; <code>Outils de géométrie</code> -&gt; <code>Centroïdes</code>.
Ou passer par la boite à outils de traitements.</p>
<div class="figure">
<img src="images/06_boite_outils_traitements.png" alt="Boite à outils de traitements" />
......@@ -364,7 +366,7 @@ en entrée et cliquez sur <code>Exécuter</code>.</p>
</div>
<p>Nous pouvons remarquer qu’une icone en forme de puce mémoire est à droite du nom de la couche.
Cela indique une couche stockée en mémoire.
En regardant dans le journal, il est possible de voir le mot-clé <code>memory</code>.</p>
En regardant dans le journal, il est possible de voir le mot-clé <code>memory:</code>.</p>
</div>
<div id="historique-des-traitements" class="section level2">
<h2><span class="header-section-number">1.6</span> Historique des traitements</h2>
......@@ -375,7 +377,7 @@ En regardant dans le journal, il est possible de voir le mot-clé <code>memory</
<img src="images/09_algorithme.png" alt="Historique des traitements" />
<p class="caption">Historique des traitements</p>
</div>
<div class="sourceCode" id="cb8"><pre class="sourceCode python"><code class="sourceCode python"><a class="sourceLine" id="cb8-1" data-line-number="1">processing.run(<span class="st">&quot;native:centroids&quot;</span>, </a>
<div class="sourceCode" id="cb8"><pre class="sourceCode python"><code class="sourceCode python"><a class="sourceLine" id="cb8-1" data-line-number="1">results <span class="op">=</span> processing.run(<span class="st">&quot;native:centroids&quot;</span>, </a>
<a class="sourceLine" id="cb8-2" data-line-number="2"> {<span class="st">&#39;INPUT&#39;</span>:<span class="st">&#39;/home/niko/Téléchargements/lyon/arrondissements.shp&#39;</span>,</a>
<a class="sourceLine" id="cb8-3" data-line-number="3"> <span class="st">&#39;ALL_PARTS&#39;</span>:<span class="va">False</span>,</a>
<a class="sourceLine" id="cb8-4" data-line-number="4"> <span class="st">&#39;OUTPUT&#39;</span>:<span class="st">&#39;memory:&#39;</span></a>
......@@ -386,8 +388,10 @@ En regardant dans le journal, il est possible de voir le mot-clé <code>memory</
<li><code>native:centroids</code> : Algorithme de calcul des centroids fourni par QGIS (natif)</li>
<li><code>INPUT</code> : chemin vers les données en entrée</li>
<li><code>ALL_PARTS</code> : paramètre spécifique à l’algorithme</li>
<li><code>OUTPUT</code> : où vont les données en sortie</li>
<li><code>OUTPUT</code> : où vont les données en sortie.</li>
</ul>
<p><strong>Attention</strong>: pour les sorties temporaires, le paramètre <code>OUTPUT</code> pourra prendre
la valeur <code>memory:</code> ou <code>TEMPORARY_OUTPUT</code> selon la version de QGIS.</p>
</div>
<div id="exercices" class="section level2">
<h2><span class="header-section-number">1.7</span> Exercices</h2>
......
......@@ -24,7 +24,7 @@
<meta name="author" content="Nicolas Roelandt" />
<meta name="date" content="2021-01-31" />
<meta name="date" content="2021-02-03" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<meta name="apple-mobile-web-app-capable" content="yes" />
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment