diff options
| author | George Steel <george.steel@gmail.com> | 2022-12-10 19:27:20 -0500 |
|---|---|---|
| committer | George Steel <george.steel@gmail.com> | 2022-12-10 19:29:01 -0500 |
| commit | 2cec72cbbd73b2dece5d15715e2ab8bddd417c69 (patch) | |
| tree | aff4569cb68f626e05489a86511fbd4be8325e17 /lib/utils/geometry.py | |
| parent | 495a22ea55234e032ac526450fd7969d9aa799c8 (diff) | |
| parent | e52f889bb0cb208685b3f3ef8271f63ecd318af1 (diff) | |
Merge branch 'george-steel/expose-trim-after'
Diffstat (limited to 'lib/utils/geometry.py')
| -rw-r--r-- | lib/utils/geometry.py | 41 |
1 files changed, 34 insertions, 7 deletions
diff --git a/lib/utils/geometry.py b/lib/utils/geometry.py index 30457749..98f40709 100644 --- a/lib/utils/geometry.py +++ b/lib/utils/geometry.py @@ -39,6 +39,40 @@ def cut(line, distance, normalized=False): LineString([(cp.x, cp.y)] + coords[i:])] +def cut_multiple(line, distances, normalized=False): + """Cut a LineString at multiple distances along that line. + + Always returns a list of N + 1 members, where N is the number of distances + provided. Some members of the list may be None, indicating an empty + segment. This can happen if one of the distances is at the start or end + of the line, or if duplicate distances are provided. + + Returns: + a list of LineStrings or None values""" + + distances = list(sorted(distances)) + + segments = [line] + distance_so_far = 0 + nones = [] + + for distance in distances: + segment = segments.pop() + before, after = cut(segment, distance - distance_so_far, normalized) + + segments.append(before) + + if after is None: + nones.append(after) + else: + if before is not None: + distance_so_far += before.length + segments.append(after) + + segments.extend(nones) + return segments + + def roll_linear_ring(ring, distance, normalized=False): """Make a linear ring start at a different point. @@ -113,13 +147,6 @@ def cut_path(points, length): return [Point(*point) for point in subpath.coords] -def collapse_duplicate_point(geometry): - if geometry.area < 0.01: - return geometry.representative_point() - - return geometry - - class Point: def __init__(self, x, y): self.x = x |
