This is a request which comes up quite often. Normally, the request is to create points along a pipeline at every 1000m (or some other integer). Sometimes it will be for chainage along a road, but it’s always a line feature which defines a route of some kind. The first time I did this, I used ET GeoWizards, which was an excellent starting point. However, with access to an ArcInfo Advanced licence, I decided to try it using only geoprocessing tools found in ArcToolbox. This did not go well. I then turned to something which I should have turned to at the beginning – Python.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# | |
# @date 27/11/2014 | |
# @author Cindy Williams | |
# | |
# Generates chainage at a set distance along line features | |
# and saves it to an existing, empty point feature class. | |
# The point feature class should have a predefined schema | |
# in case other attributes need to be transferred. | |
# | |
# For use as a standalone script. | |
# | |
import arcpy | |
arcpy.env.workspace = r"C:\Some\Arb\Folder\work.gdb" | |
pts = [] # Empty list for chainage points | |
route = arcpy.management.MakeFeatureLayer("ftr_route") # Feature class containing route features | |
chain = arcpy.management.MakeFeatureLayer("ftr_chain") # Empty points feature class | |
i = 1000 # Set the chainage amount | |
# Remove previous attempts at generating chainage | |
arcpy.management.TruncateTable(chain) | |
print("Chainage feature class emptied.") | |
# Loop over all the features in the route feature class | |
with arcpy.da.SearchCursor(route,["SHAPE@", "Route_Name"]) as rows: | |
for row in rows: | |
print("\tGenerating chainage along " + row[1]) | |
leng = row[0].length # Get the length of the current feature | |
pts.append((0,(row[0].positionAlongLine(0)), row[1])) # Get the start point | |
n = i # Start the count for current feature | |
while i < leng: | |
# Add a point at every i metres | |
pts.append((i,(row[0].positionAlongLine(i)), row[1])) | |
n += i | |
pts.append((leng,(row[0].positionAlongLine(leng)), row[1])) # Get the end point | |
# Open a cursor on the points layer | |
cursor = arcpy.da.InsertCursor(chain,("LEN","SHAPE@XY", "Route_Name")) | |
# Insert list of points into chainage feature class | |
for row in pts: | |
cursor.insertRow(row) | |
del pts, cursor | |
print("Script completed.") |