def merge(polylines, mx_dist=4):
    """
    point by line segment comparison
    merge polylines if points are close
    """
    l = len(polylines)
    to_remove = set()
    for n in range(l - 1, -1, -1):
        if n not in to_remove:
            c = polylines[n]
            for p0, p1 in zip(c[:-1], c[1:]):
                # create a line from any subsegment:
                l0 = p0[0], p0[1], p1[0], p1[1]

                # for every other polyline:
                for m in range(l - 1, -1, -1):
                    if m not in to_remove:
                        if n == m:
                            continue
                        remove = False
                        cc = polylines[m]
                        ind = np.zeros(shape=cc.shape[0], dtype=bool)

                        # for every point p in this polyline:
                        for o in range(len(cc) - 1, -1, -1):
                            p = cc[o]

                            if line.segmentDistance(l0, p) < mx_dist:
                                remove = True
                                ind[o] = True

                        if remove:
                            polylines[n] = np.append(c, cc[ind], axis=0)
                            ind = ~ind
                            s = ind.sum()
                            if s < 2:
                                to_remove.add(m)
                            else:
                                polylines[m] = cc[ind]

    to_remove = sorted(to_remove)
    to_remove.reverse()
    for i in to_remove:
        polylines.pop(i)
point by line segment comparison
    merge polylines if points are close