Class: ActiveRecord::ConnectionAdapters::PostGIS::OID::Spatial

Inherits:
Type::Value
  • Object
show all
Defined in:
lib/active_record/connection_adapters/postgis/oid/spatial.rb

Overview

OID used to represent geometry/geography database types and attributes.

Accepts `geo_type`, `srid`, `has_z`, `has_m`, and `geographic` as parameters. Responsible for parsing sql_types returned from the database and WKT features.

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(geo_type: 'geometry', srid: 0, has_z: false, has_m: false, geographic: false) ⇒ Spatial

Returns a new instance of Spatial.


12
13
14
15
16
17
18
# File 'lib/active_record/connection_adapters/postgis/oid/spatial.rb', line 12

def initialize(geo_type: 'geometry', srid: 0, has_z: false, has_m: false, geographic: false)
  @geo_type = geo_type
  @srid = srid
  @has_z = has_z
  @has_m = has_m
  @geographic = geographic
end

Class Method Details

.parse_sql_type(sql_type) ⇒ Object

sql_type: geometry, geometry(Point), geometry(Point,4326), …

returns [geo_type, srid, has_z, has_m]

geo_type: geography, geometry, point, line_string, polygon, ...
srid:     1234
has_z:    false
has_m:    false

27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
# File 'lib/active_record/connection_adapters/postgis/oid/spatial.rb', line 27

def self.parse_sql_type(sql_type)
  geo_type, srid, has_z, has_m = nil, 0, false, false

  if sql_type =~ /(geography|geometry)\((.*)\)$/i
    # geometry(Point)
    # geometry(Point,4326)
    params = Regexp.last_match(2).split(",")
    if params.first =~ /([a-z]+[^zm])(z?)(m?)/i
      has_z = Regexp.last_match(2).length > 0
      has_m = Regexp.last_match(3).length > 0
      geo_type = Regexp.last_match(1)
    end
    if params.last =~ /(\d+)/
      srid = Regexp.last_match(1).to_i
    end
  else
    # geometry
    # otherType(a,b)
    geo_type = sql_type
  end
  geographic = sql_type.match?(/geography/)

  [geo_type, srid, has_z, has_m, geographic]
end

Instance Method Details

#serialize(value) ⇒ Object

support setting an RGeo object or a WKT string


68
69
70
71
72
73
74
75
76
77
78
# File 'lib/active_record/connection_adapters/postgis/oid/spatial.rb', line 68

def serialize(value)
  return if value.nil?
  geo_value = cast_value(value)

  # TODO - only valid types should be allowed
  # e.g. linestring is not valid for point column
  # raise "maybe should raise" unless RGeo::Feature::Geometry.check_type(geo_value)

  RGeo::WKRep::WKBGenerator.new(hex_format: true, type_format: :ewkb, emit_ewkb_srid: true)
                           .generate(geo_value)
end

#spatial?Boolean

Returns:

  • (Boolean)

59
60
61
# File 'lib/active_record/connection_adapters/postgis/oid/spatial.rb', line 59

def spatial?
  true
end

#spatial_factoryObject


52
53
54
55
56
57
# File 'lib/active_record/connection_adapters/postgis/oid/spatial.rb', line 52

def spatial_factory
  @spatial_factory ||=
    RGeo::ActiveRecord::SpatialFactoryStore.instance.factory(
      factory_attrs
    )
end

#typeObject


63
64
65
# File 'lib/active_record/connection_adapters/postgis/oid/spatial.rb', line 63

def type
  @geographic ? :geography : :geometry
end