postgis_adapter 0.7.2 → 0.7.5
Sign up to get free protection for your applications and to get access to all the features.
- data/VERSION +1 -1
- data/lib/postgis_adapter/acts_as_geom.rb +7 -6
- data/lib/postgis_functions/common.rb +16 -3
- data/lib/postgis_functions.rb +7 -1
- data/postgis_adapter.gemspec +8 -7
- data/spec/db/models_postgis.rb +4 -0
- data/spec/db/schema_postgis.rb +18 -12
- data/spec/postgis_adapter/common_spatial_adapter_spec.rb +4 -4
- data/spec/postgis_functions/common_spec.rb +43 -1
- data/spec/spec_helper.rb +3 -3
- metadata +5 -5
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.7.
|
1
|
+
0.7.5
|
@@ -10,22 +10,23 @@ module PostgisFunctions
|
|
10
10
|
|
11
11
|
module ClassMethods
|
12
12
|
|
13
|
-
#
|
13
|
+
# has_geom :db_field => :geom_type
|
14
14
|
# Examples:
|
15
15
|
#
|
16
|
-
#
|
17
|
-
#
|
18
|
-
#
|
16
|
+
# has_geom :data => :point
|
17
|
+
# has_geom :geom => :line_string
|
18
|
+
# has_geom :geom => :polygon
|
19
19
|
#
|
20
|
-
def
|
20
|
+
def has_geom(*geom)
|
21
21
|
cattr_accessor :postgis_geoms
|
22
22
|
self.postgis_geoms = geom[0] # {:columns => column
|
23
23
|
send :include, case geom[0].values[0]
|
24
24
|
when :point then PointFunctions
|
25
25
|
when :polygon then PolygonFunctions
|
26
|
-
when :line_string then LineStringFunctions
|
26
|
+
when :line_string, :multi_line_string then LineStringFunctions
|
27
27
|
end unless geom[0].kind_of? Symbol
|
28
28
|
end
|
29
|
+
alias :acts_as_geom :has_geom
|
29
30
|
|
30
31
|
def get_geom_type(column)
|
31
32
|
self.postgis_geoms.values[0] rescue nil
|
@@ -329,6 +329,9 @@ module PostgisFunctions
|
|
329
329
|
postgis_calculate(:touches, [self, other])
|
330
330
|
end
|
331
331
|
|
332
|
+
def st_collect(other=nil)
|
333
|
+
postgis_calculate(:collect, [self, other])
|
334
|
+
end
|
332
335
|
#
|
333
336
|
# The convex hull of a geometry represents the minimum closed geometry that
|
334
337
|
# encloses all geometries within the set.
|
@@ -506,8 +509,8 @@ module PostgisFunctions
|
|
506
509
|
#
|
507
510
|
# http://geojson.org/
|
508
511
|
#
|
509
|
-
def as_geo_json
|
510
|
-
postgis_calculate(:AsGeoJSON, self)
|
512
|
+
def as_geo_json(precision=15, bbox=0)
|
513
|
+
postgis_calculate(:AsGeoJSON, self, [precision, bbox])
|
511
514
|
end
|
512
515
|
|
513
516
|
|
@@ -687,9 +690,19 @@ module PostgisFunctions
|
|
687
690
|
# #float ST_Max_Distance(geometry g1, geometry g2);
|
688
691
|
# postgis_calculate(:max_distance, [self, other])
|
689
692
|
#end
|
690
|
-
end
|
691
693
|
|
694
|
+
#
|
695
|
+
# Returns a (set of) LineString(s) formed by sewing together a MULTILINESTRING.
|
696
|
+
#
|
697
|
+
# Only use with MULTILINESTRING/LINESTRINGs. If you feed a polygon or geometry collection into this function, it will return an empty GEOMETRYCOLLECTION
|
698
|
+
#
|
699
|
+
# Returns geometry ST_LineMerge(geometry amultilinestring);
|
700
|
+
#
|
701
|
+
def line_merge
|
702
|
+
postgis_calculate(:LineMerge, self, { :stcollect => self})
|
703
|
+
end
|
692
704
|
|
705
|
+
end
|
693
706
|
#
|
694
707
|
#
|
695
708
|
#
|
data/lib/postgis_functions.rb
CHANGED
@@ -50,13 +50,18 @@ module PostgisFunctions
|
|
50
50
|
# Implement a better way for options?
|
51
51
|
if options.instance_of? Hash
|
52
52
|
transform = options.delete(:transform)
|
53
|
+
stcollect = options.delete(:stcollect)
|
53
54
|
options = nil
|
54
55
|
end
|
55
56
|
|
56
57
|
fields = tables.map { |f| "#{f[:uid]}.#{f[:column]}" } # W1.geom
|
57
58
|
fields << not_db.map { |g| "'#{g.as_hex_ewkb}'::geometry"} unless not_db.empty?
|
58
59
|
fields.map! { |f| "ST_Transform(#{f}, #{transform})" } if transform # ST_Transform(W1.geom,x)
|
59
|
-
|
60
|
+
fields.map! { |f| "ST_Union(#{f})" } if stcollect # ST_Transform(W1.geom,x)
|
61
|
+
conditions = tables.map do |f|
|
62
|
+
raise unless f[:uid]
|
63
|
+
"#{f[:uid]}.id = #{f[:id]}"
|
64
|
+
end # W1.id = 5
|
60
65
|
tables.map! { |f| "#{f[:name]} #{f[:uid]}" } # streets W1
|
61
66
|
|
62
67
|
#
|
@@ -73,6 +78,7 @@ module PostgisFunctions
|
|
73
78
|
fields = fields.join(" #{options} ")
|
74
79
|
end
|
75
80
|
|
81
|
+
|
76
82
|
sql = "SELECT #{opcode}(#{fields}) "
|
77
83
|
sql << "FROM #{tables.join(",")} " unless tables.empty?
|
78
84
|
sql << "WHERE #{conditions.join(" AND ")}" unless conditions.empty?
|
data/postgis_adapter.gemspec
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# Generated by jeweler
|
2
|
-
# DO NOT EDIT THIS FILE
|
3
|
-
# Instead, edit Jeweler::Tasks in Rakefile, and run
|
2
|
+
# DO NOT EDIT THIS FILE DIRECTLY
|
3
|
+
# Instead, edit Jeweler::Tasks in Rakefile, and run the gemspec command
|
4
4
|
# -*- encoding: utf-8 -*-
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{postgis_adapter}
|
8
|
-
s.version = "0.7.
|
8
|
+
s.version = "0.7.5"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Marcos Piccinini"]
|
12
|
-
s.date = %q{
|
12
|
+
s.date = %q{2010-01-29}
|
13
13
|
s.description = %q{Execute PostGIS functions on Active Record}
|
14
14
|
s.email = %q{x@nofxx.com}
|
15
15
|
s.extra_rdoc_files = [
|
@@ -55,12 +55,12 @@ Gem::Specification.new do |s|
|
|
55
55
|
"spec/db/schema_postgis.rb",
|
56
56
|
"spec/postgis_adapter/acts_as_geom_spec.rb",
|
57
57
|
"spec/postgis_adapter/common_spatial_adapter_spec.rb",
|
58
|
-
"spec/postgis_functions_spec.rb",
|
59
|
-
"spec/spec_helper.rb",
|
60
58
|
"spec/postgis_adapter_spec.rb",
|
59
|
+
"spec/postgis_functions/bbox_spec.rb",
|
61
60
|
"spec/postgis_functions/class_spec.rb",
|
62
61
|
"spec/postgis_functions/common_spec.rb",
|
63
|
-
"spec/
|
62
|
+
"spec/postgis_functions_spec.rb",
|
63
|
+
"spec/spec_helper.rb"
|
64
64
|
]
|
65
65
|
|
66
66
|
if s.respond_to? :specification_version then
|
@@ -73,3 +73,4 @@ Gem::Specification.new do |s|
|
|
73
73
|
else
|
74
74
|
end
|
75
75
|
end
|
76
|
+
|
data/spec/db/models_postgis.rb
CHANGED
data/spec/db/schema_postgis.rb
CHANGED
@@ -3,53 +3,53 @@ ActiveRecord::Schema.define() do
|
|
3
3
|
|
4
4
|
create_table "table_points", :force => true do |t|
|
5
5
|
t.string "data"
|
6
|
-
t.point "geom", :null=>false
|
6
|
+
t.point "geom", :null=>false, :srid => 4326
|
7
7
|
end
|
8
8
|
|
9
9
|
create_table "table_keyword_column_points", :force => true do |t|
|
10
|
-
t.point "location", :null => false
|
10
|
+
t.point "location", :null => false, :srid => 4326
|
11
11
|
end
|
12
12
|
|
13
13
|
create_table "table_line_strings", :force => true do |t|
|
14
14
|
t.integer "value"
|
15
|
-
t.line_string "geom", :null=>false
|
15
|
+
t.line_string "geom", :null=>false, :srid => 4326
|
16
16
|
end
|
17
17
|
|
18
18
|
create_table "table_polygons", :force => true do |t|
|
19
|
-
t.polygon "geom", :null=>false
|
19
|
+
t.polygon "geom", :null=>false, :srid => 4326
|
20
20
|
end
|
21
21
|
|
22
22
|
create_table "table_multi_points", :force => true do |t|
|
23
|
-
t.multi_point "geom", :null=>false
|
23
|
+
t.multi_point "geom", :null=>false, :srid => 4326
|
24
24
|
end
|
25
25
|
|
26
26
|
create_table "table_multi_line_strings", :force => true do |t|
|
27
|
-
t.multi_line_string "geom", :null=>false
|
27
|
+
t.multi_line_string "geom", :null=>false, :srid => 4326
|
28
28
|
end
|
29
29
|
|
30
30
|
create_table "table_multi_polygons", :force => true do |t|
|
31
|
-
t.multi_polygon "geom", :null=>false
|
31
|
+
t.multi_polygon "geom", :null=>false, :srid => 4326
|
32
32
|
end
|
33
33
|
|
34
34
|
create_table "table_geometries", :force => true do |t|
|
35
|
-
t.geometry "geom", :null=>false
|
35
|
+
t.geometry "geom", :null=>false, :srid => 4326
|
36
36
|
end
|
37
37
|
|
38
38
|
create_table "table_geometry_collections", :force => true do |t|
|
39
|
-
t.geometry_collection "geom", :null=>false
|
39
|
+
t.geometry_collection "geom", :null=>false, :srid => 4326
|
40
40
|
end
|
41
41
|
|
42
42
|
create_table "table3dz_points", :force => true do |t|
|
43
43
|
t.column "data", :string
|
44
|
-
t.point "geom", :null => false , :with_z => true
|
44
|
+
t.point "geom", :null => false , :with_z => true, :srid => 4326
|
45
45
|
end
|
46
46
|
|
47
47
|
create_table "table3dm_points", :force => true do |t|
|
48
|
-
t.point "geom", :null => false , :with_m => true
|
48
|
+
t.point "geom", :null => false , :with_m => true, :srid => 4326
|
49
49
|
end
|
50
50
|
|
51
51
|
create_table "table4d_points", :force => true do |t|
|
52
|
-
t.point "geom", :null => false, :with_m => true, :with_z => true
|
52
|
+
t.point "geom", :null => false, :with_m => true, :with_z => true, :srid => 4326
|
53
53
|
end
|
54
54
|
|
55
55
|
create_table "table_srid_line_strings", :force => true do |t|
|
@@ -78,6 +78,12 @@ ActiveRecord::Schema.define() do
|
|
78
78
|
t.line_string :geom, :null => false, :srid => 4326
|
79
79
|
end
|
80
80
|
|
81
|
+
create_table :roads, :force => true do |t|
|
82
|
+
t.string :data, :limit => 100
|
83
|
+
t.integer :value
|
84
|
+
t.multi_line_string :geom, :null => false, :srid => 4326
|
85
|
+
end
|
86
|
+
|
81
87
|
create_table :common_geos, :force => true do |t|
|
82
88
|
t.string :data, :limit => 100
|
83
89
|
t.integer :value
|
@@ -40,7 +40,7 @@ describe "CommonSpatialAdapter" do
|
|
40
40
|
|
41
41
|
before(:all)do
|
42
42
|
ActiveRecord::Schema.define do
|
43
|
-
add_column "parks","geom2", :multi_point
|
43
|
+
add_column "parks","geom2", :multi_point, :srid => 4326
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
@@ -55,7 +55,7 @@ describe "CommonSpatialAdapter" do
|
|
55
55
|
col.geometry_type.should eql(:multi_point)
|
56
56
|
col.type.should eql(:geometry)
|
57
57
|
col.null.should be_true
|
58
|
-
col.srid.should eql(
|
58
|
+
col.srid.should eql(4326)
|
59
59
|
col.with_z.should be_false
|
60
60
|
col.with_m.should be_false
|
61
61
|
end
|
@@ -159,7 +159,7 @@ describe "CommonSpatialAdapter" do
|
|
159
159
|
create_table "parks", :force => true do |t|
|
160
160
|
t.column "data" , :string, :limit => 100
|
161
161
|
t.column "value", :integer
|
162
|
-
t.column "geom", :point,:null=>false
|
162
|
+
t.column "geom", :point,:null=>false, :srid => 4326
|
163
163
|
end
|
164
164
|
end
|
165
165
|
|
@@ -246,7 +246,7 @@ describe "CommonSpatialAdapter" do
|
|
246
246
|
[144.819402,13.568565],[144.822373,13.572223],[144.8242032,13.57381149],
|
247
247
|
[144.82634,13.575666],[144.83416,13.590365],[144.83514,13.595657],
|
248
248
|
[144.834284,13.59652],[144.834024,13.598031],[144.83719,13.598061],
|
249
|
-
[144.857742,13.598263]]]).to_fixture_format.split(/\s+/).should eql(["
|
249
|
+
[144.857742,13.598263]]]).to_fixture_format.split(/\s+/).should eql(["0103000020E61000000100000020000000FBCC599F721B62404ED026874F322B40056A3178981B6240BF61A2410A2E2B406B10E676AF1B6240E486DF4DB72C2B40BC7A15199D1B6240F701486DE22C2B40CE893DB48F1B62400E828E56B52C2B40BA84436F711B624054C37E4FAC2B2B407862D68B211B62408F183DB7D0252B40D8817346141B6240C51D6FF25B242B40BFB7E9CFFE1A624071FF91E9D0212B401EA33CF3F21A624024F1F274AE202B408EEA7420EB1A6240ED4ACB48BD1F2B4058E20165D31A6240BEBC00FBE81C2B40A3586E69B51A6240E6E5B0FB8E192B40452BF702B31A6240FE2B2B4D4A192B40CA32C4B1AE1A624084B872F6CE182B403291D26C9E1A62408B8C0E48C2162B4072E14048961A624014B35E0CE5142B403FA88B144A1A6240732EC55565172B405CBA38E0E9196240344179C48D1A2B402C2AE274121A624005C58F31771D2B40892650C4221A62406D62793EA01F2B40FDBD141E341A62405D328E91EC212B40DD088B8A381A6240EC4CA1F31A232B40A1832EE1501A6240BB09BE69FA242B4046A863DF5F1A6240F23C9F9ECA252B400D6C9560711A624099D6A6B1BD262B4034F44F70B11A6240F5673F52442E2B409B728577B91A624056444DF4F9302B406FF25B74B21A6240E1D1C6116B312B4088821953B01A624005FD851E31322B4039D1AE42CA1A6240AF06280D35322B40FBCC599F721B62404ED026874F322B40"])
|
250
250
|
end
|
251
251
|
|
252
252
|
end
|
@@ -8,6 +8,7 @@ describe "Common Functions" do
|
|
8
8
|
@c2 ||= City.create!(:data => "City1", :geom => Polygon.from_coordinates([[[22,66],[65,65],[20,10],[22,66]],[[10,15],[15,11],[34,14],[10,15]]],4326))
|
9
9
|
@c3 ||= City.create!(:data => "City3", :geom => Polygon.from_coordinates([[[12.4,-45.3],[45.4,41.6],[4.456,1.0698],[12.4,-45.3]],[[2.4,5.3],[5.4,1.4263],[14.46,1.06],[2.4,5.3]]],4326))
|
10
10
|
@s1 ||= Street.create!(:data => "Street1", :geom => LineString.from_coordinates([[1,1],[2,2]],4326))
|
11
|
+
@sx ||= Street.create!(:data => "Street1", :geom => LineString.from_coordinates([[2,2],[4,4]],4326))
|
11
12
|
@s2 ||= Street.create!(:data => "Street2", :geom => LineString.from_coordinates([[4,4],[7,7]],4326))
|
12
13
|
@s3 ||= Street.create!(:data => "Street3", :geom => LineString.from_coordinates([[8,8],[18,18],[20,20],[25,25],[30,30],[38,38]],4326))
|
13
14
|
@s4 ||= Street.create!(:data => "Street4", :geom => LineString.from_coordinates([[10,8],[15,18]],4326))
|
@@ -16,6 +17,9 @@ describe "Common Functions" do
|
|
16
17
|
@p3 ||= Position.create!(:data => "Point3", :geom => Point.from_x_y(8,8,4326))
|
17
18
|
@p4 ||= Position.create!(:data => "Point4", :geom => Point.from_x_y(18.1,18,4326))
|
18
19
|
@p5 ||= Position.create!(:data => "Point5", :geom => Point.from_x_y(30,30,4326))
|
20
|
+
@m1 ||= Road.create(:data => "MG-050", :geom => MultiLineString.from_line_strings([@s1.geom, @sx.geom]))
|
21
|
+
@m2 ||= Road.create(:data => "MG-050", :geom => MultiLineString.from_line_strings([@s3.geom, @s4.geom]))
|
22
|
+
@p6 ||= Position.create!(:data => "Point6", :geom => Point.from_x_y(30.9999,30.9999,4326))
|
19
23
|
end
|
20
24
|
|
21
25
|
describe "Point" do
|
@@ -102,9 +106,18 @@ describe "Common Functions" do
|
|
102
106
|
it "should export as GeoJSON" do
|
103
107
|
@p1.as_geo_json.should eql("{\"type\":\"Point\",\"coordinates\":[1,1]}")
|
104
108
|
end
|
109
|
+
|
110
|
+
it "should export as GeoJSON with variable precision" do
|
111
|
+
@p6.as_geo_json(1).should eql("{\"type\":\"Point\",\"coordinates\":[31,31]}")
|
112
|
+
end
|
113
|
+
|
114
|
+
it "should export as GeoJSON with variable precision and bounding box" do
|
115
|
+
@p6.as_geo_json(1,1).should eql("{\"type\":\"Point\",\"bbox\":[31.0,31.0,31.0,31.0],\"coordinates\":[31,31]}")
|
116
|
+
end
|
105
117
|
end
|
106
118
|
|
107
119
|
|
120
|
+
|
108
121
|
# it { @p3.x.should be_close(8.0, 0.1) }
|
109
122
|
# it { @p3.y.should be_close(8.0, 0.1) }
|
110
123
|
# it { @p3.z.should be_close(0.0, 0.1) }
|
@@ -239,6 +252,10 @@ describe "Common Functions" do
|
|
239
252
|
end
|
240
253
|
end
|
241
254
|
|
255
|
+
it "should have 1 geometry" do
|
256
|
+
@s1.should_not respond_to(:geometries)
|
257
|
+
end
|
258
|
+
|
242
259
|
it "should intersect with linestring" do
|
243
260
|
@s4.intersects?(@s3).should be_true
|
244
261
|
end
|
@@ -293,7 +310,6 @@ describe "Common Functions" do
|
|
293
310
|
@s1.as_geo_json.should eql("{\"type\":\"LineString\",\"coordinates\":[[1,1],[2,2]]}")
|
294
311
|
end
|
295
312
|
end
|
296
|
-
|
297
313
|
end
|
298
314
|
|
299
315
|
describe "Distance" do
|
@@ -369,6 +385,32 @@ describe "Common Functions" do
|
|
369
385
|
str.geom[1].x.should be_close(7,0.0000001)
|
370
386
|
str.geom[1].y.should be_close(7,0.0000001)
|
371
387
|
end
|
388
|
+
|
389
|
+
describe "MultiLineString" do
|
390
|
+
|
391
|
+
it "should write nicely" do
|
392
|
+
@m1.geom.should be_instance_of(MultiLineString)
|
393
|
+
end
|
394
|
+
|
395
|
+
it "should have 2 geometries" do
|
396
|
+
@m1.geom.should have(2).geometries
|
397
|
+
end
|
398
|
+
|
399
|
+
it "should have 2 points on the geometry" do
|
400
|
+
@m1.geom.geometries[0].length.should eql(2)
|
401
|
+
end
|
402
|
+
|
403
|
+
it "should line merge!" do
|
404
|
+
merged = @m1.line_merge
|
405
|
+
merged.should be_instance_of(LineString)
|
406
|
+
merged.length.should eql(3)
|
407
|
+
end
|
408
|
+
|
409
|
+
it "should line merge collect" do
|
410
|
+
co = @m2.line_merge
|
411
|
+
co.should be_instance_of(LineString)
|
412
|
+
end
|
413
|
+
end
|
372
414
|
end
|
373
415
|
|
374
416
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -3,7 +3,7 @@ require 'spec'
|
|
3
3
|
require 'pg'
|
4
4
|
require 'activerecord'
|
5
5
|
$:.unshift((File.join(File.dirname(__FILE__), '..', 'lib')))
|
6
|
-
gem 'activerecord', "=2.3.
|
6
|
+
gem 'activerecord', "=2.3.5"
|
7
7
|
gem 'nofxx-georuby'
|
8
8
|
require 'postgis_adapter'
|
9
9
|
|
@@ -12,11 +12,11 @@ $logger = Logger.new(StringIO.new)
|
|
12
12
|
def $logger.write(d); self.info(d); end
|
13
13
|
# $stdout = $logger
|
14
14
|
|
15
|
-
GeoRuby::SimpleFeatures.srid = -1
|
15
|
+
# GeoRuby::SimpleFeatures.srid = -1
|
16
16
|
|
17
17
|
ActiveRecord::Base.logger = $logger
|
18
18
|
ActiveRecord::Base.establish_connection({ :adapter => "postgresql", :database => "postgis_adapter",
|
19
|
-
:username => "
|
19
|
+
:username => "nofxx", :password => "" })
|
20
20
|
|
21
21
|
PG_VERSION = ActiveRecord::Base.connection.select_value("SELECT version()").scan(/PostgreSQL ([\d\.]*)/)[0][0]
|
22
22
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: postgis_adapter
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.7.
|
4
|
+
version: 0.7.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcos Piccinini
|
@@ -9,7 +9,7 @@ autorequire:
|
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
11
|
|
12
|
-
date:
|
12
|
+
date: 2010-01-29 00:00:00 -02:00
|
13
13
|
default_executable:
|
14
14
|
dependencies: []
|
15
15
|
|
@@ -82,9 +82,9 @@ test_files:
|
|
82
82
|
- spec/db/schema_postgis.rb
|
83
83
|
- spec/postgis_adapter/acts_as_geom_spec.rb
|
84
84
|
- spec/postgis_adapter/common_spatial_adapter_spec.rb
|
85
|
-
- spec/postgis_functions_spec.rb
|
86
|
-
- spec/spec_helper.rb
|
87
85
|
- spec/postgis_adapter_spec.rb
|
86
|
+
- spec/postgis_functions/bbox_spec.rb
|
88
87
|
- spec/postgis_functions/class_spec.rb
|
89
88
|
- spec/postgis_functions/common_spec.rb
|
90
|
-
- spec/
|
89
|
+
- spec/postgis_functions_spec.rb
|
90
|
+
- spec/spec_helper.rb
|