# How to spatially sort line features???

Discussion created by yichiliu on Jan 8, 2014
Hi all,

I wrote a script to calculate angle bisectors of adjacent lines. I pasted my code here. This code worked fine if the line segments are in right order. However, if the features are not in a spatially right order, for example, the first feature (FID = 0, highlighted in the image) at the middle of the whole line, the result won???t be correct. My question is, how can sort these line segments? Or is there a better way to calculate angle bisector?

Thank you very much!

[ATTACH=CONFIG]30356[/ATTACH]

```import sys
import os
import arcpy
import math

def CalculateAngle(x, y):
Len = math.hypot (x, y)
acos = x/Len
angle = math.acos(acos)
degree = math.degrees (angle)

if y > 0:
return r

if y < 0:
newdegree = 360.00 - degree
return r

if y == 0:
if x >= 0:
return r
if x < 0:
return r

inputlines = arcpy.GetParameterAsText(0)

fcLocation = arcpy.GetParameterAsText(1)

fcName = arcpy.GetParameterAsText(2)

dis = arcpy.GetParameterAsText(3)

d = float(dis)

arcpy.CreateFeatureclass_management(fcLocation, fcName, "POLYLINE")

fcOutput = os.path.join (fcLocation, fcName)

# Create search cursor, read in lines
rows = arcpy.da.SearchCursor(inputlines, ["SHAPE@"])
#Insert Cursor: write lines to new feature lass
cursor = arcpy.da.InsertCursor(fcOutput, ["SHAPE@"])

row = rows.next()
SLstartpt = row[0].firstPoint
SLstartx = SLstartpt.X
SLstarty = SLstartpt.Y

SLendpt = row[0].lastPoint
SLendx = SLendpt.X
SLendy = SLendpt.Y

STempX = SLstartx - SLendx
STempY = SLstarty - SLendy

#start the row iteration
for row in rows:
lenth = row[0].length

if lenth < 1e-03:
continue

ELstartpt = row[0].firstPoint
ELstartx = ELstartpt.X
ELstarty = ELstartpt.Y

ELendpt = row[0].lastPoint
ELendx = ELendpt.X
ELendy = ELendpt.Y

ETempX = ELendx - ELstartx
ETempY = ELendy - ELstarty

#Calculate the angle of first line
Sangle = CalculateAngle(STempX, STempY)

#Calculate the angle of second line
Eangle = CalculateAngle(ETempX, ETempY)

#Calculate the angle of bisector
angle = Eangle + (Sangle - Eangle)/2

cos = math.cos(angle)
sin = math.sin(angle)

TempX = d * cos
TempY = d * sin

StartX = TempX + ELstartx
StartY = TempY + ELstarty

EndX = ELstartx - TempX
EndY = ELstarty - TempY

array = arcpy.Array([arcpy.Point(StartX, StartY), arcpy.Point(EndX, EndY)])
polyline = arcpy.Polyline(array)
cursor.insertRow([polyline])

STempX = (-1) * ETempX
STempY = (-1) * ETempY

del cursor
del row
del rows
```