{"id":173401,"date":"2010-12-14T21:48:58","date_gmt":"2010-12-14T21:48:58","guid":{"rendered":"http:\/\/www.esri.com\/arcgis-blog\/?post_type=blog&#038;p=173401"},"modified":"2018-12-18T11:52:26","modified_gmt":"2018-12-18T19:52:26","slug":"combining-data-driven-pages-with-python-and-arcpy-mapping","status":"publish","type":"blog","link":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping","title":{"rendered":"Combining Data Driven Pages with Python and arcpy.mapping"},"author":3601,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","format":"standard","meta":{"_acf_changed":false,"_searchwp_excluded":""},"categories":[22941],"tags":[31181,27981,26461,24341],"industry":[],"product":[36991],"class_list":["post-173401","blog","type-blog","status-publish","format-standard","hentry","category-mapping","tag-arcpy","tag-layout","tag-map-book","tag-python","product-arcgis-desktop"],"acf":{"short_description":"Python module that allows you to interact with your map documents and layers, in conjunction with your data driven pages","flexible_content":[{"acf_fc_layout":"content","content":"<p>You can use arcpy.mapping, the Python module that allows you to interact with your map documents and layers, in conjunction with your data driven pages to do much more than make simple map books. For example, most complete map book products require title pages, overview maps, and sometimes pages of text or report information. In the past, putting these types of map books together could be time consuming, and usually required extra steps to assemble pages into a single document. At ArcGIS 10 putting together this type of map book product can be automated with a simple Python script.<\/p>\n<p>The following example exports a title page, an overview map, and a series of data driven pages and combines them, along with a PDF file containing a list of contact information, into a single multi-page PDF file:<\/p>\n<p><i>import arcpy, os, string<br \/>\n#Create final output PDF file<br \/>\nfinalPdf = arcpy.mapping.PDFDocumentCreate(r\u201dC:MyProjectMyAtlas.pdf\u201d)<\/i><\/p>\n<p>#Export Title page and append to final PDF file<br \/>\nmxd = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyTitlePage.mxd\u201d)<br \/>\ntmpPdf = r\u201dC:MyProjectMyTitlePage.pdf\u201d<br \/>\narcpy.mapping.ExportToPDF(mxd, tmpPdf)<br \/>\nfinalPdf.appendPages(tmpPdf)<br \/>\ndel mxd, tmpPdf<\/p>\n<p>#Export Overview Map and append to final PDF file<br \/>\nmxd = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyOverviewMap.mxd\u201d)<br \/>\ntmpPdf = r\u201dC:MyProjectMyOverviewMap.pdf\u201d<br \/>\narcpy.mapping.ExportToPDF(mxd, tmpPdf)<br \/>\nfinalPdf.appendPages(tmpPdf)<br \/>\ndel mxd, tmpPdf<\/p>\n<p>#Export Data Driven Pages and append to final PDF file<br \/>\nmxd = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyAtlasPages.mxd\u201d)<br \/>\ntmpPdf = r\u201dC:MyProjectMyAtlasPages.pdf\u201d<br \/>\nddp = mxd.dataDrivenPages<br \/>\nddp.exportToPDF(tmpPdf, \u201cALL\u201d)<br \/>\nfinalPdf.appendPages(tmpPdf)<br \/>\ndel mxd, tmpPdf<\/p>\n<p>#Append Contact Information to final PDF file<br \/>\nfinalPdf.appendPages(r\u201dC:MyProjectContactInfo.pdf\u201d)<\/p>\n<p>#Update the properties of the final pdf to show thumbnail view<br \/>\nfinalPdf.updateDocProperties(pdf_open_view=\u201dUSE_THUMBS\u201d,<br \/>\npdf_layout=\u201dSINGLE_PAGE\u201d)<\/p>\n<p><i>del finalPdf<\/i><\/p>\n<p>You can also use python in conjunction with data driven pages to cycle through each page, and perform one of the many operations supported by arcpy.mapping. For example, you can update a layer\u2019s symbology, update some layout text, and export or print each map. This example demonstrates how to cycle through all your data driven pages and export them as PNG files:<br \/>\nimport arcpy<\/p>\n<p><i>#Specify the map document<br \/>\nmxd = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyAtlasPages.mxd\u201d)<\/i><\/p>\n<p><i>#Export each of the data driven pages<br \/>\nfor pageNum in range(1, mxd.dataDrivenPages.pageCount + 1):<br \/>\nmxd.dataDrivenPages.currentPageID = pageNum<br \/>\nprint \u201cExporting page {0} of {1}\u201d.format(str(mxd.dataDrivenPages.currentPageID), str(mxd.dataDrivenPages.pageCount))<br \/>\narcpy.mapping.ExportToPNG(mxd, r\u201dC:MyProjectOutputMyAtlas_Page\u201d + str(pageNum) + \u201c.png\u201d)<br \/>\ndel mxd<\/i><\/p>\n<p>See the following blog entry for more info on exporting and printing using arcpy.mapping:\u00a0<a href=\"https:\/\/blogs.esri.com\/Dev\/blogs\/arcgisdesktop\/archive\/2010\/02\/01\/ArcPy-and-Geoprocessing_2620_-it_1920_s-for-Developers-too.aspx\" target=\"_blank\" rel=\"noopener\">http:\/\/blogs.esri.com\/Dev\/blogs\/arcgisdesktop\/archive\/2010\/02\/01\/ArcPy-and-Geoprocessing_2620_-it_1920_s-for-Developers-too.aspx<\/a><\/p>\n<p>arcpy.mapping opens up many possibilities for the types of map books you can create. For example, you can create a thematic atlas with multiple pages specifying a different theme on each page. The following example zooms to a selected parcel, toggles on different layer visibility and exports the layout for multiple themes in order to create a parcel report with a soil map, a flood map and a zoning map:<\/p>\n<p><i>import arcpy, os<\/i><\/p>\n<p>#Specify output path and final output PDF<br \/>\noutPath = r\u201dC:MyProjectoutput\\\u201d<br \/>\nfinalPdf = arcpy.mapping.PDFDocumentCreate(outPath + \u201cParcelReport.pdf\u201d)<\/p>\n<p>#Specify the map document and the data frame<br \/>\nmxd = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyParcelMap.mxd\u201d)<br \/>\ndf = arcpy.mapping.ListDataFrames(mxd, \u201cLayers\u201d)[0]<\/p>\n<p>#Select a parcel using the LocAddress attribute and zoom to selected<br \/>\nparcelLayer = arcpy.mapping.ListLayers(mxd, \u201cParcels\u201d, df)[0]<br \/>\narcpy.SelectLayerByAttribute_management(parcelLayer, \u201cNEW_SELECTION\u201d, \u201c\u201dLocAddress\u201d = \u2019519 Main St\u2019\u201d)<br \/>\ndf.zoomToSelectedFeatures()<\/p>\n<p>#Turn on visibility for each theme and export the page<br \/>\nlyrList = [&#8220;Soils&#8221;, &#8220;Floodplains&#8221;, &#8220;Zones&#8221;]<br \/>\nfor lyrName in lyrList:<br \/>\nlyr = arcpy.mapping.ListLayers(mxd, lyrName, df)[0]<br \/>\nlyr.visible = True<\/p>\n<p><i>\u00a0\u00a0\u00a0\u00a0 #Export each theme to a temporary PDF and append to the final PDF<br \/>\ntmpPdf = outPath + lyrName + \u201c_temp.pdf\u201d<br \/>\nif os.path.exists(tmpPdf):<br \/>\nos.remove(tmpPdf)<br \/>\narcpy.mapping.ExportToPDF(mxd, tmpPdf)<br \/>\nfinalPdf.appendPages(tmpPdf)<\/i><\/p>\n<p>#Turn off layer visibility and clean up for next pass through the loop<br \/>\nlyr.visible = False<br \/>\ndel lyr, tmpPdf<br \/>\ndel mxd, df, finalPdf<\/p>\n<p>Frequently map books require a separate layout for a left and right page in order to create a wider margin in the middle when the pages are bound together. Or some map books require page layouts using different orientations, where some of the maps are portrait and some are landscape.\u00a0\u00a0 In this example we use two layouts, one for the left and one for the right. Both layouts have multiple pages created using data driven pages. The following script exports all the left pages and all the right pages and assembles them together into a single PDF file:<\/p>\n<p><i>import arcpy, os<\/i><\/p>\n<p># Specify left and right map documents and create final output PDF file<br \/>\nmxdLeft = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyAtlas_left.mxd\u201d)<br \/>\nmxdRight = arcpy.mapping.MapDocument(r\u201dC:MyProjectMyAtlas_right.mxd\u201d)<br \/>\nfinalPdf = arcpy.mapping.PDFDocumentCreate(r\u201dC:MyProjectMyAtlas.pdf\u201d)<\/p>\n<p>#Export left (odd) pages to temporary PDF files<br \/>\nfor pgNumLeft in range(1, mxdLeft.dataDrivenPages.pageCount + 1, 2):<br \/>\nmxdLeft.dataDrivenPages.currentPageID = pgNumLeft<br \/>\narcpy.mapping.ExportToPDF(mxdLeft, r\u201dC:MyProjectTemp_Page\u201d + str(pgNumLeft) + \u201c.pdf\u201d)<\/p>\n<p>#Export right (even) pages to temporary PDF files<br \/>\nfor pgNumRight in range(2, mxdRight.dataDrivenPages.pageCount + 1, 2):<br \/>\nmxdRight.dataDrivenPages.currentPageID = pgNumRight<br \/>\narcpy.mapping.ExportToPDF(mxdRight, r\u201dC:DataDemosHamiltonCoDemooutputAtlas_Page\u201d + str(pgNumRight) + \u201c.pdf\u201d)<\/p>\n<p><i>#Append all pages into final PDF file and clean up temporary PDF files<br \/>\nfor pgNum in range(1, mxdLeft.dataDrivenPages.pageCount + 1,):<br \/>\ntmpPdf = r\u201dC:DataDemosHamiltonCoDemooutputAtlas_Page\u201d + str(pgNum) + \u201c.pdf\u201d<br \/>\nif os.path.exists(tmpPdf):<br \/>\nfinalPdf.appendPages (tmpPdf)<br \/>\nos.remove(tmpPdf)<br \/>\ndel mxdLeft, mxdRight, finalPdf, tmpPdf<\/i><\/p>\n<p>When you combine the multiple pages, and dynamic layout elements from data driven pages along with the things you can do with arcpy.mapping there are many possibilities. Arcpy.mapping makes it easy to write powerful Python scripts that automate many of the redundant map book and atlas compilation and production tasks.<\/p>\n<p>These are just a small sample.\u00a0 There is a lot more you can do with arcpy.mapping.\u00a0 See an overview at:<br \/>\n<a href=\"http:\/\/help.arcgis.com\/en\/arcgisdesktop\/1%3Cbr%20\/%3E0.0\/help\/index.html#\/\/00s300000032000000.htm\" target=\"_blank\" rel=\"noopener\">http:\/\/help.arcgis.com\/en\/arcgisdesktop\/10.0\/help\/index.html#\/\/00s300000032000000.htm<\/a><\/p>\n<p>You can find additional sample scripts at\u00a0<a href=\"http:\/\/resources.arcgis.com\/gallery\/file\/geoprocessing\/details?entryID=A910AB18-1422-2418-3418-3885D388EF60\" target=\"_blank\" rel=\"noopener\">Code Gallery<\/a><\/p>\n<p><a href=\"http:\/\/downloads2.esri.com\/blogs\/images\/dev_21804.jpg\" target=\"_blank\" rel=\"noopener\"><img decoding=\"async\" src=\"http:\/\/downloads2.esri.com\/blogs\/images\/dev_21804.jpg\" border=\"0\" \/><\/a><\/p>\n"}],"authors":[{"ID":3601,"user_firstname":"Rob","user_lastname":"Elkins","nickname":"rpe2","user_nicename":"rpe2","display_name":"Rob Elkins","user_email":"relkins@esri.com","user_url":"","user_registered":"2018-03-02 00:15:15","user_description":"","user_avatar":"<img alt='' src='https:\/\/secure.gravatar.com\/avatar\/372025ad723ca3ed9f19047a9f7e1db155d632dbd4c919d556c8daa4654f15fa?s=96&#038;d=blank&#038;r=g' srcset='https:\/\/secure.gravatar.com\/avatar\/372025ad723ca3ed9f19047a9f7e1db155d632dbd4c919d556c8daa4654f15fa?s=192&#038;d=blank&#038;r=g 2x' class='avatar avatar-96 photo' height='96' width='96' loading='lazy' decoding='async'\/>"}],"related_articles":"","card_image":false,"wide_image":false},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.9 (Yoast SEO v25.9) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Combining Data Driven Pages with Python and arcpy.mapping<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Combining Data Driven Pages with Python and arcpy.mapping\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\" \/>\n<meta property=\"og:site_name\" content=\"ArcGIS Blog\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/esrigis\/\" \/>\n<meta property=\"article:modified_time\" content=\"2018-12-18T19:52:26+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@ESRI\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":[\"Article\",\"BlogPosting\"],\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\"},\"author\":{\"name\":\"Rob Elkins\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3334a2f9ab0a4c95d2e01e7e7f44c5d5\"},\"headline\":\"Combining Data Driven Pages with Python and arcpy.mapping\",\"datePublished\":\"2010-12-14T21:48:58+00:00\",\"dateModified\":\"2018-12-18T19:52:26+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\"},\"wordCount\":9,\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"keywords\":[\"ArcPy\",\"Layout\",\"Map Book\",\"python\"],\"articleSection\":[\"Mapping\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\",\"name\":\"Combining Data Driven Pages with Python and arcpy.mapping\",\"isPartOf\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\"},\"datePublished\":\"2010-12-14T21:48:58+00:00\",\"dateModified\":\"2018-12-18T19:52:26+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.esri.com\/arcgis-blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Combining Data Driven Pages with Python and arcpy.mapping\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#website\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"name\":\"ArcGIS Blog\",\"description\":\"Get insider info from Esri product teams\",\"publisher\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#organization\",\"name\":\"Esri\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"contentUrl\":\"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png\",\"width\":400,\"height\":400,\"caption\":\"Esri\"},\"image\":{\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/esrigis\/\",\"https:\/\/x.com\/ESRI\",\"https:\/\/www.linkedin.com\/company\/5311\/\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3334a2f9ab0a4c95d2e01e7e7f44c5d5\",\"name\":\"Rob Elkins\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/372025ad723ca3ed9f19047a9f7e1db155d632dbd4c919d556c8daa4654f15fa?s=96&d=blank&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/372025ad723ca3ed9f19047a9f7e1db155d632dbd4c919d556c8daa4654f15fa?s=96&d=blank&r=g\",\"caption\":\"Rob Elkins\"},\"url\":\"\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Combining Data Driven Pages with Python and arcpy.mapping","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping","og_locale":"en_US","og_type":"article","og_title":"Combining Data Driven Pages with Python and arcpy.mapping","og_url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping","og_site_name":"ArcGIS Blog","article_publisher":"https:\/\/www.facebook.com\/esrigis\/","article_modified_time":"2018-12-18T19:52:26+00:00","twitter_card":"summary_large_image","twitter_site":"@ESRI","schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":["Article","BlogPosting"],"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping#article","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping"},"author":{"name":"Rob Elkins","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3334a2f9ab0a4c95d2e01e7e7f44c5d5"},"headline":"Combining Data Driven Pages with Python and arcpy.mapping","datePublished":"2010-12-14T21:48:58+00:00","dateModified":"2018-12-18T19:52:26+00:00","mainEntityOfPage":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping"},"wordCount":9,"publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"keywords":["ArcPy","Layout","Map Book","python"],"articleSection":["Mapping"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping","url":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping","name":"Combining Data Driven Pages with Python and arcpy.mapping","isPartOf":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#website"},"datePublished":"2010-12-14T21:48:58+00:00","dateModified":"2018-12-18T19:52:26+00:00","breadcrumb":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.esri.com\/arcgis-blog\/products\/arcgis-desktop\/mapping\/combining-data-driven-pages-with-python-and-arcpy-mapping#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.esri.com\/arcgis-blog\/"},{"@type":"ListItem","position":2,"name":"Combining Data Driven Pages with Python and arcpy.mapping"}]},{"@type":"WebSite","@id":"https:\/\/www.esri.com\/arcgis-blog\/#website","url":"https:\/\/www.esri.com\/arcgis-blog\/","name":"ArcGIS Blog","description":"Get insider info from Esri product teams","publisher":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.esri.com\/arcgis-blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.esri.com\/arcgis-blog\/#organization","name":"Esri","url":"https:\/\/www.esri.com\/arcgis-blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","contentUrl":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2018\/04\/Esri.png","width":400,"height":400,"caption":"Esri"},"image":{"@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/esrigis\/","https:\/\/x.com\/ESRI","https:\/\/www.linkedin.com\/company\/5311\/"]},{"@type":"Person","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/3334a2f9ab0a4c95d2e01e7e7f44c5d5","name":"Rob Elkins","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.esri.com\/arcgis-blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/372025ad723ca3ed9f19047a9f7e1db155d632dbd4c919d556c8daa4654f15fa?s=96&d=blank&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/372025ad723ca3ed9f19047a9f7e1db155d632dbd4c919d556c8daa4654f15fa?s=96&d=blank&r=g","caption":"Rob Elkins"},"url":""}]}},"text_date":"December 14, 2010","author_name":"Rob Elkins","author_page":false,"custom_image":"https:\/\/www.esri.com\/arcgis-blog\/app\/uploads\/2025\/08\/Newsroom-Keyart-Wide-1920-x-1080.jpg","primary_product":"ArcMap","tag_data":[{"term_id":31181,"name":"ArcPy","slug":"arcpy","term_group":0,"term_taxonomy_id":31181,"taxonomy":"post_tag","description":"","parent":0,"count":32,"filter":"raw"},{"term_id":27981,"name":"Layout","slug":"layout","term_group":0,"term_taxonomy_id":27981,"taxonomy":"post_tag","description":"","parent":0,"count":36,"filter":"raw"},{"term_id":26461,"name":"Map Book","slug":"map-book","term_group":0,"term_taxonomy_id":26461,"taxonomy":"post_tag","description":"","parent":0,"count":4,"filter":"raw"},{"term_id":24341,"name":"python","slug":"python","term_group":0,"term_taxonomy_id":24341,"taxonomy":"post_tag","description":"","parent":0,"count":171,"filter":"raw"}],"category_data":[{"term_id":22941,"name":"Mapping","slug":"mapping","term_group":0,"term_taxonomy_id":22941,"taxonomy":"category","description":"","parent":0,"count":2691,"filter":"raw"}],"product_data":[{"term_id":36991,"name":"ArcMap","slug":"arcgis-desktop","term_group":0,"term_taxonomy_id":36991,"taxonomy":"product","description":"","parent":36981,"count":325,"filter":"raw"}],"primary_product_link":"https:\/\/www.esri.com\/arcgis-blog\/?s=#&products=arcgis-desktop","_links":{"self":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/173401","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog"}],"about":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/types\/blog"}],"author":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/users\/3601"}],"replies":[{"embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/comments?post=173401"}],"version-history":[{"count":0,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/blog\/173401\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/media?parent=173401"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/categories?post=173401"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/tags?post=173401"},{"taxonomy":"industry","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/industry?post=173401"},{"taxonomy":"product","embeddable":true,"href":"https:\/\/www.esri.com\/arcgis-blog\/wp-json\/wp\/v2\/product?post=173401"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}