Class: Geos::Geometry

Inherits:
Object
  • Object
show all
Includes:
Tools
Defined in:
lib/ffi-geos/geometry.rb

Direct Known Subclasses

GeometryCollection, LineString, Point, Polygon

Constant Summary

Constants included from GeomTypes

Geos::GeomTypes::GEOS_GEOMETRYCOLLECTION, Geos::GeomTypes::GEOS_LINEARRING, Geos::GeomTypes::GEOS_LINESTRING, Geos::GeomTypes::GEOS_MULTILINESTRING, Geos::GeomTypes::GEOS_MULTIPOINT, Geos::GeomTypes::GEOS_MULTIPOLYGON, Geos::GeomTypes::GEOS_POINT, Geos::GeomTypes::GEOS_POLYGON

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Tools

#bool_result, #cast_geometry_ptr, #check_enum_value, #check_geometry, #pick_srid_according_to_policy, #pick_srid_from_geoms, #symbol_for_enum

Constructor Details

#initialize(ptr, auto_free = true) ⇒ Geometry

For internal use. Geometry objects should be created via WkbReader, WktReader and the various Geos.create_* methods.



11
12
13
14
15
16
17
18
# File 'lib/ffi-geos/geometry.rb', line 11

def initialize(ptr, auto_free = true)
  @ptr = FFI::AutoPointer.new(
    ptr,
    self.class.method(:release)
  )

  @ptr.autorelease = auto_free
end

Instance Attribute Details

#ptrObject (readonly)

Returns the value of attribute ptr.



7
8
9
# File 'lib/ffi-geos/geometry.rb', line 7

def ptr
  @ptr
end

Class Method Details

.release(ptr) ⇒ Object

:nodoc:



30
31
32
# File 'lib/ffi-geos/geometry.rb', line 30

def self.release(ptr) #:nodoc:
  FFIGeos.GEOSGeom_destroy_r(Geos.current_handle, ptr)
end

Instance Method Details

#areaObject



430
431
432
433
434
435
436
437
438
# File 'lib/ffi-geos/geometry.rb', line 430

def area
  if self.empty?
    0
  else
    double_ptr = FFI::MemoryPointer.new(:double)
    FFIGeos.GEOSArea_r(Geos.current_handle, self.ptr, double_ptr)
    double_ptr.read_double
  end
end

#boundaryObject



150
151
152
# File 'lib/ffi-geos/geometry.rb', line 150

def boundary
  cast_geometry_ptr(FFIGeos.GEOSBoundary_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#buffer(width, options = nil) ⇒ Object

:call-seq:

buffer(width)
buffer(width, options)
buffer(width, buffer_params)
buffer(width, quad_segs)

Calls buffer on the Geometry. Options can be passed as either a BufferParams object, as an equivalent Hash or as a quad_segs value. Default values can be found in Geos::Constants::BUFFER_PARAM_DEFAULTS.

Note that when using versions of GEOS prior to 3.3.0, only the quad_segs option is recognized when using Geometry#buffer and other options are ignored.



98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/ffi-geos/geometry.rb', line 98

def buffer(width, options = nil)
  options ||= {}
  params = case options
    when Hash
      Geos::BufferParams.new(options)
    when Geos::BufferParams
      options
    when Numeric
      Geos::BufferParams.new(:quad_segs => options)
    else
      raise ArgumentError.new("Expected Geos::BufferParams, a Hash or a Numeric")
  end

  cast_geometry_ptr(FFIGeos.GEOSBufferWithParams_r(Geos.current_handle, self.ptr, params.ptr, width), :srid_copy => self.srid)
end

#centroidObject Also known as: center



192
193
194
# File 'lib/ffi-geos/geometry.rb', line 192

def centroid
  cast_geometry_ptr(FFIGeos.GEOSGetCentroid_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#contains?(geom) ⇒ Boolean

Returns:

  • (Boolean)


265
266
267
268
# File 'lib/ffi-geos/geometry.rb', line 265

def contains?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSContains_r(Geos.current_handle, self.ptr, geom.ptr))
end

#convex_hullObject



131
132
133
# File 'lib/ffi-geos/geometry.rb', line 131

def convex_hull
  cast_geometry_ptr(FFIGeos.GEOSConvexHull_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#coord_seqObject



73
74
75
# File 'lib/ffi-geos/geometry.rb', line 73

def coord_seq
  CoordinateSequence.new(FFIGeos.GEOSGeom_getCoordSeq_r(Geos.current_handle, self.ptr), false)
end

#covered_by?(geom) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


301
302
303
304
# File 'lib/ffi-geos/geometry.rb', line 301

def covered_by?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSCoveredBy_r(Geos.current_handle, self.ptr, geom.ptr))
end

#covers?(geom) ⇒ Boolean

:nodoc:

Returns:

  • (Boolean)


279
280
281
282
# File 'lib/ffi-geos/geometry.rb', line 279

def covers?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSCovers_r(Geos.current_handle, self.ptr, geom.ptr))
end

#crosses?(geom) ⇒ Boolean

Returns:

  • (Boolean)


255
256
257
258
# File 'lib/ffi-geos/geometry.rb', line 255

def crosses?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSCrosses_r(Geos.current_handle, self.ptr, geom.ptr))
end

#difference(geom) ⇒ Object



135
136
137
138
139
140
# File 'lib/ffi-geos/geometry.rb', line 135

def difference(geom)
  check_geometry(geom)
  cast_geometry_ptr(FFIGeos.GEOSDifference_r(Geos.current_handle, self.ptr, geom.ptr), {
    :srid_copy => pick_srid_from_geoms(self.srid, geom.srid)
  })
end

#dimensionsObject



61
62
63
# File 'lib/ffi-geos/geometry.rb', line 61

def dimensions
  FFIGeos.GEOSGeom_getDimensions_r(Geos.current_handle, self.ptr)
end

#disjoint?(geom) ⇒ Boolean

Returns:

  • (Boolean)


240
241
242
243
# File 'lib/ffi-geos/geometry.rb', line 240

def disjoint?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSDisjoint_r(Geos.current_handle, self.ptr, geom.ptr))
end

#distance(geom) ⇒ Object



450
451
452
453
454
455
# File 'lib/ffi-geos/geometry.rb', line 450

def distance(geom)
  check_geometry(geom)
  double_ptr = FFI::MemoryPointer.new(:double)
  FFIGeos.GEOSDistance_r(Geos.current_handle, self.ptr, geom.ptr, double_ptr)
  double_ptr.read_double
end

#empty?Boolean

Returns:

  • (Boolean)


340
341
342
# File 'lib/ffi-geos/geometry.rb', line 340

def empty?
  bool_result(FFIGeos.GEOSisEmpty_r(Geos.current_handle, self.ptr))
end

#end_pointObject



426
427
428
# File 'lib/ffi-geos/geometry.rb', line 426

def end_point
  cast_geometry_ptr(FFIGeos.GEOSGeomGetEndPoint_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#envelopeObject



197
198
199
# File 'lib/ffi-geos/geometry.rb', line 197

def envelope
  cast_geometry_ptr(FFIGeos.GEOSEnvelope_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#eql?(geom) ⇒ Boolean Also known as: ==, equals?

Returns:

  • (Boolean)


319
320
321
322
# File 'lib/ffi-geos/geometry.rb', line 319

def eql?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSEquals_r(Geos.current_handle, self.ptr, geom.ptr))
end

#eql_almost?(geom, decimal = 6) ⇒ Boolean Also known as: equals_almost?, almost_equals?

Returns:

  • (Boolean)


333
334
335
336
# File 'lib/ffi-geos/geometry.rb', line 333

def eql_almost?(geom, decimal = 6)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSEqualsExact_r(Geos.current_handle, self.ptr, geom.ptr, 0.5 * 10 ** (-decimal)))
end

#eql_exact?(geom, tolerance) ⇒ Boolean Also known as: equals_exact?, exactly_equals?

Returns:

  • (Boolean)


326
327
328
329
# File 'lib/ffi-geos/geometry.rb', line 326

def eql_exact?(geom, tolerance)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSEqualsExact_r(Geos.current_handle, self.ptr, geom.ptr, tolerance))
end

#extract_unique_pointsObject Also known as: unique_points



235
236
237
# File 'lib/ffi-geos/geometry.rb', line 235

def extract_unique_points
  cast_geometry_ptr(FFIGeos.GEOSGeom_extractUniquePoints_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#geom_typeObject

Returns the name of the Geometry type, i.e. “Point”, “Polygon”, etc.



35
36
37
# File 'lib/ffi-geos/geometry.rb', line 35

def geom_type
  FFIGeos.GEOSGeomType_r(Geos.current_handle, self.ptr)
end

#has_z?Boolean

Returns:

  • (Boolean)


386
387
388
# File 'lib/ffi-geos/geometry.rb', line 386

def has_z?
  bool_result(FFIGeos.GEOSHasZ_r(Geos.current_handle, self.ptr))
end

#hausdorff_distance(geom, densify_frac = nil) ⇒ Object



457
458
459
460
461
462
463
464
465
466
467
468
469
# File 'lib/ffi-geos/geometry.rb', line 457

def hausdorff_distance(geom, densify_frac = nil)
  check_geometry(geom)

  double_ptr = FFI::MemoryPointer.new(:double)

  if densify_frac
    FFIGeos.GEOSHausdorffDistanceDensify_r(Geos.current_handle, self.ptr, geom.ptr, densify_frac, double_ptr)
  else
    FFIGeos.GEOSHausdorffDistance_r(Geos.current_handle, self.ptr, geom.ptr, double_ptr)
  end

  double_ptr.read_double
end

#initialize_copy(source) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/ffi-geos/geometry.rb', line 20

def initialize_copy(source)
  @ptr = FFI::AutoPointer.new(
    FFIGeos.GEOSGeom_clone_r(Geos.current_handle, source.ptr),
    self.class.method(:release)
  )

  # Copy over SRID since GEOS does not
  self.srid = source.srid
end

#interpolate(d, normalized = false) ⇒ Object



408
409
410
411
412
413
414
415
416
# File 'lib/ffi-geos/geometry.rb', line 408

def interpolate(d, normalized = false)
  ret = if normalized
    FFIGeos.GEOSInterpolateNormalized_r(Geos.current_handle, self.ptr, d)
  else
    FFIGeos.GEOSInterpolate_r(Geos.current_handle, self.ptr, d)
  end

  cast_geometry_ptr(ret, :srid_copy => self.srid)
end

#interpolate_normalized(d) ⇒ Object



418
419
420
# File 'lib/ffi-geos/geometry.rb', line 418

def interpolate_normalized(d)
  self.interpolate(d, true)
end

#intersection(geom) ⇒ Object



77
78
79
80
81
82
# File 'lib/ffi-geos/geometry.rb', line 77

def intersection(geom)
  check_geometry(geom)
  cast_geometry_ptr(FFIGeos.GEOSIntersection_r(Geos.current_handle, self.ptr, geom.ptr), {
    :srid_copy => pick_srid_from_geoms(self.srid, geom.srid)
  })
end

#intersects?(geom) ⇒ Boolean

Returns:

  • (Boolean)


250
251
252
253
# File 'lib/ffi-geos/geometry.rb', line 250

def intersects?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSIntersects_r(Geos.current_handle, self.ptr, geom.ptr))
end

#lengthObject



440
441
442
443
444
445
446
447
448
# File 'lib/ffi-geos/geometry.rb', line 440

def length
  if self.empty?
    0
  else
    double_ptr = FFI::MemoryPointer.new(:double)
    FFIGeos.GEOSLength_r(Geos.current_handle, self.ptr, double_ptr)
    double_ptr.read_double
  end
end

#line_mergeObject



223
224
225
# File 'lib/ffi-geos/geometry.rb', line 223

def line_merge
  cast_geometry_ptr(FFIGeos.GEOSLineMerge_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#normalize!Object Also known as: normalize



44
45
46
47
48
49
50
# File 'lib/ffi-geos/geometry.rb', line 44

def normalize!
  if FFIGeos.GEOSNormalize_r(Geos.current_handle, self.ptr) == -1
    raise RuntimeError.new("Couldn't normalize #{self.class}")
  end

  self
end

#num_coordinatesObject



69
70
71
# File 'lib/ffi-geos/geometry.rb', line 69

def num_coordinates
  FFIGeos.GEOSGetNumCoordinates_r(Geos.current_handle, self.ptr)
end

#num_geometriesObject



65
66
67
# File 'lib/ffi-geos/geometry.rb', line 65

def num_geometries
  FFIGeos.GEOSGetNumGeometries_r(Geos.current_handle, self.ptr)
end

#overlaps?(geom) ⇒ Boolean

Returns:

  • (Boolean)


270
271
272
273
# File 'lib/ffi-geos/geometry.rb', line 270

def overlaps?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSOverlaps_r(Geos.current_handle, self.ptr, geom.ptr))
end

#point_on_surfaceObject Also known as: representative_point



187
188
189
# File 'lib/ffi-geos/geometry.rb', line 187

def point_on_surface
  cast_geometry_ptr(FFIGeos.GEOSPointOnSurface_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#polygonizeObject



517
518
519
520
521
522
# File 'lib/ffi-geos/geometry.rb', line 517

def polygonize
  ary = FFI::MemoryPointer.new(:pointer)
  ary.write_array_of_pointer([ self.ptr ])

  cast_geometry_ptr(FFIGeos.GEOSPolygonize_r(Geos.current_handle, ary, 1), :srid_copy => self.srid).to_a
end

#polygonize_cut_edgesObject



524
525
526
527
528
529
# File 'lib/ffi-geos/geometry.rb', line 524

def polygonize_cut_edges
  ary = FFI::MemoryPointer.new(:pointer)
  ary.write_array_of_pointer([ self.ptr ])

  cast_geometry_ptr(FFIGeos.GEOSPolygonizer_getCutEdges_r(Geos.current_handle, ary, 1), :srid_copy => self.srid).to_a
end

#polygonize_fullObject

Returns a Hash with the following structure:

{
  :rings => [ ... ],
  :cuts => [ ... ],
  :dangles => [ ... ],
  :invalid_rings => [ ... ]
}


494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
# File 'lib/ffi-geos/geometry.rb', line 494

def polygonize_full
  cuts = FFI::MemoryPointer.new(:pointer)
  dangles = FFI::MemoryPointer.new(:pointer)
  invalid_rings = FFI::MemoryPointer.new(:pointer)

  rings = cast_geometry_ptr(
    FFIGeos.GEOSPolygonize_full_r(Geos.current_handle, self.ptr, cuts, dangles, invalid_rings), {
      :srid_copy => self.srid
    }
  )

  cuts = cast_geometry_ptr(cuts.read_pointer, :srid_copy => self.srid)
  dangles = cast_geometry_ptr(dangles.read_pointer, :srid_copy => self.srid)
  invalid_rings = cast_geometry_ptr(invalid_rings.read_pointer, :srid_copy => self.srid)

  {
    :rings => rings.to_a,
    :cuts => cuts.to_a,
    :dangles => dangles.to_a,
    :invalid_rings => invalid_rings.to_a
  }
end

#project(geom, normalized = false) ⇒ Object

Raises:

  • (TypeError)


393
394
395
396
397
398
399
400
401
# File 'lib/ffi-geos/geometry.rb', line 393

def project(geom, normalized = false)
  raise TypeError.new("Expected Geos::Point type") if !geom.is_a?(Geos::Point)

  if normalized
    FFIGeos.GEOSProjectNormalized_r(Geos.current_handle, self.ptr, geom.ptr)
  else
    FFIGeos.GEOSProject_r(Geos.current_handle, self.ptr, geom.ptr)
  end
end

#project_normalized(geom) ⇒ Object



403
404
405
# File 'lib/ffi-geos/geometry.rb', line 403

def project_normalized(geom)
  self.project(geom, true)
end

#relate(geom) ⇒ Object

Returns the Dimensionally Extended Nine-Intersection Model (DE-9IM) matrix of the geometries as a String.



203
204
205
206
# File 'lib/ffi-geos/geometry.rb', line 203

def relate(geom)
  check_geometry(geom)
  FFIGeos.GEOSRelate_r(Geos.current_handle, self.ptr, geom.ptr)
end

#relate_boundary_node_rule(geom, bnr = :mod2) ⇒ Object

Available in GEOS 3.3+.



216
217
218
219
220
# File 'lib/ffi-geos/geometry.rb', line 216

def relate_boundary_node_rule(geom, bnr = :mod2)
  check_geometry(geom)
  check_enum_value(Geos::RelateBoundaryNodeRules, bnr)
  FFIGeos.GEOSRelateBoundaryNodeRule_r(Geos.current_handle, self.ptr, geom.ptr, bnr)
end

#relate_pattern(geom, pattern) ⇒ Object

Checks the DE-9IM pattern against the geoms.



209
210
211
212
# File 'lib/ffi-geos/geometry.rb', line 209

def relate_pattern(geom, pattern)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSRelatePattern_r(Geos.current_handle, self.ptr, geom.ptr, pattern))
end

#ring?Boolean

Returns:

  • (Boolean)


382
383
384
# File 'lib/ffi-geos/geometry.rb', line 382

def ring?
  bool_result(FFIGeos.GEOSisRing_r(Geos.current_handle, self.ptr))
end

#shared_paths(geom) ⇒ Object



479
480
481
482
483
484
# File 'lib/ffi-geos/geometry.rb', line 479

def shared_paths(geom)
  check_geometry(geom)
  cast_geometry_ptr(FFIGeos.GEOSSharedPaths_r(Geos.current_handle, self.ptr, geom.ptr), {
    :srid_copy => pick_srid_from_geoms(self.srid, geom.srid)
  }).to_a
end

#simple?Boolean

Returns:

  • (Boolean)


378
379
380
# File 'lib/ffi-geos/geometry.rb', line 378

def simple?
  bool_result(FFIGeos.GEOSisSimple_r(Geos.current_handle, self.ptr))
end

#simplify(tolerance) ⇒ Object



227
228
229
# File 'lib/ffi-geos/geometry.rb', line 227

def simplify(tolerance)
  cast_geometry_ptr(FFIGeos.GEOSSimplify_r(Geos.current_handle, self.ptr, tolerance), :srid_copy => self.srid)
end

#snap(geom, tolerance) ⇒ Object Also known as: snap_to



471
472
473
474
475
476
# File 'lib/ffi-geos/geometry.rb', line 471

def snap(geom, tolerance)
  check_geometry(geom)
  cast_geometry_ptr(FFIGeos.GEOSSnap_r(Geos.current_handle, self.ptr, geom.ptr, tolerance), {
    :srid_copy => pick_srid_from_geoms(self.srid, geom.srid)
  })
end

#sridObject



53
54
55
# File 'lib/ffi-geos/geometry.rb', line 53

def srid
  FFIGeos.GEOSGetSRID_r(Geos.current_handle, self.ptr)
end

#srid=(s) ⇒ Object



57
58
59
# File 'lib/ffi-geos/geometry.rb', line 57

def srid=(s)
  FFIGeos.GEOSSetSRID_r(Geos.current_handle, self.ptr, s)
end

#start_pointObject



422
423
424
# File 'lib/ffi-geos/geometry.rb', line 422

def start_point
  cast_geometry_ptr(FFIGeos.GEOSGeomGetStartPoint_r(Geos.current_handle, self.ptr), :srid_copy => self.srid)
end

#sym_difference(geom) ⇒ Object Also known as: symmetric_difference



142
143
144
145
146
147
# File 'lib/ffi-geos/geometry.rb', line 142

def sym_difference(geom)
  check_geometry(geom)
  cast_geometry_ptr(FFIGeos.GEOSSymDifference_r(Geos.current_handle, self.ptr, geom.ptr), {
    :srid_copy => pick_srid_from_geoms(self.srid, geom.srid)
  })
end

#to_preparedObject



531
532
533
# File 'lib/ffi-geos/geometry.rb', line 531

def to_prepared
  Geos::PreparedGeometry.new(self)
end

#to_sObject



535
536
537
538
539
540
541
542
543
# File 'lib/ffi-geos/geometry.rb', line 535

def to_s
  writer = WktWriter.new
  wkt = writer.write(self)
  if wkt.length > 120
    wkt = "#{wkt[0...120]} ... "
  end

  "#<Geos::#{self.geom_type}: #{wkt}>"
end

#topology_preserve_simplify(tolerance) ⇒ Object



231
232
233
# File 'lib/ffi-geos/geometry.rb', line 231

def topology_preserve_simplify(tolerance)
  cast_geometry_ptr(FFIGeos.GEOSTopologyPreserveSimplify_r(Geos.current_handle, self.ptr, tolerance), :srid_copy => self.srid)
end

#touches?(geom) ⇒ Boolean

Returns:

  • (Boolean)


245
246
247
248
# File 'lib/ffi-geos/geometry.rb', line 245

def touches?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSTouches_r(Geos.current_handle, self.ptr, geom.ptr))
end

#type_idObject

Returns one of the values from Geos::GeomTypes.



40
41
42
# File 'lib/ffi-geos/geometry.rb', line 40

def type_id
  FFIGeos.GEOSGeomTypeId_r(Geos.current_handle, self.ptr)
end

#unary_unionObject

Available in GEOS 3.3+



180
181
182
183
184
# File 'lib/ffi-geos/geometry.rb', line 180

def unary_union
  cast_geometry_ptr(FFIGeos.GEOSUnaryUnion_r(Geos.current_handle, self.ptr), {
    :srid_copy => self.srid
  })
end

#union(geom = nil) ⇒ Object

Calling without a geom argument is equivalent to calling unary_union when using GEOS 3.3+ and is equivalent to calling union_cascaded in older versions.



157
158
159
160
161
162
163
164
165
166
167
168
169
170
# File 'lib/ffi-geos/geometry.rb', line 157

def union(geom = nil)
  if geom
    check_geometry(geom)
    cast_geometry_ptr(FFIGeos.GEOSUnion_r(Geos.current_handle, self.ptr, geom.ptr), {
      :srid_copy => pick_srid_from_geoms(self.srid, geom.srid)
    })
  else
    if self.respond_to?(:unary_union)
      self.unary_union
    else
      self.union_cascaded
    end
  end
end

#union_cascadedObject



172
173
174
175
176
# File 'lib/ffi-geos/geometry.rb', line 172

def union_cascaded
  cast_geometry_ptr(FFIGeos.GEOSUnionCascaded_r(Geos.current_handle, self.ptr), {
    :srid_copy => self.srid
  })
end

#valid?Boolean

Returns:

  • (Boolean)


344
345
346
# File 'lib/ffi-geos/geometry.rb', line 344

def valid?
  bool_result(FFIGeos.GEOSisValid_r(Geos.current_handle, self.ptr))
end

#valid_detail(flags = 0) ⇒ Object

Returns a Hash containing the following structure on invalid geometries:

{
  :detail => "String explaining the problem",
  :location => Geos::Point # centered on the problem
}

If the Geometry is valid, returns nil.



361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
# File 'lib/ffi-geos/geometry.rb', line 361

def valid_detail(flags = 0)
  detail = FFI::MemoryPointer.new(:pointer)
  location = FFI::MemoryPointer.new(:pointer)
  valid = bool_result(
    FFIGeos.GEOSisValidDetail_r(Geos.current_handle, self.ptr, flags, detail, location)
  )

  if !valid
    {
      :detail => detail.read_pointer.read_string,
      :location => cast_geometry_ptr(location.read_pointer, {
        :srid_copy => self.srid
      })
    }
  end
end

#valid_reasonObject

Returns a String describing whether or not the Geometry is valid.



349
350
351
# File 'lib/ffi-geos/geometry.rb', line 349

def valid_reason
  FFIGeos.GEOSisValidReason_r(Geos.current_handle, self.ptr)
end

#within?(geom) ⇒ Boolean

Returns:

  • (Boolean)


260
261
262
263
# File 'lib/ffi-geos/geometry.rb', line 260

def within?(geom)
  check_geometry(geom)
  bool_result(FFIGeos.GEOSWithin_r(Geos.current_handle, self.ptr, geom.ptr))
end