turf-ruby 0.1.0 → 0.2.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/.hound.yml +5 -0
- data/.rubocop.yml +32 -0
- data/.travis.yml +1 -1
- data/Gemfile +3 -1
- data/Gemfile.lock +2 -2
- data/README.md +1 -1
- data/Rakefile +3 -1
- data/bin/console +2 -1
- data/lib/turf.rb +11 -1
- data/lib/turf/helper.rb +78 -8
- data/lib/turf/invariant.rb +29 -0
- data/lib/turf/measurement.rb +30 -0
- data/lib/turf/version.rb +3 -1
- data/lib/turf_ruby.rb +6 -0
- data/turf-ruby.gemspec +15 -6
- metadata +7 -3
- data/lib/turf-ruby.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8ed0e8a70920277e4e8507100d1f14084e75d0904c03feea99dc8196530561a
|
4
|
+
data.tar.gz: baba690e3110b85c5ece7eed4f5bd3229b5ecfbbeeca7ad4a7ca8e05d182763f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9e331328f338fff791262493ae0f63da0baea68b5ec457c911ce62711803fc5f91b989bb5a2abc5191ff354f25306c664cb1b00a75c857484da518da4367a475
|
7
|
+
data.tar.gz: 7d1814173daf223ec7d8f9bbd4ae080c18c85bcfe4c0d307ada85abde67772aaa5d58bf87024fb5757825b5faa7544ab908ff12bc67c3cc5302ecf5e5281a0d6
|
data/.hound.yml
ADDED
data/.rubocop.yml
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
Layout/FirstArrayElementIndentation:
|
2
|
+
EnforcedStyle: consistent
|
3
|
+
|
4
|
+
Metrics:
|
5
|
+
Enabled: false
|
6
|
+
|
7
|
+
Style/Documentation:
|
8
|
+
Enabled: false
|
9
|
+
|
10
|
+
Style/HashEachMethods:
|
11
|
+
Enabled: false
|
12
|
+
|
13
|
+
Style/HashTransformKeys:
|
14
|
+
Enabled: true
|
15
|
+
|
16
|
+
Style/HashTransformValues:
|
17
|
+
Enabled: true
|
18
|
+
|
19
|
+
Style/IfUnlessModifier:
|
20
|
+
Enabled: false
|
21
|
+
|
22
|
+
Style/NegatedIf:
|
23
|
+
Enabled: false
|
24
|
+
|
25
|
+
Style/StringLiterals:
|
26
|
+
EnforcedStyle: double_quotes
|
27
|
+
|
28
|
+
Style/TrailingCommaInArguments:
|
29
|
+
EnforcedStyleForMultiline: comma
|
30
|
+
|
31
|
+
Style/TrailingCommaInArrayLiteral:
|
32
|
+
EnforcedStyleForMultiline: consistent_comma
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
# Turf Ruby
|
1
|
+
# Turf Ruby [](https://travis-ci.com/formigarafa/turf-ruby)
|
2
2
|
|
3
3
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/turf`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
4
|
|
data/Rakefile
CHANGED
data/bin/console
CHANGED
@@ -1,7 +1,8 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
2
3
|
|
3
4
|
require "bundler/setup"
|
4
|
-
require "
|
5
|
+
require "turf_ruby"
|
5
6
|
|
6
7
|
# You can add fixtures and/or initialization code here to make experimenting
|
7
8
|
# with your gem easier. You can also use a different console, if you like.
|
data/lib/turf.rb
CHANGED
@@ -1,6 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require "turf/version"
|
2
4
|
|
3
5
|
module Turf
|
4
6
|
class Error < StandardError; end
|
5
|
-
|
7
|
+
|
8
|
+
# A non-intrusive implemenation of Rails' Hash#deep_symbolize_keys
|
9
|
+
def self.deep_symbolize_keys(hash)
|
10
|
+
return hash unless hash.is_a? Hash
|
11
|
+
|
12
|
+
hash.transform_keys(&:to_sym).transform_values do |value|
|
13
|
+
deep_symbolize_keys(value)
|
14
|
+
end
|
15
|
+
end
|
6
16
|
end
|
data/lib/turf/helper.rb
CHANGED
@@ -1,26 +1,96 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Turf
|
4
|
+
EARTH_RADIUS = 6_371_008.8
|
5
|
+
FACTORS = {
|
6
|
+
"centimeters" => EARTH_RADIUS * 100,
|
7
|
+
"centimetres" => EARTH_RADIUS * 100,
|
8
|
+
"degrees" => EARTH_RADIUS / 111_325,
|
9
|
+
"feet" => EARTH_RADIUS * 3.28084,
|
10
|
+
"inches" => EARTH_RADIUS * 39.370,
|
11
|
+
"kilometers" => EARTH_RADIUS / 1000,
|
12
|
+
"kilometres" => EARTH_RADIUS / 1000,
|
13
|
+
"meters" => EARTH_RADIUS,
|
14
|
+
"metres" => EARTH_RADIUS,
|
15
|
+
"miles" => EARTH_RADIUS / 1609.344,
|
16
|
+
"millimeters" => EARTH_RADIUS * 1000,
|
17
|
+
"millimetres" => EARTH_RADIUS * 1000,
|
18
|
+
"nauticalmiles" => EARTH_RADIUS / 1852,
|
19
|
+
"radians" => 1,
|
20
|
+
"yards" => EARTH_RADIUS / 1.0936
|
21
|
+
}.freeze
|
22
|
+
|
2
23
|
def self.feature(geom, properties = nil, options = {})
|
3
24
|
feat = {
|
4
25
|
type: "Feature",
|
5
26
|
geometry: geom,
|
6
|
-
properties: properties || {}
|
27
|
+
properties: properties || {}
|
7
28
|
}
|
8
|
-
if options[:id]
|
9
|
-
feat[:id] = options[:id]
|
10
|
-
end
|
29
|
+
feat[:id] = options[:id] if options[:id]
|
11
30
|
|
12
|
-
if options[:bbox]
|
13
|
-
feat[:bbox] = options[:bbox]
|
14
|
-
end
|
31
|
+
feat[:bbox] = options[:bbox] if options[:bbox]
|
15
32
|
|
16
33
|
feat
|
17
34
|
end
|
18
35
|
|
36
|
+
def self.line_string(coordinates, properties = nil, options = {})
|
37
|
+
if coordinates.size < 2
|
38
|
+
raise Error, "coordinates must be an array of two or more positions"
|
39
|
+
end
|
40
|
+
|
41
|
+
geom = {
|
42
|
+
type: "LineString",
|
43
|
+
coordinates: coordinates
|
44
|
+
}
|
45
|
+
feature(geom, properties, options)
|
46
|
+
end
|
47
|
+
|
19
48
|
def self.point(coordinates, properties = nil, options = {})
|
20
49
|
geom = {
|
21
50
|
type: "Point",
|
22
|
-
coordinates: coordinates
|
51
|
+
coordinates: coordinates
|
52
|
+
}
|
53
|
+
feature(geom, properties, options)
|
54
|
+
end
|
55
|
+
|
56
|
+
def self.polygon(coordinates, properties = nil, options = {})
|
57
|
+
coordinates.each do |ring|
|
58
|
+
if ring.size < 4
|
59
|
+
raise(
|
60
|
+
Error,
|
61
|
+
"Each LinearRing of a Polygon must have 4 or more Positions.",
|
62
|
+
)
|
63
|
+
end
|
64
|
+
|
65
|
+
ring.last.each_with_index do |number, idx|
|
66
|
+
if ring.first[idx] != number
|
67
|
+
raise Error, "First and last Position are not equivalent."
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
geom = {
|
72
|
+
type: "Polygon",
|
73
|
+
coordinates: coordinates
|
23
74
|
}
|
24
75
|
feature(geom, properties, options)
|
25
76
|
end
|
77
|
+
|
78
|
+
def self.degrees_to_radians(degrees)
|
79
|
+
radians = degrees.remainder(360)
|
80
|
+
radians * Math::PI / 180
|
81
|
+
end
|
82
|
+
|
83
|
+
def self.radians_to_length(radians, units = "kilometers")
|
84
|
+
factor = FACTORS[units]
|
85
|
+
raise Error, "#{units} units is invalid" unless factor
|
86
|
+
|
87
|
+
radians * factor
|
88
|
+
end
|
89
|
+
|
90
|
+
def self.length_to_radians(distance, units = "kilometers")
|
91
|
+
factor = FACTORS[units]
|
92
|
+
raise Error, "#{units} units is invalid" unless factor
|
93
|
+
|
94
|
+
distance / factor
|
95
|
+
end
|
26
96
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Turf
|
4
|
+
def self.get_coord(coord)
|
5
|
+
if !coord
|
6
|
+
raise Error, "coord is required"
|
7
|
+
end
|
8
|
+
|
9
|
+
is_numeric = ->(i) { i.is_a? Numeric }
|
10
|
+
if coord.is_a?(Array) && coord.length >= 2 && coord.all?(&is_numeric)
|
11
|
+
return coord
|
12
|
+
end
|
13
|
+
|
14
|
+
if coord.is_a? Hash
|
15
|
+
coord = deep_symbolize_keys(coord)
|
16
|
+
|
17
|
+
is_feature = coord[:type] == "Feature"
|
18
|
+
if is_feature && coord.fetch(:geometry, {})[:type] == "Point"
|
19
|
+
return coord[:geometry][:coordinates]
|
20
|
+
end
|
21
|
+
|
22
|
+
if coord[:type] == "Point"
|
23
|
+
return coord[:coordinates]
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
raise Error, "coord must be GeoJSON Point or an Array of numbers"
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Turf
|
4
|
+
def self.distance(from, to, **options)
|
5
|
+
coordinates1 = get_coord from
|
6
|
+
coordinates2 = get_coord to
|
7
|
+
|
8
|
+
d_lat = degrees_to_radians coordinates2[1] - coordinates1[1]
|
9
|
+
d_lon = degrees_to_radians coordinates2[0] - coordinates1[0]
|
10
|
+
lat1 = degrees_to_radians coordinates1[1]
|
11
|
+
lat2 = degrees_to_radians coordinates2[1]
|
12
|
+
|
13
|
+
a =
|
14
|
+
(
|
15
|
+
(Math.sin(d_lat / 2)**2) +
|
16
|
+
(Math.sin(d_lon / 2)**2) * Math.cos(lat1) * Math.cos(lat2)
|
17
|
+
)
|
18
|
+
|
19
|
+
call_args = [
|
20
|
+
2 * Math.atan2(
|
21
|
+
Math.sqrt(a),
|
22
|
+
Math.sqrt(1 - a),
|
23
|
+
),
|
24
|
+
]
|
25
|
+
if options[:units]
|
26
|
+
call_args << options[:units]
|
27
|
+
end
|
28
|
+
public_send(:radians_to_length, *call_args)
|
29
|
+
end
|
30
|
+
end
|
data/lib/turf/version.rb
CHANGED
data/lib/turf_ruby.rb
ADDED
data/turf-ruby.gemspec
CHANGED
@@ -1,4 +1,6 @@
|
|
1
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/turf/version"
|
2
4
|
|
3
5
|
Gem::Specification.new do |spec|
|
4
6
|
spec.name = "turf-ruby"
|
@@ -6,8 +8,12 @@ Gem::Specification.new do |spec|
|
|
6
8
|
spec.authors = ["Rafael Santos"]
|
7
9
|
spec.email = ["santos@rafael.nz"]
|
8
10
|
|
9
|
-
spec.summary =
|
10
|
-
spec.description =
|
11
|
+
spec.summary = "A modular geospatial engine. Ruby port of TurfJS."
|
12
|
+
spec.description = [
|
13
|
+
"Turf Ruby is a Ruby library for spatial analysis. ",
|
14
|
+
"It includes traditional spatial operations, helper functions for creating",
|
15
|
+
" GeoJSON data, and data classification and statistics tools.",
|
16
|
+
].join("")
|
11
17
|
spec.homepage = "http://github.com/formigarafa/turf-ruby"
|
12
18
|
spec.license = "MIT"
|
13
19
|
spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
|
@@ -16,9 +22,12 @@ Gem::Specification.new do |spec|
|
|
16
22
|
spec.metadata["source_code_uri"] = spec.homepage
|
17
23
|
|
18
24
|
# Specify which files should be added to the gem when it is released.
|
19
|
-
# The `git ls-files -z` loads the files in the RubyGem that have been added
|
20
|
-
|
21
|
-
|
25
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added
|
26
|
+
# into git.
|
27
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
28
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
29
|
+
f.match(%r{^(test|spec|features)/})
|
30
|
+
end
|
22
31
|
end
|
23
32
|
spec.bindir = "exe"
|
24
33
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
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.2.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: 2020-
|
11
|
+
date: 2020-03-10 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
|
@@ -20,6 +20,8 @@ extensions: []
|
|
20
20
|
extra_rdoc_files: []
|
21
21
|
files:
|
22
22
|
- ".gitignore"
|
23
|
+
- ".hound.yml"
|
24
|
+
- ".rubocop.yml"
|
23
25
|
- ".travis.yml"
|
24
26
|
- CODE_OF_CONDUCT.md
|
25
27
|
- Gemfile
|
@@ -29,10 +31,12 @@ files:
|
|
29
31
|
- Rakefile
|
30
32
|
- bin/console
|
31
33
|
- bin/setup
|
32
|
-
- lib/turf-ruby.rb
|
33
34
|
- lib/turf.rb
|
34
35
|
- lib/turf/helper.rb
|
36
|
+
- lib/turf/invariant.rb
|
37
|
+
- lib/turf/measurement.rb
|
35
38
|
- lib/turf/version.rb
|
39
|
+
- lib/turf_ruby.rb
|
36
40
|
- turf-ruby.gemspec
|
37
41
|
homepage: http://github.com/formigarafa/turf-ruby
|
38
42
|
licenses:
|
data/lib/turf-ruby.rb
DELETED