nofxx-georuby 1.7.1 → 1.7.3
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +14 -15
- data/VERSION +1 -1
- data/lib/geo_ruby/gpx4r/gpx.rb +7 -6
- data/lib/geo_ruby/shp4r/dbf.rb +2 -1
- data/lib/geo_ruby/simple_features/line_string.rb +22 -0
- data/lib/geo_ruby/simple_features/point.rb +61 -31
- data/nofxx-georuby.gemspec +24 -19
- data/spec/geo_ruby/gpx4r/gpx_spec.rb +7 -7
- data/spec/geo_ruby/simple_features/georss_parser_spec.rb +6 -6
- data/spec/geo_ruby/simple_features/line_string_spec.rb +37 -0
- data/spec/geo_ruby/simple_features/point_spec.rb +44 -0
- data/spec/spec_helper.rb +52 -3
- metadata +58 -21
- data/spec/spec.opts +0 -6
data/Rakefile
CHANGED
@@ -9,28 +9,27 @@ begin
|
|
9
9
|
gem.description = "GeoRuby provides geometric data types from the OGC 'Simple Features' specification."
|
10
10
|
gem.email = "x@nofxx.com"
|
11
11
|
gem.homepage = "http://github.com/nofxx/georuby"
|
12
|
-
gem.authors = ["Guilhem Vellut", "Marcos
|
13
|
-
|
14
|
-
|
12
|
+
gem.authors = ["Guilhem Vellut", "Marcos Piccinini"]
|
13
|
+
gem.add_development_dependency "rspec", ">= 1.2.9"
|
14
|
+
gem.add_development_dependency "dbf", ">= 1.1.2"
|
15
15
|
end
|
16
16
|
rescue LoadError
|
17
17
|
puts "Jeweler not available. Install it with: sudo gem install technicalpickles-jeweler -s http://gems.github.com"
|
18
18
|
end
|
19
19
|
|
20
|
-
require 'spec/rake/spectask'
|
21
|
-
Spec::Rake::SpecTask.new(:spec) do |spec|
|
22
|
-
|
23
|
-
|
24
|
-
end
|
25
|
-
|
26
|
-
Spec::Rake::SpecTask.new(:rcov) do |spec|
|
27
|
-
spec.libs << 'lib' << 'spec'
|
28
|
-
spec.pattern = 'spec/**/*_spec.rb'
|
29
|
-
spec.rcov = true
|
30
|
-
end
|
20
|
+
# require 'spec/rake/spectask'
|
21
|
+
# Spec::Rake::SpecTask.new(:spec) do |spec|
|
22
|
+
# spec.libs << 'lib' << 'spec'
|
23
|
+
# spec.spec_files = FileList['spec/**/*_spec.rb']
|
24
|
+
# end
|
31
25
|
|
26
|
+
# Spec::Rake::SpecTask.new(:rcov) do |spec|
|
27
|
+
# spec.libs << 'lib' << 'spec'
|
28
|
+
# spec.pattern = 'spec/**/*_spec.rb'
|
29
|
+
# spec.rcov = true
|
30
|
+
# end
|
32
31
|
|
33
|
-
task :default => :spec
|
32
|
+
# task :default => :spec
|
34
33
|
|
35
34
|
require 'rake/rdoctask'
|
36
35
|
Rake::RDocTask.new do |rdoc|
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.7.
|
1
|
+
1.7.3
|
data/lib/geo_ruby/gpx4r/gpx.rb
CHANGED
@@ -31,7 +31,7 @@ module GeoRuby
|
|
31
31
|
gpxfile = GpxFile.new(file, *opts)
|
32
32
|
if block_given?
|
33
33
|
yield gpxfile
|
34
|
-
gpxfile.close
|
34
|
+
# gpxfile.close
|
35
35
|
else
|
36
36
|
gpxfile
|
37
37
|
end
|
@@ -67,7 +67,7 @@ module GeoRuby
|
|
67
67
|
|
68
68
|
# Return the GPX file as LineString
|
69
69
|
def as_line_string
|
70
|
-
LineString.from_points(@points)
|
70
|
+
GeoRuby::SimpleFeatures::LineString.from_points(@points)
|
71
71
|
end
|
72
72
|
alias :as_polyline :as_line_string
|
73
73
|
|
@@ -75,7 +75,7 @@ module GeoRuby
|
|
75
75
|
# If the GPX isn't closed, a line from the first
|
76
76
|
# to the last point will be created to close it.
|
77
77
|
def as_polygon
|
78
|
-
Polygon.from_points([@points[0] == @points[-1] ? @points : @points.push(@points[0].clone)])
|
78
|
+
GeoRuby::SimpleFeatures::Polygon.from_points([@points[0] == @points[-1] ? @points : @points.push(@points[0].clone)])
|
79
79
|
end
|
80
80
|
|
81
81
|
# Return GPX Envelope
|
@@ -94,14 +94,15 @@ module GeoRuby
|
|
94
94
|
# trk(pt) => track /
|
95
95
|
def parse_file(with_z, with_m)
|
96
96
|
data = @gpx.read
|
97
|
-
@file_mode = data =~ /trkpt/ ? "//trkpt" : "//rtept"
|
97
|
+
@file_mode = data =~ /trkpt/ ? "//trkpt" : (data =~ /wpt/ ? "//wpt" : "//rtept")
|
98
98
|
Nokogiri.HTML(data).search(@file_mode).each do |tp|
|
99
|
-
z = z.inner_text.
|
99
|
+
z = z.inner_text.to_f if with_z && z = tp.at("ele")
|
100
100
|
m = m.inner_text if with_m && m = tp.at("time")
|
101
|
-
@points << Point.from_coordinates([tp["lon"].to_f, tp["lat"].to_f, z, m],
|
101
|
+
@points << GeoRuby::SimpleFeatures::Point.from_coordinates([tp["lon"].to_f, tp["lat"].to_f, z, m],4326,with_z, with_m)
|
102
102
|
end
|
103
103
|
close
|
104
104
|
@record_count = @points.length
|
105
|
+
self.envelope
|
105
106
|
rescue => e
|
106
107
|
raise MalformedGpxException.new("Bad GPX. Error: #{e}")
|
107
108
|
# trackpoint.at("gpxdata:hr").nil? # heartrate
|
data/lib/geo_ruby/shp4r/dbf.rb
CHANGED
@@ -166,6 +166,28 @@ module GeoRuby
|
|
166
166
|
pos_list.join(" ")
|
167
167
|
end
|
168
168
|
|
169
|
+
# Simplify linestring (Douglas Peucker Algorithm)
|
170
|
+
# http://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm
|
171
|
+
def simplify(epsilon=1)
|
172
|
+
LineString.from_points(do_simplify(@points, epsilon))
|
173
|
+
end
|
174
|
+
|
175
|
+
def do_simplify(list, epsilon)
|
176
|
+
index = dmax = 0
|
177
|
+
2.upto(list.length - 1) do |i|
|
178
|
+
d = list[i].orthogonal_distance(list[0], list[-1])
|
179
|
+
index, dmax = i, d if d > dmax
|
180
|
+
end
|
181
|
+
|
182
|
+
if dmax >= epsilon
|
183
|
+
res1 = do_simplify(list[0..index], epsilon)
|
184
|
+
res2 = do_simplify(list[index..-1], epsilon)
|
185
|
+
res1[0..-2] + res2[0..-1]
|
186
|
+
else
|
187
|
+
[list[0], list[-1]]
|
188
|
+
end
|
189
|
+
end
|
190
|
+
|
169
191
|
#Creates a new line string. Accept an array of points as argument
|
170
192
|
def self.from_points(points,srid=DEFAULT_SRID,with_z=false,with_m=false)
|
171
193
|
line_string = new(srid,with_z,with_m)
|
@@ -6,6 +6,7 @@ module GeoRuby
|
|
6
6
|
#Represents a point. It is in 3D if the Z coordinate is not +nil+.
|
7
7
|
class Point < Geometry
|
8
8
|
DEG2RAD = 0.0174532925199433
|
9
|
+
HALFPI = 1.5707963267948966
|
9
10
|
attr_accessor :x,:y,:z,:m
|
10
11
|
attr_reader :r, :t # radium and theta
|
11
12
|
|
@@ -46,16 +47,15 @@ module GeoRuby
|
|
46
47
|
Math.sqrt((point.x - x)**2 + (point.y - y)**2)
|
47
48
|
end
|
48
49
|
|
49
|
-
#
|
50
|
-
#
|
51
|
-
#
|
50
|
+
# Spherical distance in meters, using 'Haversine' formula.
|
51
|
+
# with a radius of 6471000m
|
52
|
+
# Assumes x is the lon and y the lat, in degrees (Changed in version 1.1).
|
53
|
+
# The user has to make sure using this distance makes sense (ie she should be in latlon coordinates)
|
52
54
|
def spherical_distance(point,r=6370997.0)
|
53
|
-
radlat_from = lat * DEG2RAD
|
54
|
-
radlat_to = point.lat * DEG2RAD
|
55
55
|
dlat = (point.lat - lat) * DEG2RAD / 2
|
56
56
|
dlon = (point.lon - lon) * DEG2RAD / 2
|
57
57
|
|
58
|
-
a = Math.sin(dlat)**2 + Math.cos(
|
58
|
+
a = Math.sin(dlat)**2 + Math.cos(lat * DEG2RAD) * Math.cos(point.lat * DEG2RAD) * Math.sin(dlon)**2
|
59
59
|
c = 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1-a))
|
60
60
|
r * c
|
61
61
|
end
|
@@ -108,6 +108,29 @@ module GeoRuby
|
|
108
108
|
b*a_bis*(sigma-deltaSigma)
|
109
109
|
end
|
110
110
|
|
111
|
+
# Orthogonal Distance
|
112
|
+
# Based http://www.allegro.cc/forums/thread/589720
|
113
|
+
def orthogonal_distance(line, tail = nil)
|
114
|
+
head, tail = tail ? [line, tail] : [line[0], line[-1]]
|
115
|
+
a, b = @x - head.x, @y - head.y
|
116
|
+
c, d = tail.x - head.x, tail.y - head.y
|
117
|
+
|
118
|
+
dot = a * c + b * d
|
119
|
+
len = c * c + d * d
|
120
|
+
res = dot / len
|
121
|
+
|
122
|
+
xx, yy = if res < 0
|
123
|
+
[head.x, head.y]
|
124
|
+
elsif res > 1
|
125
|
+
[tail.x, tail.y]
|
126
|
+
else
|
127
|
+
[head.x + res * c, head.y + res * d]
|
128
|
+
end
|
129
|
+
# todo benchmark if worth creating an instance
|
130
|
+
# euclidian_distance(Point.from_x_y(xx, yy))
|
131
|
+
Math.sqrt((@x - xx) ** 2 + (@y - yy) ** 2)
|
132
|
+
end
|
133
|
+
|
111
134
|
#Bearing from a point to another, in degrees.
|
112
135
|
def bearing_to(other)
|
113
136
|
return 0 if self == other
|
@@ -146,21 +169,19 @@ module GeoRuby
|
|
146
169
|
end
|
147
170
|
|
148
171
|
#tests the equality of the position of points + m
|
149
|
-
def ==(
|
150
|
-
|
151
|
-
|
152
|
-
else
|
153
|
-
@x == other_point.x and @y == other_point.y and @z == other_point.z and @m == other_point.m
|
154
|
-
end
|
172
|
+
def ==(other)
|
173
|
+
return false unless other.kind_of?(Point)
|
174
|
+
@x == other.x and @y == other.y and @z == other.z and @m == other.m
|
155
175
|
end
|
156
176
|
|
157
177
|
#binary representation of a point. It lacks some headers to be a valid EWKB representation.
|
158
178
|
def binary_representation(allow_z=true,allow_m=true) #:nodoc:
|
159
|
-
bin_rep = [@x,@y].pack("EE")
|
160
|
-
bin_rep += [@z].pack("E") if @with_z and allow_z #Default value so no crash
|
161
|
-
bin_rep += [@m].pack("E") if @with_m and allow_m #idem
|
179
|
+
bin_rep = [@x.to_f,@y.to_f].pack("EE")
|
180
|
+
bin_rep += [@z.to_f].pack("E") if @with_z and allow_z #Default value so no crash
|
181
|
+
bin_rep += [@m.to_f].pack("E") if @with_m and allow_m #idem
|
162
182
|
bin_rep
|
163
183
|
end
|
184
|
+
|
164
185
|
#WKB geometry type of a point
|
165
186
|
def binary_geometry_type#:nodoc:
|
166
187
|
1
|
@@ -173,6 +194,7 @@ module GeoRuby
|
|
173
194
|
tex_rep += " #{@m}" if @with_m and allow_m
|
174
195
|
tex_rep
|
175
196
|
end
|
197
|
+
|
176
198
|
#WKT geometry type of a point
|
177
199
|
def text_geometry_type #:nodoc:
|
178
200
|
"POINT"
|
@@ -184,11 +206,13 @@ module GeoRuby
|
|
184
206
|
geom_attr = options[:geom_attr]
|
185
207
|
"<#{georss_ns}:point#{geom_attr}>#{y} #{x}</#{georss_ns}:point>\n"
|
186
208
|
end
|
209
|
+
|
187
210
|
#georss w3c representation
|
188
211
|
def georss_w3cgeo_representation(options) #:nodoc:
|
189
212
|
w3cgeo_ns = options[:w3cgeo_ns] || "geo"
|
190
213
|
"<#{w3cgeo_ns}:lat>#{y}</#{w3cgeo_ns}:lat>\n<#{w3cgeo_ns}:long>#{x}</#{w3cgeo_ns}:long>\n"
|
191
214
|
end
|
215
|
+
|
192
216
|
#georss gml representation
|
193
217
|
def georss_gml_representation(options) #:nodoc:
|
194
218
|
georss_ns = options[:georss_ns] || "georss"
|
@@ -235,29 +259,32 @@ module GeoRuby
|
|
235
259
|
val.join(", ")
|
236
260
|
end
|
237
261
|
|
238
|
-
#Polar stuff
|
239
|
-
#
|
240
|
-
#http://
|
262
|
+
# Polar stuff
|
263
|
+
#
|
264
|
+
# http://www.engineeringtoolbox.com/converting-cartesian-polar-coordinates-d_1347.html
|
265
|
+
# http://rcoordinate.rubyforge.org/svn/point.rb
|
241
266
|
# outputs radium
|
242
|
-
def r;
|
267
|
+
def r; Math.sqrt(@x**2 + @y**2); end
|
243
268
|
|
244
|
-
#outputs theta
|
269
|
+
# outputs theta
|
245
270
|
def theta_rad
|
246
271
|
if @x.zero?
|
247
|
-
@y < 0 ? 3 *
|
272
|
+
@y < 0 ? 3 * HALFPI : HALFPI
|
248
273
|
else
|
249
274
|
th = Math.atan(@y/@x)
|
250
275
|
th += 2 * Math::PI if r > 0
|
251
276
|
end
|
252
277
|
end
|
253
278
|
|
254
|
-
|
255
|
-
theta_rad / DEG2RAD
|
256
|
-
|
279
|
+
# outputs theta in degrees
|
280
|
+
def theta_deg; theta_rad / DEG2RAD; end
|
281
|
+
|
282
|
+
# outputs an array containing polar distance and theta
|
283
|
+
def as_polar; [r,t]; end
|
257
284
|
|
258
|
-
#
|
259
|
-
def
|
260
|
-
|
285
|
+
# invert signal of all coordinates
|
286
|
+
def -@
|
287
|
+
set_x_y_z(-@x, -@y, -@z)
|
261
288
|
end
|
262
289
|
|
263
290
|
#creates a point from an array of coordinates
|
@@ -323,11 +350,14 @@ module GeoRuby
|
|
323
350
|
|
324
351
|
#aliasing the constructors in case you want to use lat/lon instead of y/x
|
325
352
|
class << self
|
326
|
-
alias :
|
327
|
-
alias :
|
328
|
-
alias :
|
353
|
+
alias :xy :from_x_y
|
354
|
+
alias :xyz :from_x_y_z
|
355
|
+
alias :from_lon_lat_z :from_x_y_z
|
356
|
+
alias :from_lon_lat :from_x_y
|
357
|
+
alias :from_lon_lat_z :from_x_y_z
|
358
|
+
alias :from_lon_lat_m :from_x_y_m
|
329
359
|
alias :from_lon_lat_z_m :from_x_y_z_m
|
330
|
-
alias :from_rad_tet
|
360
|
+
alias :from_rad_tet :from_r_t
|
331
361
|
end
|
332
362
|
end
|
333
363
|
end
|
data/nofxx-georuby.gemspec
CHANGED
@@ -5,11 +5,11 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{nofxx-georuby}
|
8
|
-
s.version = "1.7.
|
8
|
+
s.version = "1.7.3"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = ["Guilhem Vellut", "Marcos
|
12
|
-
s.date = %q{2010-
|
11
|
+
s.authors = ["Guilhem Vellut", "Marcos Piccinini"]
|
12
|
+
s.date = %q{2010-09-20}
|
13
13
|
s.description = %q{GeoRuby provides geometric data types from the OGC 'Simple Features' specification.}
|
14
14
|
s.email = %q{x@nofxx.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -85,43 +85,48 @@ Gem::Specification.new do |s|
|
|
85
85
|
"spec/geo_ruby/simple_features/point_spec.rb",
|
86
86
|
"spec/geo_ruby/simple_features/polygon_spec.rb",
|
87
87
|
"spec/geo_ruby_spec.rb",
|
88
|
-
"spec/spec.opts",
|
89
88
|
"spec/spec_helper.rb"
|
90
89
|
]
|
91
90
|
s.homepage = %q{http://github.com/nofxx/georuby}
|
92
91
|
s.rdoc_options = ["--charset=UTF-8"]
|
93
92
|
s.require_paths = ["lib"]
|
94
|
-
s.rubygems_version = %q{1.3.
|
93
|
+
s.rubygems_version = %q{1.3.7}
|
95
94
|
s.summary = %q{Ruby data holder for OGC Simple Features}
|
96
95
|
s.test_files = [
|
97
|
-
"spec/
|
96
|
+
"spec/geo_ruby_spec.rb",
|
97
|
+
"spec/spec_helper.rb",
|
98
|
+
"spec/geo_ruby/gpx4r/gpx_spec.rb",
|
98
99
|
"spec/geo_ruby/shp4r/shp_spec.rb",
|
99
|
-
"spec/geo_ruby/simple_features/
|
100
|
-
"spec/geo_ruby/simple_features/ewkb_parser_spec.rb",
|
101
|
-
"spec/geo_ruby/simple_features/ewkt_parser_spec.rb",
|
102
|
-
"spec/geo_ruby/simple_features/geometry_collection_spec.rb",
|
100
|
+
"spec/geo_ruby/simple_features/point_spec.rb",
|
103
101
|
"spec/geo_ruby/simple_features/geometry_factory_spec.rb",
|
104
|
-
"spec/geo_ruby/simple_features/
|
105
|
-
"spec/geo_ruby/simple_features/
|
102
|
+
"spec/geo_ruby/simple_features/envelope_spec.rb",
|
103
|
+
"spec/geo_ruby/simple_features/polygon_spec.rb",
|
106
104
|
"spec/geo_ruby/simple_features/line_string_spec.rb",
|
107
|
-
"spec/geo_ruby/simple_features/linear_ring_spec.rb",
|
108
105
|
"spec/geo_ruby/simple_features/multi_line_string_spec.rb",
|
109
|
-
"spec/geo_ruby/simple_features/
|
106
|
+
"spec/geo_ruby/simple_features/ewkt_parser_spec.rb",
|
107
|
+
"spec/geo_ruby/simple_features/ewkb_parser_spec.rb",
|
108
|
+
"spec/geo_ruby/simple_features/linear_ring_spec.rb",
|
109
|
+
"spec/geo_ruby/simple_features/geometry_collection_spec.rb",
|
110
110
|
"spec/geo_ruby/simple_features/multi_polygon_spec.rb",
|
111
|
-
"spec/geo_ruby/simple_features/
|
112
|
-
"spec/geo_ruby/simple_features/
|
113
|
-
"spec/
|
114
|
-
"spec/spec_helper.rb"
|
111
|
+
"spec/geo_ruby/simple_features/multi_point_spec.rb",
|
112
|
+
"spec/geo_ruby/simple_features/georss_parser_spec.rb",
|
113
|
+
"spec/geo_ruby/simple_features/geometry_spec.rb"
|
115
114
|
]
|
116
115
|
|
117
116
|
if s.respond_to? :specification_version then
|
118
117
|
current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
|
119
118
|
s.specification_version = 3
|
120
119
|
|
121
|
-
if Gem::Version.new(Gem::
|
120
|
+
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
121
|
+
s.add_development_dependency(%q<rspec>, [">= 1.2.9"])
|
122
|
+
s.add_development_dependency(%q<dbf>, [">= 1.1.2"])
|
122
123
|
else
|
124
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
125
|
+
s.add_dependency(%q<dbf>, [">= 1.1.2"])
|
123
126
|
end
|
124
127
|
else
|
128
|
+
s.add_dependency(%q<rspec>, [">= 1.2.9"])
|
129
|
+
s.add_dependency(%q<dbf>, [">= 1.1.2"])
|
125
130
|
end
|
126
131
|
end
|
127
132
|
|
@@ -25,7 +25,7 @@ describe Gpx4r do
|
|
25
25
|
end
|
26
26
|
|
27
27
|
it "should open and parse no trkpt one" do
|
28
|
-
@gpxfile2.record_count.should eql(
|
28
|
+
@gpxfile2.record_count.should eql(86)
|
29
29
|
end
|
30
30
|
|
31
31
|
it "should open and parse 3" do
|
@@ -38,18 +38,18 @@ describe Gpx4r do
|
|
38
38
|
end
|
39
39
|
|
40
40
|
it "should read Z and M" do
|
41
|
-
@gpxfile[0].z.should eql(468)
|
41
|
+
@gpxfile[0].z.should eql(468.0)
|
42
42
|
@gpxfile[0].m.should eql("2008-09-07T17:36:57Z")
|
43
43
|
end
|
44
44
|
|
45
45
|
it "should read X and Y 2" do
|
46
|
-
@gpxfile2[0].x.should be_close(-71.
|
47
|
-
@gpxfile2[0].y.should be_close(42.
|
46
|
+
@gpxfile2[0].x.should be_close(-71.119277, 0.0001)
|
47
|
+
@gpxfile2[0].y.should be_close(42.438878, 0.0001)
|
48
48
|
end
|
49
49
|
|
50
50
|
it "should read Z and M 2" do
|
51
|
-
@gpxfile2[0].z.should eql(
|
52
|
-
@gpxfile2[0].m.should eql("2001-
|
51
|
+
@gpxfile2[0].z.should eql(44.586548)
|
52
|
+
@gpxfile2[0].m.should eql("2001-11-28T21:05:28Z")
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should read X and Y 3" do
|
@@ -58,7 +58,7 @@ describe Gpx4r do
|
|
58
58
|
end
|
59
59
|
|
60
60
|
it "should read Z and M 3" do
|
61
|
-
@gpxfile3[0].z.should eql(88)
|
61
|
+
@gpxfile3[0].z.should eql(88.5787354)
|
62
62
|
@gpxfile3[0].m.should eql(0.0)
|
63
63
|
end
|
64
64
|
|
@@ -45,18 +45,18 @@ describe GeorssParser do
|
|
45
45
|
end
|
46
46
|
|
47
47
|
it "test_envelope" do
|
48
|
-
linear_ring1 = LinearRing.from_coordinates([[12
|
49
|
-
linear_ring2 = LinearRing.from_coordinates([[2
|
48
|
+
linear_ring1 = LinearRing.from_coordinates([[12,-45,5],[45,41,6],[4,1,8],[12.4,-45,3]],256,true)
|
49
|
+
linear_ring2 = LinearRing.from_coordinates([[2,5,9],[5.4,1,-5.4],[14,1,34],[2,5,3]],256,true)
|
50
50
|
polygon = Polygon.from_linear_rings([linear_ring1,linear_ring2],256,true)
|
51
51
|
|
52
52
|
e = polygon.envelope
|
53
53
|
|
54
|
-
e.as_georss(:dialect => :simple).gsub("\n","").should eql("<georss:box>-45
|
54
|
+
e.as_georss(:dialect => :simple).gsub("\n","").should eql("<georss:box>-45 4 41 45</georss:box>")
|
55
55
|
#center
|
56
|
-
e.as_georss(:dialect => :w3cgeo).gsub("\n","").should eql("<geo:lat>-
|
57
|
-
e.as_georss(:dialect => :gml).gsub("\n","").should eql("<georss:where><gml:Envelope><gml:LowerCorner>-45
|
56
|
+
e.as_georss(:dialect => :w3cgeo).gsub("\n","").should eql("<geo:lat>-2</geo:lat><geo:long>24</geo:long>")
|
57
|
+
e.as_georss(:dialect => :gml).gsub("\n","").should eql("<georss:where><gml:Envelope><gml:LowerCorner>-45 4</gml:LowerCorner><gml:UpperCorner>41 45</gml:UpperCorner></gml:Envelope></georss:where>")
|
58
58
|
|
59
|
-
e.as_kml.gsub("\n","").should eql("<LatLonAltBox><north>41
|
59
|
+
e.as_kml.gsub("\n","").should eql("<LatLonAltBox><north>41</north><south>-45</south><east>45</east><west>4</west><minAltitude>-5.4</minAltitude><maxAltitude>34</maxAltitude></LatLonAltBox>")
|
60
60
|
end
|
61
61
|
|
62
62
|
it "test_point_georss_read" do
|
@@ -205,4 +205,41 @@ describe LineString do
|
|
205
205
|
@line.euclidian_distance.should eql(20)
|
206
206
|
end
|
207
207
|
end
|
208
|
+
|
209
|
+
describe "Simplify" do
|
210
|
+
|
211
|
+
before do
|
212
|
+
@line = LineString.from_coordinates([[6,0],[4,1],[3,4],[4,6],[5,8],[5,9],[4,10],[6,15]], 4326)
|
213
|
+
end
|
214
|
+
|
215
|
+
it "should simplify a simple linestring" do
|
216
|
+
line = LineString.from_coordinates([[12,15],[14,17],[17, 20]], 4326)
|
217
|
+
line.simplify.should have(2).points
|
218
|
+
end
|
219
|
+
|
220
|
+
it "should simplify a harder linestring" do
|
221
|
+
@line.simplify(6).should have(6).points
|
222
|
+
@line.simplify(9).should have(4).points
|
223
|
+
@line.simplify(10).should have(3).points
|
224
|
+
end
|
225
|
+
|
226
|
+
it "should barely touch it" do
|
227
|
+
@line.simplify(1).should have(7).points
|
228
|
+
end
|
229
|
+
|
230
|
+
it "should simplify to five points" do
|
231
|
+
@line.simplify(7).should have(5).points
|
232
|
+
end
|
233
|
+
|
234
|
+
it "should flatten it" do
|
235
|
+
@line.simplify(11).should have(2).points
|
236
|
+
end
|
237
|
+
|
238
|
+
it "should be the first and last in a flatten" do
|
239
|
+
line = @line.simplify(11)
|
240
|
+
line[0].should be_a_point(6, 0)
|
241
|
+
line[1].should be_a_point(6, 15)
|
242
|
+
end
|
243
|
+
|
244
|
+
end
|
208
245
|
end
|
@@ -11,6 +11,22 @@ describe Point do
|
|
11
11
|
@point.should be_instance_of(Point)
|
12
12
|
end
|
13
13
|
|
14
|
+
it "should have a nice matcher" do
|
15
|
+
@point.should be_a_point
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should have a very nice matcher" do
|
19
|
+
@point.should be_a_point(0.0, 0.0)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should have a very nice matcher" do
|
23
|
+
Point.from_x_y_z_m(1,2,3.33,"t").should be_a_point(1, 2, 3.33, "t")
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should have a dumb matcher" do
|
27
|
+
Point.should be_geometric
|
28
|
+
end
|
29
|
+
|
14
30
|
it "should be subclassable" do
|
15
31
|
place = Class.new(Point)
|
16
32
|
p = place.from_x_y(1,2)
|
@@ -207,6 +223,34 @@ describe Point do
|
|
207
223
|
should be_close(156876.149400742, 0.00000001)
|
208
224
|
end
|
209
225
|
|
226
|
+
describe "Orthogonal Distance" do
|
227
|
+
before do
|
228
|
+
@line = LineString.from_coordinates([[0,0],[1,3]], 4326)
|
229
|
+
@line2 = LineString.from_coordinates([[1,1],[1,2]], 4326)
|
230
|
+
end
|
231
|
+
|
232
|
+
it "should calcula orthogonal distance from a line (90 deg)" do
|
233
|
+
@p1.orthogonal_distance(@line).should be_close(1.414, 0.001)
|
234
|
+
end
|
235
|
+
|
236
|
+
it "should calcula orthogonal distance very close..." do
|
237
|
+
@p1.orthogonal_distance(@line2).should be_zero
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should calcula orthogonal distance from a line (90 deg)" do
|
241
|
+
@p2.orthogonal_distance(@line).should be_close(2.828, 0.001)
|
242
|
+
end
|
243
|
+
|
244
|
+
it "should calcula orthogonal distance from a line (0 deg)" do
|
245
|
+
@p2.orthogonal_distance(@line2).should be_close(1.0, 0.1)
|
246
|
+
end
|
247
|
+
|
248
|
+
it "should calcula orthogonal distance from a line (0 deg)" do
|
249
|
+
@p2.orthogonal_distance(@line2).should be_close(1.0, 0.1)
|
250
|
+
end
|
251
|
+
|
252
|
+
end
|
253
|
+
|
210
254
|
it "should calculate the bearing from apoint to another in degrees" do
|
211
255
|
@p1.bearing_to(@p2).should be_close(45.0, 0.01)
|
212
256
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,9 +1,8 @@
|
|
1
1
|
begin
|
2
|
-
require 'spec'
|
3
|
-
rescue LoadError
|
4
2
|
require 'rubygems'
|
5
|
-
gem 'rspec'
|
6
3
|
require 'spec'
|
4
|
+
rescue LoadError
|
5
|
+
require 'rspec'
|
7
6
|
end
|
8
7
|
|
9
8
|
$:.unshift(File.dirname(__FILE__) + '/../lib')
|
@@ -13,3 +12,53 @@ require 'geo_ruby/gpx'
|
|
13
12
|
|
14
13
|
include GeoRuby
|
15
14
|
include SimpleFeatures
|
15
|
+
|
16
|
+
module GeorubyMatchers
|
17
|
+
|
18
|
+
class BeGeometric
|
19
|
+
|
20
|
+
def matches?(actual)
|
21
|
+
actual.ancestors.include?(actual) || actual.kind_of?("Geometry")
|
22
|
+
end
|
23
|
+
|
24
|
+
def failure_message; "expected #{@actual.inspect} to be some geom"; end
|
25
|
+
end
|
26
|
+
|
27
|
+
class BeAPoint
|
28
|
+
include RSpec::Matchers
|
29
|
+
|
30
|
+
def initialize(expect=nil)
|
31
|
+
@expect = expect
|
32
|
+
end
|
33
|
+
|
34
|
+
def matches?(actual)
|
35
|
+
if @expect
|
36
|
+
[:x, :y, :z, :m].each_with_index do |c, i|
|
37
|
+
next unless val = @expect[i]
|
38
|
+
if val.kind_of? Numeric
|
39
|
+
actual.send(c).should be_close(val, 0.1)
|
40
|
+
else
|
41
|
+
actual.send(c).should eql(val)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
actual.should be_instance_of(Point)
|
46
|
+
end
|
47
|
+
|
48
|
+
def failure_message; "expected #{@expect} but received #{@actual.inspect}"; end
|
49
|
+
def negative_failure_message; "expected something else then '#{@expect}' but got '#{@actual}'"; end
|
50
|
+
end
|
51
|
+
|
52
|
+
def be_a_point(*args)
|
53
|
+
args.empty? ? BeAPoint.new : BeAPoint.new(args)
|
54
|
+
end
|
55
|
+
|
56
|
+
def be_geometric
|
57
|
+
BeGeometric.new
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
RSpec.configure do |config|
|
62
|
+
config.include GeorubyMatchers
|
63
|
+
end
|
64
|
+
|
metadata
CHANGED
@@ -1,19 +1,53 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: nofxx-georuby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
4
|
+
prerelease: false
|
5
|
+
segments:
|
6
|
+
- 1
|
7
|
+
- 7
|
8
|
+
- 3
|
9
|
+
version: 1.7.3
|
5
10
|
platform: ruby
|
6
11
|
authors:
|
7
12
|
- Guilhem Vellut
|
8
|
-
- Marcos
|
13
|
+
- Marcos Piccinini
|
9
14
|
autorequire:
|
10
15
|
bindir: bin
|
11
16
|
cert_chain: []
|
12
17
|
|
13
|
-
date: 2010-
|
18
|
+
date: 2010-09-20 00:00:00 -03:00
|
14
19
|
default_executable:
|
15
|
-
dependencies:
|
16
|
-
|
20
|
+
dependencies:
|
21
|
+
- !ruby/object:Gem::Dependency
|
22
|
+
name: rspec
|
23
|
+
prerelease: false
|
24
|
+
requirement: &id001 !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ">="
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
segments:
|
30
|
+
- 1
|
31
|
+
- 2
|
32
|
+
- 9
|
33
|
+
version: 1.2.9
|
34
|
+
type: :development
|
35
|
+
version_requirements: *id001
|
36
|
+
- !ruby/object:Gem::Dependency
|
37
|
+
name: dbf
|
38
|
+
prerelease: false
|
39
|
+
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
+
none: false
|
41
|
+
requirements:
|
42
|
+
- - ">="
|
43
|
+
- !ruby/object:Gem::Version
|
44
|
+
segments:
|
45
|
+
- 1
|
46
|
+
- 1
|
47
|
+
- 2
|
48
|
+
version: 1.1.2
|
49
|
+
type: :development
|
50
|
+
version_requirements: *id002
|
17
51
|
description: GeoRuby provides geometric data types from the OGC 'Simple Features' specification.
|
18
52
|
email: x@nofxx.com
|
19
53
|
executables: []
|
@@ -92,7 +126,6 @@ files:
|
|
92
126
|
- spec/geo_ruby/simple_features/point_spec.rb
|
93
127
|
- spec/geo_ruby/simple_features/polygon_spec.rb
|
94
128
|
- spec/geo_ruby_spec.rb
|
95
|
-
- spec/spec.opts
|
96
129
|
- spec/spec_helper.rb
|
97
130
|
has_rdoc: true
|
98
131
|
homepage: http://github.com/nofxx/georuby
|
@@ -104,40 +137,44 @@ rdoc_options:
|
|
104
137
|
require_paths:
|
105
138
|
- lib
|
106
139
|
required_ruby_version: !ruby/object:Gem::Requirement
|
140
|
+
none: false
|
107
141
|
requirements:
|
108
142
|
- - ">="
|
109
143
|
- !ruby/object:Gem::Version
|
144
|
+
segments:
|
145
|
+
- 0
|
110
146
|
version: "0"
|
111
|
-
version:
|
112
147
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
148
|
+
none: false
|
113
149
|
requirements:
|
114
150
|
- - ">="
|
115
151
|
- !ruby/object:Gem::Version
|
152
|
+
segments:
|
153
|
+
- 0
|
116
154
|
version: "0"
|
117
|
-
version:
|
118
155
|
requirements: []
|
119
156
|
|
120
157
|
rubyforge_project:
|
121
|
-
rubygems_version: 1.3.
|
158
|
+
rubygems_version: 1.3.7
|
122
159
|
signing_key:
|
123
160
|
specification_version: 3
|
124
161
|
summary: Ruby data holder for OGC Simple Features
|
125
162
|
test_files:
|
163
|
+
- spec/geo_ruby_spec.rb
|
164
|
+
- spec/spec_helper.rb
|
126
165
|
- spec/geo_ruby/gpx4r/gpx_spec.rb
|
127
166
|
- spec/geo_ruby/shp4r/shp_spec.rb
|
128
|
-
- spec/geo_ruby/simple_features/
|
129
|
-
- spec/geo_ruby/simple_features/ewkb_parser_spec.rb
|
130
|
-
- spec/geo_ruby/simple_features/ewkt_parser_spec.rb
|
131
|
-
- spec/geo_ruby/simple_features/geometry_collection_spec.rb
|
167
|
+
- spec/geo_ruby/simple_features/point_spec.rb
|
132
168
|
- spec/geo_ruby/simple_features/geometry_factory_spec.rb
|
133
|
-
- spec/geo_ruby/simple_features/
|
134
|
-
- spec/geo_ruby/simple_features/
|
169
|
+
- spec/geo_ruby/simple_features/envelope_spec.rb
|
170
|
+
- spec/geo_ruby/simple_features/polygon_spec.rb
|
135
171
|
- spec/geo_ruby/simple_features/line_string_spec.rb
|
136
|
-
- spec/geo_ruby/simple_features/linear_ring_spec.rb
|
137
172
|
- spec/geo_ruby/simple_features/multi_line_string_spec.rb
|
138
|
-
- spec/geo_ruby/simple_features/
|
173
|
+
- spec/geo_ruby/simple_features/ewkt_parser_spec.rb
|
174
|
+
- spec/geo_ruby/simple_features/ewkb_parser_spec.rb
|
175
|
+
- spec/geo_ruby/simple_features/linear_ring_spec.rb
|
176
|
+
- spec/geo_ruby/simple_features/geometry_collection_spec.rb
|
139
177
|
- spec/geo_ruby/simple_features/multi_polygon_spec.rb
|
140
|
-
- spec/geo_ruby/simple_features/
|
141
|
-
- spec/geo_ruby/simple_features/
|
142
|
-
- spec/
|
143
|
-
- spec/spec_helper.rb
|
178
|
+
- spec/geo_ruby/simple_features/multi_point_spec.rb
|
179
|
+
- spec/geo_ruby/simple_features/georss_parser_spec.rb
|
180
|
+
- spec/geo_ruby/simple_features/geometry_spec.rb
|