ffi-geos 1.1.1 → 1.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.
Files changed (45) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +8 -5
  3. data/MIT-LICENSE +1 -1
  4. data/lib/ffi-geos.rb +90 -8
  5. data/lib/ffi-geos/buffer_params.rb +8 -7
  6. data/lib/ffi-geos/coordinate_sequence.rb +14 -13
  7. data/lib/ffi-geos/geometry.rb +120 -71
  8. data/lib/ffi-geos/geometry_collection.rb +2 -1
  9. data/lib/ffi-geos/interrupt.rb +2 -0
  10. data/lib/ffi-geos/line_string.rb +5 -4
  11. data/lib/ffi-geos/linear_ring.rb +1 -0
  12. data/lib/ffi-geos/multi_line_string.rb +2 -1
  13. data/lib/ffi-geos/multi_point.rb +1 -0
  14. data/lib/ffi-geos/multi_polygon.rb +1 -0
  15. data/lib/ffi-geos/point.rb +4 -3
  16. data/lib/ffi-geos/polygon.rb +4 -3
  17. data/lib/ffi-geos/prepared_geometry.rb +13 -12
  18. data/lib/ffi-geos/strtree.rb +61 -13
  19. data/lib/ffi-geos/tools.rb +2 -1
  20. data/lib/ffi-geos/utils.rb +12 -11
  21. data/lib/ffi-geos/version.rb +2 -1
  22. data/lib/ffi-geos/wkb_reader.rb +5 -4
  23. data/lib/ffi-geos/wkb_writer.rb +11 -10
  24. data/lib/ffi-geos/wkt_reader.rb +4 -3
  25. data/lib/ffi-geos/wkt_writer.rb +9 -8
  26. data/test/coordinate_sequence_tests.rb +1 -0
  27. data/test/geometry_collection_tests.rb +1 -0
  28. data/test/geometry_tests.rb +88 -0
  29. data/test/interrupt_tests.rb +1 -0
  30. data/test/line_string_tests.rb +1 -0
  31. data/test/linear_ring_tests.rb +1 -0
  32. data/test/misc_tests.rb +99 -0
  33. data/test/multi_line_string_tests.rb +1 -0
  34. data/test/point_tests.rb +1 -0
  35. data/test/polygon_tests.rb +1 -0
  36. data/test/prepared_geometry_tests.rb +1 -0
  37. data/test/strtree_tests.rb +143 -2
  38. data/test/test_helper.rb +8 -2
  39. data/test/tools_tests.rb +1 -0
  40. data/test/utils_tests.rb +1 -0
  41. data/test/wkb_reader_tests.rb +1 -0
  42. data/test/wkb_writer_tests.rb +3 -4
  43. data/test/wkt_reader_tests.rb +1 -0
  44. data/test/wkt_writer_tests.rb +1 -0
  45. metadata +9 -9
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class GeometryCollection < Geometry
@@ -22,7 +23,7 @@ module Geos
22
23
  if n < 0 || n >= self.num_geometries
23
24
  nil
24
25
  else
25
- cast_geometry_ptr(FFIGeos.GEOSGetGeometryN_r(Geos.current_handle, self.ptr, n), :auto_free => false)
26
+ cast_geometry_ptr(FFIGeos.GEOSGetGeometryN_r(Geos.current_handle_pointer, self.ptr, n), :auto_free => false)
26
27
  end
27
28
  end
28
29
  alias_method :geometry_n, :get_geometry_n
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+ # frozen_string_literal: true
1
3
 
2
4
  module Geos
3
5
  module Interrupt
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class LineString < Geometry
@@ -19,7 +20,7 @@ module Geos
19
20
 
20
21
  if FFIGeos.respond_to?(:GEOSGeomGetNumPoints_r)
21
22
  def num_points
22
- FFIGeos.GEOSGeomGetNumPoints_r(Geos.current_handle, self.ptr)
23
+ FFIGeos.GEOSGeomGetNumPoints_r(Geos.current_handle_pointer, self.ptr)
23
24
  end
24
25
  else
25
26
  def num_points
@@ -32,7 +33,7 @@ module Geos
32
33
  raise Geos::IndexBoundsError.new
33
34
  else
34
35
  cast_geometry_ptr(
35
- FFIGeos.GEOSGeomGetPointN_r(Geos.current_handle, self.ptr, n), {
36
+ FFIGeos.GEOSGeomGetPointN_r(Geos.current_handle_pointer, self.ptr, n), {
36
37
  :srid_copy => self.srid
37
38
  }
38
39
  )
@@ -52,7 +53,7 @@ module Geos
52
53
  options = Constants::BUFFER_PARAM_DEFAULTS.merge(options)
53
54
 
54
55
  cast_geometry_ptr(FFIGeos.GEOSOffsetCurve_r(
55
- Geos.current_handle,
56
+ Geos.current_handle_pointer,
56
57
  self.ptr,
57
58
  width,
58
59
  options[:quad_segs],
@@ -65,7 +66,7 @@ module Geos
65
66
 
66
67
  if FFIGeos.respond_to?(:GEOSisClosed_r)
67
68
  def closed?
68
- bool_result(FFIGeos.GEOSisClosed_r(Geos.current_handle, self.ptr))
69
+ bool_result(FFIGeos.GEOSisClosed_r(Geos.current_handle_pointer, self.ptr))
69
70
  end
70
71
  end
71
72
 
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class LinearRing < LineString
@@ -1,11 +1,12 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class MultiLineString < GeometryCollection
5
6
  if FFIGeos.respond_to?(:GEOSisClosed_r) && Geos::GEOS_VERSION >= '3.5.0'
6
7
  # Available in GEOS 3.5.0+.
7
8
  def closed?
8
- bool_result(FFIGeos.GEOSisClosed_r(Geos.current_handle, self.ptr))
9
+ bool_result(FFIGeos.GEOSisClosed_r(Geos.current_handle_pointer, self.ptr))
9
10
  end
10
11
  end
11
12
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class MultiPoint < GeometryCollection
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class MultiPolygon < GeometryCollection
@@ -1,11 +1,12 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class Point < Geometry
5
6
  if FFIGeos.respond_to?(:GEOSGeomGetX_r)
6
7
  def get_x
7
8
  double_ptr = FFI::MemoryPointer.new(:double)
8
- FFIGeos.GEOSGeomGetX_r(Geos.current_handle, self.ptr, double_ptr)
9
+ FFIGeos.GEOSGeomGetX_r(Geos.current_handle_pointer, self.ptr, double_ptr)
9
10
  double_ptr.read_double
10
11
  end
11
12
  else
@@ -18,7 +19,7 @@ module Geos
18
19
  if FFIGeos.respond_to?(:GEOSGeomGetY_r)
19
20
  def get_y
20
21
  double_ptr = FFI::MemoryPointer.new(:double)
21
- FFIGeos.GEOSGeomGetY_r(Geos.current_handle, self.ptr, double_ptr)
22
+ FFIGeos.GEOSGeomGetY_r(Geos.current_handle_pointer, self.ptr, double_ptr)
22
23
  double_ptr.read_double
23
24
  end
24
25
  else
@@ -31,7 +32,7 @@ module Geos
31
32
  if FFIGeos.respond_to?(:GEOSGeomGetZ_r)
32
33
  def get_z
33
34
  double_ptr = FFI::MemoryPointer.new(:double)
34
- FFIGeos.GEOSGeomGetZ_r(Geos.current_handle, self.ptr, double_ptr)
35
+ FFIGeos.GEOSGeomGetZ_r(Geos.current_handle_pointer, self.ptr, double_ptr)
35
36
  double_ptr.read_double
36
37
  end
37
38
  else
@@ -1,9 +1,10 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class Polygon < Geometry
5
6
  def num_interior_rings
6
- FFIGeos.GEOSGetNumInteriorRings_r(Geos.current_handle, self.ptr)
7
+ FFIGeos.GEOSGetNumInteriorRings_r(Geos.current_handle_pointer, self.ptr)
7
8
  end
8
9
 
9
10
  def interior_ring_n(n)
@@ -11,7 +12,7 @@ module Geos
11
12
  raise Geos::IndexBoundsError.new
12
13
  else
13
14
  cast_geometry_ptr(
14
- FFIGeos.GEOSGetInteriorRingN_r(Geos.current_handle, self.ptr, n), {
15
+ FFIGeos.GEOSGetInteriorRingN_r(Geos.current_handle_pointer, self.ptr, n), {
15
16
  :auto_free => false,
16
17
  :srid_copy => self.srid,
17
18
  :parent => self
@@ -23,7 +24,7 @@ module Geos
23
24
 
24
25
  def exterior_ring
25
26
  cast_geometry_ptr(
26
- FFIGeos.GEOSGetExteriorRing_r(Geos.current_handle, self.ptr), {
27
+ FFIGeos.GEOSGetExteriorRing_r(Geos.current_handle_pointer, self.ptr), {
27
28
  :auto_free => false,
28
29
  :srid_copy => self.srid,
29
30
  :parent => self
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class PreparedGeometry
@@ -16,7 +17,7 @@ module Geos
16
17
  }.merge(options)
17
18
 
18
19
  @ptr = FFI::AutoPointer.new(
19
- FFIGeos.GEOSPrepare_r(Geos.current_handle, geom.ptr),
20
+ FFIGeos.GEOSPrepare_r(Geos.current_handle_pointer, geom.ptr),
20
21
  self.class.method(:release)
21
22
  )
22
23
  @geometry = geom
@@ -25,57 +26,57 @@ module Geos
25
26
  end
26
27
 
27
28
  def self.release(ptr) #:nodoc:
28
- FFIGeos.GEOSPreparedGeom_destroy_r(Geos.current_handle, ptr)
29
+ FFIGeos.GEOSPreparedGeom_destroy_r(Geos.current_handle_pointer, ptr)
29
30
  end
30
31
 
31
32
  def contains?(geom)
32
33
  check_geometry(geom)
33
- bool_result(FFIGeos.GEOSPreparedContains_r(Geos.current_handle, self.ptr, geom.ptr))
34
+ bool_result(FFIGeos.GEOSPreparedContains_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
34
35
  end
35
36
 
36
37
  def contains_properly?(geom)
37
38
  check_geometry(geom)
38
- bool_result(FFIGeos.GEOSPreparedContainsProperly_r(Geos.current_handle, self.ptr, geom.ptr))
39
+ bool_result(FFIGeos.GEOSPreparedContainsProperly_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
39
40
  end
40
41
 
41
42
  def covered_by?(geom)
42
43
  check_geometry(geom)
43
- bool_result(FFIGeos.GEOSPreparedCoveredBy_r(Geos.current_handle, self.ptr, geom.ptr))
44
+ bool_result(FFIGeos.GEOSPreparedCoveredBy_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
44
45
  end
45
46
 
46
47
  def covers?(geom)
47
48
  check_geometry(geom)
48
- bool_result(FFIGeos.GEOSPreparedCovers_r(Geos.current_handle, self.ptr, geom.ptr))
49
+ bool_result(FFIGeos.GEOSPreparedCovers_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
49
50
  end
50
51
 
51
52
  def crosses?(geom)
52
53
  check_geometry(geom)
53
- bool_result(FFIGeos.GEOSPreparedCrosses_r(Geos.current_handle, self.ptr, geom.ptr))
54
+ bool_result(FFIGeos.GEOSPreparedCrosses_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
54
55
  end
55
56
 
56
57
  def disjoint?(geom)
57
58
  check_geometry(geom)
58
- bool_result(FFIGeos.GEOSPreparedDisjoint_r(Geos.current_handle, self.ptr, geom.ptr))
59
+ bool_result(FFIGeos.GEOSPreparedDisjoint_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
59
60
  end
60
61
 
61
62
  def intersects?(geom)
62
63
  check_geometry(geom)
63
- bool_result(FFIGeos.GEOSPreparedIntersects_r(Geos.current_handle, self.ptr, geom.ptr))
64
+ bool_result(FFIGeos.GEOSPreparedIntersects_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
64
65
  end
65
66
 
66
67
  def overlaps?(geom)
67
68
  check_geometry(geom)
68
- bool_result(FFIGeos.GEOSPreparedOverlaps_r(Geos.current_handle, self.ptr, geom.ptr))
69
+ bool_result(FFIGeos.GEOSPreparedOverlaps_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
69
70
  end
70
71
 
71
72
  def touches?(geom)
72
73
  check_geometry(geom)
73
- bool_result(FFIGeos.GEOSPreparedTouches_r(Geos.current_handle, self.ptr, geom.ptr))
74
+ bool_result(FFIGeos.GEOSPreparedTouches_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
74
75
  end
75
76
 
76
77
  def within?(geom)
77
78
  check_geometry(geom)
78
- bool_result(FFIGeos.GEOSPreparedWithin_r(Geos.current_handle, self.ptr, geom.ptr))
79
+ bool_result(FFIGeos.GEOSPreparedWithin_r(Geos.current_handle_pointer, self.ptr, geom.ptr))
79
80
  end
80
81
  end
81
82
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class STRtree
@@ -21,10 +22,11 @@ module Geos
21
22
  #
22
23
  def initialize(*args)
23
24
  geoms_and_objects = nil # forward declaration
25
+ capacity = 10
24
26
 
25
- capacity = if args.length == 1 && args.first.is_a?(Fixnum)
26
- args.first
27
- else
27
+ if args.first.is_a?(Integer)
28
+ capacity = args.first
29
+ elsif args.first.is_a?(Array)
28
30
  geoms_and_objects = if args.first.first.is_a?(Array)
29
31
  args.first
30
32
  else
@@ -34,15 +36,13 @@ module Geos
34
36
  geoms_and_objects.each do |geom, obj|
35
37
  check_geometry(geom)
36
38
  end
37
-
38
- geoms_and_objects.length
39
39
  end
40
40
 
41
41
  if capacity <= 0
42
42
  raise ArgumentError.new("STRtree capacity must be greater than 0")
43
43
  end
44
44
 
45
- ptr = FFIGeos.GEOSSTRtree_create_r(Geos.current_handle, capacity)
45
+ ptr = FFIGeos.GEOSSTRtree_create_r(Geos.current_handle_pointer, capacity)
46
46
 
47
47
  @ptr = FFI::AutoPointer.new(
48
48
  ptr,
@@ -63,19 +63,23 @@ module Geos
63
63
  end
64
64
 
65
65
  def self.release(ptr) #:nodoc:
66
- FFIGeos.GEOSSTRtree_destroy_r(Geos.current_handle, ptr)
66
+ FFIGeos.GEOSSTRtree_destroy_r(Geos.current_handle_pointer, ptr)
67
67
  end
68
68
 
69
69
  def built?
70
70
  @built
71
71
  end
72
72
 
73
+ def built!
74
+ @built = true
75
+ end
76
+
73
77
  def next_key
74
78
  @storage_key += 1
75
79
  end
76
80
  private :next_key
77
81
 
78
- def insert(geom, item)
82
+ def insert(geom, item = nil)
79
83
  if self.built?
80
84
  raise AlreadyBuiltError.new
81
85
  else
@@ -91,7 +95,7 @@ module Geos
91
95
  }
92
96
  @ptrs[key] = key_ptr
93
97
 
94
- FFIGeos.GEOSSTRtree_insert_r(Geos.current_handle, self.ptr, geom.ptr, key_ptr)
98
+ FFIGeos.GEOSSTRtree_insert_r(Geos.current_handle_pointer, self.ptr, geom.ptr, key_ptr)
95
99
  end
96
100
  end
97
101
 
@@ -104,8 +108,8 @@ module Geos
104
108
 
105
109
  if key
106
110
  key_ptr = @ptrs[key]
107
- result = FFIGeos.GEOSSTRtree_remove_r(Geos.current_handle, self.ptr, geom.ptr, key_ptr)
108
- @built = true
111
+ result = FFIGeos.GEOSSTRtree_remove_r(Geos.current_handle_pointer, self.ptr, geom.ptr, key_ptr)
112
+ built!
109
113
 
110
114
  if result == 1
111
115
  @storage.delete(key)
@@ -116,7 +120,7 @@ module Geos
116
120
  def query_all(geom)
117
121
  check_geometry(geom)
118
122
 
119
- @built = true
123
+ built!
120
124
  retval = []
121
125
 
122
126
  callback = proc { |*args|
@@ -130,7 +134,7 @@ module Geos
130
134
  }
131
135
 
132
136
  FFIGeos.GEOSSTRtree_query_r(
133
- Geos.current_handle,
137
+ Geos.current_handle_pointer,
134
138
  self.ptr,
135
139
  geom.ptr,
136
140
  callback,
@@ -178,5 +182,49 @@ module Geos
178
182
  yield(v)
179
183
  end
180
184
  end
185
+
186
+ if FFIGeos.respond_to?(:GEOSSTRtree_nearest_generic_r)
187
+ def nearest_generic(geom)
188
+ check_geometry(geom)
189
+
190
+ built!
191
+
192
+ return nil if @storage.empty?
193
+
194
+ callback = proc { |item, _item2, distance_ptr|
195
+ key = item.read_int
196
+ geom_from_storage = @storage[key][:geometry]
197
+
198
+ next 0 if geom_from_storage.empty?
199
+
200
+ distance = geom.distance(geom_from_storage)
201
+ distance_ptr.write_double(distance)
202
+
203
+ next 1
204
+ }
205
+
206
+ key_ptr = FFIGeos.GEOSSTRtree_nearest_generic_r(
207
+ Geos.current_handle_pointer,
208
+ self.ptr,
209
+ geom.ptr,
210
+ geom.envelope.ptr,
211
+ callback,
212
+ nil
213
+ )
214
+
215
+ @storage[key_ptr.read_int] unless key_ptr.null?
216
+ end
217
+
218
+ def nearest(geom)
219
+ item = nearest_generic(geom)
220
+ item[:geometry] if item
221
+ end
222
+ alias_method :nearest_geometry, :nearest
223
+
224
+ def nearest_item(geom)
225
+ item = nearest_generic(geom)
226
+ item[:item] if item
227
+ end
228
+ end
181
229
  end
182
230
  end
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  class NullPointerError < Geos::Error
@@ -31,7 +32,7 @@ module Geos
31
32
  raise Geos::NullPointerError.new
32
33
  end
33
34
 
34
- klass = case FFIGeos.GEOSGeomTypeId_r(Geos.current_handle, geom_ptr)
35
+ klass = case FFIGeos.GEOSGeomTypeId_r(Geos.current_handle_pointer, geom_ptr)
35
36
  when GEOS_POINT
36
37
  Point
37
38
  when GEOS_LINESTRING
@@ -1,4 +1,5 @@
1
1
  # encoding: UTF-8
2
+ # frozen_string_literal: true
2
3
 
3
4
  module Geos
4
5
  module Utils
@@ -14,7 +15,7 @@ module Geos
14
15
  # Available in GEOS 3.3.0+.
15
16
  def orientation_index(ax, ay, bx, by, px, py)
16
17
  FFIGeos.GEOSOrientationIndex_r(
17
- Geos.current_handle,
18
+ Geos.current_handle_pointer,
18
19
  ax, ay, bx, by, px, py
19
20
  )
20
21
  end
@@ -23,7 +24,7 @@ module Geos
23
24
  if FFIGeos.respond_to?(:GEOSRelatePatternMatch_r)
24
25
  # Available in GEOS 3.3.0+.
25
26
  def relate_match(mat, pat)
26
- bool_result(FFIGeos.GEOSRelatePatternMatch_r(Geos.current_handle, mat, pat))
27
+ bool_result(FFIGeos.GEOSRelatePatternMatch_r(Geos.current_handle_pointer, mat, pat))
27
28
  end
28
29
  end
29
30
 
@@ -49,7 +50,7 @@ module Geos
49
50
  cs_dup = cs.dup
50
51
  cs_dup.ptr.autorelease = false
51
52
 
52
- cast_geometry_ptr(FFIGeos.GEOSGeom_createPoint_r(Geos.current_handle, cs_dup.ptr), {
53
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createPoint_r(Geos.current_handle_pointer, cs_dup.ptr), {
53
54
  :srid => options[:srid]
54
55
  })
55
56
  end
@@ -64,7 +65,7 @@ module Geos
64
65
  cs_dup = cs.dup
65
66
  cs_dup.ptr.autorelease = false
66
67
 
67
- cast_geometry_ptr(FFIGeos.GEOSGeom_createLineString_r(Geos.current_handle, cs_dup.ptr), {
68
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createLineString_r(Geos.current_handle_pointer, cs_dup.ptr), {
68
69
  :srid => options[:srid]
69
70
  })
70
71
  end
@@ -78,7 +79,7 @@ module Geos
78
79
 
79
80
  cs.ptr.autorelease = false
80
81
 
81
- cast_geometry_ptr(FFIGeos.GEOSGeom_createLinearRing_r(Geos.current_handle, cs.ptr), {
82
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createLinearRing_r(Geos.current_handle_pointer, cs.ptr), {
82
83
  :srid => options[:srid]
83
84
  })
84
85
  end
@@ -102,32 +103,32 @@ module Geos
102
103
  i.ptr.autorelease = false
103
104
  }
104
105
 
105
- cast_geometry_ptr(FFIGeos.GEOSGeom_createPolygon_r(Geos.current_handle, outer_dup.ptr, ary, inner_dups.length), {
106
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createPolygon_r(Geos.current_handle_pointer, outer_dup.ptr, ary, inner_dups.length), {
106
107
  :srid => options[:srid]
107
108
  })
108
109
  end
109
110
 
110
111
  def create_empty_point(options = {})
111
- cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPoint_r(Geos.current_handle), {
112
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPoint_r(Geos.current_handle_pointer), {
112
113
  :srid => options[:srid]
113
114
  })
114
115
  end
115
116
 
116
117
  def create_empty_line_string(options = {})
117
- cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyLineString_r(Geos.current_handle), {
118
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyLineString_r(Geos.current_handle_pointer), {
118
119
  :srid => options[:srid]
119
120
  })
120
121
  end
121
122
 
122
123
  def create_empty_polygon(options = {})
123
- cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPolygon_r(Geos.current_handle), {
124
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPolygon_r(Geos.current_handle_pointer), {
124
125
  :srid => options[:srid]
125
126
  })
126
127
  end
127
128
 
128
129
  def create_empty_collection(t, options = {})
129
130
  check_enum_value(Geos::GeometryTypes, t)
130
- cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyCollection_r(Geos.current_handle, t), {
131
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyCollection_r(Geos.current_handle_pointer, t), {
131
132
  :srid => options[:srid]
132
133
  })
133
134
  end
@@ -182,7 +183,7 @@ module Geos
182
183
  ary = FFI::MemoryPointer.new(:pointer, geoms.length)
183
184
  ary.write_array_of_pointer(geoms_dups.map(&:ptr))
184
185
 
185
- cast_geometry_ptr(FFIGeos.GEOSGeom_createCollection_r(Geos.current_handle, t, ary, geoms_dups.length), {
186
+ cast_geometry_ptr(FFIGeos.GEOSGeom_createCollection_r(Geos.current_handle_pointer, t, ary, geoms_dups.length), {
186
187
  :srid => options[:srid]
187
188
  })
188
189
  end