Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cody-scott/arcgis_layout_manager
https://github.com/cody-scott/arcgis_layout_manager
arcgis arcmap arcpy python
Last synced: 12 days ago
JSON representation
- Host: GitHub
- URL: https://github.com/cody-scott/arcgis_layout_manager
- Owner: cody-scott
- License: mit
- Created: 2017-03-02T18:06:20.000Z (over 7 years ago)
- Default Branch: master
- Last Pushed: 2021-05-19T21:30:44.000Z (over 3 years ago)
- Last Synced: 2024-08-18T13:18:43.848Z (3 months ago)
- Topics: arcgis, arcmap, arcpy, python
- Language: Python
- Size: 39.1 KB
- Stars: 5
- Watchers: 3
- Forks: 2
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# About
This package was created to help with the issues of managing multiple map layouts within a single ArcMap document.
As it stands currently, the arcpy.mapping package provides many great tools to manipulate map documents to create map books, and manage multiple layouts, but it is cumbersome to create each time.The LayoutManager attempts to help this by tracking the location and details of Layout Objects on your map document, as well as table of contents items including if it is turned on/off, and transparency.
The intended method is that the layouts are authored within ArcMap manually, then can be easily switched between and updated. Nothing limiting doing by code though.
The data associated with the LayoutManager is stored in JSON which can be easily changed outside of ArcMap.
Finally, the package is usable from within ArcMap's python window, or incorporated into exernal scripts.
# Use Cases
Some potential uses for this would include creating multiple maps that toggle layers on and off in the table of contents.
Creating Data Driven pages that require moving items on and off the map layout.Many More!
# Installation
ArcGIS installation is requiredInstall package via pip
pip install ArcGIS-Layout-Manager
To use within ArcMap, install to the global site packages or if you wish to keep in a virtual environment but use arcpy, toggle global site packages on your virtual environmenttoggleglobalsitepackages -q
# Usage## Initialize
Can function from within ArcMap or within a separate scriptWithin ArcMap
from ArcGIS_Layout_Manager import LayoutManager
lm = LayoutManager()From script
Using path to mxd file
from ArcGIS_Layout_Manager import LayoutManager
mxd_path = r'C:\sample.mxd'
lm = LayoutManager(mxd_path=mxd_path)
or using arcpy.mapping.MapDocument classfrom ArcGIS_Layout_Manager import LayoutManager
mxd = already started arcpy.mapping.MapDocument
lm = LayoutManager(mxd=mxd)A layout.json file is created within the same folder as the map document taking the map document name as the beginning
Using the above example, the file would be called sample_layout.json in the folder* C:\sample.mxd
* C:\sample_layout.json## Create New Layout
Each layout you would like to use requires a layout to be created.
lm.create_layout("Layout Name")
Each layout name must be unique. To check existing names call
lm.list_layouts()
## Changing LayoutsTo change between your created layouts call
lm.switch_layout("Layout Name")
## Updating LayoutsOnce you made one or many changes to a layout within ArcMap, you'll need to update the current layout data.
For your currently activate layout:lm.update_layout()
For a specific layoutlm.update_layout("Layout Name")
## Saving Layout Manually
To save JSON manuallylm.save_layout_json()
# Properties
The LayoutManager has a number of properties that can be set according to your want and needs
### Auto Save
Auto Save JSON file when changing to a new layout, updating current layout, or creating new layout.
lm.auto_save = True/False
### Move Missing Off Screen
If the LayoutManager encounters a new item that you have added to the layout, but have not updated the active layout to include (such as a new text box or scale bar), then you can chose to either keep it in place in the new layout, or move it off screen.
You can also affix it to a new location and call update_layout() to save its place for future.lm.move_missing_off_screen = True/False
### Table of Contents Active
Flag if you want the LayoutManager to change your table of contents items when update_layout is calledlm.toc_active = True/False
### Layouts Active
Flag if you want the LayoutManager to change your map layout items when update_layout is calledlm.lyr_active = True/False
### Get Active Layout
Get your currently active layout propertylm.active_layout
# ExamplesAll of these assuming the following
from ArcGIS_Layout_Manager import LayoutManager
mxd = arcpy.mapping.MapDocument(r'C:\sample.mxd')
lm = LayoutManager(mxd=mxd)### Mapbook of two different locations
create two layouts
lm.create_layout("Layout One")
lm.create_layout("Layout Two")Activate Layout One
lm.switch_layout("Layout One")
Zoom map to one location
Activate Layout Two
lm.switch_layout("Layout Two")
Zoom map to second locationExport both layouts
for item in lm.list_layouts():
lm.switch_layout(item)
arcpy.mapping.ExportToJPEG(mxd, r'C:\{}'.format(item))
### Two Maps with Imagery layer toggled on and offcreate two layouts
lm.create_layout("Layout One")
lm.create_layout("Layout Two")Activate Layout One
lm.switch_layout("Layout One")
Ensure imagery layer is enabledActivate Layout Two
lm.switch_layout("Layout Two")
disable the imagery layerExport both layouts
for item in lm.list_layouts():
lm.switch_layout(item)
arcpy.mapping.ExportToJPEG(mxd, r'C:\{}'.format(item))### Create layout on existing data driven pages map
idx_lyr = mxd.dataDrivenPages.indexLayer
name_field = mxd.dataDrivenPages.pageNameField
with arcpy.da.SearchCursor(idx_lyr, name_field.name) as sc:
for row in sc:
page_name = row[0]
page_id = mxd.dataDrivenPages.getPageIDFromName(page_name)mxd.dataDrivenPages.currentPageID = page_id
arcpy.RefreshActiveView()lm.create_layout(page_id)