rgeo 0.2.2 → 0.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -44,18 +44,36 @@ module RGeo
44
44
  module SRSDatabase
45
45
 
46
46
 
47
+ # A spatial reference database implementation that fetches data
48
+ # from the spatialreference.org website.
49
+
47
50
  class SrOrg
48
51
 
49
52
 
53
+ # Create a database backed by the given catalog of the
54
+ # spatialreference.org website. Catalogs currently supported by
55
+ # spatialreference.org are "epsg", "esri", "iau2000" and "sr-org".
56
+ #
57
+ # Options:
58
+ #
59
+ # <tt>:cache</tt>::
60
+ # If set to true, lookup results are cached so if the same URL
61
+ # is requested again, the result is served from cache rather
62
+ # than issuing another HTTP request. Default is false.
63
+
50
64
  def initialize(catalog_, opts_={})
51
65
  @catalog = catalog_.to_s.downcase
52
66
  @cache = opts_[:cache] ? {} : nil
53
67
  end
54
68
 
55
69
 
70
+ # The spatialreference.org catalog used by this database.
56
71
  attr_reader :catalog
57
72
 
58
73
 
74
+ # Retrieve the Entry from a spatialreference.org catalog given an
75
+ # integer ID.
76
+
59
77
  def get(ident_)
60
78
  ident_ = ident_.to_s
61
79
  return @cache[ident_] if @cache && @cache.include?(ident_)
@@ -73,6 +91,8 @@ module RGeo
73
91
  end
74
92
 
75
93
 
94
+ # Clear the cache if one exists.
95
+
76
96
  def clear_cache
77
97
  @cache.clear if @cache
78
98
  end
@@ -44,14 +44,30 @@ module RGeo
44
44
  module SRSDatabase
45
45
 
46
46
 
47
+ # A spatial reference database implementation that fetches data from
48
+ # internet URLs.
49
+
47
50
  class UrlReader
48
51
 
49
52
 
53
+ # Create a URL-based spatial reference database.
54
+ #
55
+ # Options:
56
+ #
57
+ # <tt>:cache</tt>::
58
+ # If set to true, lookup results are cached so if the same URL
59
+ # is requested again, the result is served from cache rather
60
+ # than issuing another HTTP request. Default is false.
61
+
50
62
  def initialize(opts_={})
51
63
  @cache = opts_[:cache] ? {} : nil
52
64
  end
53
65
 
54
66
 
67
+ # Retrieve the given URL and return an Entry.
68
+ # Returns nil if the URL cannot be read as an OGC WKT or Proj4
69
+ # coordinate system
70
+
55
71
  def get(ident_)
56
72
  ident_ = ident_.to_s
57
73
  return @cache[ident_] if @cache && @cache.include?(ident_)
@@ -75,6 +91,8 @@ module RGeo
75
91
  end
76
92
 
77
93
 
94
+ # Clear the cache if one is present.
95
+
78
96
  def clear_cache
79
97
  @cache.clear if @cache
80
98
  end
@@ -46,8 +46,8 @@ module RGeo
46
46
  #
47
47
  # See the call method for a list of common configuration parameters.
48
48
  # Different generators will support different parameters. There is
49
- # no mechanism defined to reflect on the capabilities of a factory
50
- # generator.
49
+ # no mechanism defined to reflect on the parameters understood by a
50
+ # factory generator.
51
51
  #
52
52
  # Many of the implementations provide a factory method for creating
53
53
  # factories. For example, RGeo::Cartesian::preferred_factory can be
@@ -71,8 +71,8 @@ module RGeo
71
71
  # If the generator does not recognize or does not support a given
72
72
  # configuration value, the behavior is usually determined by the
73
73
  # <tt>:strict</tt> configuration element. If <tt>strict</tt> is
74
- # set to true, the generator should fail fast and return nil or
75
- # raise an exception. If it is set to false, the generator should
74
+ # set to true, the generator should fail fast by returning nil or
75
+ # raising an exception. If it is set to false, the generator should
76
76
  # attempt to do the best it can, even if it means returning a
77
77
  # factory that does not match the requested configuration.
78
78
  #
@@ -89,6 +89,19 @@ module RGeo
89
89
  # <tt>:srid</tt>::
90
90
  # The SRID for the factory and objects it creates.
91
91
  # Default is usually 0.
92
+ # <tt>:proj4</tt>::
93
+ # The coordinate system in Proj4 format, either as a
94
+ # CoordSys::Proj4 object or as a string or hash representing the
95
+ # proj4 format. This is usually an optional parameter; the default
96
+ # is usually nil.
97
+ # <tt>:coord_sys</tt>::
98
+ # The coordinate system in OGC form, either as a subclass of
99
+ # CoordSys::CS::CoordinateSystem, or as a string in WKT format.
100
+ # This is usually an optional parameter; the default is usually
101
+ # nil.
102
+ # <tt>:srs_database</tt>::
103
+ # If provided, look up the Proj4 and OGC coordinate systems from
104
+ # the given database and SRID.
92
105
  # <tt>:has_z_coordinate</tt>::
93
106
  # Support Z coordinates. Default is usually false.
94
107
  # <tt>:has_m_coordinate</tt>::
@@ -70,6 +70,10 @@ module RGeo
70
70
  else
71
71
  @proj4 = nil
72
72
  end
73
+ @coord_sys = opts_[:coord_sys]
74
+ if @coord_sys.kind_of?(::String)
75
+ @coord_sys = CoordSys::CS.create_from_wkt(@coord_sys) rescue nil
76
+ end
73
77
  end
74
78
 
75
79
 
@@ -272,7 +276,7 @@ module RGeo
272
276
  # See ::RGeo::Feature::Factory#coord_sys
273
277
 
274
278
  def coord_sys
275
- nil
279
+ @coord_sys
276
280
  end
277
281
 
278
282
 
@@ -94,15 +94,36 @@ module RGeo
94
94
  # "popular visualization CRS" (EPSG 4055), represented by
95
95
  # "<tt>+proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs</tt>".
96
96
  # Has no effect if Proj4 is not available.
97
+ # <tt>:coord_sys</tt>::
98
+ # Provide a coordinate system in OGC format, either as an object
99
+ # (one of the CoordSys::CS classes) or as a string in WKT format.
100
+ # This coordinate system must be a GeographicCoordinateSystem.
101
+ # The default is the "popular visualization CRS" (EPSG 4055).
97
102
  # <tt>:srid</tt>::
98
103
  # The SRID that should be returned by features from this factory.
99
104
  # Default is 4055, indicating EPSG 4055, the "popular
100
105
  # visualization crs". You may alternatively wish to set the srid
101
106
  # to 4326, indicating the WGS84 crs, but note that that value
102
107
  # implies an ellipsoidal datum, not a spherical datum.
108
+ # <tt>:srs_database</tt>::
109
+ # Optional. If provided, the value should be an implementation of
110
+ # CoordSys::SRSDatabase::Interface. If both this and an SRID are
111
+ # provided, they are used to look up the proj4 and coord_sys
112
+ # objects from a spatial reference system database.
103
113
 
104
114
  def spherical_factory(opts_={})
105
- Geographic::Factory.new('Spherical', :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate], :proj4 => opts_[:proj4] || '+proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs', :srid => opts_[:srid] || 4055)
115
+ proj4_ = opts_[:proj4]
116
+ coord_sys_ = opts_[:coord_sys]
117
+ srid_ = opts_[:srid]
118
+ if (!proj4_ || !coord_sys_) && srid_ && (db_ = opts_[:srs_database])
119
+ entry_ = db_.get(srid_.to_i)
120
+ if entry_
121
+ proj4_ ||= entry_.proj4
122
+ coord_sys_ ||= entry_.coord_sys
123
+ end
124
+ end
125
+ srid_ ||= coord_sys_.authority_code if coord_sys_
126
+ Geographic::Factory.new('Spherical', :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate], :proj4 => proj4_ || _proj4_4055, :coord_sys => coord_sys_ || _coordsys_4055, :srid => (srid_ || 4055).to_i)
106
127
  end
107
128
 
108
129
 
@@ -119,10 +140,10 @@ module RGeo
119
140
  # units.
120
141
  #
121
142
  # The behavior of the simple_mercator factory could also be obtained
122
- # using a projected with appropriate Proj4 specifications. However,
123
- # the simple_mercator implementation is done without actually
124
- # requiring the Proj4 library. The projections are simple enough to
125
- # be implemented in pure ruby.
143
+ # using a projected_factory with appropriate Proj4 specifications.
144
+ # However, the simple_mercator implementation is done without
145
+ # actually requiring the Proj4 library. The projections are simple
146
+ # enough to be implemented in pure ruby.
126
147
  #
127
148
  # === About the coordinate system
128
149
  #
@@ -133,12 +154,12 @@ module RGeo
133
154
  # technologies utilize this coordinate system. The second is a
134
155
  # Mercator projection based on a "sphericalization" of the WGS84
135
156
  # lat-long system. This projection is the basis of the map's screen
136
- # and tiling coordinates, and has been assigned EPSG 3857.
157
+ # and tiling coordinates, and has been assigned EPSG 3785.
137
158
  #
138
159
  # This factory represents both coordinate systems. The main factory
139
160
  # produces data in the lat-long system and reports SRID 4326, and
140
161
  # the projected factory produces data in the projection and reports
141
- # SRID 3857. Latitudes are restricted to the range
162
+ # SRID 3785. Latitudes are restricted to the range
142
163
  # (-85.05112877980659, 85.05112877980659), which conveniently
143
164
  # results in a square projected domain.
144
165
  #
@@ -147,27 +168,20 @@ module RGeo
147
168
  # You may use the following options when creating a simple_mercator
148
169
  # factory:
149
170
  #
150
- # <tt>:lenient_multi_polygon_assertions</tt>::
151
- # If set to true, assertion checking on MultiPolygon is disabled.
152
- # This may speed up creation of MultiPolygon objects, at the
153
- # expense of not doing the proper checking for OGC MultiPolygon
154
- # compliance. See RGeo::Feature::MultiPolygon for details on
155
- # the MultiPolygon assertions. Default is false.
156
- # <tt>:buffer_resolution</tt>::
157
- # The resolution of buffers around geometries created by this
158
- # factory. This controls the number of line segments used to
159
- # approximate curves. The default is 1, which causes, for
160
- # example, the buffer around a point to be approximated by a
161
- # 4-sided polygon. A resolution of 2 would cause that buffer
162
- # to be approximated by an 8-sided polygon. The exact behavior
163
- # for different kinds of buffers is defined by GEOS.
164
171
  # <tt>:has_z_coordinate</tt>::
165
172
  # Support a Z coordinate. Default is false.
166
173
  # <tt>:has_m_coordinate</tt>::
167
174
  # Support an M coordinate. Default is false.
175
+ #
176
+ # You may also provide options understood by the underlying
177
+ # projected Cartesian factory. For example, if GEOS is used for the
178
+ # projected factory, you may also set the
179
+ # <tt>:lenient_multi_polygon_assertions</tt> and
180
+ # <tt>:buffer_resolution</tt> options. See RGeo::Geos::factory for
181
+ # more details.
168
182
 
169
183
  def simple_mercator_factory(opts_={})
170
- factory_ = Geographic::Factory.new('Projected', :proj4 => '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs', :srid => 4326, :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
184
+ factory_ = Geographic::Factory.new('Projected', :proj4 => _proj4_4326, :coord_sys => _coordsys_4326, :srid => 4326, :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
171
185
  projector_ = Geographic::SimpleMercatorProjector.new(factory_, :buffer_resolution => opts_[:buffer_resolution], :lenient_multi_polygon_assertions => opts_[:lenient_multi_polygon_assertions], :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
172
186
  factory_._set_projector(projector_)
173
187
  factory_
@@ -179,78 +193,147 @@ module RGeo
179
193
  # geographic factories, this one creates features using latitude-
180
194
  # longitude values. However, calculations such as intersections are
181
195
  # done in the projected coordinate system, and size and distance
182
- # calculations report results in the projected units.
196
+ # calculations report results in the projected units. Thus, this
197
+ # factory actually includes two factories representing different
198
+ # coordinate systems: the main factory representing the geographic
199
+ # lat-long coordinate system, and an auxiliary "projection factory"
200
+ # representing the projected coordinate system.
183
201
  #
184
202
  # This implementation is intended for advanced GIS applications
185
203
  # requiring greater control over the projection being used.
186
204
  #
187
205
  # === Options
188
206
  #
189
- # When creating a projected implementation, you must provide either
190
- # the <tt>:projection_factory</tt> option, indicating an existing
191
- # Cartesian factory to use for the projection, or the
192
- # <tt>:projection_proj4</tt> option, indicating a Proj4 projection
193
- # to use to construct an appropriate projection factory.
207
+ # When creating a projected implementation, you must provide enough
208
+ # information to construct a Proj4 specification for the projection.
209
+ # Generally, this means you will provide either the projection's
210
+ # factory itself (via the <tt>:projection_factory</tt> option), in
211
+ # which case the factory must include a Proj4 coordinate system;
212
+ # or, alternatively, you should provide the Proj4 coordinate system
213
+ # and let this method construct a projection factory for you (which
214
+ # it will do using the preferred Cartesian factory generator).
215
+ # If you choose this second method, you may provide the proj4
216
+ # directly via the <tt>:projection_proj4</tt> option, or indirectly
217
+ # by providing both an <tt>:srid</tt> and a <tt>:srs_database</tt>
218
+ # to use to look up the coordinate system.
194
219
  #
195
- # If you provide <tt>:projection_factory</tt>, the following options
196
- # are supported.
220
+ # Following are detailed descriptions of the various options you can
221
+ # pass to this method.
197
222
  #
198
223
  # <tt>:projection_factory</tt>::
199
224
  # Specify an existing Cartesian factory to use for the projection.
200
- # This factory must have a non-nil Proj4.
201
- #
202
- # Note that in this case, the geography factory's z-coordinate and
203
- # m-coordinate availability will be set to match the projection's
204
- # z-coordinate and m-coordinate availability.
205
- #
206
- # If you provide <tt>:projection_proj4</tt>, the following options
207
- # are supported.
208
- #
225
+ # This factory must have a non-nil Proj4. If this is provided, any
226
+ # <tt>:projection_proj4</tt>, <tt>:projection_coord_sys</tt>, and
227
+ # <tt>:projection_srid</tt> are ignored.
209
228
  # <tt>:projection_proj4</tt>::
210
- # Specify a Proj4 projection to use. This may be specified as a
211
- # CoordSys::Proj4 object, or as a Proj4 string or hash
212
- # representation.
229
+ # Specify a Proj4 projection to use to construct the projection
230
+ # factory. This may be specified as a CoordSys::Proj4 object, or
231
+ # as a Proj4 string or hash representation.
232
+ # <tt>:projection_coord_sys</tt>::
233
+ # Specify a OGC coordinate system for the projection. This may be
234
+ # specified as an RGeo::CoordSys::CS::GeographicCoordinateSystem
235
+ # object, or as a String in OGC WKT format. Optional.
213
236
  # <tt>:projection_srid</tt>::
214
- # An SRID value to use for the projection factory. Default is 0.
215
- # <tt>:lenient_multi_polygon_assertions</tt>::
216
- # If set to true, assertion checking on MultiPolygon is disabled.
217
- # This may speed up creation of MultiPolygon objects, at the
218
- # expense of not doing the proper checking for OGC MultiPolygon
219
- # compliance. See RGeo::Feature::MultiPolygon for details on
220
- # the MultiPolygon assertions. Default is false.
221
- # <tt>:buffer_resolution</tt>::
222
- # The resolution of buffers around geometries created by this
223
- # factory. This controls the number of line segments used to
224
- # approximate curves. The default is 1, which causes, for
225
- # example, the buffer around a point to be approximated by a
226
- # 4-sided polygon. A resolution of 2 would cause that buffer
227
- # to be approximated by an 8-sided polygon. The exact behavior
228
- # for different kinds of buffers is defined by GEOS.
237
+ # The SRID value to use for the projection factory. Defaults to
238
+ # the given projection coordinate system's authority code, or to
239
+ # 0 if no projection coordinate system is known.
240
+ # <tt>:proj4</tt>::
241
+ # A proj4 projection for the geographic (lat-lon) factory. You may
242
+ # pass either an RGeo::CoordSys::Proj4 object, or a string or hash
243
+ # containing the Proj4 parameters. This coordinate system must be
244
+ # a geographic (lat/long) coordinate system. It defaults to the
245
+ # geographic part of the projection factory's coordinate system.
246
+ # Generally, you should leave it at the default unless you want
247
+ # the geographic coordinate system to be based on a different
248
+ # horizontal datum than the projection.
249
+ # <tt>:coord_sys</tt>::
250
+ # An OGC coordinate system for the geographic (lat-lon) factory,
251
+ # which may be an RGeo::CoordSys::CS::GeographicCoordinateSystem
252
+ # object or a string in OGC WKT format. It defaults to the
253
+ # geographic system embedded in the projection coordinate system.
254
+ # Generally, you should leave it at the default unless you want
255
+ # the geographic coordinate system to be based on a different
256
+ # horizontal datum than the projection.
257
+ # <tt>:srid</tt>::
258
+ # The SRID value to use for the main geographic factory. Defaults
259
+ # to the given geographic coordinate system's authority code, or
260
+ # to 0 if no geographic coordinate system is known.
261
+ # <tt>:srs_database</tt>::
262
+ # Optional. If provided, the value should be an implementation of
263
+ # CoordSys::SRSDatabase::Interface. If both this and an SRID are
264
+ # provided, they are used to look up the proj4 and coord_sys
265
+ # objects from a spatial reference system database.
229
266
  # <tt>:has_z_coordinate</tt>::
230
267
  # Support a Z coordinate. Default is false.
268
+ # Note: this is ignored if a <tt>:projection_factory</tt> is
269
+ # provided; in that case, the geographic factory's z-coordinate
270
+ # availability will match the projection factory's setting.
231
271
  # <tt>:has_m_coordinate</tt>::
232
272
  # Support an M coordinate. Default is false.
273
+ # Note: this is ignored if a <tt>:projection_factory</tt> is
274
+ # provided; in that case, the geographic factory's m-coordinate
275
+ # availability will match the projection factory's setting.
233
276
  #
234
- # Normally, this geographic factory's actual proj4 projection is
235
- # derived from the projection's proj4, by extracting the
236
- # corresponding geographic coordinate system from the projected
237
- # coordinate system. However, you can override this and provide
238
- # your own geographic coordinate system by setting the
239
- # <tt>:proj4</tt> option.
277
+ # If a <tt>:projection_factory</tt> is _not_ provided, you may also
278
+ # provide options for configuring the projected Cartesian factory.
279
+ # For example, if GEOS is used for the projected factory, you may
280
+ # also set the <tt>:lenient_multi_polygon_assertions</tt> and
281
+ # <tt>:buffer_resolution</tt> options. See RGeo::Geos::factory for
282
+ # more details.
240
283
 
241
284
  def projected_factory(opts_={})
242
285
  unless CoordSys::Proj4.supported?
243
286
  raise Error::UnsupportedOperation, "Proj4 is not supported because the proj4 library was not found at install time."
244
287
  end
288
+ db_ = opts_[:srs_database]
245
289
  if (projection_factory_ = opts_[:projection_factory])
290
+ # Get the projection coordinate systems from the given factory
246
291
  projection_proj4_ = projection_factory_.proj4
247
292
  unless projection_proj4_
248
293
  raise ::ArgumentError, 'The :projection_factory does not have a proj4.'
249
294
  end
250
- proj4_ = opts_[:proj4] || projection_proj4_.get_geographic || '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
251
- factory_ = Geographic::Factory.new('Projected', :proj4 => proj4_, :srid => opts_[:srid] || 4326, :has_z_coordinate => projection_factory_.property(:has_z_coordinate), :has_m_coordinate => projection_factory_.property(:has_m_coordinate))
295
+ projection_coord_sys_ = projection_factory_.coord_sys
296
+ if projection_coord_sys_ && !projection_coord_sys_.kind_of?(CoordSys::CS::ProjectedCoordinateSystem)
297
+ raise ::ArgumentError, 'The :projection_factory\'s coord_sys is not a ProjectedCoordinateSystem.'
298
+ end
299
+ # Determine geographic coordinate system. First check parameters.
300
+ proj4_ = opts_[:proj4]
301
+ coord_sys_ = opts_[:coord_sys]
302
+ srid_ = opts_[:srid]
303
+ # Lookup srid from srs database if needed
304
+ if (!proj4_ || !coord_sys_) && srid_ && db_
305
+ entry_ = db_.get(srid_.to_i)
306
+ if entry_
307
+ proj4_ ||= entry_.proj4
308
+ coord_sys_ ||= entry_.coord_sys
309
+ end
310
+ end
311
+ # Fall back to getting the values from the projection.
312
+ proj4_ ||= projection_proj4_.get_geographic || _proj4_4326
313
+ coord_sys_ ||= projection_coord_sys_.geographic_coordinate_system if projection_coord_sys_
314
+ srid_ ||= coord_sys_.authority_code if coord_sys_
315
+ srid_ ||= 4326
316
+ # Now we should have all the coordinate system info.
317
+ factory_ = Geographic::Factory.new('Projected', :proj4 => proj4_, :coord_sys => coord_sys_, :srid => srid_.to_i, :has_z_coordinate => projection_factory_.property(:has_z_coordinate), :has_m_coordinate => projection_factory_.property(:has_m_coordinate))
252
318
  projector_ = Geographic::Proj4Projector.create_from_existing_factory(factory_, projection_factory_)
253
- elsif (projection_proj4_ = opts_[:projection_proj4])
319
+ else
320
+ # Determine projection coordinate system. First check the parameters.
321
+ projection_proj4_ = opts_[:projection_proj4]
322
+ projection_coord_sys_ = opts_[:projection_coord_sys]
323
+ projection_srid_ = opts_[:projection_srid]
324
+ # Check the case where we need to look up a srid from an srs database.
325
+ if (!projection_proj4_ || !projection_coord_sys_) && projection_srid_ && db_
326
+ entry_ = db_.get(projection_srid_.to_i)
327
+ if entry_
328
+ projection_proj4_ ||= entry_.proj4
329
+ projection_coord_sys_ ||= entry_.coord_sys
330
+ end
331
+ end
332
+ # A projection proj4 is absolutely required.
333
+ unless projection_proj4_
334
+ raise ::ArgumentError, 'Unable to determine the Proj4 for the projected coordinate system.'
335
+ end
336
+ # Check the projection coordinate systems, and parse if needed.
254
337
  if projection_proj4_.kind_of?(::String) || projection_proj4_.kind_of?(::Hash)
255
338
  actual_projection_proj4_ = CoordSys::Proj4.create(projection_proj4_)
256
339
  unless actual_projection_proj4_
@@ -258,17 +341,68 @@ module RGeo
258
341
  end
259
342
  projection_proj4_ = actual_projection_proj4_
260
343
  end
261
- proj4_ = opts_[:proj4] || projection_proj4_.get_geographic || '+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs'
262
- factory_ = Geographic::Factory.new('Projected', :proj4 => proj4_, :srid => opts_[:srid] || 4326, :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
263
- projector_ = Geographic::Proj4Projector.create_from_proj4(factory_, opts_[:projection_proj4], :srid => opts_[:projection_srid], :buffer_resolution => opts_[:buffer_resolution], :lenient_multi_polygon_assertions => opts_[:lenient_multi_polygon_assertions], :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
264
- else
265
- raise ::ArgumentError, 'You must provide either :projection_proj4 or :projection_factory.'
344
+ if projection_coord_sys_ && !projection_coord_sys_.kind_of?(CoordSys::CS::ProjectedCoordinateSystem)
345
+ raise ::ArgumentError, 'The :projection_coord_sys is not a ProjectedCoordinateSystem.'
346
+ end
347
+ projection_srid_ ||= projection_coord_sys_.authority_code if projection_coord_sys_
348
+ # Determine geographic coordinate system. First check parameters.
349
+ proj4_ = opts_[:proj4]
350
+ coord_sys_ = opts_[:coord_sys]
351
+ srid_ = opts_[:srid]
352
+ # Lookup srid from srs database if needed
353
+ if (!proj4_ || !coord_sys_) && srid_ && db_
354
+ entry_ = db_.get(srid_.to_i)
355
+ if entry_
356
+ proj4_ ||= entry_.proj4
357
+ coord_sys_ ||= entry_.coord_sys
358
+ end
359
+ end
360
+ # Fall back to getting the values from the projection.
361
+ proj4_ ||= projection_proj4_.get_geographic || _proj4_4326
362
+ coord_sys_ ||= projection_coord_sys_.geographic_coordinate_system if projection_coord_sys_
363
+ srid_ ||= coord_sys_.authority_code if coord_sys_
364
+ srid_ ||= 4326
365
+ # Now we should have all the coordinate system info.
366
+ factory_ = Geographic::Factory.new('Projected', :proj4 => proj4_, :coord_sys => coord_sys_, :srid => srid_.to_i, :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
367
+ projector_ = Geographic::Proj4Projector.create_from_proj4(factory_, projection_proj4_, :srid => projection_srid_, :coord_sys => projection_coord_sys_, :buffer_resolution => opts_[:buffer_resolution], :lenient_multi_polygon_assertions => opts_[:lenient_multi_polygon_assertions], :has_z_coordinate => opts_[:has_z_coordinate], :has_m_coordinate => opts_[:has_m_coordinate])
266
368
  end
267
369
  factory_._set_projector(projector_)
268
370
  factory_
269
371
  end
270
372
 
271
373
 
374
+ def _proj4_4055 # :nodoc:
375
+ unless defined?(@proj4_4055)
376
+ @proj4_4055 = CoordSys::Proj4.create('+proj=longlat +a=6378137 +b=6378137 +towgs84=0,0,0,0,0,0,0 +no_defs')
377
+ end
378
+ @proj4_4055
379
+ end
380
+
381
+
382
+ def _coordsys_4055 # :nodoc:
383
+ unless defined?(@coordsys_4055)
384
+ @coordsys_4055 = CoordSys::CS.create_from_wkt('GEOGCS["Popular Visualisation CRS",DATUM["Popular_Visualisation_Datum",SPHEROID["Popular Visualisation Sphere",6378137,0,AUTHORITY["EPSG","7059"]],TOWGS84[0,0,0,0,0,0,0],AUTHORITY["EPSG","6055"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4055"]]')
385
+ end
386
+ @coordsys_4055
387
+ end
388
+
389
+
390
+ def _proj4_4326 # :nodoc:
391
+ unless defined?(@proj4_4326)
392
+ @proj4_4326 = CoordSys::Proj4.create('+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs')
393
+ end
394
+ @proj4_4326
395
+ end
396
+
397
+
398
+ def _coordsys_4326 # :nodoc:
399
+ unless defined?(@coordsys_4326)
400
+ @coordsys_4326 = CoordSys::CS.create_from_wkt('GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.01745329251994328,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]')
401
+ end
402
+ @coordsys_4326
403
+ end
404
+
405
+
272
406
  end
273
407
 
274
408
  end