class NSWTopo::GeoJSON::MultiLineString
Public Instance Methods
buffer(*margins, **options)
click to toggle source
# File lib/nswtopo/gis/geojson/multi_line_string.rb, line 39 def buffer(*margins, **options) MultiLineString.new(@coordinates + @coordinates.map(&:reverse), @properties).offset(*margins, **options) end
clip(hull)
click to toggle source
# File lib/nswtopo/gis/geojson/multi_line_string.rb, line 6 def clip(hull) lines = [hull, hull.perps].transpose.inject(@coordinates) do |result, (vertex, perp)| result.inject([]) do |clipped, points| clipped + [*points, points.last].segments.inject([[]]) do |lines, segment| inside = segment.map { |point| point.minus(vertex).dot(perp) >= 0 } case when inside.all? lines.last << segment[0] when inside[0] lines.last << segment[0] lines.last << segment.along(vertex.minus(segment[0]).dot(perp) / segment.difference.dot(perp)) when inside[1] lines << [] lines.last << segment.along(vertex.minus(segment[0]).dot(perp) / segment.difference.dot(perp)) end lines end end end.select(&:many?) lines.none? ? nil : lines.one? ? LineString.new(*lines, @properties) : MultiLineString.new(lines, @properties) end
length()
click to toggle source
# File lib/nswtopo/gis/geojson/multi_line_string.rb, line 28 def length @coordinates.sum(&:path_length) end
offset(*margins, **options)
click to toggle source
# File lib/nswtopo/gis/geojson/multi_line_string.rb, line 32 def offset(*margins, **options) linestrings = margins.inject Nodes.new(@coordinates) do |nodes, margin| nodes.progress limit: margin, **options.slice(:rounding_angle, :cutoff_angle) end.readout MultiLineString.new linestrings, @properties end
samples(interval)
click to toggle source
# File lib/nswtopo/gis/geojson/multi_line_string.rb, line 52 def samples(interval) points = @coordinates.map do |linestring| distance = linestring.path_length linestring.sample_at(interval, along: true).map do |point, along| [point, (2 * along - distance).abs - distance] end end.flatten(1).sort_by(&:last).map(&:first) MultiPoint.new points, @properties end
smooth(margin, **options)
click to toggle source
# File lib/nswtopo/gis/geojson/multi_line_string.rb, line 43 def smooth(margin, **options) linestrings = Nodes.new(@coordinates).tap do |nodes| nodes.progress **options.slice(:rounding_angle).merge(limit: margin) nodes.progress **options.slice(:rounding_angle, :cutoff_angle).merge(limit: -2 * margin) nodes.progress **options.slice(:rounding_angle, :cutoff_angle).merge(limit: margin) end.readout MultiLineString.new linestrings, @properties end