turf-ruby 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/turf.rb +12 -5
- data/lib/turf/along.rb +1 -0
- data/lib/turf/bearing.rb +1 -0
- data/lib/turf/boolean_point_in_polygon.rb +1 -0
- data/lib/turf/centroid.rb +29 -0
- data/lib/turf/destination.rb +2 -2
- data/lib/turf/distance.rb +1 -0
- data/lib/turf/helpers.rb +40 -9
- data/lib/turf/invariant.rb +1 -0
- data/lib/turf/meta.rb +94 -0
- data/lib/turf/version.rb +1 -1
- data/lib/turf_ruby.rb +2 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4a1a13828f696140452584b283d12c6d8c9f365d97cbc0995ccbd275756a84e8
|
4
|
+
data.tar.gz: 8c9b413efdd827194c98535eb64dfe61bb5057c5aa0c61bc1e3899cf9b79a24c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b8ba31f189e103c965d96cf6e424e0e229221e3bf0391a0d45156f841b64d43cdbc690be5fe58555c41bd4d800313d177467b3f00b3fc599f87925f4261d3864
|
7
|
+
data.tar.gz: e56c866eef2ff30d099e459a4d0d095931de7ce1c72f5d5a91f569600fbb694c3ef410d6ab050ea614dc565a014d36643ab53b9910eeada430c9fc3bbb5da220
|
data/lib/turf.rb
CHANGED
@@ -13,11 +13,18 @@ module Turf
|
|
13
13
|
private
|
14
14
|
|
15
15
|
# A non-intrusive implemenation of Rails' Hash#deep_symbolize_keys
|
16
|
-
def deep_symbolize_keys(
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
def deep_symbolize_keys(input)
|
17
|
+
case input
|
18
|
+
when Hash
|
19
|
+
input.transform_keys(&:to_sym).transform_values do |value|
|
20
|
+
deep_symbolize_keys(value)
|
21
|
+
end
|
22
|
+
when Array
|
23
|
+
input.map do |value|
|
24
|
+
deep_symbolize_keys value
|
25
|
+
end
|
26
|
+
else
|
27
|
+
input
|
21
28
|
end
|
22
29
|
end
|
23
30
|
end
|
data/lib/turf/along.rb
CHANGED
data/lib/turf/bearing.rb
CHANGED
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#:nodoc:
|
4
|
+
module Turf
|
5
|
+
# @!group Measurement
|
6
|
+
|
7
|
+
# Takes one or more features and calculates the centroid using the mean of all vertices. This lessens the effect of
|
8
|
+
# small islands and artifacts when calculating the centroid of a set of polygons.
|
9
|
+
# @see http://turfjs.org/docs/#centroid
|
10
|
+
# @param geojson [GeoJSON] GeoJSON to be centered
|
11
|
+
# @param properties [Hash] a [Hash] that is used as the Feature's properties
|
12
|
+
# @return [Feature<Point>] the centroid of the input features
|
13
|
+
def centroid(geojson, properties: {})
|
14
|
+
x_sum = 0
|
15
|
+
y_sum = 0
|
16
|
+
len = 0
|
17
|
+
|
18
|
+
coord_each geojson, exclude_wrap_coord: true do |coord|
|
19
|
+
x_sum += coord[0]
|
20
|
+
y_sum += coord[1]
|
21
|
+
len += 1
|
22
|
+
end
|
23
|
+
|
24
|
+
point(
|
25
|
+
[x_sum / len, y_sum / len],
|
26
|
+
properties: properties,
|
27
|
+
)
|
28
|
+
end
|
29
|
+
end
|
data/lib/turf/destination.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
#:nodoc:
|
3
4
|
module Turf
|
4
5
|
# @!group Measurement
|
5
6
|
|
@@ -28,7 +29,6 @@ module Turf
|
|
28
29
|
lng = radians_to_degrees(longitude2)
|
29
30
|
lat = radians_to_degrees(latitude2)
|
30
31
|
|
31
|
-
|
32
|
-
point([lng, lat], properties, **{})
|
32
|
+
point([lng, lat], properties: properties)
|
33
33
|
end
|
34
34
|
end
|
data/lib/turf/distance.rb
CHANGED
data/lib/turf/helpers.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
#:nodoc:
|
3
4
|
module Turf
|
4
5
|
EARTH_RADIUS = 6_371_008.8
|
5
6
|
private_constant :EARTH_RADIUS
|
@@ -31,11 +32,11 @@ module Turf
|
|
31
32
|
# @param bbox [Array<number>] Bounding Box Array [west, south, east, north] associated with the Feature
|
32
33
|
# @param id [string | number] Identifier associated with the Feature
|
33
34
|
# @return [Feature] a GeoJSON Feature
|
34
|
-
def feature(geom, properties
|
35
|
+
def feature(geom, properties: {}, bbox: nil, id: nil)
|
35
36
|
feat = {
|
36
37
|
type: "Feature",
|
37
|
-
|
38
|
-
|
38
|
+
properties: properties,
|
39
|
+
geometry: geom
|
39
40
|
}
|
40
41
|
feat[:id] = options[:id] if id
|
41
42
|
feat[:bbox] = options[:bbox] if bbox
|
@@ -65,7 +66,7 @@ module Turf
|
|
65
66
|
# @param bbox [Array<number>] Bounding Box Array [west, south, east, north] associated with the Feature
|
66
67
|
# @param id [string | number] Identifier associated with the Feature
|
67
68
|
# @return [Feature<LineString>] LineString Feature
|
68
|
-
def line_string(coordinates, properties
|
69
|
+
def line_string(coordinates, properties: {}, bbox: nil, id: nil)
|
69
70
|
if coordinates.size < 2
|
70
71
|
raise Error, "coordinates must be an array of two or more positions"
|
71
72
|
end
|
@@ -74,7 +75,7 @@ module Turf
|
|
74
75
|
type: "LineString",
|
75
76
|
coordinates: coordinates
|
76
77
|
}
|
77
|
-
feature(geom, properties, bbox: bbox, id: id)
|
78
|
+
feature(geom, properties: properties, bbox: bbox, id: id)
|
78
79
|
end
|
79
80
|
|
80
81
|
# Creates a Point Feature from a Position.
|
@@ -84,12 +85,12 @@ module Turf
|
|
84
85
|
# @param bbox [Array<number>] Bounding Box Array [west, south, east, north] associated with the Feature
|
85
86
|
# @param id [string | number] Identifier associated with the Feature
|
86
87
|
# @return [Feature<Point>] a Point feature
|
87
|
-
def point(coordinates, properties
|
88
|
+
def point(coordinates, properties: {}, id: nil, bbox: nil)
|
88
89
|
geom = {
|
89
90
|
type: "Point",
|
90
91
|
coordinates: coordinates
|
91
92
|
}
|
92
|
-
feature(geom, properties, id: id, bbox: bbox)
|
93
|
+
feature(geom, properties: properties, id: id, bbox: bbox)
|
93
94
|
end
|
94
95
|
|
95
96
|
# Creates a Polygon Feature from an Array of LinearRings.
|
@@ -99,7 +100,7 @@ module Turf
|
|
99
100
|
# @param bbox [Array<number>] Bounding Box Array [west, south, east, north] associated with the Feature
|
100
101
|
# @param id [string | number] Identifier associated with the Feature
|
101
102
|
# @return [Feature<Polygon>] Polygon feature
|
102
|
-
def polygon(coordinates, properties
|
103
|
+
def polygon(coordinates, properties: {}, bbox: nil, id: nil)
|
103
104
|
coordinates.each do |ring|
|
104
105
|
if ring.size < 4
|
105
106
|
raise(
|
@@ -118,7 +119,37 @@ module Turf
|
|
118
119
|
type: "Polygon",
|
119
120
|
coordinates: coordinates
|
120
121
|
}
|
121
|
-
feature(geom, properties, id: id, bbox: bbox)
|
122
|
+
feature(geom, properties: properties, id: id, bbox: bbox)
|
123
|
+
end
|
124
|
+
|
125
|
+
# Creates a Feature<MultiPolygon> based on a coordinate array. Properties can be added optionally.
|
126
|
+
# @see https://turfjs.org/docs/#multiPolygon
|
127
|
+
# @param coordinates [Array<Array<Array<Array<number>>>>] an array of Polygons
|
128
|
+
# @param properties [Hash] an Hash of key-value pairs to add as properties
|
129
|
+
# @param bbox [Array<number>] Bounding Box Array [west, south, east, north] associated with the Feature
|
130
|
+
# @param id [string|number] Identifier associated with the Feature
|
131
|
+
# @return [Feature<MultiPolygon>] a multipolygon feature
|
132
|
+
def multi_polygon(coordinates, properties: {}, bbox: nil, id: nil)
|
133
|
+
geom = {
|
134
|
+
type: "MultiPolygon",
|
135
|
+
coordinates: coordinates
|
136
|
+
}
|
137
|
+
feature(geom, properties: properties, id: id, bbox: bbox)
|
138
|
+
end
|
139
|
+
|
140
|
+
# Creates a Feature<MultiLineString> based on a coordinate array. Properties can be added optionally.
|
141
|
+
# @see https://turfjs.org/docs/#multiLineString
|
142
|
+
# @param coordinates [Array<Array<Array<number>>>] coordinates an array of LineStrings
|
143
|
+
# @param properties [Hash] a Hash of key-value pairs to add as properties
|
144
|
+
# @param bbox [Array<number>] Bounding Box Array [west, south, east, north] associated with the Feature
|
145
|
+
# @param id [string|number] Identifier associated with the Feature
|
146
|
+
# @return [Feature<MultiLineString>] a MultiLineString feature
|
147
|
+
def multi_line_string(coordinates, properties: {}, bbox: nil, id: nil)
|
148
|
+
geom = {
|
149
|
+
type: "MultiLineString",
|
150
|
+
coordinates: coordinates
|
151
|
+
}
|
152
|
+
feature(geom, properties: properties, id: id, bbox: bbox)
|
122
153
|
end
|
123
154
|
|
124
155
|
# @!group Unit Conversion
|
data/lib/turf/invariant.rb
CHANGED
data/lib/turf/meta.rb
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
#:nodoc:
|
4
|
+
module Turf
|
5
|
+
# @!group Meta
|
6
|
+
|
7
|
+
# Iterate over coordinates in any GeoJSON object, similar to Array.forEach()
|
8
|
+
# @see https://turfjs.org/docs/#coordEach
|
9
|
+
# @param geojson [FeatureCollection|Feature|Geometry] any GeoJSON object
|
10
|
+
# @param exclude_wrap_coord [boolean] whether or not to include the final coordinate of LinearRings that wraps the
|
11
|
+
# ring in its iteration
|
12
|
+
# @yield [current_coord, coord_index] given any coordinate
|
13
|
+
# @yieldparam current_coord [Array<number>] The current coordinate being processed.
|
14
|
+
# @yieldparam coord_index [number] The current index of the coordinate being processed.
|
15
|
+
def coord_each(geojson, exclude_wrap_coord: false, &block)
|
16
|
+
return unless geojson
|
17
|
+
|
18
|
+
geojson = deep_symbolize_keys geojson
|
19
|
+
geometries = []
|
20
|
+
case geojson[:type]
|
21
|
+
when "FeatureCollection"
|
22
|
+
geojson[:features].each do |feature|
|
23
|
+
geometries.push feature[:geometry]
|
24
|
+
end
|
25
|
+
when "Feature"
|
26
|
+
geometries.push geojson[:geometry]
|
27
|
+
else
|
28
|
+
geometries.push geojson
|
29
|
+
end
|
30
|
+
|
31
|
+
# flatten GeometryCollection
|
32
|
+
geometries =
|
33
|
+
geometries.map do |geometry|
|
34
|
+
next if geometry.nil?
|
35
|
+
next geometry unless geometry[:type] == "GeometryCollection"
|
36
|
+
|
37
|
+
geometry[:geometries]
|
38
|
+
end.flatten
|
39
|
+
|
40
|
+
coords =
|
41
|
+
geometries.flat_map do |geometry|
|
42
|
+
next nil if geometry.nil?
|
43
|
+
|
44
|
+
case geometry[:type]
|
45
|
+
when "Point"
|
46
|
+
[geometry[:coordinates]]
|
47
|
+
when "LineString", "MultiPoint"
|
48
|
+
geometry[:coordinates]
|
49
|
+
when "Polygon", "MultiLineString"
|
50
|
+
geometry[:coordinates].flat_map do |line_coords|
|
51
|
+
(
|
52
|
+
exclude_wrap_coord ? line_coords.slice(0...-1) : line_coords
|
53
|
+
)
|
54
|
+
end
|
55
|
+
when "MultiPolygon"
|
56
|
+
geometry[:coordinates].flat_map do |polygon_coords|
|
57
|
+
polygon_coords.flat_map do |line_coords|
|
58
|
+
(
|
59
|
+
exclude_wrap_coord ? line_coords.slice(0...-1) : line_coords
|
60
|
+
)
|
61
|
+
end
|
62
|
+
end
|
63
|
+
when "Feature"
|
64
|
+
[].tap do |feature_coords|
|
65
|
+
coord_each geometry, exclude_wrap_coord: exclude_wrap_coord do |coord|
|
66
|
+
feature_coords.push coord
|
67
|
+
end
|
68
|
+
end
|
69
|
+
else
|
70
|
+
raise Error, "Unknown Geometry Type: #{geometry[:type]}"
|
71
|
+
end
|
72
|
+
end.compact
|
73
|
+
|
74
|
+
coords.each_with_index(&block)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Iterate over features in any GeoJSON object, similar to Array.forEach.
|
78
|
+
# @see https://turfjs.org/docs/#featureEach
|
79
|
+
# @param geojson [FeatureCollection|Feature|Geometry] any GeoJSON object
|
80
|
+
# @yield [feature] given any coordinate
|
81
|
+
# @yieldparam feature [Feature<any>] currentFeature The current Feature being processed.
|
82
|
+
# @yieldparam feature_index [number] The current index of the Feature being processed.
|
83
|
+
def feature_each(geojson, &block)
|
84
|
+
return unless geojson
|
85
|
+
|
86
|
+
geojson = deep_symbolize_keys geojson
|
87
|
+
case geojson[:type]
|
88
|
+
when "Feature"
|
89
|
+
yield geojson, 0
|
90
|
+
when "FeatureCollection"
|
91
|
+
geojson[:features].each_with_index(&block)
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
data/lib/turf/version.rb
CHANGED
data/lib/turf_ruby.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: turf-ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Rafael Santos
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-06-
|
11
|
+
date: 2021-06-23 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Turf Ruby is a Ruby library for spatial analysis. It includes traditional
|
14
14
|
spatial operations, helper functions for creating GeoJSON data, and data classification
|
@@ -23,10 +23,12 @@ files:
|
|
23
23
|
- lib/turf/along.rb
|
24
24
|
- lib/turf/bearing.rb
|
25
25
|
- lib/turf/boolean_point_in_polygon.rb
|
26
|
+
- lib/turf/centroid.rb
|
26
27
|
- lib/turf/destination.rb
|
27
28
|
- lib/turf/distance.rb
|
28
29
|
- lib/turf/helpers.rb
|
29
30
|
- lib/turf/invariant.rb
|
31
|
+
- lib/turf/meta.rb
|
30
32
|
- lib/turf/version.rb
|
31
33
|
- lib/turf_ruby.rb
|
32
34
|
homepage: http://github.com/formigarafa/turf-ruby
|
@@ -44,7 +46,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
44
46
|
requirements:
|
45
47
|
- - ">="
|
46
48
|
- !ruby/object:Gem::Version
|
47
|
-
version:
|
49
|
+
version: 2.5.0
|
48
50
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
49
51
|
requirements:
|
50
52
|
- - ">="
|