Module: Geos::Utils
Constant Summary
Constants included
from GeomTypes
GeomTypes::GEOS_GEOMETRYCOLLECTION, GeomTypes::GEOS_LINEARRING, GeomTypes::GEOS_LINESTRING, GeomTypes::GEOS_MULTILINESTRING, GeomTypes::GEOS_MULTIPOINT, GeomTypes::GEOS_MULTIPOLYGON, GeomTypes::GEOS_POINT, GeomTypes::GEOS_POLYGON
Class Method Summary
collapse
Instance Method Summary
collapse
Methods included from Tools
bool_result, bool_to_int, cast_geometry_ptr, check_enum_value, check_geometry, extract_options!, pick_srid_according_to_policy, pick_srid_from_geoms, symbol_for_enum
Class Method Details
.create_collection(t, *args) ⇒ Object
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
|
# File 'lib/ffi-geos/utils.rb', line 140
def create_collection(t, *args)
check_enum_value(Geos::GeometryTypes, t)
klass = case t
when GEOS_MULTIPOINT, :multi_point
Geos::Point
when GEOS_MULTILINESTRING, :multi_line_string
Geos::LineString
when GEOS_MULTIPOLYGON, :multi_polygon
Geos::Polygon
when GEOS_GEOMETRYCOLLECTION, :geometry_collection
Geos::Geometry
end
options = (args)
geoms = Array(args).flatten.tap do |i|
if i.detect { |g| !g.is_a?(klass) }
raise TypeError, "Expected geoms Array to contain #{klass} objects"
end
end
geoms_dups = geoms.map(&:dup)
geoms_dups.each do |i|
i.ptr.autorelease = false
end
ary = FFI::MemoryPointer.new(:pointer, geoms.length)
ary.write_array_of_pointer(geoms_dups.map(&:ptr))
cast_geometry_ptr(FFIGeos.GEOSGeom_createCollection_r(Geos.current_handle_pointer, t, ary, geoms_dups.length), srid: options[:srid])
end
|
.create_empty_collection(t, options = {}) ⇒ Object
115
116
117
118
|
# File 'lib/ffi-geos/utils.rb', line 115
def create_empty_collection(t, options = {})
check_enum_value(Geos::GeometryTypes, t)
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyCollection_r(Geos.current_handle_pointer, t), srid: options[:srid])
end
|
.create_empty_geometry_collection(options = {}) ⇒ Object
132
133
134
|
# File 'lib/ffi-geos/utils.rb', line 132
def create_empty_geometry_collection(options = {})
create_empty_collection(:geometry_collection, options)
end
|
.create_empty_line_string(options = {}) ⇒ Object
107
108
109
|
# File 'lib/ffi-geos/utils.rb', line 107
def create_empty_line_string(options = {})
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyLineString_r(Geos.current_handle_pointer), srid: options[:srid])
end
|
.create_empty_linear_ring(options = {}) ⇒ Object
136
137
138
|
# File 'lib/ffi-geos/utils.rb', line 136
def create_empty_linear_ring(options = {})
Geos::WktReader.new.read('LINEARRING EMPTY', options)
end
|
.create_empty_multi_line_string(options = {}) ⇒ Object
124
125
126
|
# File 'lib/ffi-geos/utils.rb', line 124
def create_empty_multi_line_string(options = {})
create_empty_collection(:multi_line_string, options)
end
|
.create_empty_multi_point(options = {}) ⇒ Object
120
121
122
|
# File 'lib/ffi-geos/utils.rb', line 120
def create_empty_multi_point(options = {})
create_empty_collection(:multi_point, options)
end
|
.create_empty_multi_polygon(options = {}) ⇒ Object
128
129
130
|
# File 'lib/ffi-geos/utils.rb', line 128
def create_empty_multi_polygon(options = {})
create_empty_collection(:multi_polygon, options)
end
|
.create_empty_point(options = {}) ⇒ Object
103
104
105
|
# File 'lib/ffi-geos/utils.rb', line 103
def create_empty_point(options = {})
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPoint_r(Geos.current_handle_pointer), srid: options[:srid])
end
|
.create_empty_polygon(options = {}) ⇒ Object
111
112
113
|
# File 'lib/ffi-geos/utils.rb', line 111
def create_empty_polygon(options = {})
cast_geometry_ptr(FFIGeos.GEOSGeom_createEmptyPolygon_r(Geos.current_handle_pointer), srid: options[:srid])
end
|
.create_geometry_collection(*args) ⇒ Object
185
186
187
|
# File 'lib/ffi-geos/utils.rb', line 185
def create_geometry_collection(*args)
create_collection(:geometry_collection, *args)
end
|
.create_line_string(cs, options = {}) ⇒ Object
56
57
58
59
60
61
62
63
64
65
66
67
|
# File 'lib/ffi-geos/utils.rb', line 56
def create_line_string(cs, options = {})
cs = cs_from_cs_or_geom(cs)
if cs.length <= 1 && cs.length != 0
raise ArgumentError, 'IllegalArgumentException: point array must contain 0 or >1 elements'
end
cs_dup = cs.dup
cs_dup.ptr.autorelease = false
cast_geometry_ptr(FFIGeos.GEOSGeom_createLineString_r(Geos.current_handle_pointer, cs_dup.ptr), srid: options[:srid])
end
|
.create_linear_ring(cs, options = {}) ⇒ Object
69
70
71
72
73
74
75
76
77
78
79
|
# File 'lib/ffi-geos/utils.rb', line 69
def create_linear_ring(cs, options = {})
cs = cs_from_cs_or_geom(cs)
if cs.length <= 1 && cs.length != 0
raise ArgumentError, 'IllegalArgumentException: point array must contain 0 or >1 elements'
end
cs.ptr.autorelease = false
cast_geometry_ptr(FFIGeos.GEOSGeom_createLinearRing_r(Geos.current_handle_pointer, cs.ptr), srid: options[:srid])
end
|
.create_multi_line_string(*args) ⇒ Object
177
178
179
|
# File 'lib/ffi-geos/utils.rb', line 177
def create_multi_line_string(*args)
create_collection(:multi_line_string, *args)
end
|
.create_multi_point(*args) ⇒ Object
173
174
175
|
# File 'lib/ffi-geos/utils.rb', line 173
def create_multi_point(*args)
create_collection(:multi_point, *args)
end
|
.create_multi_polygon(*args) ⇒ Object
181
182
183
|
# File 'lib/ffi-geos/utils.rb', line 181
def create_multi_polygon(*args)
create_collection(:multi_polygon, *args)
end
|
.create_point(*args) ⇒ Object
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
# File 'lib/ffi-geos/utils.rb', line 30
def create_point(*args)
options = (args)
if args.length == 1
cs = args.first
elsif args.length == 2
cs = CoordinateSequence.new(1, 2)
cs.x[0] = args[0].to_f
cs.y[0] = args[1].to_f
elsif args.length == 3
cs = CoordinateSequence.new(1, 3)
cs.x[0], cs.y[0], cs.z[0] = args.map(&:to_f)
else
raise ArgumentError, "Wrong number of arguments (#{args.length} for 1-3)"
end
if cs.length != 1
raise ArgumentError, 'IllegalArgumentException: Point coordinate list must contain a single element'
end
cs_dup = cs.dup
cs_dup.ptr.autorelease = false
cast_geometry_ptr(FFIGeos.GEOSGeom_createPoint_r(Geos.current_handle_pointer, cs_dup.ptr), srid: options[:srid])
end
|
.create_polygon(outer, *args) ⇒ Object
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# File 'lib/ffi-geos/utils.rb', line 81
def create_polygon(outer, *args)
options = (args)
inner_dups = Array(args).flatten.collect do |i|
force_to_linear_ring(i) or
raise TypeError, 'Expected inner Array to contain Geos::LinearRing or Geos::CoordinateSequence objects'
end
outer_dup = force_to_linear_ring(outer) or
raise TypeError, 'Expected outer shell to be a Geos::LinearRing or Geos::CoordinateSequence'
ary = FFI::MemoryPointer.new(:pointer, inner_dups.length)
ary.write_array_of_pointer(inner_dups.map(&:ptr))
outer_dup.ptr.autorelease = false
inner_dups.each do |i|
i.ptr.autorelease = false
end
cast_geometry_ptr(FFIGeos.GEOSGeom_createPolygon_r(Geos.current_handle_pointer, outer_dup.ptr, ary, inner_dups.length), srid: options[:srid])
end
|
Instance Method Details
#orientation_index(ax, ay, bx, by, px, py) ⇒ Object
-
-1 if reaching P takes a counter-clockwise (left) turn
-
1 if reaching P takes a clockwise (right) turn
-
0 if P is collinear with A-B
Available in GEOS 3.3.0+.
15
16
17
18
19
20
|
# File 'lib/ffi-geos/utils.rb', line 15
def orientation_index(ax, ay, bx, by, px, py)
FFIGeos.GEOSOrientationIndex_r(
Geos.current_handle_pointer,
ax, ay, bx, by, px, py
)
end
|
#relate_match(mat, pat) ⇒ Object
Available in GEOS 3.3.0+.