Python 从csv计算多段线的长度

Python 从csv计算多段线的长度,python,csv,distance,Python,Csv,Distance,我对python还是新手。我需要通过简单的距离计算帮助计算多段线的长度: distance = sqrt( (x1 - x2)**2 + (y1 - y2)**2 ) 例如,我的输入csv如下所示 id x y sequence 1 1.5 2.5 0 1 3.2 4.9 1 1 3.6 6.6 2 1 4.4 5.0 3 2 2.0 4.5 0 2

我对python还是新手。我需要通过简单的距离计算帮助计算多段线的长度:

    distance = sqrt( (x1 - x2)**2 + (y1 - y2)**2 )
例如,我的输入csv如下所示

id    x     y     sequence
1    1.5   2.5       0
1    3.2   4.9       1
1    3.6   6.6       2
1    4.4   5.0       3
2    2.0   4.5       0
2    3.5   6.0       1
我有“id”和“序列”(线顶点的序列号)。如何读取csv文件?如果当前“id”与前一行“id”具有相同的值,则执行距离计算:sqrt((x[i]-x[i-1])**2+(y[i]-y[i-1])**2)。然后,按“id”分组,并将其“距离”值相加

输出csv如下所示:

id    distance
 1       ?
 2       ?
提前谢谢

多段线:

两点之间的距离以及点与多段线之间的距离:

def lineMagnitude (x1, y1, x2, y2):
    lineMagnitude = math.sqrt(math.pow((x2 - x1), 2)+ math.pow((y2 - y1), 2))
    return lineMagnitude

#Calc minimum distance from a point and a line segment (i.e. consecutive vertices in a polyline).
def DistancePointLine (px, py, x1, y1, x2, y2):
    #http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/source.vba
    LineMag = lineMagnitude(x1, y1, x2, y2)

    if LineMag < 0.00000001:
        DistancePointLine = 9999
        return DistancePointLine

    u1 = (((px - x1) * (x2 - x1)) + ((py - y1) * (y2 - y1)))
    u = u1 / (LineMag * LineMag)

    if (u < 0.00001) or (u > 1):
        #// closest point does not fall within the line segment, take the shorter distance
        #// to an endpoint
        ix = lineMagnitude(px, py, x1, y1)
        iy = lineMagnitude(px, py, x2, y2)
        if ix > iy:
            DistancePointLine = iy
        else:
            DistancePointLine = ix
    else:
        # Intersecting point is on the line, use the formula
        ix = x1 + u * (x2 - x1)
        iy = y1 + u * (y2 - y1)
        DistancePointLine = lineMagnitude(px, py, ix, iy)

    return DistancePointLine
def线路幅值(x1、y1、x2、y2):
lineMagnitude=数学sqrt(数学功率((x2-x1),2)+数学功率((y2-y1),2))
返回线幅值
#计算距点和线段(即多段线中的连续顶点)的最小距离。
def距离点线(px、py、x1、y1、x2、y2):
#http://local.wasp.uwa.edu.au/~pbourke/geometry/pointline/source.vba
LineMag=线幅值(x1,y1,x2,y2)
如果LineMag<0.00000001:
距离点线=9999
返回距离点线
u1=((px-x1)*(x2-x1))+((py-y1)*(y2-y1)))
u=u1/(LineMag*LineMag)
如果(u<0.00001)或(u>1):
#//最近点不在线段内,取较短的距离
#//到达终点
ix=线幅值(px,py,x1,y1)
iy=线震级(px,py,x2,y2)
如果ix>iy:
距离点线=iy
其他:
距离点线=ix
其他:
#相交点在直线上,使用公式
ix=x1+u*(x2-x1)
iy=y1+u*(y2-y1)
距离点线=线幅值(px、py、ix、iy)
返回距离点线

欲了解更多信息,请访问:

这类问题通常会被关闭。如果一次只回答一个问题,说明什么不起作用或什么不知道如何做,则更有可能得到有用的回答。函数的参数列表中有两个名为y2,没有一个名为y1。