﻿{"id":2539,"date":"2015-10-20T10:54:06","date_gmt":"2015-10-20T08:54:06","guid":{"rendered":"http:\/\/www.sigterritoires.fr\/?p=2539"},"modified":"2023-04-28T14:58:52","modified_gmt":"2023-04-28T12:58:52","slug":"arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap","status":"publish","type":"post","link":"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/","title":{"rendered":"Arcmap : Un script Python pour g\u00e9ocoder des adresses avec OpenStreetMap"},"content":{"rendered":"<p>A l&rsquo;\u00e9poque o\u00f9 QGis permet un geocodage d&rsquo;adresses gratuit, illimit\u00e9 et simple d&rsquo;utilisation (voir l&rsquo;article <a href=\"http:\/\/www.sigterritoires.fr\/index.php\/geocodage-dadresses-avec-qgis-2-8\/\">Geocodages d&rsquo;adresses avec QGis 2.8<\/a>), le g\u00e9ocodage avec ArcGis s&rsquo;englue dans des cr\u00e9dits, des cl\u00e9s API et autres artifices pour rendre payant et compliqu\u00e9 le m\u00eame r\u00e9sultat. Heureusement que certaines portes ne peuvent pas \u00eatre verrouill\u00e9es et qu&rsquo;il reste des moyens de faire, sans y passer forc\u00e9ment \u00e0 la caisse. Voici un petit script Python qui permet de g\u00e9ocoder un fichier d&rsquo;adresses avec OpenStreetMap \u00e0 partir d&rsquo;ArcMap.<\/p>\n<p><!--more--><\/p>\n<p>La base de ce script nous la devons \u00e0 <a href=\"http:\/\/www.digital-geography.com\/geocoding-addresses-in-arcgis-the-other-approach\/#.ViXfEisayB3\">Riccardo<\/a>. Pour g\u00e9ocoder un fichier d&rsquo;adresses, c&rsquo;est \u00e0 dire prendre un enregistrement avec l&rsquo;adresse d&rsquo;un point et le convertir en un point dans un shape, il nous faut:<\/p>\n<p>1- le module geopy de Python<\/p>\n<p>2-un fichier texte avec les adresses \u00e0 g\u00e9ocoder<\/p>\n<p>3-la toolbox d&rsquo;ArcMap<\/p>\n<h2>Installation du module geopy<\/h2>\n<p>Pour t\u00e9l\u00e9charger la derni\u00e8re version au jour de cet article, <a href=\"https:\/\/pypi.python.org\/packages\/source\/g\/geopy\/geopy-1.11.0.tar.gz#md5=b73445dc0069550bbd2b09162f7339b3\">cliquez ici<\/a><\/p>\n<p>Pour avoir un version actualis\u00e9e, allez \u00e0 la page d\u2019accueil du Repository Python:  , recherchez geopy avec la fen\u00eatre de recherche et t\u00e9l\u00e9chargez la derni\u00e8re version disponible de geopy en version source (et non en Python wheel).<\/p>\n<p>D\u00e9compressez le fichier t\u00e9l\u00e9charg\u00e9 et recherchez un r\u00e9pertoire geopy (sans autre caract\u00e8re):<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2542\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/geopy1\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png?fit=642%2C244&amp;ssl=1\" data-orig-size=\"642,244\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"geopy1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png?fit=630%2C239&amp;ssl=1\" class=\"aligncenter wp-image-2542 size-full\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png?resize=640%2C243\" alt=\"r\u00e9pertoire geopy\" width=\"640\" height=\"243\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png?w=642&amp;ssl=1 642w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png?resize=300%2C114&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy1.png?resize=630%2C239&amp;ssl=1 630w\" sizes=\"auto, (max-width: 640px) 100vw, 640px\" \/><\/a><\/p>\n<p>Copiez ce r\u00e9pertoire dans le r\u00e9pertoire Python d&rsquo;ArcGis. En principe il se trouve sur votre disque C, r\u00e9pertoire Python27-&gt;ArcGis10.X-&gt;Lib<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy2.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2543\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/geopy2\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy2.png?fit=562%2C322&amp;ssl=1\" data-orig-size=\"562,322\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"geopy2\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy2.png?fit=562%2C322&amp;ssl=1\" class=\"aligncenter wp-image-2543 size-full\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy2.png?resize=562%2C322\" alt=\"r\u00e9pertoire python arcgis\" width=\"562\" height=\"322\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy2.png?w=562&amp;ssl=1 562w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy2.png?resize=300%2C172&amp;ssl=1 300w\" sizes=\"auto, (max-width: 562px) 100vw, 562px\" \/><\/a><\/p>\n<p>Voil\u00e0! Vous avez install\u00e9 le module geopy.<\/p>\n<h2>Pr\u00e9paration du fichier d&rsquo;adresses<\/h2>\n<p>Le g\u00e9ocodage va \u00eatre effectu\u00e9 par un service web, dans notre cas le service Nominatim d&rsquo;OpenStreetMaps. Il vous faut formater un minimum vos donn\u00e9es si vous voulez que le service Web comprenne ce que vous voulez. Nous allons donc structurer un minimum les adresses. mais il y a un autre probl\u00e8me, c&rsquo;est qu&rsquo;en anglais cela suffirait, mais que nos sacr\u00e9s caract\u00e8res accentu\u00e9s fran\u00e7ais vont poser forc\u00e9ment probl\u00e8me. Nous devons donc r\u00e9soudre aussi ce probl\u00e8me, sous peine que Nominatim ne trouve aucune adresse.<\/p>\n<p>Pour commencer, si vous ne les avez pas d\u00e9j\u00e0, chargez vos adresses dans un tableur. Vous devez avoir au moins deux colonnes:<\/p>\n<ul>\n<li>dans la premi\u00e8re vous mettrez l&rsquo;adresse (num\u00e9ro, rue,&#8230;)<\/li>\n<li>dans la deuxi\u00e8me vous mettrez le code postal et la ville ou commune<\/li>\n<\/ul>\n<p>La premi\u00e8re ligne du tableau doit contenir des noms de champ. \u00c9vitez tout caract\u00e8re sp\u00e9cial, le blanc, etc.<\/p>\n<p>Pour nos deux champs, supposons que nous les nommons <em><strong>adresse<\/strong> <\/em>et <em><strong>ville<\/strong><\/em><\/p>\n<p>Vous pouvez avoir plus de champs, mais par la suite nous n&rsquo;utiliserons que ces deux champs l\u00e0.<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2544\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/geopy3\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3.png?fit=831%2C484&amp;ssl=1\" data-orig-size=\"831,484\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"geopy3\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3.png?fit=630%2C367&amp;ssl=1\" class=\"aligncenter wp-image-2544 size-large\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3-630x367.png?resize=630%2C367\" alt=\"fichier excel d'adresses\" width=\"630\" height=\"367\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3.png?resize=630%2C367&amp;ssl=1 630w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3.png?resize=300%2C175&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy3.png?w=831&amp;ssl=1 831w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n<p>Vous devez maintenant enregistrer le tableau sous forme de fichier texte. Vous avez plusieurs formats texte propos\u00e9s par les tableurs. Dans le cas d&rsquo;Excel, choisissez <em><strong>texte s\u00e9parateur tabulations.<\/strong><\/em> En faisant \u00e7a vous choisissez non seulement le s\u00e9parateur de champs mais aussi le type d&rsquo;encodage du fichier. L&rsquo;encodage, comme son nom l&rsquo;indique, ce sont les codes ascii utilis\u00e9s pour repr\u00e9senter les caract\u00e8res, en particulier nos pr\u00e9cieux caract\u00e8res accentu\u00e9s. Si vous avez Notepad, vous pouvez voir l&rsquo;encodage du fichier. Dans ce cas vous verrez encodage : ANSI.<\/p>\n<p>Si vous ne suivez pas ces instructions, vous pourrez avoir un plantage du script sous Arcmap. Il vous faudra alors, soit modifier le script pour qu&rsquo;il corresponde \u00e0 l&rsquo;encodage de votre fichier, soit revenir au fichier et l&rsquo;encoder en ANSI (Latin-1).<\/p>\n<p>Voil\u00e0! Le fichier d&rsquo;adresses et pr\u00eat \u00e0 \u00eatre g\u00e9ocod\u00e9.<\/p>\n<h2>Le script Python<\/h2>\n<p>Le script propos\u00e9 ici ne pr\u00e9tend pas \u00eatre un outil fini. Il y a de multiples aspects qui ne sont pas pris en compte. Si tel quel vous suffit, c&rsquo;est parfait. Si non, il vous servira de base pour que vous le modifiez et l&rsquo;adaptiez \u00e0 votre cas particulier.<\/p>\n<p>Vous pouvez t\u00e9l\u00e9charger ici une bo\u00eete \u00e0 outils contenant le script ainsi que le fichier texte d&rsquo;exemple.<\/p>\n\n<!-- G\u00e9n\u00e9ration r\u00e9alis\u00e9e avec Document Gallery. Obtenez votre version ici :http:\/\/wordpress.org\/extend\/plugins\/document-gallery -->\n<div id=\"document-gallery-1\" class=\"document-gallery\" data-shortcode='{\"id\":2539,\"include\":\"2550\",\"exclude\":\"\",\"attachment_pg\":false,\"descriptions\":false,\"fancy\":true,\"mime_types\":\"application,video,text,audio,image\",\"order\":\"ASC\",\"orderby\":\"post__in\",\"relation\":\"AND\",\"post_status\":\"any\",\"post_type\":\"attachment\",\"limit\":-1,\"columns\":4,\"new_window\":false,\"paginate\":true,\"skip\":0}' style='--dg-icon-width: 24%'>\n<div class='document-icon-row'>\n   <div class=\"document-icon\">\n      <a href=\"https:\/\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geocodage.zip\" target=\"_self\">\n         <img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/plugins\/document-gallery\/src\/assets\/icons\/compressed.png?w=640&#038;ssl=1\" title=\"geocodage\" alt=\"geocodage\" data-ext=\"zip\"\/>\n         <span class=\"title\">geocodage<\/span>\n      <\/a>\n   <\/div>\n\n<\/div>\n<\/div>\n<p>N&rsquo;oubliez pas de configurer le chemin du script de la toolbox vers le fichier .py fourni.<\/p>\n<h3>Fonctionnement<\/h3>\n<p>Pour que le script fonctionne, il faut le fichier d&rsquo;adresses que nous avons construit plus haut, ainsi qu&rsquo;un shape vide de type point.<\/p>\n<p>On pourrait cr\u00e9er le shape dans le script mais dans l&rsquo;\u00e9tat actuel, vous devez cr\u00e9er un shape de type point, avec le syst\u00e8me de coordonn\u00e9es G\u00e9ographique WGS84 et cr\u00e9er un champ texte appel\u00e9 <em><strong>Nom<\/strong><\/em> o\u00f9 sera stock\u00e9e l&rsquo;adresse contenue dans l&rsquo;enregistrement du fichier texte. Pr\u00e9voyez assez de longueur de champ (100?) pour contenir cette adresse.<\/p>\n<p>Sauf miracle, chaque fois qu&rsquo;on g\u00e9ocode un fichier d&rsquo;adresses, il y a des adresse qui ne sont pas trouv\u00e9es par le service de geocodage. Ces adresses sont mises dans un fichier texte en sortie.<\/p>\n<p>En lan\u00e7ant le script vous aurez la fen\u00eatre de param\u00e9trage suivante:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2546\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/geopy4\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4.png?fit=881%2C332&amp;ssl=1\" data-orig-size=\"881,332\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"geopy4\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4.png?fit=630%2C237&amp;ssl=1\" class=\"aligncenter wp-image-2546 size-large\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4-630x237.png?resize=630%2C237\" alt=\"parametrage de la commande de geocodage\" width=\"630\" height=\"237\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4.png?resize=630%2C237&amp;ssl=1 630w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4.png?resize=300%2C113&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy4.png?w=881&amp;ssl=1 881w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><em><strong>Shapesor<\/strong><\/em> est le fichier shape de points o\u00f9 vous allez r\u00e9cup\u00e9rer les adresse g\u00e9ocod\u00e9es<\/p>\n<p><em><strong>fichier adresses<\/strong><\/em> est le fichier texte contenant les adresses<\/p>\n<p><em><strong>adresse<\/strong><\/em> est le nom du champ du fichier adresses contenant l&rsquo;adresse (num\u00e9ro, rue, &#8230;)<\/p>\n<p><em><strong>ville<\/strong><\/em> est le nom du champ du fichier adresses contenant le code postal et la ville<\/p>\n<p><em><strong>fichier erreurs<\/strong><\/em> est le nom du fichier o\u00f9 seront mises les adresse qui n&rsquo;auront pas \u00e9t\u00e9 g\u00e9ocod\u00e9es.<\/p>\n<h3>Contenu du script<\/h3>\n<p>Voici le script dans sa totalit\u00e9:<\/p>\n<p><em>import arcpy<\/em><br \/>\n<em>import geopy<\/em><br \/>\n<em>import csv<\/em><br \/>\n<em>from geopy.geocoders import Nominatim<\/em><br \/>\n<em>geolocator = Nominatim()<\/em><\/p>\n<p><em>failed_text =\u00a0\u00bb\u00a0\u00bb<\/em><br \/>\n<em>numbers_failed = 0<\/em><br \/>\n<em>outShp=arcpy.GetParameterAsText(0)<\/em><br \/>\n<em>inFC=arcpy.GetParameterAsText(1)<\/em><br \/>\n<em>outFC=arcpy.GetParameterAsText(4)<\/em><br \/>\n<em>adresse=arcpy.GetParameterAsText(2)<\/em><br \/>\n<em>place=arcpy.GetParameterAsText(3)<\/em><br \/>\n<em>cursor = arcpy.InsertCursor(outShp)<\/em><br \/>\n<em>with open(outFC, &lsquo;w&rsquo;) as file:<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0with open(inFC, &lsquo;rb&rsquo;) as csvfile:<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0content = csv.DictReader(csvfile, delimiter=&rsquo;\\t&rsquo;)<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0for row in content:<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0feature = cursor.newRow()<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex = arcpy.CreateObject(\u00ab\u00a0Point\u00a0\u00bb)<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0coord = geolocator.geocode(row[adresse].decode(&lsquo;latin1&rsquo;) + row[place].decode(&lsquo;latin1&rsquo;) ,timeout=25)<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 if coord is None:<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0failed_text += row[adresse] + row[place] + \u00ab\u00a0\\n\u00a0\u00bb<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0numbers_failed += 1<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0if coord is not None:<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vertex.X = coord.longitude<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.Y = coord.latitude<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feature.shape=vertex<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feature.Nom=row[adresse]<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0cursor.insertRow(feature)<\/em><br \/>\n<em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0file.write(failed_text)<\/em><br \/>\n<em>\u00a0\u00a0 \u00a0file.close()<\/em><br \/>\n<em>del cursor<\/em><br \/>\n<em>print \u00ab\u00a0failed geocodes: \u00a0\u00bb + str(numbers_failed) + \u00ab\u00a0!!! check the file \u00a0\u00bb + outFC<\/em><\/p>\n<p><em>dataframe = arcpy.mapping.ListDataFrames(arcpy.mapping.MapDocument(&lsquo;current&rsquo;))[0] \u00a0<\/em><br \/>\n<em>geocodelayer = arcpy.mapping.Layer(outShp)<\/em><br \/>\n<em>arcpy.mapping.AddLayer(dataframe,geocodelayer,\u00a0\u00bbBOTTOM\u00a0\u00bb) <\/em><br \/>\n<em>layer_extent = geocodelayer.getExtent()<\/em><br \/>\n<em>dataframe.extent = layer_extent<\/em><\/p>\n<p>Voyons maintenant les diff\u00e9rentes parties.<\/p>\n<p>Tout d&rsquo;abord, nous avons le choix du geolocator:<\/p>\n<p><strong><em>from geopy.geocoders import Nominatim<\/em><\/strong><br \/>\n<strong><em>geolocator = Nominatim()<\/em><\/strong><\/p>\n<p>Si vous souhaitez utiliser un autre service de geocodage, c&rsquo;est ici qu&rsquo;il faut le choisir. N&rsquo;oubliez pas que certains services demandent une cl\u00e9 API, un nom d&rsquo;utilisateur, un mot de passe. Dans ces cas il faudra ajouter le code n\u00e9cessaire pour initialiser la connexion.<\/p>\n<p>Deuxi\u00e8mement, nous avons la r\u00e9cup\u00e9ration des param\u00e8tres fournis dans la fen\u00eatre de param\u00e9trage du script:<\/p>\n<p><strong><em>outShp=arcpy.GetParameterAsText(0)<\/em><\/strong><br \/>\n<strong><em>inFC=arcpy.GetParameterAsText(1)<\/em><\/strong><br \/>\n<strong><em>outFC=arcpy.GetParameterAsText(4)<\/em><\/strong><br \/>\n<strong><em>adresse=arcpy.GetParameterAsText(2)<\/em><\/strong><br \/>\n<strong><em>place=arcpy.GetParameterAsText(3)<\/em><\/strong><\/p>\n<p>Vous pouvez modifier le script pour avoir plus d&rsquo;options de param\u00e9trage, par exemple le s\u00e9parateur utilis\u00e9 dans le fichier d&rsquo;adresses. Dans ce cas vous devez ajouter le param\u00e8tre dans les param\u00e8tres du script: clic droit sur le script dans la fen\u00eatre de la toolbox -&gt;Propri\u00e9t\u00e9s -&gt; onglet Param\u00e8tres<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy5.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2547\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/geopy5\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy5.png?fit=443%2C570&amp;ssl=1\" data-orig-size=\"443,570\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"geopy5\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy5.png?fit=443%2C570&amp;ssl=1\" class=\"aligncenter wp-image-2547 size-full\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy5.png?resize=443%2C570\" alt=\"ajout d'un param\u00e8tre au script\" width=\"443\" height=\"570\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy5.png?w=443&amp;ssl=1 443w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy5.png?resize=233%2C300&amp;ssl=1 233w\" sizes=\"auto, (max-width: 443px) 100vw, 443px\" \/><\/a><\/p>\n<p>et rajouter une ligne de code avec un nom de variable et l&rsquo;index du param\u00e8tre:<\/p>\n<p><strong><em>separateur=arcpy.GetParameterAsText(6)<\/em><\/strong><\/p>\n<p>La ligne:<\/p>\n<p><strong><em>cursor = arcpy.InsertCursor(outShp)<\/em><\/strong><\/p>\n<p>met en place un curseur sur le fichier shape qui permet l&rsquo;insertion des points des adresses trouv\u00e9es.<\/p>\n<p>La ligne :<\/p>\n<p><em>\u00a0<strong>content = csv.DictReader(csvfile, delimiter=&rsquo;\\t&rsquo;)<\/strong><\/em><\/p>\n<p>utilise le module Python csv pour lire le contenu du fichier d&rsquo;adresses dans une variable <em>content. <\/em>L&rsquo;option<em> delimiter=&rsquo;\\t&rsquo; <\/em>indique au module que le s\u00e9parateur des champs est la tabulation. Si vous utilisez un autre s\u00e9parateur (ce que je vous d\u00e9conseille), c&rsquo;est ici qu&rsquo;il faut l&rsquo;indiquer.<\/p>\n<p><strong><em>\u00a0feature = cursor.newRow()<\/em><\/strong><br \/>\n<strong><em>vertex = arcpy.CreateObject(\u00ab\u00a0Point\u00a0\u00bb)<\/em><\/strong><\/p>\n<p>correspondent \u00e0 la cr\u00e9ation d&rsquo;un nouvelle entit\u00e9 de type point dans le fichier shape en sortie.<\/p>\n<p>L&rsquo;appel au g\u00e9ocodage utilise les variables <em>adresse<\/em> et <em>place<\/em> qui correspondent aux champs <em>adresse<\/em> et <em>ville<\/em> des param\u00e8tres du script.<\/p>\n<p><em>\u00a0<strong>coord = geolocator.geocode(row[adresse].decode(&lsquo;latin1&rsquo;) + row[place].decode(&lsquo;latin1&rsquo;) ,timeout=25)<\/strong><\/em><\/p>\n<p>Selon l&rsquo;encodage du fichier texte, vous pourrez \u00eatre amen\u00e9s \u00e0 modifier &lsquo;latin-1&rsquo;. Vous vaez de multiples possibilit\u00e9s, mais les plus courantes sont &lsquo;utf-8&rsquo; et &lsquo;UTF-16LE&rsquo;.<\/p>\n<p>Si le retour du g\u00e9ocodage (coord) est vide on \u00e9crit l&rsquo;adresse dans le fichier d&rsquo;erreurs et s&rsquo;il n&rsquo;est pas vide on cr\u00e9\u00e9 le point dans le fichier shape.<\/p>\n<p><em><strong>\u00a0if coord is None:<\/strong><\/em><br \/>\n<strong> <em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0failed_text += row[adresse] + row[place] + \u00ab\u00a0\\n\u00a0\u00bb<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0numbers_failed += 1<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 \u00a0<\/em><\/strong><br \/>\n<strong>\u00a0<em>if coord is not None:<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 vertex.X = coord.longitude<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0vertex.Y = coord.latitude<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feature.shape=vertex<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 feature.Nom=row[adresse]<\/em><\/strong><br \/>\n<strong> <em>\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0\u00a0\u00a0 \u00a0cursor.insertRow(feature)<\/em><\/strong><\/p>\n<p><em><strong>feature.Nom<\/strong><\/em> correspond au champ <em><strong>Nom<\/strong> <\/em>cr\u00e9\u00e9 dans le fichier shape au d\u00e9part. Si vous appelez le champ autrement que <em><strong>Nom<\/strong> <\/em>il faut modifier cette ligne.<\/p>\n<p>La fin du script charge le fichier shape dans le document actif d&rsquo;ArcMap.<\/p>\n<p>Le r\u00e9sultat final de la commande est le suivant:<\/p>\n<p><a href=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" data-attachment-id=\"2554\" data-permalink=\"https:\/\/www.sigterritoires.fr\/index.php\/arcmap-un-script-python-pour-geocoder-des-adresses-avec-openstreetmap\/geopy6\/\" data-orig-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png?fit=1511%2C762&amp;ssl=1\" data-orig-size=\"1511,762\" data-comments-opened=\"1\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"geopy6\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png?fit=630%2C318&amp;ssl=1\" class=\"aligncenter size-large wp-image-2554\" src=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6-630x318.png?resize=630%2C318\" alt=\"r\u00e9sultat final du geocodage\" width=\"630\" height=\"318\" srcset=\"https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png?resize=630%2C318&amp;ssl=1 630w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png?resize=300%2C151&amp;ssl=1 300w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png?w=1511&amp;ssl=1 1511w, https:\/\/i0.wp.com\/www.sigterritoires.fr\/wp-content\/uploads\/2015\/10\/geopy6.png?w=1280&amp;ssl=1 1280w\" sizes=\"auto, (max-width: 630px) 100vw, 630px\" \/><\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>A l&rsquo;\u00e9poque o\u00f9 QGis permet un geocodage d&rsquo;adresses gratuit, illimit\u00e9 et simple d&rsquo;utilisation (voir l&rsquo;article Geocodages d&rsquo;adresses avec QGis 2.8), le g\u00e9ocodage avec ArcGis s&rsquo;englue dans des cr\u00e9dits, des cl\u00e9s API et autres artifices pour rendre&hellip;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"give_campaign_id":0,"_bbp_topic_count":0,"_bbp_reply_count":0,"_bbp_total_topic_count":0,"_bbp_total_reply_count":0,"_bbp_voice_count":0,"_bbp_anonymous_reply_count":0,"_bbp_topic_count_hidden":0,"_bbp_reply_count_hidden":0,"_bbp_forum_subforum_count":0,"sfsi_plus_gutenberg_text_before_share":"","sfsi_plus_gutenberg_show_text_before_share":"","sfsi_plus_gutenberg_icon_type":"","sfsi_plus_gutenberg_icon_alignemt":"","sfsi_plus_gutenburg_max_per_row":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[145,146,152],"tags":[15,65,195,70,131,223],"class_list":["post-2539","post","type-post","status-publish","format-standard","hentry","category-arcgis","category-arcmap","category-outils_divers","tag-arcgis","tag-arcmap","tag-geocodage","tag-openstreetmaps","tag-python","tag-script"],"aioseo_notices":[],"jetpack_featured_media_url":"","jetpack_shortlink":"https:\/\/wp.me\/p6XU0A-EX","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts\/2539","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/comments?post=2539"}],"version-history":[{"count":0,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/posts\/2539\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/media?parent=2539"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/categories?post=2539"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.sigterritoires.fr\/index.php\/wp-json\/wp\/v2\/tags?post=2539"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}