Class: Proj4::Projection

Inherits:
Object
  • Object
show all
Includes:
Tools
Defined in:
lib/ffi-proj4/projection.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from Tools

#bool_result, #deg_to_rad, #deg_to_rad!, #rad_to_deg, #rad_to_deg!

Constructor Details

#initialize(arg, auto_free = true) ⇒ Projection

Returns a new instance of Projection.



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'lib/ffi-proj4/projection.rb', line 10

def initialize(arg, auto_free = true)
  args = case arg
    when Array
      arg.collect { |a| a.sub(/^\+/, '') }
    when String
      if arg =~ /^(epsg|esri):/i
        [ "+init=#{arg}" ]
      else
        arg.strip.split(/ /).collect { |a| a.sub(/^\+/, '') }
      end
    when Hash
      arg.collect { |k, v|
        if v.nil?
          k.to_s
        else
          "#{k.to_s.strip}=#{v.to_s.strip}"
        end
      }
    when Proj4::Projection
      arg.definition.strip.split(/ /).collect { |a| a.sub(/^\+/, '') }
    else
      raise ArgumentError.new("Unknown type #{arg.class} for projection definition")
  end

  params = args.collect(&:strip).collect { |a|
    if !(a =~ /^\+/)
      "+#{a}"
    else
      a
    end
  }.join(' ')

  ptr = FFIProj4.pj_init_plus(params)

  if ptr.null?
    result = FFIProj4.pj_get_errno_ref.read_int
    raise ProjectionParseError.new(FFIProj4.pj_strerrno(result))
  else
    @ptr = FFI::AutoPointer.new(
      ptr,
      self.class.method(:release)
    )
  end

  self.ptr.autorelease = auto_free
end

Instance Attribute Details

#ptrObject (readonly)

Returns the value of attribute ptr.



8
9
10
# File 'lib/ffi-proj4/projection.rb', line 8

def ptr
  @ptr
end

Class Method Details

.release(ptr) ⇒ Object

:nodoc:



57
58
59
# File 'lib/ffi-proj4/projection.rb', line 57

def self.release(ptr) #:nodoc:
  FFIProj4.pj_free(ptr)
end

Instance Method Details

#datumObject



229
230
231
# File 'lib/ffi-proj4/projection.rb', line 229

def datum
  self.to_hash[:datum]
end

#datum_transform(proj, *args) ⇒ Object



200
201
202
# File 'lib/ffi-proj4/projection.rb', line 200

def datum_transform(proj, *args)
  self.datum_transform!(proj, *(dup_args(*args)))
end

#datum_transform!(proj, *args) ⇒ Object Also known as: datum_transform_rad!



195
196
197
# File 'lib/ffi-proj4/projection.rb', line 195

def datum_transform!(proj, *args)
  perform_transform(:pj_datum_transform, proj, *args)
end

#datum_transform_deg(proj, *args) ⇒ Object



208
209
210
# File 'lib/ffi-proj4/projection.rb', line 208

def datum_transform_deg(proj, *args)
  self.datum_transform_deg!(proj, *(dup_args(*args)))
end

#datum_transform_deg!(proj, *args) ⇒ Object



204
205
206
# File 'lib/ffi-proj4/projection.rb', line 204

def datum_transform_deg!(proj, *args)
  self.datum_transform!(proj, *args).to_deg!
end

#definitionObject Also known as: getDef



72
73
74
# File 'lib/ffi-proj4/projection.rb', line 72

def definition
  @definition ||= FFIProj4.pj_get_def(self.ptr, 0).strip
end

#forward(*args) ⇒ Object Also known as: forward_rad, forwardRad



112
113
114
# File 'lib/ffi-proj4/projection.rb', line 112

def forward(*args)
  self.forward!(*dup_args(*args))
end

#forward!(*args) ⇒ Object Also known as: forward_rad!, forwardRad!



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/ffi-proj4/projection.rb', line 94

def forward!(*args)
  xy, point = xy_and_point_from_args(*args)

  ret = FFIProj4.pj_fwd(xy, self.ptr)
  result = FFIProj4.pj_get_errno_ref.read_int

  if result == 0
    point.x = ret[:x]
    point.y = ret[:y]
    point.z = 0 if point.respond_to?(:z=)
    point
  else
    raise Proj4::Error.instantiate_error(result)
  end
end

#forward_all(proj, collection) ⇒ Object



135
136
137
138
139
# File 'lib/ffi-proj4/projection.rb', line 135

def forward_all(proj, collection)
  collection.collect do |args|
    self.forward!(proj, *(dup_args(*args)))
  end
end

#forward_all!(collection) ⇒ Object



128
129
130
131
132
133
# File 'lib/ffi-proj4/projection.rb', line 128

def forward_all!(collection)
  collection.each do |args|
    self.forward_all!(proj, *args)
  end
  collection
end

#forward_deg(*args) ⇒ Object Also known as: forwardDeg



123
124
125
# File 'lib/ffi-proj4/projection.rb', line 123

def forward_deg(*args)
  self.forward_deg!(*dup_args(*args))
end

#forward_deg!(*args) ⇒ Object Also known as: forwardDeg!



118
119
120
# File 'lib/ffi-proj4/projection.rb', line 118

def forward_deg!(*args)
  self.forward!(*args_deg_to_rad(*args))
end

#geocentric?Boolean Also known as: isGeocent?, isGeocentric?

Returns:

  • (Boolean)


66
67
68
# File 'lib/ffi-proj4/projection.rb', line 66

def geocentric?
  bool_result(FFIProj4.pj_is_geocent(self.ptr))
end

#inverse(*args) ⇒ Object Also known as: inverse_rad, inverseRad



159
160
161
# File 'lib/ffi-proj4/projection.rb', line 159

def inverse(*args)
  self.inverse!(*dup_args(*args))
end

#inverse!(*args) ⇒ Object Also known as: inverse_rad!, inverseRad!



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/ffi-proj4/projection.rb', line 141

def inverse!(*args)
  xy, point = xy_and_point_from_args(*args)

  ret = FFIProj4.pj_inv(xy, self.ptr)
  result = FFIProj4.pj_get_errno_ref.read_int

  if result == 0
    point.x = ret[:x]
    point.y = ret[:y]
    point.z = 0 if point.respond_to?(:z=)
    point
  else
    raise Proj4::Error.instantiate_error(result)
  end
end

#inverse_deg(*args) ⇒ Object Also known as: inverseDeg



170
171
172
# File 'lib/ffi-proj4/projection.rb', line 170

def inverse_deg(*args)
  self.inverse_deg!(*dup_args(*args))
end

#inverse_deg!(*args) ⇒ Object Also known as: inverseDeg!



165
166
167
# File 'lib/ffi-proj4/projection.rb', line 165

def inverse_deg!(*args)
  self.inverse!(*args).to_deg!
end

#lat_long?Boolean Also known as: isLatLong?

Returns:

  • (Boolean)


61
62
63
# File 'lib/ffi-proj4/projection.rb', line 61

def lat_long?
  bool_result(FFIProj4.pj_is_latlong(self.ptr))
end

#projectionObject



225
226
227
# File 'lib/ffi-proj4/projection.rb', line 225

def projection
  self.to_hash[:proj]
end

#to_hashObject Also known as: definition_as_hash



77
78
79
80
81
82
83
84
85
86
# File 'lib/ffi-proj4/projection.rb', line 77

def to_hash
  @hash ||= self.definition.split(/ /).inject({}) { |memo, opt|
    memo.tap {
      k, v = opt.split('=')
      k.sub!(/^\+/, '')
      v = true if v.nil?
      memo[k.to_sym] = v
    }
  }
end

#to_sObject Also known as: inspect



89
90
91
# File 'lib/ffi-proj4/projection.rb', line 89

def to_s
  "#<Proj4::Projection #{definition}>"
end

#transform(proj, *args) ⇒ Object Also known as: transform_rad, transformRad



181
182
183
# File 'lib/ffi-proj4/projection.rb', line 181

def transform(proj, *args)
  self.transform!(proj, *(dup_args(*args)))
end

#transform!(proj, *args) ⇒ Object Also known as: transform_rad!, transformRad!



175
176
177
# File 'lib/ffi-proj4/projection.rb', line 175

def transform!(proj, *args)
  perform_transform(:pj_transform, proj, *args)
end

#transform_all(proj, collection) ⇒ Object



219
220
221
222
223
# File 'lib/ffi-proj4/projection.rb', line 219

def transform_all(proj, collection)
  collection.collect do |args|
    self.transform!(proj, *(dup_args(*args)))
  end
end

#transform_all!(proj, collection) ⇒ Object



212
213
214
215
216
217
# File 'lib/ffi-proj4/projection.rb', line 212

def transform_all!(proj, collection)
  collection.each do |args|
    self.transform!(proj, *args)
  end
  collection
end

#transform_deg(proj, *args) ⇒ Object



191
192
193
# File 'lib/ffi-proj4/projection.rb', line 191

def transform_deg(proj, *args)
  self.transform_deg!(proj, *(dup_args(*args)))
end

#transform_deg!(proj, *args) ⇒ Object



187
188
189
# File 'lib/ffi-proj4/projection.rb', line 187

def transform_deg!(proj, *args)
  self.transform!(proj, *args).to_deg!
end