-
Notifications
You must be signed in to change notification settings - Fork 0
/
lpt.py
112 lines (90 loc) · 3.77 KB
/
lpt.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
import arcpy
import os
from math import ceil
class Length(object):
def __init__(self):
"""Define the tool (tool name is the name of the class)."""
self.label = "Length"
self.description = "Partition line segments approximately a specified length. The number of parts per line segment will vary depending on the length of the original line segment."
self.canRunInBackground = False
def getParameterInfo(self):
"""Define parameter definitions"""
param0 = arcpy.Parameter(name = "in_lines",
displayName = "Input Lines",
direction = "Input",
parameterType = "Required",
datatype = "DEFeatureClass")
param1 = arcpy.Parameter(name = "workspace",
displayName = "Workspace",
direction = "Input",
parameterType = "Required",
datatype = "DEWorkspace")
param2 = arcpy.Parameter(name = "out_lines",
displayName = "Output Partitioned Lines",
direction = "Input",
parameterType = "Required",
datatype = "GPString")
param3 = arcpy.Parameter(name = "length",
displayName = "Approximate Lengths",
direction = "Input",
parameterType = "Required",
datatype = "GPLong")
param4 = arcpy.Parameter(name="overwrite_output",
displayName="Overwrite Output",
direction="Input",
parameterType="Required",
datatype="GPBoolean")
param4.value = True
params = [param0, param1, param2, param3, param4]
return params
def isLicensed(self):
"""Set whether tool is licensed to execute."""
return True
def updateParameters(self, parameters):
"""Modify the values and properties of parameters before internal
validation is performed. This method is called whenever a parameter
has been changed."""
return
def updateMessages(self, parameters):
"""Modify the messages created by internal validation for each tool
parameter. This method is called after internal validation."""
return
def execute(self, parameters, messages):
"""The source code of the tool."""
in_lines = parameters[0].valueAsText
workspace = parameters[1].valueAsText
out_feature = parameters[2].valueAsText
out_lines = os.path.join(workspace, out_feature)
length = parameters[3].value
arcpy.env.overwriteOutput = parameters[4].value
out_mem = "in_memory/out"
sr = arcpy.Describe(in_lines).spatialReference
arcpy.CreateFeatureclass_management("in_memory", "out", "POLYLINE", template=in_lines,spatial_reference=sr)
fields = arcpy.ListFields(in_lines)
fields = map(lambda f: f.name, fields)
fields.remove("SHAPE")
fields.insert(0, "SHAPE@")
with arcpy.da.SearchCursor(in_lines, fields) as scur:
with arcpy.da.InsertCursor(out_mem, fields ) as icur:
for srow in scur:
line = srow[0]
line_segments = self.segment(line, length)
for line_segment in line_segments:
irow = [line_segment,]+list(srow[1:])
icur.insertRow(irow)
arcpy.CopyFeatures_management(out_mem, out_lines)
arcpy.Delete_management(out_mem)
return
def segment(self, line, slice_size):
length = line.getLength("PLANAR", "FEET")
segments = list()
partitions = int(ceil(length/slice_size))
start = 0
end = length/partitions
for part in range(partitions+1):
line_segment = line.segmentAlongLine(start, end)
if line_segment.length > 0:
segments.append(line_segment)
start = end
end = (part+1)*length/partitions
return segments