def crop(seq, maxpoints=20, proximity=100, straighten=False):
x = map(float, range(0, len(seq)))
VWpts = simplify(x, seq, maxpoints)
xn, yn = map(list, zip(*VWpts))
simple = np.interp(x, xn, yn)
seq[abs(seq - simple) > proximity] = simple[abs(seq - simple) > proximity]
points = []
for xi, yi in enumerate(seq):
point = ogr.Geometry(ogr.wkbPoint)
point.AddPoint(xi, yi)
points.append(point)
points = np.array(points)
while True:
poly = createPoly(xn, yn, len(seq), max(seq))
line = ogr.Geometry(ogr.wkbLineString)
for xi, yi in zip(xn, yn):
line.AddPoint(xi, yi)
dists = np.array([line.Distance(point) for point in points])
contain = np.array([point.Within(poly) for point in points])
dists[~contain] = 0
points = points[(dists > 0)]
dists = dists[(dists > 0)]
if len(dists) == 0:
break
candidate = points[np.argmax(dists)]
cp = candidate.GetPoint()
index = np.argmin(np.array(xn) < cp[0])
xn.insert(index, cp[0])
yn.insert(index, cp[1])
if straighten:
indices = [i for i in range(0, len(xn)) if (xn[i], yn[i]) in VWpts]
for i, j in enumerate(indices):
if i < (len(indices)-1):
if indices[i+1] > j+1:
dx = abs(xn[j] - xn[indices[i + 1]])
dy = abs(yn[j] - yn[indices[i + 1]])
if dx > dy:
seg_y = yn[j:indices[i + 1]+1]
print(seg_y)
for k in range(j, indices[i + 1]+1):
yn[k] = min(seg_y)
return np.interp(x, xn, yn)
评论列表
文章目录