ffi-geos 0.0.4 → 0.0.5
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +18 -0
- data/Gemfile +3 -0
- data/MIT-LICENSE +1 -1
- data/Rakefile +3 -17
- data/ffi-geos.gemspec +16 -63
- data/lib/ffi-geos.rb +1 -1
- data/lib/ffi-geos/buffer_params.rb +65 -53
- data/lib/ffi-geos/coordinate_sequence.rb +70 -11
- data/lib/ffi-geos/geometry.rb +43 -27
- data/lib/ffi-geos/version.rb +5 -0
- data/test/coordinate_sequence_tests.rb +75 -0
- data/test/test_helper.rb +1 -1
- data/test/utils_tests.rb +3 -3
- data/test/wkt_reader_tests.rb +1 -1
- metadata +58 -7
- data/VERSION +0 -1
data/.gitignore
ADDED
data/Gemfile
ADDED
data/MIT-LICENSE
CHANGED
data/Rakefile
CHANGED
@@ -8,6 +8,7 @@ gem 'rdoc', '~> 3.12'
|
|
8
8
|
require 'rubygems/package_task'
|
9
9
|
require 'rake/testtask'
|
10
10
|
require 'rdoc/task'
|
11
|
+
require 'bundler/gem_tasks'
|
11
12
|
|
12
13
|
if RUBY_VERSION >= '1.9'
|
13
14
|
begin
|
@@ -19,28 +20,13 @@ end
|
|
19
20
|
|
20
21
|
$:.push 'lib'
|
21
22
|
|
22
|
-
version =
|
23
|
-
|
24
|
-
begin
|
25
|
-
require 'jeweler'
|
26
|
-
Jeweler::Tasks.new do |gem|
|
27
|
-
gem.name = "ffi-geos"
|
28
|
-
gem.summary = "An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS)."
|
29
|
-
gem.description = gem.summary
|
30
|
-
gem.email = "dark.panda@gmail.com"
|
31
|
-
gem.homepage = "http://github.com/dark-panda/ffi-geos"
|
32
|
-
gem.authors = [ "J Smith" ]
|
33
|
-
gem.add_dependency "ffi", "~> 1.0.0"
|
34
|
-
end
|
35
|
-
Jeweler::GemcutterTasks.new
|
36
|
-
rescue LoadError
|
37
|
-
puts "Jeweler (or a dependency) not available. Install it with: sudo gem install jeweler"
|
38
|
-
end
|
23
|
+
version = Geos::VERSION
|
39
24
|
|
40
25
|
desc 'Test GEOS interface'
|
41
26
|
Rake::TestTask.new(:test) do |t|
|
42
27
|
t.test_files = FileList['test/**/*_tests.rb']
|
43
28
|
t.verbose = !!ENV['VERBOSE_TESTS']
|
29
|
+
t.warning = !!ENV['WARNINGS']
|
44
30
|
end
|
45
31
|
|
46
32
|
desc 'Build docs'
|
data/ffi-geos.gemspec
CHANGED
@@ -1,74 +1,27 @@
|
|
1
|
-
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run 'rake gemspec'
|
4
1
|
# -*- encoding: utf-8 -*-
|
5
2
|
|
3
|
+
require File.expand_path('../lib/ffi-geos/version', __FILE__)
|
4
|
+
|
6
5
|
Gem::Specification.new do |s|
|
7
|
-
s.name =
|
8
|
-
s.version =
|
6
|
+
s.name = "ffi-geos"
|
7
|
+
s.version = Geos::VERSION
|
9
8
|
|
10
9
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
|
-
s.authors = [
|
12
|
-
s.
|
13
|
-
s.
|
14
|
-
s.email =
|
10
|
+
s.authors = ["J Smith"]
|
11
|
+
s.description = "An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS)."
|
12
|
+
s.summary = s.description
|
13
|
+
s.email = "dark.panda@gmail.com"
|
15
14
|
s.extra_rdoc_files = [
|
16
15
|
"README.rdoc"
|
17
16
|
]
|
18
|
-
s.files =
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
"ffi-geos.gemspec",
|
24
|
-
"lib/ffi-geos.rb",
|
25
|
-
"lib/ffi-geos/buffer_params.rb",
|
26
|
-
"lib/ffi-geos/coordinate_sequence.rb",
|
27
|
-
"lib/ffi-geos/geometry.rb",
|
28
|
-
"lib/ffi-geos/geometry_collection.rb",
|
29
|
-
"lib/ffi-geos/line_string.rb",
|
30
|
-
"lib/ffi-geos/linear_ring.rb",
|
31
|
-
"lib/ffi-geos/multi_line_string.rb",
|
32
|
-
"lib/ffi-geos/multi_point.rb",
|
33
|
-
"lib/ffi-geos/multi_polygon.rb",
|
34
|
-
"lib/ffi-geos/point.rb",
|
35
|
-
"lib/ffi-geos/polygon.rb",
|
36
|
-
"lib/ffi-geos/prepared_geometry.rb",
|
37
|
-
"lib/ffi-geos/strtree.rb",
|
38
|
-
"lib/ffi-geos/tools.rb",
|
39
|
-
"lib/ffi-geos/utils.rb",
|
40
|
-
"lib/ffi-geos/wkb_reader.rb",
|
41
|
-
"lib/ffi-geos/wkb_writer.rb",
|
42
|
-
"lib/ffi-geos/wkt_reader.rb",
|
43
|
-
"lib/ffi-geos/wkt_writer.rb",
|
44
|
-
"test/coordinate_sequence_tests.rb",
|
45
|
-
"test/geometry_tests.rb",
|
46
|
-
"test/misc_tests.rb",
|
47
|
-
"test/point_tests.rb",
|
48
|
-
"test/prepared_geometry_tests.rb",
|
49
|
-
"test/strtree_tests.rb",
|
50
|
-
"test/test_helper.rb",
|
51
|
-
"test/utils_tests.rb",
|
52
|
-
"test/wkb_reader_tests.rb",
|
53
|
-
"test/wkb_writer_tests.rb",
|
54
|
-
"test/wkt_reader_tests.rb",
|
55
|
-
"test/wkt_writer_tests.rb"
|
56
|
-
]
|
57
|
-
s.homepage = %q{http://github.com/dark-panda/ffi-geos}
|
58
|
-
s.require_paths = [%q{lib}]
|
59
|
-
s.rubygems_version = %q{1.8.9}
|
60
|
-
s.summary = %q{An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS).}
|
61
|
-
|
62
|
-
if s.respond_to? :specification_version then
|
63
|
-
s.specification_version = 3
|
17
|
+
s.files = `git ls-files`.split($\)
|
18
|
+
s.executables = s.files.grep(%r{^bin/}).map { |f| File.basename(f) }
|
19
|
+
s.test_files = s.files.grep(%r{^(test|spec|features)/})
|
20
|
+
s.homepage = "http://github.com/dark-panda/ffi-geos"
|
21
|
+
s.require_paths = ["lib"]
|
64
22
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
s.add_dependency(%q<ffi>, ["~> 1.0.0"])
|
69
|
-
end
|
70
|
-
else
|
71
|
-
s.add_dependency(%q<ffi>, ["~> 1.0.0"])
|
72
|
-
end
|
23
|
+
s.add_dependency("ffi", ["~> 1.0.0"])
|
24
|
+
s.add_dependency("rdoc")
|
25
|
+
s.add_dependency("rake", ["~> 0.9"])
|
73
26
|
end
|
74
27
|
|
data/lib/ffi-geos.rb
CHANGED
@@ -1,6 +1,7 @@
|
|
1
1
|
|
2
2
|
require 'ffi'
|
3
3
|
require 'rbconfig'
|
4
|
+
require 'ffi-geos/version'
|
4
5
|
|
5
6
|
module Geos
|
6
7
|
GEOS_BASE = File.join(File.dirname(__FILE__), 'ffi-geos')
|
@@ -1030,7 +1031,6 @@ module Geos
|
|
1030
1031
|
end
|
1031
1032
|
|
1032
1033
|
module VersionConstants
|
1033
|
-
VERSION = File.read(File.join(GEOS_BASE, %w{ .. .. VERSION })).strip
|
1034
1034
|
GEOS_JTS_PORT = Geos.jts_port
|
1035
1035
|
GEOS_VERSION,
|
1036
1036
|
GEOS_VERSION_MAJOR, GEOS_VERSION_MINOR, GEOS_VERSION_PATCH, GEOS_VERSION_PRERELEASE,
|
@@ -3,81 +3,93 @@ module Geos
|
|
3
3
|
class BufferParams
|
4
4
|
include Geos::Tools
|
5
5
|
|
6
|
-
attr_reader :ptr, :params
|
7
|
-
|
8
6
|
VALID_PARAMETERS = [
|
9
7
|
:quad_segs, :endcap, :join, :mitre_limit, :single_sided
|
10
8
|
].freeze
|
11
9
|
|
12
10
|
undef :clone, :dup
|
13
11
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
12
|
+
if FFIGeos.respond_to?(:GEOSBufferParams_create_r)
|
13
|
+
attr_reader :ptr, :params
|
14
|
+
|
15
|
+
# The defaults for the params according to GEOS are as found in
|
16
|
+
# Geos::Constants::BUFFER_PARAMS_DEFAULTS. Note that when setting the
|
17
|
+
# :quad_segs value that you should set it before setting other values like
|
18
|
+
# :join and :mitre_limit, as GEOS contains logic concerning how the
|
19
|
+
# :quad_segs value affects these parameters and vice versa. For details,
|
20
|
+
# refer to src/operation/buffer/BufferParameters.cpp and the
|
21
|
+
# BufferParameters::setQuadrantSegments(int) method in the GEOS source
|
22
|
+
# code for details.
|
23
|
+
def initialize(params = {})
|
24
|
+
params = Geos::Constants::BUFFER_PARAM_DEFAULTS.merge(params)
|
25
|
+
|
26
|
+
ptr = FFIGeos.GEOSBufferParams_create_r(Geos.current_handle)
|
27
|
+
@ptr = FFI::AutoPointer.new(
|
28
|
+
ptr,
|
29
|
+
self.class.method(:release)
|
30
|
+
)
|
31
|
+
|
32
|
+
@params = {}
|
33
|
+
VALID_PARAMETERS.each do |param|
|
34
|
+
self.send("#{param}=", params[param])
|
35
|
+
end
|
34
36
|
end
|
35
|
-
end
|
36
37
|
|
37
|
-
|
38
|
-
|
39
|
-
|
38
|
+
def self.release(ptr) #:nodoc:
|
39
|
+
FFIGeos.GEOSBufferParams_destroy_r(Geos.current_handle, ptr)
|
40
|
+
end
|
40
41
|
|
41
|
-
|
42
|
-
|
42
|
+
def endcap=(value)
|
43
|
+
check_enum_value(Geos::BufferCapStyles, value)
|
43
44
|
|
44
|
-
|
45
|
-
|
45
|
+
if bool_result(FFIGeos.GEOSBufferParams_setEndCapStyle_r(Geos.current_handle, ptr, value))
|
46
|
+
@params[:endcap] = symbol_for_enum(Geos::BufferCapStyles, value)
|
47
|
+
end
|
46
48
|
end
|
47
|
-
end
|
48
49
|
|
49
|
-
|
50
|
-
|
50
|
+
def join=(value)
|
51
|
+
check_enum_value(Geos::BufferJoinStyles, value)
|
51
52
|
|
52
|
-
|
53
|
-
|
53
|
+
if bool_result(FFIGeos.GEOSBufferParams_setJoinStyle_r(Geos.current_handle, ptr, value))
|
54
|
+
@params[:join] = symbol_for_enum(Geos::BufferJoinStyles, value)
|
55
|
+
end
|
54
56
|
end
|
55
|
-
end
|
56
57
|
|
57
|
-
|
58
|
-
|
59
|
-
|
58
|
+
def mitre_limit=(value)
|
59
|
+
if bool_result(FFIGeos.GEOSBufferParams_setMitreLimit_r(Geos.current_handle, ptr, value))
|
60
|
+
@params[:mitre_limit] = value
|
61
|
+
end
|
60
62
|
end
|
61
|
-
end
|
62
63
|
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
def quad_segs=(value)
|
65
|
+
if bool_result(FFIGeos.GEOSBufferParams_setQuadrantSegments_r(Geos.current_handle, ptr, value))
|
66
|
+
@params[:quad_segs] = value
|
67
|
+
end
|
66
68
|
end
|
67
|
-
end
|
68
69
|
|
69
|
-
|
70
|
-
|
71
|
-
|
70
|
+
def single_sided=(value)
|
71
|
+
if bool_result(FFIGeos.GEOSBufferParams_setSingleSided_r(Geos.current_handle, ptr, value ? 1 : 0))
|
72
|
+
@params[:single_sided] = value
|
73
|
+
end
|
72
74
|
end
|
73
|
-
end
|
74
75
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
VALID_PARAMETERS.each do |param|
|
77
|
+
self.class_eval(<<-EOF, __FILE__, __LINE__ + 1)
|
78
|
+
def #{param}
|
79
|
+
@params[:#{param}]
|
80
|
+
end
|
81
|
+
EOF
|
82
|
+
end
|
83
|
+
else
|
84
|
+
attr_accessor(*VALID_PARAMETERS)
|
85
|
+
|
86
|
+
def initialize(params = {})
|
87
|
+
params = Geos::Constants::BUFFER_PARAM_DEFAULTS.merge(params)
|
88
|
+
|
89
|
+
VALID_PARAMETERS.each do |param|
|
90
|
+
self.send("#{param}=", params[param])
|
79
91
|
end
|
80
|
-
|
92
|
+
end
|
81
93
|
end
|
82
94
|
end
|
83
95
|
end
|
@@ -6,13 +6,46 @@ module Geos
|
|
6
6
|
class ParseError < ArgumentError
|
7
7
|
end
|
8
8
|
|
9
|
+
class CoordinateAccessor
|
10
|
+
attr_accessor :parent, :dimension
|
11
|
+
|
12
|
+
include Enumerable
|
13
|
+
|
14
|
+
def initialize(parent, dimension)
|
15
|
+
@parent = parent
|
16
|
+
@dimension = dimension
|
17
|
+
end
|
18
|
+
|
19
|
+
def [](idx)
|
20
|
+
parent.get_ordinate(idx, self.dimension)
|
21
|
+
end
|
22
|
+
|
23
|
+
def []=(idx, value)
|
24
|
+
parent.set_ordinate(idx, self.dimension, value)
|
25
|
+
end
|
26
|
+
|
27
|
+
def each
|
28
|
+
if block_given?
|
29
|
+
parent.length.times do |n|
|
30
|
+
yield parent.get_ordinate(n, self.dimension)
|
31
|
+
end
|
32
|
+
self
|
33
|
+
else
|
34
|
+
parent.length.times.collect { |n|
|
35
|
+
parent.get_ordinate(n, self.dimension)
|
36
|
+
}.to_enum
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
9
41
|
include Enumerable
|
10
42
|
|
11
|
-
attr_reader :ptr
|
43
|
+
attr_reader :ptr, :x, :y, :z
|
12
44
|
|
13
45
|
# :call-seq:
|
14
46
|
# new(ptr, auto_free = true)
|
15
|
-
# new(size = 0,
|
47
|
+
# new(size = 0, dimensions = 0)
|
48
|
+
# new(options)
|
16
49
|
# new(points)
|
17
50
|
#
|
18
51
|
# The ptr version of the initializer is for internal use.
|
@@ -27,7 +60,7 @@ module Geos
|
|
27
60
|
ptr, auto_free = if args.first.is_a?(FFI::Pointer)
|
28
61
|
[ args.first, args[1] ]
|
29
62
|
else
|
30
|
-
size,
|
63
|
+
size, dimensions = if args.first.is_a?(Array)
|
31
64
|
points = if args.first.first.is_a?(Array)
|
32
65
|
args.first
|
33
66
|
else
|
@@ -44,15 +77,20 @@ module Geos
|
|
44
77
|
else
|
45
78
|
[ points.length, points.first.length ]
|
46
79
|
end
|
80
|
+
elsif args.first.is_a?(Hash)
|
81
|
+
args.first.values_at(:size, :dimensions)
|
47
82
|
else
|
48
83
|
if !args.length.between?(0, 2)
|
49
84
|
raise ArgumentError.new("wrong number of arguments (#{args.length} for 0-2)")
|
50
85
|
else
|
51
|
-
[ args[0]
|
86
|
+
[ args[0], args[1] ]
|
52
87
|
end
|
53
88
|
end
|
54
89
|
|
55
|
-
|
90
|
+
size ||= 0
|
91
|
+
dimensions ||= 0
|
92
|
+
|
93
|
+
[ FFIGeos.GEOSCoordSeq_create_r(Geos.current_handle, size, dimensions), true ]
|
56
94
|
end
|
57
95
|
|
58
96
|
@ptr = FFI::AutoPointer.new(
|
@@ -64,6 +102,10 @@ module Geos
|
|
64
102
|
@ptr.autorelease = false
|
65
103
|
end
|
66
104
|
|
105
|
+
@x = CoordinateAccessor.new(self, 0)
|
106
|
+
@y = CoordinateAccessor.new(self, 1)
|
107
|
+
@z = CoordinateAccessor.new(self, 2)
|
108
|
+
|
67
109
|
if points
|
68
110
|
points.each_with_index do |point, idx|
|
69
111
|
point.each_with_index do |val, dim|
|
@@ -90,25 +132,31 @@ module Geos
|
|
90
132
|
# Yields coordinates as [ x, y, z ]. The z coordinate may be omitted for
|
91
133
|
# 2-dimensional CoordinateSequences.
|
92
134
|
def each
|
93
|
-
|
94
|
-
|
95
|
-
self.
|
96
|
-
|
97
|
-
|
98
|
-
|
135
|
+
if block_given?
|
136
|
+
self.length.times do |n|
|
137
|
+
yield self.build_coordinate(n)
|
138
|
+
end
|
139
|
+
self
|
140
|
+
else
|
141
|
+
self.length.times.collect { |n|
|
142
|
+
self.build_coordinate(n)
|
143
|
+
}.to_enum
|
99
144
|
end
|
100
145
|
end
|
101
146
|
|
147
|
+
# Sets the x value of a coordinate. Can also be set via #x[]=.
|
102
148
|
def set_x(idx, val)
|
103
149
|
self.check_bounds(idx)
|
104
150
|
FFIGeos.GEOSCoordSeq_setX_r(Geos.current_handle, self.ptr, idx, val)
|
105
151
|
end
|
106
152
|
|
153
|
+
# Sets the y value of a coordinate. Can also be set via #y[]=.
|
107
154
|
def set_y(idx, val)
|
108
155
|
self.check_bounds(idx)
|
109
156
|
FFIGeos.GEOSCoordSeq_setY_r(Geos.current_handle, self.ptr, idx, val)
|
110
157
|
end
|
111
158
|
|
159
|
+
# Sets the z value of a coordinate. Can also be set via #z[]=.
|
112
160
|
def set_z(idx, val)
|
113
161
|
self.check_bounds(idx)
|
114
162
|
FFIGeos.GEOSCoordSeq_setZ_r(Geos.current_handle, self.ptr, idx, val)
|
@@ -119,6 +167,7 @@ module Geos
|
|
119
167
|
FFIGeos.GEOSCoordSeq_setOrdinate_r(Geos.current_handle, self.ptr, idx, dim, val)
|
120
168
|
end
|
121
169
|
|
170
|
+
# Gets the x value of a coordinate. Can also be retrieved via #x[].
|
122
171
|
def get_x(idx)
|
123
172
|
self.check_bounds(idx)
|
124
173
|
FFI::MemoryPointer.new(:double).tap { |ret|
|
@@ -126,6 +175,7 @@ module Geos
|
|
126
175
|
}.read_double
|
127
176
|
end
|
128
177
|
|
178
|
+
# Gets the y value of a coordinate. Can also be retrieved via #y[].
|
129
179
|
def get_y(idx)
|
130
180
|
self.check_bounds(idx)
|
131
181
|
FFI::MemoryPointer.new(:double).tap { |ret|
|
@@ -133,6 +183,7 @@ module Geos
|
|
133
183
|
}.read_double
|
134
184
|
end
|
135
185
|
|
186
|
+
# Gets the z value of a coordinate. Can also be retrieved via #z[].
|
136
187
|
def get_z(idx)
|
137
188
|
self.check_bounds(idx)
|
138
189
|
FFI::MemoryPointer.new(:double).tap { |ret|
|
@@ -193,5 +244,13 @@ module Geos
|
|
193
244
|
raise RuntimeError.new("Index out of bounds")
|
194
245
|
end
|
195
246
|
end
|
247
|
+
|
248
|
+
def build_coordinate(n) #:nodoc:
|
249
|
+
[
|
250
|
+
self.get_x(n),
|
251
|
+
(self.dimensions >= 2 ? self.get_y(n) : nil),
|
252
|
+
(self.dimensions >= 3 ? self.get_z(n) : nil)
|
253
|
+
].compact
|
254
|
+
end
|
196
255
|
end
|
197
256
|
end
|
data/lib/ffi-geos/geometry.rb
CHANGED
@@ -78,30 +78,51 @@ module Geos
|
|
78
78
|
cast_geometry_ptr(FFIGeos.GEOSIntersection_r(Geos.current_handle, self.ptr, geom.ptr))
|
79
79
|
end
|
80
80
|
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
81
|
+
if FFIGeos.respond_to?(:GEOSBufferWithParams_r)
|
82
|
+
# :call-seq:
|
83
|
+
# buffer(width)
|
84
|
+
# buffer(width, options)
|
85
|
+
# buffer(width, buffer_params)
|
86
|
+
# buffer(width, quad_segs)
|
87
|
+
#
|
88
|
+
# Calls buffer on the Geometry. Options can be passed as either a
|
89
|
+
# BufferParams object, as an equivalent Hash or as a quad_segs value.
|
90
|
+
# Default values can be found in Geos::Constants::BUFFER_PARAM_DEFAULTS.
|
91
|
+
#
|
92
|
+
# Note that when using versions of GEOS prior to 3.3.0, only the
|
93
|
+
# quad_segs option is recognized when using Geometry#buffer and other
|
94
|
+
# options are ignored.
|
95
|
+
def buffer(width, options = nil)
|
96
|
+
options ||= {}
|
97
|
+
params = case options
|
98
|
+
when Hash
|
99
|
+
Geos::BufferParams.new(options)
|
100
|
+
when Geos::BufferParams
|
101
|
+
options
|
102
|
+
when Numeric
|
103
|
+
Geos::BufferParams.new(:quad_segs => options)
|
104
|
+
else
|
105
|
+
raise ArgumentError.new("Expected Geos::BufferParams, a Hash or a Numeric")
|
106
|
+
end
|
107
|
+
|
108
|
+
cast_geometry_ptr(FFIGeos.GEOSBufferWithParams_r(Geos.current_handle, self.ptr, params.ptr, width))
|
102
109
|
end
|
110
|
+
else
|
111
|
+
def buffer(width, options = nil)
|
112
|
+
options ||= {}
|
113
|
+
quad_segs = case options
|
114
|
+
when Hash
|
115
|
+
Geos::BufferParams.new(options).quad_segs
|
116
|
+
when Geos::BufferParams
|
117
|
+
options.quad_segs
|
118
|
+
when Numeric
|
119
|
+
options
|
120
|
+
else
|
121
|
+
raise ArgumentError.new("Expected Geos::BufferParams, a Hash or a Numeric")
|
122
|
+
end
|
103
123
|
|
104
|
-
|
124
|
+
cast_geometry_ptr(FFIGeos.GEOSBuffer_r(Geos.current_handle, self.ptr, width, quad_segs))
|
125
|
+
end
|
105
126
|
end
|
106
127
|
|
107
128
|
def convex_hull
|
@@ -280,11 +301,6 @@ module Geos
|
|
280
301
|
end
|
281
302
|
end
|
282
303
|
|
283
|
-
def disjoint?(geom)
|
284
|
-
check_geometry(geom)
|
285
|
-
bool_result(FFIGeos.GEOSDisjoint_r(Geos.current_handle, self.ptr, geom.ptr))
|
286
|
-
end
|
287
|
-
|
288
304
|
def eql?(geom)
|
289
305
|
check_geometry(geom)
|
290
306
|
bool_result(FFIGeos.GEOSEquals_r(Geos.current_handle, self.ptr, geom.ptr))
|
@@ -196,4 +196,79 @@ class CoordinateSequenceTests < Test::Unit::TestCase
|
|
196
196
|
cs = Geos::CoordinateSequence.new([[1, 2, 3], [10, 11, 12]])
|
197
197
|
assert_equal("1.0 2.0 3.0, 10.0 11.0 12.0", cs.to_s)
|
198
198
|
end
|
199
|
+
|
200
|
+
def test_get_by_proxy
|
201
|
+
cs = Geos::CoordinateSequence.new([[1, 2], [10, 11]])
|
202
|
+
|
203
|
+
assert_equal(1, cs.x[0])
|
204
|
+
assert_equal(10, cs.x[1])
|
205
|
+
|
206
|
+
assert_equal(2, cs.y[0])
|
207
|
+
assert_equal(11, cs.y[1])
|
208
|
+
|
209
|
+
assert_equal('NaN', cs.z[0].to_s)
|
210
|
+
assert_equal('NaN', cs.z[1].to_s)
|
211
|
+
|
212
|
+
assert_raise(RuntimeError) do
|
213
|
+
cs.x[100]
|
214
|
+
end
|
215
|
+
|
216
|
+
assert_raise(RuntimeError) do
|
217
|
+
cs.y[100]
|
218
|
+
end
|
219
|
+
|
220
|
+
assert_raise(RuntimeError) do
|
221
|
+
cs.z[100]
|
222
|
+
end
|
223
|
+
end
|
224
|
+
|
225
|
+
def test_set_by_proxy
|
226
|
+
cs = Geos::CoordinateSequence.new(2)
|
227
|
+
cs.x[0] = 1
|
228
|
+
cs.x[1] = 10
|
229
|
+
|
230
|
+
cs.y[0] = 2
|
231
|
+
cs.y[1] = 11
|
232
|
+
|
233
|
+
assert_equal(1, cs.get_x(0))
|
234
|
+
assert_equal(10, cs.get_x(1))
|
235
|
+
|
236
|
+
assert_equal(2, cs.get_y(0))
|
237
|
+
assert_equal(11, cs.get_y(1))
|
238
|
+
|
239
|
+
assert_raise(RuntimeError) do
|
240
|
+
cs.x[100] = 10
|
241
|
+
end
|
242
|
+
|
243
|
+
assert_raise(RuntimeError) do
|
244
|
+
cs.y[100] = 10
|
245
|
+
end
|
246
|
+
|
247
|
+
assert_raise(RuntimeError) do
|
248
|
+
cs.z[100] = 10
|
249
|
+
end
|
250
|
+
end
|
251
|
+
|
252
|
+
def test_proxy_enumerator
|
253
|
+
cs = Geos::CoordinateSequence.new(10)
|
254
|
+
|
255
|
+
assert_kind_of(Enumerable, cs.x.each)
|
256
|
+
assert_kind_of(Enumerable, cs.x.to_enum)
|
257
|
+
assert_equal(cs.x, cs.x.each {})
|
258
|
+
end
|
259
|
+
|
260
|
+
def test_options_hash
|
261
|
+
cs = Geos::CoordinateSequence.new(:size => 10, :dimensions => 2)
|
262
|
+
|
263
|
+
assert_equal(10, cs.size)
|
264
|
+
assert_equal(2, cs.dimensions)
|
265
|
+
end
|
266
|
+
|
267
|
+
def test_enumerator
|
268
|
+
cs = Geos::CoordinateSequence.new(10)
|
269
|
+
|
270
|
+
assert_kind_of(Enumerable, cs.each)
|
271
|
+
assert_kind_of(Enumerable, cs.to_enum)
|
272
|
+
assert_equal(cs, cs.each {})
|
273
|
+
end
|
199
274
|
end
|
data/test/test_helper.rb
CHANGED
@@ -8,7 +8,7 @@ else
|
|
8
8
|
require File.join(File.dirname(__FILE__), %w{ .. lib ffi-geos })
|
9
9
|
end
|
10
10
|
|
11
|
-
puts "Ruby version #{RUBY_VERSION} - #{RbConfig::CONFIG['RUBY_INSTALL_NAME']}"
|
11
|
+
puts "Ruby version #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL} - #{RbConfig::CONFIG['RUBY_INSTALL_NAME']}"
|
12
12
|
puts "ffi version #{Gem.loaded_specs['ffi'].version}" if Gem.loaded_specs['ffi']
|
13
13
|
puts "GEOS version #{Geos::GEOS_VERSION}"
|
14
14
|
puts "ffi-geos version #{Geos::VERSION}" if defined?(Geos::VERSION)
|
data/test/utils_tests.rb
CHANGED
@@ -55,7 +55,7 @@ class UtilsTests < Test::Unit::TestCase
|
|
55
55
|
def test_bad_create_point
|
56
56
|
cs = Geos::CoordinateSequence.new(0, 0)
|
57
57
|
assert_raise(RuntimeError) do
|
58
|
-
|
58
|
+
Geos.create_point(cs)
|
59
59
|
end
|
60
60
|
end
|
61
61
|
|
@@ -87,7 +87,7 @@ class UtilsTests < Test::Unit::TestCase
|
|
87
87
|
def test_create_bad_line_string
|
88
88
|
cs = Geos::CoordinateSequence.new(1, 0)
|
89
89
|
assert_raise(RuntimeError) do
|
90
|
-
|
90
|
+
Geos::create_line_string(cs)
|
91
91
|
end
|
92
92
|
end
|
93
93
|
|
@@ -126,7 +126,7 @@ class UtilsTests < Test::Unit::TestCase
|
|
126
126
|
cs = Geos::CoordinateSequence.new(1, 0)
|
127
127
|
|
128
128
|
assert_raise(RuntimeError) do
|
129
|
-
|
129
|
+
Geos::create_linear_ring(cs)
|
130
130
|
end
|
131
131
|
end
|
132
132
|
|
data/test/wkt_reader_tests.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ffi-geos
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.5
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-
|
12
|
+
date: 2012-07-25 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: ffi
|
16
|
-
requirement:
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ~>
|
@@ -21,7 +21,44 @@ dependencies:
|
|
21
21
|
version: 1.0.0
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements:
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.0.0
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: rdoc
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: rake
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '0.9'
|
54
|
+
type: :runtime
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0.9'
|
25
62
|
description: An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS).
|
26
63
|
email: dark.panda@gmail.com
|
27
64
|
executables: []
|
@@ -29,10 +66,11 @@ extensions: []
|
|
29
66
|
extra_rdoc_files:
|
30
67
|
- README.rdoc
|
31
68
|
files:
|
69
|
+
- .gitignore
|
70
|
+
- Gemfile
|
32
71
|
- MIT-LICENSE
|
33
72
|
- README.rdoc
|
34
73
|
- Rakefile
|
35
|
-
- VERSION
|
36
74
|
- ffi-geos.gemspec
|
37
75
|
- lib/ffi-geos.rb
|
38
76
|
- lib/ffi-geos/buffer_params.rb
|
@@ -50,6 +88,7 @@ files:
|
|
50
88
|
- lib/ffi-geos/strtree.rb
|
51
89
|
- lib/ffi-geos/tools.rb
|
52
90
|
- lib/ffi-geos/utils.rb
|
91
|
+
- lib/ffi-geos/version.rb
|
53
92
|
- lib/ffi-geos/wkb_reader.rb
|
54
93
|
- lib/ffi-geos/wkb_writer.rb
|
55
94
|
- lib/ffi-geos/wkt_reader.rb
|
@@ -86,8 +125,20 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
86
125
|
version: '0'
|
87
126
|
requirements: []
|
88
127
|
rubyforge_project:
|
89
|
-
rubygems_version: 1.8.
|
128
|
+
rubygems_version: 1.8.23
|
90
129
|
signing_key:
|
91
130
|
specification_version: 3
|
92
131
|
summary: An ffi wrapper for GEOS, a C++ port of the Java Topology Suite (JTS).
|
93
|
-
test_files:
|
132
|
+
test_files:
|
133
|
+
- test/coordinate_sequence_tests.rb
|
134
|
+
- test/geometry_tests.rb
|
135
|
+
- test/misc_tests.rb
|
136
|
+
- test/point_tests.rb
|
137
|
+
- test/prepared_geometry_tests.rb
|
138
|
+
- test/strtree_tests.rb
|
139
|
+
- test/test_helper.rb
|
140
|
+
- test/utils_tests.rb
|
141
|
+
- test/wkb_reader_tests.rb
|
142
|
+
- test/wkb_writer_tests.rb
|
143
|
+
- test/wkt_reader_tests.rb
|
144
|
+
- test/wkt_writer_tests.rb
|
data/VERSION
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
0.0.4
|