charta 0.1.8 → 0.1.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +5 -5
- data/charta.gemspec +0 -2
- data/lib/charta/geometry.rb +47 -32
- data/lib/charta/geometry_collection.rb +2 -2
- data/lib/charta/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: cf89b408699b34e871d1b85a23315e3e2d735b5c
|
4
|
+
data.tar.gz: '02795fccd17495a483a93d3a1752c874a28d7e48'
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b9c290de3bebb7d8d10ef5a3b179fa7adaedc20555a82552500cf30dd3131594824efb8292f9a618f030aeedaf9e4775f4f165f32074e755df860204abbf1988
|
7
|
+
data.tar.gz: 363f6dc4da4a6f296460f9e38ec34051a8a980069829c362827e6d29bb3f110c51976b9e9890ea5b0badd52af5093f5658cf6ab7ee43558bb985b2d5b3b2e1ca
|
data/Rakefile
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require 'bundler/gem_tasks'
|
2
|
+
require 'rake/testtask'
|
3
3
|
|
4
4
|
Rake::TestTask.new(:test) do |t|
|
5
|
-
t.libs <<
|
6
|
-
t.libs <<
|
5
|
+
t.libs << 'test'
|
6
|
+
t.libs << 'lib'
|
7
7
|
t.test_files = FileList['test/**/*_test.rb']
|
8
8
|
end
|
9
9
|
|
10
|
-
task :
|
10
|
+
task default: :test
|
data/charta.gemspec
CHANGED
data/lib/charta/geometry.rb
CHANGED
@@ -6,9 +6,8 @@ module Charta
|
|
6
6
|
# Represents a Geometry with SRID
|
7
7
|
class Geometry
|
8
8
|
def initialize(feature, properties = {})
|
9
|
-
|
9
|
+
self.feature = feature
|
10
10
|
@properties = properties
|
11
|
-
# raise ArgumentError, 'Need EWKT to instantiate Geometry' if @ewkt.to_s =~ /\A[[:space:]]*\z/
|
12
11
|
end
|
13
12
|
|
14
13
|
def inspect
|
@@ -18,7 +17,7 @@ module Charta
|
|
18
17
|
# Returns the type of the geometry as a string. Example: point,
|
19
18
|
# multi_polygon, geometry_collection...
|
20
19
|
def type
|
21
|
-
Charta.underscore(
|
20
|
+
Charta.underscore(feature.geometry_type.type_name).to_sym
|
22
21
|
end
|
23
22
|
|
24
23
|
# Returns the type of the geometry as a string. EG: 'ST_Linestring', 'ST_Polygon',
|
@@ -26,29 +25,30 @@ module Charta
|
|
26
25
|
# in the case of the string and ST in front that is returned, as well as the fact
|
27
26
|
# that it will not indicate whether the geometry is measured.
|
28
27
|
def collection?
|
29
|
-
|
28
|
+
feature.geometry_type == RGeo::Feature::GeometryCollection
|
30
29
|
end
|
31
30
|
|
32
31
|
# Return the spatial reference identifier for the ST_Geometry
|
33
32
|
def srid
|
34
|
-
|
33
|
+
feature.srid.to_i
|
35
34
|
end
|
36
35
|
|
37
36
|
# Returns the underlaying object managed by Charta: the RGeo feature
|
38
37
|
def to_rgeo
|
39
|
-
|
38
|
+
feature
|
40
39
|
end
|
41
40
|
|
42
|
-
# Returns the Well-Known Text (WKT) representation of the geometry/geography
|
41
|
+
# Returns the Well-Known Text (WKT) representation of the geometry/geography
|
42
|
+
# without SRID metadata
|
43
43
|
def to_text
|
44
|
-
|
44
|
+
feature.as_text.match(/\ASRID=.*;(.*)/)[1]
|
45
45
|
end
|
46
46
|
alias as_text to_text
|
47
47
|
alias to_wkt to_text
|
48
48
|
|
49
49
|
# Returns EWKT: WKT with its SRID
|
50
50
|
def to_ewkt
|
51
|
-
Charta.generate_ewkt(
|
51
|
+
Charta.generate_ewkt(feature).to_s
|
52
52
|
end
|
53
53
|
alias to_s to_ewkt
|
54
54
|
|
@@ -60,7 +60,7 @@ module Charta
|
|
60
60
|
# Return the Well-Known Binary (WKB) representation of the geometry with SRID meta data.
|
61
61
|
def to_binary
|
62
62
|
generator = RGeo::WKRep::WKBGenerator.new(tag_format: :ewkbt, emit_ewkbt_srid: true)
|
63
|
-
generator.generate(
|
63
|
+
generator.generate(feature)
|
64
64
|
end
|
65
65
|
alias to_ewkb to_binary
|
66
66
|
|
@@ -78,7 +78,7 @@ module Charta
|
|
78
78
|
|
79
79
|
# Return the geometry as Scalar Vector Graphics (SVG) path data.
|
80
80
|
def to_svg_path
|
81
|
-
RGeo::SVG.encode(
|
81
|
+
RGeo::SVG.encode(feature)
|
82
82
|
end
|
83
83
|
|
84
84
|
# Return the geometry as a Geometry Javascript Object Notation (GeoJSON) element.
|
@@ -89,7 +89,7 @@ module Charta
|
|
89
89
|
|
90
90
|
# Returns object in JSON (Hash)
|
91
91
|
def to_json_object
|
92
|
-
RGeo::GeoJSON.encode(
|
92
|
+
RGeo::GeoJSON.encode(feature)
|
93
93
|
end
|
94
94
|
|
95
95
|
# Test if the other measure is equal to self
|
@@ -97,7 +97,7 @@ module Charta
|
|
97
97
|
other_geometry = Charta.new_geometry(other).transform(srid)
|
98
98
|
return true if empty? && other_geometry.empty?
|
99
99
|
return inspect == other_geometry.inspect if collection? && other_geometry.collection?
|
100
|
-
|
100
|
+
feature.equals?(other_geometry.feature)
|
101
101
|
end
|
102
102
|
|
103
103
|
# Test if the other measure is equal to self
|
@@ -105,38 +105,38 @@ module Charta
|
|
105
105
|
other_geometry = Charta.new_geometry(other).transform(srid)
|
106
106
|
return true if empty? && other_geometry.empty?
|
107
107
|
return inspect == other_geometry.inspect if collection? && other_geometry.collection?
|
108
|
-
|
108
|
+
!feature.equals?(other_geometry.feature)
|
109
109
|
end
|
110
110
|
|
111
111
|
# Returns true if Geometry is a Surface
|
112
112
|
def surface?
|
113
|
-
[RGeo::Feature::Polygon, RGeo::Feature::MultiPolygon].include?
|
113
|
+
[RGeo::Feature::Polygon, RGeo::Feature::MultiPolygon].include? feature.geometry_type
|
114
114
|
end
|
115
115
|
|
116
116
|
# Returns area in unit corresponding to the SRS
|
117
117
|
def area
|
118
|
-
surface? ?
|
118
|
+
surface? ? feature.area : 0
|
119
119
|
end
|
120
120
|
|
121
121
|
# Returns true if this Geometry is an empty geometrycollection, polygon,
|
122
122
|
# point etc.
|
123
123
|
def empty?
|
124
|
-
|
124
|
+
feature.is_empty?
|
125
125
|
end
|
126
126
|
alias blank? empty?
|
127
127
|
|
128
128
|
# Computes the geometric center of a geometry, or equivalently, the center
|
129
129
|
# of mass of the geometry as a POINT.
|
130
130
|
def centroid
|
131
|
-
return nil unless surface? &&
|
132
|
-
point =
|
131
|
+
return nil unless surface? && !feature.is_empty?
|
132
|
+
point = feature.centroid
|
133
133
|
[point.y, point.x]
|
134
134
|
end
|
135
135
|
|
136
136
|
# Returns a POINT guaranteed to lie on the surface.
|
137
137
|
def point_on_surface
|
138
138
|
return nil unless surface?
|
139
|
-
point =
|
139
|
+
point = feature.point_on_surface
|
140
140
|
[point.y, point.x]
|
141
141
|
end
|
142
142
|
|
@@ -153,9 +153,9 @@ module Charta
|
|
153
153
|
items = []
|
154
154
|
as_multi_type = "multi_#{as_type}".to_sym
|
155
155
|
if type == as_type
|
156
|
-
items <<
|
156
|
+
items << feature
|
157
157
|
elsif type == :geometry_collection
|
158
|
-
|
158
|
+
feature.each do |geom|
|
159
159
|
type_name = Charta.underscore(geom.geometry_type.type_name).to_sym
|
160
160
|
if type_name == as_type
|
161
161
|
items << geom
|
@@ -166,7 +166,7 @@ module Charta
|
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
169
|
-
Charta.new_geometry(
|
169
|
+
Charta.new_geometry(feature.factory.send(as_multi_type, items))
|
170
170
|
end
|
171
171
|
|
172
172
|
# Returns a new geometry with the coordinates converted into the new SRS
|
@@ -179,7 +179,7 @@ module Charta
|
|
179
179
|
raise "Cannot find proj for SRID: #{new_srid}" if new_proj_entry.nil?
|
180
180
|
new_feature = RGeo::CoordSys::Proj4.transform(
|
181
181
|
database.get(srid).proj4,
|
182
|
-
|
182
|
+
feature,
|
183
183
|
new_proj_entry.proj4,
|
184
184
|
self.class.factory(new_srid)
|
185
185
|
)
|
@@ -189,29 +189,29 @@ module Charta
|
|
189
189
|
|
190
190
|
# Produces buffer
|
191
191
|
def buffer(radius)
|
192
|
-
|
192
|
+
feature.buffer(radius)
|
193
193
|
end
|
194
194
|
|
195
195
|
def merge(other)
|
196
196
|
other_geometry = Charta.new_geometry(other).transform(srid)
|
197
|
-
|
197
|
+
feature.union(other_geometry.feature)
|
198
198
|
end
|
199
199
|
alias + merge
|
200
200
|
|
201
201
|
def intersection(other)
|
202
202
|
other_geometry = Charta.new_geometry(other).transform(srid)
|
203
|
-
|
203
|
+
feature.intersection(other_geometry.feature)
|
204
204
|
end
|
205
205
|
|
206
206
|
def difference(other)
|
207
207
|
other_geometry = Charta.new_geometry(other).transform(srid)
|
208
|
-
|
208
|
+
feature.difference(other_geometry.feature)
|
209
209
|
end
|
210
210
|
alias - difference
|
211
211
|
|
212
212
|
def bounding_box
|
213
213
|
unless defined? @bounding_box
|
214
|
-
bbox = RGeo::Cartesian::BoundingBox.create_from_geometry(
|
214
|
+
bbox = RGeo::Cartesian::BoundingBox.create_from_geometry(feature)
|
215
215
|
instance_variable_set('@x_min', bbox.min_x || 0)
|
216
216
|
instance_variable_set('@y_min', bbox.min_y || 0)
|
217
217
|
instance_variable_set('@x_max', bbox.max_x || 0)
|
@@ -231,8 +231,23 @@ module Charta
|
|
231
231
|
Charta.find_srid(name_or_srid)
|
232
232
|
end
|
233
233
|
|
234
|
+
# TODO: Manage YAML domain type to ensure maintainability of YAML
|
235
|
+
# serialization in time.
|
234
236
|
def feature
|
235
|
-
@feature
|
237
|
+
if @feature.nil?
|
238
|
+
if @ewkt.nil?
|
239
|
+
raise StandardError, 'Invalid geometry (no feature, no EWKT)'
|
240
|
+
else
|
241
|
+
@feature = ::Charta::Geometry.from_ewkt(@ewkt)
|
242
|
+
@properties = @options.dup if @options
|
243
|
+
end
|
244
|
+
end
|
245
|
+
@feature.dup
|
246
|
+
end
|
247
|
+
|
248
|
+
def feature=(new_feature)
|
249
|
+
raise ArgumentError, "Feature can't be nil" if new_feature.nil?
|
250
|
+
@feature = new_feature
|
236
251
|
end
|
237
252
|
|
238
253
|
def to_json_feature(properties = {})
|
@@ -254,8 +269,6 @@ module Charta
|
|
254
269
|
from_ewkt(ewkt_or_rgeo)
|
255
270
|
end
|
256
271
|
|
257
|
-
private
|
258
|
-
|
259
272
|
def from_rgeo(rgeo)
|
260
273
|
srid = rgeo.srid
|
261
274
|
RGeo::Feature.cast(rgeo, factory: Geometry.factory(srid))
|
@@ -273,6 +286,8 @@ module Charta
|
|
273
286
|
raise "Invalid EWKT (#{e.class.name}: #{e.message}): #{ewkt}"
|
274
287
|
end
|
275
288
|
|
289
|
+
private
|
290
|
+
|
276
291
|
def geos_factory(srid)
|
277
292
|
RGeo::Geos.factory(
|
278
293
|
srid: srid,
|
@@ -3,12 +3,12 @@ module Charta
|
|
3
3
|
class GeometryCollection < Geometry
|
4
4
|
def self.empty(srid = nil)
|
5
5
|
srid = Charta.find_srid(srid.nil? ? :WGS84 : srid)
|
6
|
-
feature = Charta.new_feature(
|
6
|
+
feature = Charta.new_feature('GEOMETRYCOLLECTION EMPTY', srid)
|
7
7
|
new(feature)
|
8
8
|
end
|
9
9
|
|
10
10
|
def to_json_feature_collection(collection_properties = [])
|
11
|
-
features = feature.each.with_index.collect do |f,i|
|
11
|
+
features = feature.each.with_index.collect do |f, i|
|
12
12
|
properties = {}
|
13
13
|
properties = collection_properties[i] unless collection_properties[i].nil?
|
14
14
|
|
data/lib/charta/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: charta
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brice TEXIER
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-10-
|
11
|
+
date: 2017-10-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|