Take the 2-minute tour ×
Geographic Information Systems Stack Exchange is a question and answer site for cartographers, geographers and GIS professionals. It's 100% free, no registration required.

I'm customizing an automated mapping solution using arcpy.mapping and data driven pages. Using a looping statement, I'm hardcoding the position for the mapping elements (legend, north arrow, inset map, etc. so that for each map, the mapping elements do not interfere with the area of interest. My code works for all mapping elements except for TEXT_ELEMENTS. Text element stays in the first position assigned for all of the maps.

Not quite sure why this is the case, cause I have been able to get the north arrow, a neat line, legend, scale bar, and inset map (dataframe) to move position for 16 different maps.

Sample code below showing how I'm moving the inset map and one of the text elements is shown below:

import arcpy, os
# Create an output directory variable
outDir = r"C:\Desktop\Test"  

# Create a new, empty pdf document in the specified output directory
finalpdf_filename = outDir + r"\FinalMapBook.pdf"
if os.path.exists(finalpdf_filename): # Check to see if file already exists, delete if it does
  os.remove(finalpdf_filename)
finalPdf = arcpy.mapping.PDFDocumentCreate(finalpdf_filename)
# Create a Data Driven Pages object from the mxd 
mxdPath = r"C:\Desktop\Test\States.mxd"
tempMap = arcpy.mapping.MapDocument(mxdPath)
tempDDP = tempMap.dataDrivenPages
# Create objects for the layout elements that will be moving, e.g., inset data frame, scale text
dataFrame = arcpy.mapping.ListDataFrames(tempMap, "LocatorDF")[0]  

for pgIndex in range(1, tempDDP.pageCount + 1, 1):

  # Create a name for the pdf file you will create for each page
  tempMap.dataDrivenPages.currentPageID = pgIndex
  pageName = tempMap.dataDrivenPages.pageRow.Name
  temp_filename = r"C:\Desktop\Test\temp_pdfs\Land_Cover_" + \
                            str(pgIndex) + pageName + ".pdf"
  if os.path.exists(temp_filename):
    os.remove(temp_filename)

  #Code to modify mapping elements for each page

  # Code for Map1
  if (pgIndex == 1):

    #Set inset map position
    inset = arcpy.mapping.ListDataFrames(tempMap, "LocatorDF")[0]
    inset.ElementPositionX = 3.25
    inset.ElementPositionY = 0
    # Move text elements
    elm = arcpy.mapping.ListLayoutElements(tempMap, "TEXT_ELEMENT", "Westport")[0]
    elm.ElementPositionX = 0.3125   
    elm.ElementPositionY = 3.0227

  # Code for Map2
  if (pgIndex == 2):

    #Set inset map position
    inset = arcpy.mapping.ListDataFrames(tempMap, "LocatorDF")[0]
    inset.ElementPositionX = 0
    inset.ElementPositionY = 3.25
    # Move text elements
    elm = arcpy.mapping.ListLayoutElements(tempMap, "TEXT_ELEMENT", "Westport")[0]
    elm.ElementPositionX = 2.3125   
    elm.ElementPositionY = 2.0227


  # Code for Map3
  if (pgIndex == 3):
    #Set inset map position
    inset = arcpy.mapping.ListDataFrames(tempMap, "LocatorDF")[0]
    inset.ElementPositionX = 3.25
    inset.ElementPositionY = 3.25
    # Move text elements
    elm = arcpy.mapping.ListLayoutElements(tempMap, "TEXT_ELEMENT", "Westport")[0]
    elm.ElementPositionX = 1.3125   
    elm.ElementPositionY = 2.0227

  # Code to export current page and add it to mapbook
  tempDDP.exportToPDF(temp_filename, "RANGE", pgIndex)
  finalPdf.appendPages(temp_filename)

  arcpy.RefreshActiveView()

# Clean up
del tempMap

# Update the properties of the final pdf
finalPdf.updateDocProperties(pdf_open_view="USE_THUMBS",
                             pdf_layout="SINGLE_PAGE")

# Save your result
finalPdf.saveAndClose()  
share|improve this question
add comment

1 Answer

up vote 1 down vote accepted

Okay a small change to the script, and to the text element properties was all I needed. Lower case "e" for elementPositionX and Y, and under the "size and position" tab in the text element properties I gave it an "element name" for the script to search (in this case "Westport").

Now it works!

    # Code for Map3
  if (pgIndex == 3):
    #Set inset map position
    inset = arcpy.mapping.ListDataFrames(tempMap, "LocatorDF")[0]
    inset.elementPositionX = 3.25
    inset.elementPositionY = 3.25
    # Move text elements
    elm = arcpy.mapping.ListLayoutElements(tempMap, "TEXT_ELEMENT", "Westport")[0]
    elm.elementPositionX = 1.3125   
    elm.elementPositionY = 2.0227
share|improve this answer
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.