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
135
136
137
138
139
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
|
# File 'lib/ffi-geos/utils.rb', line 135
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|
raise TypeError, "Expected geoms Array to contain #{klass} objects" if i.detect { |g| !g.is_a?(klass) }
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
110
111
112
113
|
# File 'lib/ffi-geos/utils.rb', line 110
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
127
128
129
|
# File 'lib/ffi-geos/utils.rb', line 127
def create_empty_geometry_collection(options = {})
create_empty_collection(:geometry_collection, options)
end
|
.create_empty_line_string(options = {}) ⇒ Object
102
103
104
|
# File 'lib/ffi-geos/utils.rb', line 102
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
131
132
133
|
# File 'lib/ffi-geos/utils.rb', line 131
def create_empty_linear_ring(options = {})
Geos::WktReader.new.read('LINEARRING EMPTY', options)
end
|
.create_empty_multi_line_string(options = {}) ⇒ Object
119
120
121
|
# File 'lib/ffi-geos/utils.rb', line 119
def create_empty_multi_line_string(options = {})
create_empty_collection(:multi_line_string, options)
end
|
.create_empty_multi_point(options = {}) ⇒ Object
115
116
117
|
# File 'lib/ffi-geos/utils.rb', line 115
def create_empty_multi_point(options = {})
create_empty_collection(:multi_point, options)
end
|
.create_empty_multi_polygon(options = {}) ⇒ Object
123
124
125
|
# File 'lib/ffi-geos/utils.rb', line 123
def create_empty_multi_polygon(options = {})
create_empty_collection(:multi_polygon, options)
end
|
.create_empty_point(options = {}) ⇒ Object
98
99
100
|
# File 'lib/ffi-geos/utils.rb', line 98
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
106
107
108
|
# File 'lib/ffi-geos/utils.rb', line 106
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
178
179
180
|
# File 'lib/ffi-geos/utils.rb', line 178
def create_geometry_collection(*args)
create_collection(:geometry_collection, *args)
end
|
.create_line_string(cs, options = {}) ⇒ Object
55
56
57
58
59
60
61
62
63
64
|
# File 'lib/ffi-geos/utils.rb', line 55
def create_line_string(cs, options = {})
cs = cs_from_cs_or_geom(cs)
raise ArgumentError, 'IllegalArgumentException: point array must contain 0 or >1 elements' if cs.length <= 1 && !cs.empty?
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
66
67
68
69
70
71
72
73
74
|
# File 'lib/ffi-geos/utils.rb', line 66
def create_linear_ring(cs, options = {})
cs = cs_from_cs_or_geom(cs)
raise ArgumentError, 'IllegalArgumentException: point array must contain 0 or >1 elements' if cs.length <= 1 && !cs.empty?
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
170
171
172
|
# File 'lib/ffi-geos/utils.rb', line 170
def create_multi_line_string(*args)
create_collection(:multi_line_string, *args)
end
|
.create_multi_point(*args) ⇒ Object
166
167
168
|
# File 'lib/ffi-geos/utils.rb', line 166
def create_multi_point(*args)
create_collection(:multi_point, *args)
end
|
.create_multi_polygon(*args) ⇒ Object
174
175
176
|
# File 'lib/ffi-geos/utils.rb', line 174
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
|
# File 'lib/ffi-geos/utils.rb', line 30
def create_point(*args)
options = (args)
case args.length
when 1
cs = args.first
when 2
cs = CoordinateSequence.new(1, 2)
cs.x[0] = args[0].to_f
cs.y[0] = args[1].to_f
when 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
raise ArgumentError, 'IllegalArgumentException: Point coordinate list must contain a single element' if cs.length != 1
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
# File 'lib/ffi-geos/utils.rb', line 76
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+.