<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:taxo="http://purl.org/rss/1.0/modules/taxonomy/" version="2.0">
  <channel>
    <title>topic Re: Data Driven Pages Index Code in Python Questions</title>
    <link>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359438#M28371</link>
    <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I updated this a bit the other day. Just a few minor changes and wanted to post some read me text with it. I hope I can get time soon to make this generalized for the resource center.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
import arcpy, textwrap, os, re
from operator import itemgetter
mxd=arcpy.mapping.MapDocument(r'CURRENT')
path = os.path.dirname(mxd.filePath)
arcpy.AddMessage('Creating Roads Feature Layer...')
arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0),'Roads')
arcpy.AddMessage('Creating Grid FeatureLayer...')
arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(1),'Grid')
arcpy.AddMessage('Making Road List...')
alphaList,numList=[],[]
for feature in arcpy.SearchCursor('Roads'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByLocation_management('Grid','INTERSECT',feature.SHAPE)
&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList,roadName=[],[]
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridCursor=arcpy.SearchCursor('Grid')
&amp;nbsp;&amp;nbsp;&amp;nbsp; for tile in GridCursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if arcpy.GetParameter(2)==True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList.append('16R FU %s%s'%(tile.Eastings,tile.Northings))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList.append('%s %s-%s'%(tile.Page,tile.COL,tile.ROW))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if feature.ST_NAME[0].isdigit():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; match=re.search(r'(\d*)(\D*)', feature.ST_NAME)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numList.append([feature.DIR,int(match.group(1)),match.group(2),feature.ST_TYPE,', '.join(tileList)])
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList.append([feature.DIR,feature.ST_NAME,feature.ST_TYPE,', '.join(tileList)])
&amp;nbsp;&amp;nbsp;&amp;nbsp; del GridCursor
arcpy.AddMessage('Merging Strings...')
currentLetter='A'
alphaList_merged=['----------A---------']
for road in sorted(alphaList,key=itemgetter(1,2,0)):
&amp;nbsp;&amp;nbsp;&amp;nbsp; if road[1][0]!=currentLetter:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentLetter=road[1][0].upper()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList_merged.append('----------%s----------'%road[1][0].upper())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList_merged.append(('%s %s %s: %s'%(road[0],road[1],road[2],road[3])).lstrip())
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList_merged.append(('%s %s %s: %s'%(road[0],road[1],road[2],road[3])).lstrip())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
numList_merged=[('%s %s%s %s: %s'%(road[0],road[1],road[2],road[3],road[4])).lstrip() for road in sorted(numList,key=itemgetter(1,3,0))]
roadList=[road for road in alphaList_merged]
roadList.append('----------#----------')
for road in numList_merged:
&amp;nbsp;&amp;nbsp;&amp;nbsp; roadList.append(road)
arcpy.AddMessage('Setting Up Word Wrapping...')
roadList_wrapped=[]
wrapper=textwrap.TextWrapper(width=21, subsequent_indent='&amp;nbsp; ', expand_tabs=False)
for line in roadList:
&amp;nbsp;&amp;nbsp;&amp;nbsp; line=str(line)
&amp;nbsp;&amp;nbsp;&amp;nbsp; for part in wrapper.wrap(line):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; roadList_wrapped.append(part)
roadList_split=['\n'.join(roadList_wrapped[pos:pos+69]) for pos in xrange(0, len(roadList_wrapped), 69)]
arcpy.AddMessage('Exporting PDF...')
One=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'One')[0]
Two=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Two')[0]
Three=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Three')[0]
Four=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Four')[0]

count=1
for textbox in [roadList_split[pos:pos+4] for pos in xrange(0, len(roadList_split), 4)]:
&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(textbox)==4:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],textbox[2],textbox[3]
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],textbox[2],' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],' ',' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],' ',' ',' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; One.text,One.elementPositionX,One.elementPositionY=oneText,.6875,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Two.text,Two.elementPositionX,Two.elementPositionY=twoText,2.5625,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Three.text,Three.elementPositionX,Three.elementPositionY=threeText,4.4375,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Four.text,Four.elementPositionX,Four.elementPositionY=fourText,6.3125,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.mapping.ExportToPDF(mxd, path+ r'/IndexPage%s.pdf'%count)
&amp;nbsp;&amp;nbsp;&amp;nbsp; count+=1
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
pdfDoc=arcpy.mapping.PDFDocumentCreate(path+r'/Index.pdf')
for num in xrange(1,len([roadList_split[pos:pos+4] for pos in xrange(0, len(roadList_split), 4)])+1):
&amp;nbsp;&amp;nbsp;&amp;nbsp; pdfDoc.appendPages(path+r'/IndexPage%s.pdf'%num)
pdfDoc.saveAndClose()
One.text,One.elementPositionX,One.elementPositionY='BOX ONE',.6875,10.5
Two.text,Two.elementPositionX,Two.elementPositionY='BOX TWO',2.5625,10.5
Three.text,Three.elementPositionX,Three.elementPositionY='BOX THREE',4.4375,10.5
Four.text,Four.elementPositionX,Four.elementPositionY='BOX FOUR',6.3125,10.5
arcpy.RefreshActiveView()
&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Some changes may need to be made to the section begining at line 17 and ending at&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;line 29. This section takes each road feature and selects the grid tiles which &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;intersect it and then writes both the road information and the intesection&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;information to a list for sorting and export later. By making the road data into a&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;nested list sorting the list into alphabetical order is made easier. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Inline comments should help for editing the code to fit your projects. Unfortunatly&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;due to differences in schemas and formatting between various organizations road and&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;grid feature classes this part cannot be generalized easily.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If your road data is split into short segments for addressing purposes it may be&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;a good idea to dissolve your roads into single features with the Unslpit Line or&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Dissolve tool. This will cut down the number of pages in the index because the &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;same road will not appear multiple times.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The output for each road will be in the format 'Direction Name Type: Intersections'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'E 23RD CT: 118 B-1, 118 A-1, 117D-1, 118 C-1'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This is wrapped to fit a 21 character line:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;E 23RD CT: 118 B-1,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 118 A-1, 117D-1,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 118 C-1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;A sample page is included in PDF format.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;0: Road data; Feature Layer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1: Grid data; Feature Layer&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The code is currently set up for a schema like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Road: DIR,ST_NAME,ST_TYPE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Grid: COL,ROW&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the road data that my county uses numbered streets are named 1ST, 2ND, 3RD, etc.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This means that numbered streets are in the table as strings. Lines 25-27 takes&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;any road that has a name begining with a numeral and splits it into an integer and&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;a string i.e.E 1ST Ave becomes ['E',1,'ST','AVE']. This allows the numbered streets to &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;be sorted properly instead of normal string sorting.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
    <pubDate>Sat, 11 Dec 2021 16:46:54 GMT</pubDate>
    <dc:creator>ChrisMathers</dc:creator>
    <dc:date>2021-12-11T16:46:54Z</dc:date>
    <item>
      <title>Data Driven Pages Index Code</title>
      <link>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359437#M28370</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I dont like the code for the index that is up on the resource center. So I wrote my own. This uses a page layout in arcmap with 4 columns that are 1.5 inchs wide. The font is Courier New at 9 pt so that allows for 21 characters per line and 69 lines per 10 inch column on an 8.5x11 page. I merged my roads with Unsplit Line before running this. I am thinking about generalizing this so that it can go on the resource center with little changing needed to adapt it to someone elses project. Unlike the other one out there, this one uses only standard library and arcpy functions and methods. This exports a slew of PDF documents which I dont use arcpy to merge. I tried it a few times and was unhappy with the result. It kept putting pages out of order.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="plain" name="code"&gt;
import arcpy, textwrap, os, re
from operator import itemgetter
mxd=arcpy.mapping.MapDocument('CURRENT')
path = os.path.dirname(mxd.filePath)
arcpy.AddMessage('Creating Roads Feature Layer...')
arcpy.MakeFeatureLayer_management(path+ r"/Roads_UnsplitLine.shp",'Roads_UnsplitLine', '"ST_NAME"&amp;lt;&amp;gt;\'\'')
arcpy.AddMessage('Creating Grid FeatureLayer...')
arcpy.MakeFeatureLayer_management(path+ r'/Grid.shp','Grid')
 
arcpy.AddMessage('Making Road List...')
alphaList,numList=[],[]
for feature in arcpy.UpdateCursor('Roads_UnsplitLine'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByLocation_management('Grid','INTERSECT',feature.SHAPE)
&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList,roadName=[],[]
&amp;nbsp;&amp;nbsp;&amp;nbsp; for tile in arcpy.SearchCursor('Grid'):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList.append('%s %s-%s'%(tile.Page,tile.COL,tile.ROW))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if feature.DIR in ['E','W','S','N','NW']: DIR=feature.DIR
&amp;nbsp;&amp;nbsp;&amp;nbsp; else: DIR=' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; if feature.ST_NAME[0].isdigit():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; match=re.search(r'(\d*)(\D*)', feature.ST_NAME)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numList.append([DIR,int(match.group(1)),match.group(2),feature.ST_TYPE,', '.join(tileList)])
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList.append([DIR,feature.ST_NAME,feature.ST_TYPE,', '.join(tileList)])
 
arcpy.AddMessage('Merging Strings...')
numList_merged=['%s %s%s %s: %s'%(road[0],road[1],road[2],road[3],road[4]) for road in sorted(numList,key=itemgetter(1,3,0))]
alphaList_merged=['%s %s %s: %s'%(road[0],road[1],road[2],road[3]) for road in sorted(alphaList,key=itemgetter(1,2,0))]
roadList=[road for road in alphaList_merged]
for road in numList_merged:
&amp;nbsp;&amp;nbsp;&amp;nbsp; roadList.append(road)
 
arcpy.AddMessage('Setting Up Word Wrapping...')
roadList_wrapped=[]
wrapper=textwrap.TextWrapper(width=21, subsequent_indent='&amp;nbsp; ', expand_tabs=False)
for line in roadList:
&amp;nbsp;&amp;nbsp;&amp;nbsp; line=str(line)
&amp;nbsp;&amp;nbsp;&amp;nbsp; for part in wrapper.wrap(line.lstrip()):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; roadList_wrapped.append(part)
 
roadList_split=['\n'.join(roadList_wrapped[pos:pos+69]) for pos in xrange(0, len(roadList_wrapped), 69)]
 
arcpy.AddMessage('Exporting PDF...')
One=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'One')[0]
Two=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Two')[0]
Three=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Three')[0]
Four=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Four')[0]
 
count=1
for textbox in [roadList_split[pos:pos+4] for pos in xrange(0, len(roadList_split), 4)]:
&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(textbox)==4:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],textbox[2],textbox[3]
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],textbox[2],' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],' ',' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],' ',' ',' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; One.text,One.elementPositionX,One.elementPositionY=oneText,.6875,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Two.text,Two.elementPositionX,Two.elementPositionY=twoText,2.5625,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Three.text,Three.elementPositionX,Three.elementPositionY=threeText,4.4375,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Four.text,Four.elementPositionX,Four.elementPositionY=fourText,6.3125,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.mapping.ExportToPDF(mxd, path+ r'/IndexPage%s.pdf'%count)
&amp;nbsp;&amp;nbsp;&amp;nbsp; count+=1
 
One.text,One.elementPositionX,One.elementPositionY='BOX ONE',.6875,10.5
Two.text,Two.elementPositionX,Two.elementPositionY='BOX TWO',2.5625,10.5
Three.text,Three.elementPositionX,Three.elementPositionY='BOX THREE',4.4375,10.5
Four.text,Four.elementPositionX,Four.elementPositionY='BOX FOUR',6.3125,10.5
 
&lt;/PRE&gt;&lt;DIV style="display:none;"&gt; &lt;/DIV&gt;&lt;BR /&gt;&lt;SPAN&gt;I tried to use list comprehensions as much as possible to cut down on the number of lines. If anyone has any questions about this script I would be happy to answer them.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Thu, 20 Jan 2011 17:43:13 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359437#M28370</guid>
      <dc:creator>ChrisMathers</dc:creator>
      <dc:date>2011-01-20T17:43:13Z</dc:date>
    </item>
    <item>
      <title>Re: Data Driven Pages Index Code</title>
      <link>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359438#M28371</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;I updated this a bit the other day. Just a few minor changes and wanted to post some read me text with it. I hope I can get time soon to make this generalized for the resource center.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;PRE class="lia-code-sample line-numbers language-none"&gt;
import arcpy, textwrap, os, re
from operator import itemgetter
mxd=arcpy.mapping.MapDocument(r'CURRENT')
path = os.path.dirname(mxd.filePath)
arcpy.AddMessage('Creating Roads Feature Layer...')
arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(0),'Roads')
arcpy.AddMessage('Creating Grid FeatureLayer...')
arcpy.MakeFeatureLayer_management(arcpy.GetParameterAsText(1),'Grid')
arcpy.AddMessage('Making Road List...')
alphaList,numList=[],[]
for feature in arcpy.SearchCursor('Roads'):
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.SelectLayerByLocation_management('Grid','INTERSECT',feature.SHAPE)
&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList,roadName=[],[]
&amp;nbsp;&amp;nbsp;&amp;nbsp; GridCursor=arcpy.SearchCursor('Grid')
&amp;nbsp;&amp;nbsp;&amp;nbsp; for tile in GridCursor:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if arcpy.GetParameter(2)==True:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList.append('16R FU %s%s'%(tile.Eastings,tile.Northings))
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tileList.append('%s %s-%s'%(tile.Page,tile.COL,tile.ROW))
&amp;nbsp;&amp;nbsp;&amp;nbsp; if feature.ST_NAME[0].isdigit():
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; match=re.search(r'(\d*)(\D*)', feature.ST_NAME)
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; numList.append([feature.DIR,int(match.group(1)),match.group(2),feature.ST_TYPE,', '.join(tileList)])
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList.append([feature.DIR,feature.ST_NAME,feature.ST_TYPE,', '.join(tileList)])
&amp;nbsp;&amp;nbsp;&amp;nbsp; del GridCursor
arcpy.AddMessage('Merging Strings...')
currentLetter='A'
alphaList_merged=['----------A---------']
for road in sorted(alphaList,key=itemgetter(1,2,0)):
&amp;nbsp;&amp;nbsp;&amp;nbsp; if road[1][0]!=currentLetter:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; currentLetter=road[1][0].upper()
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList_merged.append('----------%s----------'%road[1][0].upper())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList_merged.append(('%s %s %s: %s'%(road[0],road[1],road[2],road[3])).lstrip())
&amp;nbsp;&amp;nbsp;&amp;nbsp; else:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; alphaList_merged.append(('%s %s %s: %s'%(road[0],road[1],road[2],road[3])).lstrip())
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; 
numList_merged=[('%s %s%s %s: %s'%(road[0],road[1],road[2],road[3],road[4])).lstrip() for road in sorted(numList,key=itemgetter(1,3,0))]
roadList=[road for road in alphaList_merged]
roadList.append('----------#----------')
for road in numList_merged:
&amp;nbsp;&amp;nbsp;&amp;nbsp; roadList.append(road)
arcpy.AddMessage('Setting Up Word Wrapping...')
roadList_wrapped=[]
wrapper=textwrap.TextWrapper(width=21, subsequent_indent='&amp;nbsp; ', expand_tabs=False)
for line in roadList:
&amp;nbsp;&amp;nbsp;&amp;nbsp; line=str(line)
&amp;nbsp;&amp;nbsp;&amp;nbsp; for part in wrapper.wrap(line):
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; roadList_wrapped.append(part)
roadList_split=['\n'.join(roadList_wrapped[pos:pos+69]) for pos in xrange(0, len(roadList_wrapped), 69)]
arcpy.AddMessage('Exporting PDF...')
One=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'One')[0]
Two=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Two')[0]
Three=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Three')[0]
Four=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'Four')[0]

count=1
for textbox in [roadList_split[pos:pos+4] for pos in xrange(0, len(roadList_split), 4)]:
&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(textbox)==4:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],textbox[2],textbox[3]
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==3:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],textbox[2],' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==2:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],textbox[1],' ',' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; elif len(textbox)==1:
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; oneText,twoText,threeText,fourText=textbox[0],' ',' ',' '
&amp;nbsp;&amp;nbsp;&amp;nbsp; One.text,One.elementPositionX,One.elementPositionY=oneText,.6875,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Two.text,Two.elementPositionX,Two.elementPositionY=twoText,2.5625,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Three.text,Three.elementPositionX,Three.elementPositionY=threeText,4.4375,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; Four.text,Four.elementPositionX,Four.elementPositionY=fourText,6.3125,10.5
&amp;nbsp;&amp;nbsp;&amp;nbsp; arcpy.mapping.ExportToPDF(mxd, path+ r'/IndexPage%s.pdf'%count)
&amp;nbsp;&amp;nbsp;&amp;nbsp; count+=1
&amp;nbsp;&amp;nbsp;&amp;nbsp; 
pdfDoc=arcpy.mapping.PDFDocumentCreate(path+r'/Index.pdf')
for num in xrange(1,len([roadList_split[pos:pos+4] for pos in xrange(0, len(roadList_split), 4)])+1):
&amp;nbsp;&amp;nbsp;&amp;nbsp; pdfDoc.appendPages(path+r'/IndexPage%s.pdf'%num)
pdfDoc.saveAndClose()
One.text,One.elementPositionX,One.elementPositionY='BOX ONE',.6875,10.5
Two.text,Two.elementPositionX,Two.elementPositionY='BOX TWO',2.5625,10.5
Three.text,Three.elementPositionX,Three.elementPositionY='BOX THREE',4.4375,10.5
Four.text,Four.elementPositionX,Four.elementPositionY='BOX FOUR',6.3125,10.5
arcpy.RefreshActiveView()
&lt;/PRE&gt;&lt;BR /&gt;&lt;SPAN&gt; &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Some changes may need to be made to the section begining at line 17 and ending at&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;line 29. This section takes each road feature and selects the grid tiles which &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;intersect it and then writes both the road information and the intesection&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;information to a list for sorting and export later. By making the road data into a&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;nested list sorting the list into alphabetical order is made easier. &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Inline comments should help for editing the code to fit your projects. Unfortunatly&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;due to differences in schemas and formatting between various organizations road and&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;grid feature classes this part cannot be generalized easily.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;If your road data is split into short segments for addressing purposes it may be&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;a good idea to dissolve your roads into single features with the Unslpit Line or&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Dissolve tool. This will cut down the number of pages in the index because the &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;same road will not appear multiple times.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;The output for each road will be in the format 'Direction Name Type: Intersections'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;'E 23RD CT: 118 B-1, 118 A-1, 117D-1, 118 C-1'&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This is wrapped to fit a 21 character line:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;E 23RD CT: 118 B-1,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 118 A-1, 117D-1,&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;&amp;nbsp; 118 C-1&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;A sample page is included in PDF format.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Parameters:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;0: Road data; Feature Layer&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;1: Grid data; Feature Layer&lt;/SPAN&gt;&lt;BR /&gt;&lt;BR /&gt;&lt;SPAN&gt;The code is currently set up for a schema like this:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Road: DIR,ST_NAME,ST_TYPE&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;Grid: COL,ROW&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;In the road data that my county uses numbered streets are named 1ST, 2ND, 3RD, etc.&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;This means that numbered streets are in the table as strings. Lines 25-27 takes&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;any road that has a name begining with a numeral and splits it into an integer and&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;a string i.e.E 1ST Ave becomes ['E',1,'ST','AVE']. This allows the numbered streets to &lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;be sorted properly instead of normal string sorting.&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Sat, 11 Dec 2021 16:46:54 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359438#M28371</guid>
      <dc:creator>ChrisMathers</dc:creator>
      <dc:date>2021-12-11T16:46:54Z</dc:date>
    </item>
    <item>
      <title>Re: Data Driven Pages Index Code</title>
      <link>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359439#M28372</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Hi! I am trying out your code, and so far I've been able to modify it to my needs, but I am stuck on line:&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN style="font-style:italic;"&gt;One=arcpy.mapping.ListLayoutElements(mxd, 'TEXT_ELEMENT', 'One') [0]&lt;BR /&gt;&lt;/SPAN&gt;&lt;BR /&gt;&lt;SPAN&gt;I keep getting "IndexError: list index out of range". When I remove "[0]", the code gets through that line OK, but naturally gets stuck a short while later, when "oneText" is referenced. This at least suggests to me that it's not a problem with mxd directly? What should the mxd look like before the script starts, is it just empty? I am running this from outside ArcMap, so I am using a pre-saved mxd instead of Current. Could that be the problem? Thanks a lot for your help!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Dec 2011 15:43:35 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359439#M28372</guid>
      <dc:creator>MariaJosefson</dc:creator>
      <dc:date>2011-12-20T15:43:35Z</dc:date>
    </item>
    <item>
      <title>Re: Data Driven Pages Index Code</title>
      <link>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359440#M28373</link>
      <description>&lt;HTML&gt;&lt;HEAD&gt;&lt;/HEAD&gt;&lt;BODY&gt;&lt;SPAN&gt;Update - I found that removing 'One' etc inside parentheses makes the code work (whu, I am not sure!). I am still having issues with formatting of the resulting page (only getting one column per page), and still rather confused about what the "empty" mxd should contain. Also, my understanding was that the street list would come out alphabetically, and it looks to be not - did I break something in the code, or was that not part of the program? Thanks!&lt;/SPAN&gt;&lt;/BODY&gt;&lt;/HTML&gt;</description>
      <pubDate>Tue, 20 Dec 2011 21:13:26 GMT</pubDate>
      <guid>https://community.esri.com/t5/python-questions/data-driven-pages-index-code/m-p/359440#M28373</guid>
      <dc:creator>MariaJosefson</dc:creator>
      <dc:date>2011-12-20T21:13:26Z</dc:date>
    </item>
  </channel>
</rss>

