I'm trying to use positionAlongLine() to create equally spaced points down a polyline as part of a loop. I also need to calculate the distance at the same time.

However, on curves there is a mismatch between what the distance SHOULD BE and what the distance IS when the points are measured using the measure tool in arcmap.

See example image - 18 points on a 660.979m curved line should all be 36.72m apart but instead vary from 35 to 40m each (but the calculated distance in the script is correct as 36.72m).

I'm not sure why this is not working for curves - does the positionAlongLine() take the curve into account to get the correct position? If not, is there a way of adapting it?

def fillInPoints(prevID):

prevStreetLen = streetLengths[prevID]  # How long was the street before (before we add our point)?  # 18/04/18 - REMOVED THE (*1000)
streetVertexCount = len(xyDict[prevID]) - 1  # How many vertices on street according to the geometry?
distBetween = prevStreetLen /streetVertexCount  # Average distance between vertices

if distBetween > 100:  # 100 is our max distance, fill in between if greater
    streetVertexCount += floor(distBetween / 100)  # add in the min number to bring distbetween down below 100 (e.g. 300m = 3)

thisDirection = streetSeq_dict[streetSeq-1]['direction']  # Direction (FT/TF) of PREVIOUS street

# Here we are filling in the gaps where the distance between the start and end of the segment are too long
if streetVertexCount > 1:  # More than just the start and end (NB we've already added vertices if streets were >100m)

    # Loop through each vertex
    for n in range(1,int(streetVertexCount)):
        position = n * (1 / float(streetVertexCount))  # Get the position (e.g. 0.5 if only 1 point added)

        streetShape = streetShapeDict[prevID]
        thisDistance = 0

        # Subtracting from the current distance as we're looking back to the street before
        if thisDirection == "FT":
            thisPoint = streetShape.positionAlongLine(position,True).firstPoint
            thisDistance = distanceFromStart - ((1 - position) * prevStreetLen)

            thisPoint = streetShape.positionAlongLine((1 - position),True).firstPoint
            thisDistance = distanceFromStart - ((1 - position) * prevStreetLen)


enter image description here

  • You might check if there is some rounding errors with the division. Python 2.7 doesn't always provide you with a floating point number: 1/length might give you an integer whereas 1.0/length or float(1)/length would give you a floating point. You're also using percentage along the line. Maybe use the actual distance you are interested in. Just some initial thoughts. – dslamb Apr 23 '18 at 13:36
  • Thanks dslamb, tried the 1.0 trick but this didn't work unfortunately. Tried distance, wasn't working but realised this was because of the coordinate system I was in, will keep trying... – Mike Apr 24 '18 at 16:46

Problem was the method was run in WGS 1984 but the workspace is in a projected coordinate system.

Running the method in a projected coordinate system resolved the issue.

| improve this answer | |

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

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