georuby-ext 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/.jrubyrc +1 -0
- data/.travis.yml +23 -0
- data/Gemfile +6 -0
- data/Guardfile +12 -2
- data/MIT-LICENSE +20 -0
- data/README.rdoc +2 -28
- data/georuby-ext.gemspec +14 -11
- data/lib/georuby-ext.rb +17 -2
- data/lib/georuby-ext/core_ext.rb +11 -0
- data/lib/georuby-ext/geokit.rb +10 -3
- data/lib/georuby-ext/georuby/envelope.rb +36 -1
- data/lib/georuby-ext/georuby/ewkb_parser.rb +11 -0
- data/lib/georuby-ext/georuby/ewkt_parser.rb +11 -0
- data/lib/georuby-ext/georuby/geometry.rb +46 -2
- data/lib/georuby-ext/georuby/line_string.rb +19 -7
- data/lib/georuby-ext/georuby/linear_ring.rb +15 -0
- data/lib/georuby-ext/georuby/locators.rb +30 -17
- data/lib/georuby-ext/georuby/multi_polygon.rb +15 -1
- data/lib/georuby-ext/georuby/point.rb +148 -24
- data/lib/georuby-ext/georuby/polygon.rb +38 -27
- data/lib/georuby-ext/georuby/rtree.rb +133 -0
- data/lib/georuby-ext/georuby/srid.rb +17 -0
- data/lib/georuby-ext/proj4.rb +15 -2
- data/lib/georuby-ext/rgeo/cartesian/feature_methods.rb +58 -0
- data/lib/georuby-ext/rgeo/feature/geometry.rb +11 -0
- data/lib/georuby-ext/rgeo/feature/geometry_collection.rb +11 -0
- data/lib/georuby-ext/rgeo/feature/rgeo.rb +157 -0
- data/lib/georuby-ext/rgeo/geos/ffi_feature_methods.rb +265 -0
- data/lib/georuby-ext/rspec_helper.rb +47 -8
- data/spec/lib/geokit_spec.rb +44 -0
- data/spec/lib/georuby/envelope_spec.rb +46 -0
- data/spec/lib/georuby/geometry_spec.rb +81 -0
- data/spec/{georuby → lib/georuby}/line_string_spec.rb +29 -14
- data/spec/lib/georuby/linear_ring_spec.rb +52 -0
- data/spec/lib/georuby/locators_spec.rb +123 -0
- data/spec/lib/georuby/multi_polygon_spec.rb +69 -0
- data/spec/lib/georuby/point_spec.rb +248 -0
- data/spec/lib/georuby/polygon_spec.rb +175 -0
- data/spec/lib/georuby/rtree_spec.rb +132 -0
- data/spec/lib/proj4_spec.rb +24 -0
- data/spec/lib/rgeo/cartesian/feature_methods_spec.rb +110 -0
- data/spec/lib/rgeo/geos/ffi_feature_methods_spec.rb +234 -0
- data/spec/spec_helper.rb +12 -8
- metadata +224 -189
- data/lib/georuby-ext/rgeo.rb +0 -23
- data/spec/georuby/linear_ring_spec.rb +0 -33
- data/spec/georuby/locators_spec.rb +0 -120
- data/spec/georuby/multi_polygon_spec.rb +0 -29
- data/spec/georuby/point_spec.rb +0 -44
- data/spec/georuby/polygon_spec.rb +0 -134
- data/spec/rgeo_spec.rb +0 -81
@@ -21,39 +21,78 @@ def geometry(text, srid = 4326)
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def point(x=0.0, y=0.0, srid = 4326)
|
24
|
-
|
24
|
+
if String === x
|
25
|
+
geometry("POINT(#{x})")
|
26
|
+
else
|
27
|
+
GeoRuby::SimpleFeatures::Point.from_x_y x, y, srid
|
28
|
+
end
|
25
29
|
end
|
26
30
|
|
27
31
|
def points(text)
|
28
|
-
text.split(",").collect { |definition|
|
32
|
+
text.split(",").collect { |definition| point definition }
|
29
33
|
end
|
30
34
|
|
31
35
|
def line_string(*points)
|
32
36
|
if points.one? and String === points.first
|
33
37
|
geometry("LINESTRING(#{points})")
|
34
38
|
else
|
35
|
-
GeoRuby::SimpleFeatures::LineString.from_points(points)
|
39
|
+
GeoRuby::SimpleFeatures::LineString.from_points(points, points.first.srid)
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
def multi_line_string(*lines)
|
44
|
+
if lines.one? and String === lines.first
|
45
|
+
geometry("MULTILINESTRING(#{lines})")
|
46
|
+
else
|
47
|
+
GeoRuby::SimpleFeatures::MultiLineString.from_line_strings lines, lines.first.srid
|
36
48
|
end
|
37
49
|
end
|
38
50
|
|
39
51
|
def linear_ring(*points)
|
40
|
-
GeoRuby::SimpleFeatures::LinearRing.from_points(points)
|
52
|
+
GeoRuby::SimpleFeatures::LinearRing.from_points(points, points.first.srid)
|
53
|
+
end
|
54
|
+
|
55
|
+
def envelope(lower_corner, upper_corner)
|
56
|
+
lower_corner = point(lower_corner) if String === lower_corner
|
57
|
+
upper_corner = point(upper_corner) if String === upper_corner
|
58
|
+
|
59
|
+
GeoRuby::SimpleFeatures::Envelope.from_points([lower_corner, upper_corner], lower_corner.srid)
|
41
60
|
end
|
42
61
|
|
43
62
|
def polygon(*points)
|
44
|
-
|
63
|
+
if points.one? and String === points.first
|
64
|
+
geometry("POLYGON(#{points})")
|
65
|
+
else
|
66
|
+
GeoRuby::SimpleFeatures::Polygon.from_points([points], points.first.srid)
|
67
|
+
end
|
45
68
|
end
|
46
69
|
|
47
70
|
def multi_polygon(*polygons)
|
48
|
-
GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([polygons])
|
71
|
+
GeoRuby::SimpleFeatures::MultiPolygon.from_polygons([polygons], polygons.first.srid)
|
72
|
+
end
|
73
|
+
|
74
|
+
def rgeo_factory
|
75
|
+
@rgeo_factory ||= RGeo::Geos.factory(:srid => 4326, :wkt_parser => {:support_ewkt => true})
|
49
76
|
end
|
50
77
|
|
51
78
|
def rgeo_point(x = 0, y = 0, srid = 4326)
|
52
|
-
|
79
|
+
rgeo_factory.point(x, y)
|
80
|
+
end
|
81
|
+
|
82
|
+
def rgeo_multi_polygon(polygons, srid = 4326)
|
83
|
+
rgeo_factory.multi_polygon(polygons)
|
84
|
+
end
|
85
|
+
|
86
|
+
def rgeo_multi_line_string(multi_line_string, srid = 4326)
|
87
|
+
if lines.one? and String === lines.first
|
88
|
+
geometry("MULTILINESTRING(#{lines})")
|
89
|
+
else
|
90
|
+
Rgeo::Geos::MultiLineString.from_line_strings lines, lines.first.srid
|
91
|
+
end
|
53
92
|
end
|
54
93
|
|
55
94
|
def rgeometry(text, srid = 4326)
|
56
|
-
|
95
|
+
rgeo_factory.parse_wkt text
|
57
96
|
end
|
58
97
|
|
59
98
|
def rgeo_line_string(text, srid = 4326)
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe GeoKit::LatLng do
|
4
|
+
|
5
|
+
subject { GeoKit::LatLng.new }
|
6
|
+
|
7
|
+
describe "#valid?" do
|
8
|
+
|
9
|
+
it "should be invalid when lat is nil" do
|
10
|
+
subject.lat, subject.lng = nil, 45
|
11
|
+
subject.should_not be_valid
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should be invalid when lng is nil" do
|
15
|
+
subject.lat, subject.lng = 45, nil
|
16
|
+
subject.should_not be_valid
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should be valid when lat is between -90 and 90, lng between -180 and 180" do
|
20
|
+
subject.lat, subject.lng = 45, 90
|
21
|
+
subject.should be_valid
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "#wgs84_to_google" do
|
27
|
+
|
28
|
+
it "should return google coordinates" do
|
29
|
+
subject.lat, subject.lng = 45, 90
|
30
|
+
#subject.wgs84_to_google.eql?(Geokit::LatLng.new(5621521.48619207, 10018754.1713946)).should be_true
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
describe "#google_to_wgs84" do
|
36
|
+
|
37
|
+
it "should wgs84 coordinates" do
|
38
|
+
subject.lat, subject.lng = 45, 90
|
39
|
+
#subject.google_to_wgs84.eql?(Geokit::LatLng.new(0.000404241877844722, 0.000808483755707569)).should be_true
|
40
|
+
end
|
41
|
+
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
@@ -0,0 +1,46 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GeoRuby::SimpleFeatures::Envelope do
|
4
|
+
|
5
|
+
subject { envelope point(0,0), point(1,1) }
|
6
|
+
|
7
|
+
describe "#to_google" do
|
8
|
+
|
9
|
+
it "should return an Envelope with Google srid" do
|
10
|
+
subject.to_google.srid.should == 900913
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "to_polygon" do
|
16
|
+
let(:geo_polygon){ polygon(point(0,0), point(0,1), point(1,1), point(1,0), point(0,0))}
|
17
|
+
let(:geo_envelope) { envelope( point(0,0), point(1,1) ) }
|
18
|
+
|
19
|
+
it "should return a polygon GeoRuby::SimpleFeatures::Polygon" do
|
20
|
+
(geo_envelope.to_polygon == geo_polygon).should be_true
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
describe ".bounds" do
|
25
|
+
|
26
|
+
it "should return a global bounds of children" do
|
27
|
+
geometries = [polygon("(0 0,1 1,1 0, 0 0)"), polygon("(1 1,2 2,2 0, 1 1)")]
|
28
|
+
GeoRuby::SimpleFeatures::Envelope.bounds(geometries).should == envelope("0 0","2 2")
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
describe ".overlaps?" do
|
33
|
+
|
34
|
+
it "should return true if bound is included in envelope" do
|
35
|
+
bound = envelope("0 0","1 1")
|
36
|
+
envelope("0 0","2 2").overlaps?(bound).should == true
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should return true if bound intersects envelope" do
|
40
|
+
bound = envelope("0 0","1 1")
|
41
|
+
envelope("0.5 0.5","2 2").overlaps?(bound).should == true
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
|
46
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe GeoRuby::SimpleFeatures::Geometry do
|
4
|
+
|
5
|
+
subject { point }
|
6
|
+
|
7
|
+
describe "#to_ewkt" do
|
8
|
+
|
9
|
+
it "should return as_ewkt result" do
|
10
|
+
subject.to_ewkt.should == subject.as_ewkt
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
|
15
|
+
it "should be wgs84 when srid == 4326" do
|
16
|
+
subject.srid = 4326
|
17
|
+
subject.should be_wgs84
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should not be wgs84 when srid isn't 4326" do
|
21
|
+
subject.srid = 900913
|
22
|
+
subject.should_not be_wgs84
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#inspect" do
|
26
|
+
|
27
|
+
it "should include geometry class name" do
|
28
|
+
subject.inspect.should include(subject.class.name)
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should include geometry ekwt" do
|
32
|
+
subject.inspect.should include(subject.to_ewkt)
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
describe ".srid!" do
|
38
|
+
|
39
|
+
it "should return the uniq srid of given geometries" do
|
40
|
+
GeoRuby::SimpleFeatures::Geometry.srid!([point.to_google]).should == 900913
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should raise an error when srid is not uniq" do
|
44
|
+
lambda do
|
45
|
+
GeoRuby::SimpleFeatures::Geometry.srid!([point, point.to_google])
|
46
|
+
end.should raise_error
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
describe "#to_wgs84" do
|
52
|
+
|
53
|
+
let(:projected_geometry) { mock }
|
54
|
+
|
55
|
+
it "should return a geometry with 4326 srid" do
|
56
|
+
subject.to_wgs84.srid.should == 4326
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should project the geometry in wgs84" do
|
60
|
+
subject.should_receive(:project_to).with(4326).and_return(projected_geometry)
|
61
|
+
subject.to_wgs84.should == projected_geometry
|
62
|
+
end
|
63
|
+
|
64
|
+
end
|
65
|
+
|
66
|
+
describe "#to_google" do
|
67
|
+
|
68
|
+
let(:projected_geometry) { mock }
|
69
|
+
|
70
|
+
it "should return a geometry with 900913 srid" do
|
71
|
+
subject.to_google.srid.should == 900913
|
72
|
+
end
|
73
|
+
|
74
|
+
it "should project the geometry in google" do
|
75
|
+
subject.should_receive(:project_to).with(900913).and_return(projected_geometry)
|
76
|
+
subject.to_google.should == projected_geometry
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
|
81
|
+
end
|
@@ -5,9 +5,6 @@ describe GeoRuby::SimpleFeatures::LineString do
|
|
5
5
|
subject { line_string "0 0,1 1,0 0" }
|
6
6
|
|
7
7
|
describe "#to_rgeo" do
|
8
|
-
it "should create a RGeo Geos geometry" do
|
9
|
-
subject.to_rgeo.should be_kind_of(RGeo::Geos::GeometryImpl)
|
10
|
-
end
|
11
8
|
|
12
9
|
context "returned RGeo LineString" do
|
13
10
|
it "should have the same srid" do
|
@@ -41,7 +38,6 @@ describe GeoRuby::SimpleFeatures::LineString do
|
|
41
38
|
|
42
39
|
it "should have the same srid" do
|
43
40
|
subject.to_ring.should have_same(:srid).than(subject)
|
44
|
-
# subject.to_ring.srid.should == subject.srid
|
45
41
|
end
|
46
42
|
|
47
43
|
context "when line is closed" do
|
@@ -72,7 +68,7 @@ describe GeoRuby::SimpleFeatures::LineString do
|
|
72
68
|
subject.change(:points => other_points).points.should == other_points
|
73
69
|
end
|
74
70
|
|
75
|
-
it "should change the
|
71
|
+
it "should change the srid if specified" do
|
76
72
|
subject.change(:srid => 1).srid.should == 1
|
77
73
|
end
|
78
74
|
|
@@ -94,27 +90,46 @@ describe GeoRuby::SimpleFeatures::LineString do
|
|
94
90
|
|
95
91
|
end
|
96
92
|
|
97
|
-
describe "#
|
93
|
+
describe "#project_to" do
|
94
|
+
|
95
|
+
let(:target_srid) { 900913 }
|
96
|
+
subject { line_string("0 0,1 1,0 0") }
|
98
97
|
|
99
98
|
it "should project all points into wgs84" do
|
100
|
-
subject.
|
101
|
-
|
99
|
+
subject.project_to(target_srid).points.each_with_index do |point, index|
|
100
|
+
point.should == subject[index].project_to(target_srid)
|
102
101
|
end
|
103
102
|
end
|
104
103
|
|
105
|
-
it "should have the srid
|
106
|
-
subject.
|
104
|
+
it "should have the target srid" do
|
105
|
+
subject.project_to(target_srid).srid.should == target_srid
|
107
106
|
end
|
108
107
|
|
109
108
|
it "should not change other attributes" do
|
110
|
-
subject.
|
109
|
+
subject.project_to(target_srid).should have_same(:with_z, :with_m).than(subject)
|
110
|
+
end
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
describe "#close!" do
|
115
|
+
|
116
|
+
it "should add first point if needed" do
|
117
|
+
line_string("0 0,1 1").close!.should == line_string("0 0,1 1,0 0")
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should not change a closed line" do
|
121
|
+
line_string("0 0,1 1,0 0").close!.should == line_string("0 0,1 1,0 0")
|
111
122
|
end
|
112
123
|
|
113
124
|
end
|
114
125
|
|
115
|
-
|
116
|
-
|
117
|
-
|
126
|
+
describe "#side_count" do
|
127
|
+
|
128
|
+
it "should return point count minus one" do
|
129
|
+
line_string("0 0,1 1,2 2").side_count.should == 2
|
130
|
+
end
|
131
|
+
|
118
132
|
end
|
119
133
|
|
120
134
|
end
|
135
|
+
|
@@ -0,0 +1,52 @@
|
|
1
|
+
require "spec_helper"
|
2
|
+
|
3
|
+
describe GeoRuby::SimpleFeatures::LinearRing do
|
4
|
+
let(:result) { rgeo_factory.linear_ring([rgeo_point(0, 0), rgeo_point(2, 1), rgeo_point(3, 2), rgeo_point(0, 0)])}
|
5
|
+
|
6
|
+
describe "to_rgeo" do
|
7
|
+
it "should create a RGeo::Feature::LinearRing" do
|
8
|
+
line = linear_ring(point(0,0), point(2,1), point(3,2), point(0,0))
|
9
|
+
line.to_rgeo.should == result
|
10
|
+
end
|
11
|
+
|
12
|
+
it "should create a RGeo::Feature::LinearRing if the georuby linear ring is not closed" do
|
13
|
+
line = linear_ring(point(0,0), point(2,1), point(3,2))
|
14
|
+
line.to_rgeo.should == result
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
describe ".from_points" do
|
20
|
+
|
21
|
+
it "should be closed even if last point is missing" do
|
22
|
+
GeoRuby::SimpleFeatures::LinearRing.from_points(points("0 0,1 1,0 0")).should be_closed
|
23
|
+
end
|
24
|
+
|
25
|
+
it "should accept already closed line" do
|
26
|
+
GeoRuby::SimpleFeatures::LinearRing.from_points(points("0 0,1 1,0 0")).should == line_string("0 0,1 1,0 0")
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
describe ".from_coordinates" do
|
32
|
+
|
33
|
+
it "should be closed even if last point is missing" do
|
34
|
+
GeoRuby::SimpleFeatures::LinearRing.from_coordinates([[0,0],[1,1],[0,0]]).should be_closed
|
35
|
+
end
|
36
|
+
|
37
|
+
it "should accept already closed line" do
|
38
|
+
GeoRuby::SimpleFeatures::LinearRing.from_coordinates([[0,0],[1,1],[0,0]]).should == line_string("0 0,1 1,0 0")
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
it "should close linear rings parsed from ekt" do
|
44
|
+
polygon("(0 0,1 1)").rings.first.should be_closed
|
45
|
+
end
|
46
|
+
|
47
|
+
it "should close linear rings parsed from ekb" do
|
48
|
+
ewkb_polygon = GeoRuby::SimpleFeatures::Geometry.from_ewkb(polygon("(0 0,1 1,0 0)").as_ewkb)
|
49
|
+
ewkb_polygon.rings.first.should be_closed
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
@@ -0,0 +1,123 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe GeoRuby::SimpleFeatures::MultiLineString do
|
4
|
+
|
5
|
+
describe "locate_point" do
|
6
|
+
|
7
|
+
context "examples" do
|
8
|
+
|
9
|
+
# it "should find 2,1 at 0.5 between 0,0 and 4,0" do
|
10
|
+
# multi_line_string("(0 0,4 0)").locate_point(point(2,1)).should == 0.5
|
11
|
+
# end
|
12
|
+
|
13
|
+
# it "should find 2,1 at 1.5 for (0,4)...(0,1) and (0,0)...(4,0)" do
|
14
|
+
# multi_line_string("(0 4,0 1),(0 0,4 0)").locate_point(point(2,1)).should == 1.5
|
15
|
+
# end
|
16
|
+
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
|
21
|
+
describe "interpolate_point" do
|
22
|
+
|
23
|
+
context "examples" do
|
24
|
+
|
25
|
+
it "should find 0.5 at (2,0) between 0,0 and 4,0" do
|
26
|
+
multi_line_string("(0 0,4 0)").interpolate_point(0.5).should == point(2,0)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should find 1.5 at (2,0) for (0,4)...(0,1) and (0,0)...(4,0)" do
|
30
|
+
multi_line_string("(0 4,0 1),(0 0,4 0)").interpolate_point(1.5).should == point(2,0)
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
describe GeoRuby::SimpleFeatures::LineString do
|
40
|
+
|
41
|
+
describe "locate_point" do
|
42
|
+
|
43
|
+
# context "examples" do
|
44
|
+
|
45
|
+
# it "should find 2,1 at 0.5 between 0,0 and 4,0" do
|
46
|
+
# line_string("0 0,4 0").locate_point(point(2,1)).should == 0.5
|
47
|
+
# end
|
48
|
+
|
49
|
+
# it "should find 2,1 at 0.5 between 0,0 and 4,0 (with several segments)" do
|
50
|
+
# line_string("0 0,2 0,4 0").locate_point(point(2,1)).should == 0.5
|
51
|
+
# end
|
52
|
+
|
53
|
+
# end
|
54
|
+
|
55
|
+
it "should find Tour Eiffel at 0.434073695339917 on Avenue Gustave Eiffel" do
|
56
|
+
tour_eiffel = point 2.2946, 48.8580
|
57
|
+
avenue_gustave_eiffel = line_string "2.29406861440145 48.8570391455916,2.29498049424636 48.8576531708278,2.29540512788116 48.8579392878211,2.29634853859254 48.8585744605187"
|
58
|
+
expected_location = 0.434073695339917
|
59
|
+
|
60
|
+
avenue_gustave_eiffel.locate_point(tour_eiffel).should be_within(0.001).of(expected_location)
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
describe GeoRuby::SimpleFeatures::LineString::PointLocator do
|
68
|
+
|
69
|
+
alias_method :p, :point
|
70
|
+
|
71
|
+
def locator(target, departure, arrival)
|
72
|
+
GeoRuby::SimpleFeatures::LineString::PointLocator.new target, departure, arrival
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "distance_from_segment" do
|
76
|
+
|
77
|
+
it "should be zero if target is the segment departure" do
|
78
|
+
departure = point(0, 0)
|
79
|
+
locator(departure, departure, p(1,1)).distance_from_segment.should be_zero
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should be zero if target is the segment arrival" do
|
83
|
+
arrival = point(0, 0)
|
84
|
+
locator(arrival, p(1,1), arrival).distance_from_segment.should be_zero
|
85
|
+
end
|
86
|
+
|
87
|
+
end
|
88
|
+
|
89
|
+
context "examples" do
|
90
|
+
|
91
|
+
it "should find right angle between 3 points" do
|
92
|
+
origin = tour_eiffel = point(2.2946, 48.8580)
|
93
|
+
locator(origin.endpoint(45, 100), origin, origin.endpoint(90, 100)).angle.rad2deg.should be_within(0.001).of(45)
|
94
|
+
end
|
95
|
+
|
96
|
+
# it "should locate 0,y at 0 between 0,0 and 4,0" do
|
97
|
+
# -10.upto(10) do |y|
|
98
|
+
# locator(p(0,y), p(0,0), p(4,0)).locate_point.should be_zero
|
99
|
+
# end
|
100
|
+
# end
|
101
|
+
|
102
|
+
# it "should locate 2,y at 0.5 between 0,0 and 4,0" do
|
103
|
+
# -10.upto(10) do |y|
|
104
|
+
# locator(p(2,y), p(0,0), p(4,0)).locate_point.should == 0.5
|
105
|
+
# end
|
106
|
+
# end
|
107
|
+
|
108
|
+
# it "should locate 4,y at 1 between 0,0 and 4,0" do
|
109
|
+
# -10.upto(10) do |y|
|
110
|
+
# locator(p(4,y), p(0,0), p(4,0)).locate_point.should == 1
|
111
|
+
# end
|
112
|
+
# end
|
113
|
+
|
114
|
+
# it "should find 2,y at a distance of y from 0,0 and 4,0" do
|
115
|
+
# -10.upto(10) do |y|
|
116
|
+
# locator(p(2,y), p(0,0), p(4,0)).distance_from_segment.should be_within(0.001).of(y.abs)
|
117
|
+
# end
|
118
|
+
# end
|
119
|
+
|
120
|
+
end
|
121
|
+
|
122
|
+
|
123
|
+
end
|