postgis_adapter 0.3.0 → 0.3.4
Sign up to get free protection for your applications and to get access to all the features.
- data/Manifest.txt +0 -1
- data/README.rdoc +2 -1
- data/lib/postgis_adapter/common_spatial_adapter.rb +4 -1
- data/lib/postgis_adapter.rb +4 -3
- data/lib/postgis_functions/class.rb +20 -21
- data/lib/postgis_functions/common.rb +69 -7
- data/lib/postgis_functions.rb +12 -12
- data/postgis_adapter.gemspec +6 -6
- data/spec/db/schema_postgis.rb +6 -0
- data/spec/postgis_functions/class_spec.rb +54 -0
- data/spec/postgis_functions/common_spec.rb +31 -2
- data/spec/postgis_functions_spec.rb +9 -25
- metadata +3 -4
- data/lib/postgis_adapter/acts_as_geom_flymake.rb +0 -69
data/Manifest.txt
CHANGED
data/README.rdoc
CHANGED
@@ -5,6 +5,7 @@ in a transparent way (that is like the other base data type columns).
|
|
5
5
|
It also provides a way to manage these columns in migrations.
|
6
6
|
|
7
7
|
This fork adds handy methods to make geometrical calculations on postgis.
|
8
|
+
Based on http://georuby.rubyforge.org Spatial Adapter
|
8
9
|
|
9
10
|
Postgis Manual - http://postgis.refractions.net/documentation/manual-svn
|
10
11
|
|
@@ -322,5 +323,5 @@ Project Tracker http://nofxx.lighthouseapp.com/projects/20712-postgis_adapter
|
|
322
323
|
|
323
324
|
=== SpatialAdapter
|
324
325
|
|
325
|
-
|
326
|
+
http://georuby.rubyforge.org
|
326
327
|
guilhem.vellut+georuby@gmail.com.
|
@@ -1,9 +1,12 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
2
|
# PostGIS Adapter
|
3
3
|
#
|
4
4
|
# Common Spatial Adapter for ActiveRecord
|
5
5
|
#
|
6
|
+
# Code from
|
7
|
+
# http://georuby.rubyforge.org Spatial Adapter
|
6
8
|
#
|
9
|
+
|
7
10
|
#Addition of a flag indicating if the index is spatial
|
8
11
|
ActiveRecord::ConnectionAdapters::IndexDefinition.class_eval do
|
9
12
|
attr_accessor :spatial
|
data/lib/postgis_adapter.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
#
|
1
|
+
#
|
2
2
|
# PostGIS Adapter
|
3
3
|
#
|
4
|
-
# Spatial Adapter PostGIS Adapter for ActiveRecord
|
5
4
|
#
|
5
|
+
# Code from
|
6
|
+
# http://georuby.rubyforge.org Spatial Adapter
|
6
7
|
#
|
7
8
|
require 'activerecord'
|
8
9
|
require 'active_record/connection_adapters/postgresql_adapter'
|
@@ -18,7 +19,7 @@ include GeoRuby::SimpleFeatures
|
|
18
19
|
include SpatialAdapter
|
19
20
|
|
20
21
|
module PostgisAdapter
|
21
|
-
VERSION = '0.3.
|
22
|
+
VERSION = '0.3.4'
|
22
23
|
end
|
23
24
|
|
24
25
|
#tables to ignore in migration : relative to PostGIS management of geometric columns
|
@@ -1,31 +1,30 @@
|
|
1
1
|
module PostgisFunctions
|
2
|
-
|
3
|
-
|
4
|
-
###
|
5
|
-
##
|
2
|
+
|
6
3
|
#
|
7
4
|
# Class Methods
|
8
5
|
#
|
9
|
-
# Falling back to AR here.
|
10
|
-
#
|
11
6
|
module ClassMethods
|
12
7
|
|
13
8
|
#
|
14
|
-
# Returns the closest record
|
15
|
-
|
16
|
-
|
17
|
-
|
9
|
+
# Returns the closest record
|
10
|
+
def closest_to(p, opts = {})
|
11
|
+
srid = opts.delete(:srid) || 4326
|
12
|
+
opts.merge!(:order => "ST_Distance(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))")
|
13
|
+
find(:first, opts)
|
18
14
|
end
|
19
15
|
|
20
|
-
|
21
|
-
|
16
|
+
#
|
17
|
+
# Order by distance
|
18
|
+
def close_to(p, opts = {})
|
19
|
+
srid = opts.delete(:srid) || 4326
|
20
|
+
opts.merge!(:order => "ST_Distance(geom, GeomFromText('POINT(#{p.x} #{p.y})', #{srid}))")
|
21
|
+
find(:all, opts)
|
22
22
|
end
|
23
23
|
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
find(:all, :order => "ST_length(geom) #{sort}" )
|
24
|
+
def by_length opts = {}
|
25
|
+
sort = opts.delete(:sort) || 'asc'
|
26
|
+
opts.merge!(:order => "ST_length(geom) #{sort}")
|
27
|
+
find(:all, opts)
|
29
28
|
end
|
30
29
|
|
31
30
|
def longest
|
@@ -58,7 +57,7 @@ module PostgisFunctions
|
|
58
57
|
end
|
59
58
|
|
60
59
|
end
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
end
|
60
|
+
|
61
|
+
|
62
|
+
|
63
|
+
end
|
@@ -379,7 +379,7 @@ module PostgisFunctions
|
|
379
379
|
#
|
380
380
|
# Returns Geometry ST_Polygonize(geometry set geomfield);
|
381
381
|
#
|
382
|
-
def polygonize
|
382
|
+
def polygonize
|
383
383
|
postgis_calculate(:polygonize, self)
|
384
384
|
end
|
385
385
|
|
@@ -437,8 +437,12 @@ module PostgisFunctions
|
|
437
437
|
#
|
438
438
|
# Return Geometry ST_Transform(geometry g1, integer srid);
|
439
439
|
#
|
440
|
+
def transform!(new_srid)
|
441
|
+
self[get_column_name] = postgis_calculate("Transform", self, new_srid)
|
442
|
+
end
|
443
|
+
|
440
444
|
def transform(new_srid)
|
441
|
-
|
445
|
+
dup.transform!(new_srid)
|
442
446
|
end
|
443
447
|
|
444
448
|
#
|
@@ -453,6 +457,52 @@ module PostgisFunctions
|
|
453
457
|
postgis_calculate("segmentize", self, max_length)
|
454
458
|
end
|
455
459
|
|
460
|
+
#
|
461
|
+
# Returns the instance`s geom srid
|
462
|
+
#
|
463
|
+
def srid
|
464
|
+
self[get_column_name].srid
|
465
|
+
end
|
466
|
+
|
467
|
+
#
|
468
|
+
# Return UTM Zone for a geom
|
469
|
+
#
|
470
|
+
# Return Integer
|
471
|
+
def utm_zone
|
472
|
+
if srid == 4326
|
473
|
+
geom = centroid
|
474
|
+
else
|
475
|
+
geomdup = transform(4326)
|
476
|
+
mezzo = geomdup.length / 2
|
477
|
+
geom = case geomdup
|
478
|
+
when Point then geomdup
|
479
|
+
when LineString then geomdup[mezzo]
|
480
|
+
else
|
481
|
+
geomgeog[mezzo][geomgeo[mezzo]/2]
|
482
|
+
end
|
483
|
+
|
484
|
+
end
|
485
|
+
|
486
|
+
pref = geom.y > 0 ? 32700 : 32600
|
487
|
+
zone = ((geom.x + 180) / 6 + 1).to_i
|
488
|
+
zone + pref
|
489
|
+
end
|
490
|
+
|
491
|
+
#
|
492
|
+
# Returns the Geometry in its UTM Zone
|
493
|
+
#
|
494
|
+
# Return Geometry
|
495
|
+
def to_utm!(utm=nil)
|
496
|
+
utm ||= utm_zone
|
497
|
+
self[get_column_name] = transform(utm)
|
498
|
+
end
|
499
|
+
|
500
|
+
def to_utm
|
501
|
+
dup.to_utm!
|
502
|
+
end
|
503
|
+
|
504
|
+
#
|
505
|
+
#
|
456
506
|
#
|
457
507
|
# LINESTRING
|
458
508
|
#
|
@@ -623,15 +673,24 @@ module PostgisFunctions
|
|
623
673
|
end
|
624
674
|
|
625
675
|
|
626
|
-
|
627
|
-
|
628
|
-
|
676
|
+
#
|
677
|
+
#
|
678
|
+
#
|
629
679
|
#
|
630
680
|
# POINT
|
631
681
|
#
|
632
682
|
#
|
683
|
+
#
|
684
|
+
#
|
633
685
|
module PointFunctions
|
634
686
|
|
687
|
+
#
|
688
|
+
# Some nice getters
|
689
|
+
#
|
690
|
+
def x; @x ||= self[get_column_name].x; end
|
691
|
+
def y; @y ||= self[get_column_name].y; end
|
692
|
+
def z; @z ||= self[get_column_name].z; end
|
693
|
+
|
635
694
|
#
|
636
695
|
# Returns a float between 0 and 1 representing the location of the closest point
|
637
696
|
# on LineString to the given Point, as a fraction of total 2d line length.
|
@@ -710,12 +769,15 @@ module PostgisFunctions
|
|
710
769
|
|
711
770
|
end
|
712
771
|
|
713
|
-
|
714
|
-
|
772
|
+
#
|
773
|
+
#
|
774
|
+
#
|
715
775
|
#
|
716
776
|
# Polygon
|
717
777
|
#
|
718
778
|
#
|
779
|
+
#
|
780
|
+
#
|
719
781
|
module PolygonFunctions
|
720
782
|
|
721
783
|
#
|
data/lib/postgis_functions.rb
CHANGED
@@ -11,13 +11,13 @@
|
|
11
11
|
#
|
12
12
|
# Some links:
|
13
13
|
#
|
14
|
-
# PostGis Manual -
|
14
|
+
# PostGis Manual - http://postgis.refractions.net/documentation/manual-svn/ch07.html
|
15
15
|
# Earth Spheroid - http://en.wikipedia.org/wiki/Figure_of_the_Earth
|
16
16
|
#
|
17
|
-
|
17
|
+
|
18
18
|
module PostgisFunctions
|
19
|
+
# WGS84 Spheroid
|
19
20
|
EARTH_SPHEROID = "'SPHEROID[\"GRS-80\",6378137,298.257222101]'" # SRID => 4326
|
20
|
-
#EARTH_SPHEROID = "'SPHEROID[\"IERS_2003\",6378136.6,298.25642]'" # SRID =>
|
21
21
|
|
22
22
|
def postgis_calculate(operation, subjects, options = {})
|
23
23
|
subjects = [subjects] unless subjects.respond_to?(:map)
|
@@ -29,24 +29,24 @@ module PostgisFunctions
|
|
29
29
|
private
|
30
30
|
|
31
31
|
def get_column_name
|
32
|
-
@geo_column ||= postgis_geoms[:columns]
|
32
|
+
@geo_column ||= postgis_geoms[:columns]
|
33
33
|
end
|
34
34
|
|
35
35
|
#
|
36
|
-
# Construct the
|
36
|
+
# Construct the PostGIS SQL query
|
37
37
|
#
|
38
|
-
#
|
39
|
-
# Distance/DWithin/Length/Perimeter
|
40
|
-
# DistanceSphere/Spheroid
|
38
|
+
# Returns:
|
39
|
+
# Area/Distance/DWithin/Length/Perimeter => projected units
|
40
|
+
# DistanceSphere/Spheroid => meters
|
41
41
|
#
|
42
42
|
def construct_geometric_sql(type,geoms,options)
|
43
43
|
|
44
44
|
tables = geoms.map do |t| {
|
45
|
-
:
|
45
|
+
:name => t.class.table_name,
|
46
46
|
:uid => unique_identifier,
|
47
47
|
:id => t[:id] }
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
# Implement a better way for options?
|
51
51
|
if options.instance_of? Hash
|
52
52
|
transform = options.delete(:transform)
|
@@ -56,7 +56,7 @@ module PostgisFunctions
|
|
56
56
|
fields = tables.map { |f| "#{f[:uid]}.#{get_column_name}" } # W1.geom
|
57
57
|
fields.map! { |f| "ST_Transform(#{f}, #{transform})" } if transform # ST_Transform(W1.geom,x)
|
58
58
|
conditions = tables.map { |f| "#{f[:uid]}.id = #{f[:id]}" } # W1.id = 5
|
59
|
-
tables.map! { |f| "#{f[:
|
59
|
+
tables.map! { |f| "#{f[:name]} #{f[:uid]}" } # streets W1
|
60
60
|
|
61
61
|
#
|
62
62
|
# Data => SELECT Func(A,B)
|
@@ -149,7 +149,7 @@ end
|
|
149
149
|
#ST_AsGML
|
150
150
|
#ST_AsKML
|
151
151
|
#ST_AsSVG
|
152
|
-
#
|
152
|
+
# #EARTH_SPHEROID = "'SPHEROID[\"IERS_2003\",6378136.6,298.25642]'" # SRID =>
|
153
153
|
# def distance_convert(value, unit, from = nil)
|
154
154
|
# factor = case unit
|
155
155
|
# when :km, :kilo then 1
|
data/postgis_adapter.gemspec
CHANGED
@@ -2,15 +2,15 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = %q{postgis_adapter}
|
5
|
-
s.version = "0.3.
|
5
|
+
s.version = "0.3.4"
|
6
6
|
|
7
7
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
8
8
|
s.authors = ["Marcos Piccinini"]
|
9
|
-
s.date = %q{2009-
|
9
|
+
s.date = %q{2009-04-13}
|
10
10
|
s.description = %q{Postgis Adapter for Activer Record}
|
11
11
|
s.email = ["x@nofxx.com"]
|
12
12
|
s.extra_rdoc_files = ["History.txt", "Manifest.txt", "README.rdoc"]
|
13
|
-
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "init.rb", "install.rb", "lib/postgis_adapter.rb", "lib/postgis_adapter/acts_as_geom.rb", "lib/postgis_adapter/
|
13
|
+
s.files = ["History.txt", "MIT-LICENSE", "Manifest.txt", "README.rdoc", "Rakefile", "init.rb", "install.rb", "lib/postgis_adapter.rb", "lib/postgis_adapter/acts_as_geom.rb", "lib/postgis_adapter/common_spatial_adapter.rb", "lib/postgis_functions.rb", "lib/postgis_functions/bbox.rb", "lib/postgis_functions/class.rb", "lib/postgis_functions/common.rb", "postgis_adapter.gemspec", "rails/init.rb", "script/console", "script/destroy", "script/generate", "spec/db/database_postgis.yml", "spec/db/models_postgis.rb", "spec/db/schema_postgis.rb", "spec/postgis_adapter/acts_as_geom_spec.rb", "spec/postgis_adapter/common_spatial_adapter_spec.rb", "spec/postgis_adapter_spec.rb", "spec/postgis_functions/bbox_spec.rb", "spec/postgis_functions/class_spec.rb", "spec/postgis_functions/common_spec.rb", "spec/postgis_functions_spec.rb", "spec/spec.opts", "spec/spec_helper.rb", "uninstall.rb"]
|
14
14
|
s.has_rdoc = true
|
15
15
|
s.homepage = %q{http://github.com/nofxx/postgis_adapter}
|
16
16
|
s.rdoc_options = ["--main", "README.rdoc"]
|
@@ -25,16 +25,16 @@ Gem::Specification.new do |s|
|
|
25
25
|
|
26
26
|
if Gem::Version.new(Gem::RubyGemsVersion) >= Gem::Version.new('1.2.0') then
|
27
27
|
s.add_runtime_dependency(%q<activerecord>, [">= 2.0.2"])
|
28
|
-
s.add_development_dependency(%q<newgem>, [">= 1.
|
28
|
+
s.add_development_dependency(%q<newgem>, [">= 1.3.0"])
|
29
29
|
s.add_development_dependency(%q<hoe>, [">= 1.8.0"])
|
30
30
|
else
|
31
31
|
s.add_dependency(%q<activerecord>, [">= 2.0.2"])
|
32
|
-
s.add_dependency(%q<newgem>, [">= 1.
|
32
|
+
s.add_dependency(%q<newgem>, [">= 1.3.0"])
|
33
33
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
34
34
|
end
|
35
35
|
else
|
36
36
|
s.add_dependency(%q<activerecord>, [">= 2.0.2"])
|
37
|
-
s.add_dependency(%q<newgem>, [">= 1.
|
37
|
+
s.add_dependency(%q<newgem>, [">= 1.3.0"])
|
38
38
|
s.add_dependency(%q<hoe>, [">= 1.8.0"])
|
39
39
|
end
|
40
40
|
end
|
data/spec/db/schema_postgis.rb
CHANGED
@@ -0,0 +1,54 @@
|
|
1
|
+
require File.dirname(__FILE__) + '/../spec_helper.rb'
|
2
|
+
|
3
|
+
describe "Class Functions" do
|
4
|
+
before(:all) do
|
5
|
+
@c1 ||= City.create!(:data => "City1", :geom => Polygon.from_coordinates([[[12,45],[45,41],[4,1],[12,45]],[[2,5],[5,1],[14,1],[2,5]]],4326))
|
6
|
+
@s1 ||= Street.create!(:data => "Street1", :geom => LineString.from_coordinates([[1,1],[88,88]],4326))
|
7
|
+
@p1 ||= Position.create!(:data => "Point1", :geom => Point.from_x_y(1,1,4326))
|
8
|
+
end
|
9
|
+
|
10
|
+
it "should find the closest other point" do
|
11
|
+
Position.close_to(@p1.geom, :srid => 4326)[0].data.should == @p1.data
|
12
|
+
end
|
13
|
+
|
14
|
+
it "should find the closest other point and limit" do
|
15
|
+
Position.close_to(@p1.geom, :limit => 10).should have(10).positions
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should find the closest other point" do
|
19
|
+
Position.closest_to(@p1.geom).data.should == @p1.data
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should sort by linestring length" do
|
23
|
+
Street.by_length.should be_instance_of(Array)
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should sort by linestring length" do
|
27
|
+
Street.by_length(:limit => 10).should have(10).streets
|
28
|
+
end
|
29
|
+
|
30
|
+
it "should find the longest" do
|
31
|
+
Street.longest.should be_instance_of(Street)
|
32
|
+
end
|
33
|
+
|
34
|
+
it "should find all dwithin one" do
|
35
|
+
Position.all_within(@s1.geom).should be_instance_of(Array)
|
36
|
+
end
|
37
|
+
|
38
|
+
it "should find all dwithin one" do
|
39
|
+
City.by_perimeter.should be_instance_of(Array)
|
40
|
+
end
|
41
|
+
|
42
|
+
it "should sort by polygon area" do
|
43
|
+
City.by_area.should be_instance_of(Array)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "should sort by all within" do
|
47
|
+
City.all_within(@s1.geom).should be_instance_of(Array)
|
48
|
+
end
|
49
|
+
|
50
|
+
it "should sort by all within" do
|
51
|
+
City.by_boundaries.should be_instance_of(Array)
|
52
|
+
end
|
53
|
+
|
54
|
+
end
|
@@ -20,11 +20,11 @@ describe "Common Functions" do
|
|
20
20
|
describe "Point" do
|
21
21
|
|
22
22
|
it "should find the closest other point" do
|
23
|
-
Position.close_to(@p1.geom
|
23
|
+
Position.close_to(@p1.geom)[0].data.should == @p1.data
|
24
24
|
end
|
25
25
|
|
26
26
|
it "should find the closest other point" do
|
27
|
-
Position.closest_to(@p1.geom
|
27
|
+
Position.closest_to(@p1.geom).data.should == @p1.data
|
28
28
|
end
|
29
29
|
|
30
30
|
it { @p1.distance_to(@s2).should be_close(4.24264068711928, 0.0001) }
|
@@ -72,6 +72,22 @@ describe "Common Functions" do
|
|
72
72
|
@p2.where_on_line(@s2).should be_close(0.3333, 0.1)
|
73
73
|
end
|
74
74
|
|
75
|
+
it "should have a srid getter" do
|
76
|
+
@p1.srid.should eql(29101)
|
77
|
+
end
|
78
|
+
|
79
|
+
it "should calculate the UTM srid" do
|
80
|
+
@p2.utm_zone.should eql(32731)
|
81
|
+
end
|
82
|
+
|
83
|
+
it "should convert to utm zone" do
|
84
|
+
lambda { @p2.to_utm! }.should change(@p2, :srid)
|
85
|
+
end
|
86
|
+
|
87
|
+
it { @p3.x.should be_close(8.0, 0.1) }
|
88
|
+
it { @p3.y.should be_close(8.0, 0.1) }
|
89
|
+
it { @p3.z.should be_close(0.0, 0.1) }
|
90
|
+
|
75
91
|
end
|
76
92
|
|
77
93
|
describe "Polygon" do
|
@@ -161,6 +177,10 @@ describe "Common Functions" do
|
|
161
177
|
# @c1.disjoint?(@p2).should be_true
|
162
178
|
# end
|
163
179
|
|
180
|
+
it "should find the UTM zone" do
|
181
|
+
@c2.utm_zone.should eql(32737)
|
182
|
+
end
|
183
|
+
|
164
184
|
end
|
165
185
|
|
166
186
|
describe "LineString" do
|
@@ -292,6 +312,15 @@ describe "Common Functions" do
|
|
292
312
|
@s2.segmentize(0.1).should be_instance_of(LineString)
|
293
313
|
end
|
294
314
|
|
315
|
+
it "should find the UTM zone" do
|
316
|
+
@s2.utm_zone.should eql(32731)
|
317
|
+
end
|
318
|
+
|
319
|
+
it "should find the UTM zone" do
|
320
|
+
@s2.transform!(29101)
|
321
|
+
@s2.utm_zone.should eql(32732)
|
322
|
+
end
|
323
|
+
|
295
324
|
end
|
296
325
|
|
297
326
|
end
|
@@ -6,6 +6,7 @@ describe "PostgisFunctions" do
|
|
6
6
|
@c1 ||= City.create!(:data => "City1", :geom => Polygon.from_coordinates([[[12,45],[45,42],[4,1],[12,45]],[[2,5],[5,1],[14,1],[2,5]]],4326))
|
7
7
|
@s1 ||= Street.create!(:data => "Street1", :geom => LineString.from_coordinates([[-43,-20],[-42,-28]],4326))
|
8
8
|
@p1 ||= Position.create!(:data => "Point1", :geom => Point.from_x_y(-43,-22,4326))
|
9
|
+
@cg ||= CommonGeo.create!(:data => "Point1", :geom => Point.from_x_y(-43,-22,4326))
|
9
10
|
end
|
10
11
|
|
11
12
|
describe "Common Mix" do
|
@@ -14,6 +15,14 @@ describe "PostgisFunctions" do
|
|
14
15
|
@p1.distance_to(@s1).should be_close(0.248069469178417, 0.00000001)
|
15
16
|
end
|
16
17
|
|
18
|
+
it "should calculate distance point to line" do
|
19
|
+
@cg.distance_to(@s1).should be_close(0.248069469178417, 0.00000001)
|
20
|
+
end
|
21
|
+
|
22
|
+
it "should calculate distance point to line" do
|
23
|
+
@p1.geom.as_kml.should eql("<Point>\n<coordinates>-43,-22</coordinates>\n</Point>\n")
|
24
|
+
end
|
25
|
+
|
17
26
|
it "should calculate inside a city" do
|
18
27
|
@p1.should_not be_inside(@c1)
|
19
28
|
end
|
@@ -30,29 +39,4 @@ describe "PostgisFunctions" do
|
|
30
39
|
|
31
40
|
end
|
32
41
|
|
33
|
-
#TODO is sorted rspec helper
|
34
|
-
describe "Class methods" do
|
35
|
-
|
36
|
-
it "should find all dwithin one" do
|
37
|
-
Position.all_within(@s1.geom).should be_instance_of(Array)
|
38
|
-
end
|
39
|
-
|
40
|
-
it "should find all dwithin one" do
|
41
|
-
City.by_perimeter.should be_instance_of(Array)
|
42
|
-
end
|
43
|
-
|
44
|
-
it "should sort by polygon area" do
|
45
|
-
City.by_area.should be_instance_of(Array)
|
46
|
-
end
|
47
|
-
|
48
|
-
it "should sort by all within" do
|
49
|
-
City.all_within(@s1.geom).should be_instance_of(Array)
|
50
|
-
end
|
51
|
-
|
52
|
-
it "should sort by all within" do
|
53
|
-
City.by_boundaries.should be_instance_of(Array)
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
42
|
end
|
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.3.
|
4
|
+
version: 0.3.4
|
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: 2009-
|
12
|
+
date: 2009-04-13 00:00:00 -03:00
|
13
13
|
default_executable:
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
@@ -30,7 +30,7 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: 1.
|
33
|
+
version: 1.3.0
|
34
34
|
version:
|
35
35
|
- !ruby/object:Gem::Dependency
|
36
36
|
name: hoe
|
@@ -63,7 +63,6 @@ files:
|
|
63
63
|
- install.rb
|
64
64
|
- lib/postgis_adapter.rb
|
65
65
|
- lib/postgis_adapter/acts_as_geom.rb
|
66
|
-
- lib/postgis_adapter/acts_as_geom_flymake.rb
|
67
66
|
- lib/postgis_adapter/common_spatial_adapter.rb
|
68
67
|
- lib/postgis_functions.rb
|
69
68
|
- lib/postgis_functions/bbox.rb
|
@@ -1,69 +0,0 @@
|
|
1
|
-
# #
|
2
|
-
# PostGIS Adapter
|
3
|
-
#
|
4
|
-
#
|
5
|
-
# http://github.com/nofxx/postgis_adapter
|
6
|
-
#
|
7
|
-
module PostgisFunctions
|
8
|
-
def self.included(base)
|
9
|
-
base.send :extend, ClassMethods
|
10
|
-
end
|
11
|
-
|
12
|
-
module ClassMethods
|
13
|
-
#
|
14
|
-
# class City
|
15
|
-
# has_geom :point, :bounds
|
16
|
-
# end
|
17
|
-
#
|
18
|
-
# @city.bounds.area #=> 12.456
|
19
|
-
# @city.point.distance_to(@p) #=> "1000"
|
20
|
-
# @product.tax_currency #=> "USD"
|
21
|
-
#
|
22
|
-
# Opts:
|
23
|
-
# :cents => "pennys" #=> @product.pennys
|
24
|
-
# :currency => "currency" #=> @product.currency
|
25
|
-
# :allow_nil => true
|
26
|
-
# :with_currency => true
|
27
|
-
#
|
28
|
-
def has_geom(*attributes)
|
29
|
-
config = {:with_currency => true, :converter => lambda { |m| m.to_money },
|
30
|
-
:allow_nil => false }.update(attributes.extract_options!)
|
31
|
-
|
32
|
-
attributes.each do |attr|
|
33
|
-
mapping = [[config[:cents] || "#{attr}_cents", 'cents']]
|
34
|
-
mapping << [config[:currency] || "#{attr}_currency", 'currency'] if config[:with_currency]
|
35
|
-
|
36
|
-
composed_of attr, :class_name => 'Money',:allow_nil => config[:allow_nil],
|
37
|
-
:mapping => mapping, :converter => config[:converter]
|
38
|
-
end
|
39
|
-
|
40
|
-
end
|
41
|
-
|
42
|
-
# acts_as_geom :geom
|
43
|
-
def acts_as_geom(*columns)
|
44
|
-
cattr_accessor :postgis_geoms
|
45
|
-
geoms = columns.map do |g|
|
46
|
-
geom_type = get_geom_type(g)
|
47
|
-
case geom_type
|
48
|
-
when :point
|
49
|
-
send :include, PointFunctions
|
50
|
-
when :polygon
|
51
|
-
send :include, PolygonFunctions
|
52
|
-
when :line_string
|
53
|
-
send :include, LineStringFunctions
|
54
|
-
end
|
55
|
-
g
|
56
|
-
end
|
57
|
-
self.postgis_geoms = {:columns => geoms}#, :opts => options}
|
58
|
-
end
|
59
|
-
|
60
|
-
def get_geom_type(column)
|
61
|
-
self.columns.select { |c| c.name == column.to_s}.first.geometry_type
|
62
|
-
rescue ActiveRecord::StatementInvalid => e
|
63
|
-
nil
|
64
|
-
end
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
ActiveRecord::Base.send :include, PostgisFunctions
|
69
|
-
|