mirror of https://github.com/tidwall/tile38.git
44 lines
1.1 KiB
Go
44 lines
1.1 KiB
Go
|
package clip
|
||
|
|
||
|
import (
|
||
|
"github.com/tidwall/geojson"
|
||
|
"github.com/tidwall/geojson/geometry"
|
||
|
)
|
||
|
|
||
|
func clipLineString(
|
||
|
lineString *geojson.LineString, clipper geojson.Object,
|
||
|
) geojson.Object {
|
||
|
bbox := clipper.Rect()
|
||
|
var newPoints [][]geometry.Point
|
||
|
var clipped geometry.Segment
|
||
|
var rejected bool
|
||
|
var line []geometry.Point
|
||
|
base := lineString.Base()
|
||
|
nSegments := base.NumSegments()
|
||
|
for i := 0; i < nSegments; i++ {
|
||
|
clipped, rejected = clipSegment(base.SegmentAt(i), bbox)
|
||
|
if rejected {
|
||
|
continue
|
||
|
}
|
||
|
if len(line) > 0 && line[len(line)-1] != clipped.A {
|
||
|
newPoints = append(newPoints, line)
|
||
|
line = []geometry.Point{clipped.A}
|
||
|
} else if len(line) == 0 {
|
||
|
line = append(line, clipped.A)
|
||
|
}
|
||
|
line = append(line, clipped.B)
|
||
|
}
|
||
|
if len(line) > 0 {
|
||
|
newPoints = append(newPoints, line)
|
||
|
}
|
||
|
var children []*geometry.Line
|
||
|
for _, points := range newPoints {
|
||
|
children = append(children,
|
||
|
geometry.NewLine(points, geometry.DefaultIndex))
|
||
|
}
|
||
|
if len(children) == 1 {
|
||
|
return geojson.NewLineString(children[0])
|
||
|
}
|
||
|
return geojson.NewMultiLineString(children)
|
||
|
}
|