rgeo 0.1.22 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (86) hide show
  1. data/History.rdoc +31 -0
  2. data/README.rdoc +53 -59
  3. data/Spatial_Programming_With_RGeo.rdoc +120 -67
  4. data/Version +1 -1
  5. data/ext/proj4_c_impl/extconf.rb +1 -1
  6. data/lib/rgeo.rb +80 -87
  7. data/lib/rgeo/cartesian.rb +0 -10
  8. data/lib/rgeo/coord_sys.rb +0 -7
  9. data/lib/rgeo/coord_sys/proj4.rb +2 -2
  10. data/lib/rgeo/error.rb +2 -6
  11. data/lib/rgeo/feature.rb +0 -7
  12. data/lib/rgeo/feature/curve.rb +5 -5
  13. data/lib/rgeo/feature/factory.rb +45 -5
  14. data/lib/rgeo/feature/factory_generator.rb +2 -4
  15. data/lib/rgeo/feature/geometry.rb +97 -27
  16. data/lib/rgeo/feature/geometry_collection.rb +3 -3
  17. data/lib/rgeo/feature/line_string.rb +3 -3
  18. data/lib/rgeo/feature/multi_curve.rb +2 -2
  19. data/lib/rgeo/feature/multi_surface.rb +3 -3
  20. data/lib/rgeo/feature/point.rb +6 -6
  21. data/lib/rgeo/feature/polygon.rb +4 -4
  22. data/lib/rgeo/feature/surface.rb +3 -3
  23. data/lib/rgeo/geographic.rb +0 -11
  24. data/lib/rgeo/geographic/factory.rb +5 -2
  25. data/lib/rgeo/geographic/interface.rb +1 -1
  26. data/lib/rgeo/geos.rb +0 -7
  27. data/lib/rgeo/geos/factory.rb +1 -1
  28. data/lib/rgeo/impl_helper.rb +0 -7
  29. data/lib/rgeo/wkrep.rb +0 -7
  30. data/lib/rgeo/wkrep/wkb_parser.rb +2 -2
  31. data/test/tc_oneoff.rb +0 -1
  32. metadata +7 -155
  33. data/lib/active_record/connection_adapters/mysql2spatial_adapter.rb +0 -124
  34. data/lib/active_record/connection_adapters/mysqlspatial_adapter.rb +0 -136
  35. data/lib/active_record/connection_adapters/postgis_adapter.rb +0 -426
  36. data/lib/active_record/connection_adapters/spatialite_adapter.rb +0 -488
  37. data/lib/rgeo/active_record/arel_modifications.rb +0 -78
  38. data/lib/rgeo/active_record/base_modifications.rb +0 -124
  39. data/lib/rgeo/active_record/common.rb +0 -166
  40. data/lib/rgeo/active_record/mysql_common.rb +0 -150
  41. data/lib/rgeo/all.rb +0 -49
  42. data/lib/rgeo/geo_json.rb +0 -60
  43. data/lib/rgeo/geo_json/coder.rb +0 -401
  44. data/lib/rgeo/geo_json/entities.rb +0 -285
  45. data/lib/rgeo/geo_json/interface.rb +0 -129
  46. data/lib/rgeo/shapefile.rb +0 -60
  47. data/lib/rgeo/shapefile/reader.rb +0 -898
  48. data/test/active_record/common_setup_methods.rb +0 -129
  49. data/test/active_record/readme.txt +0 -43
  50. data/test/active_record/tc_mysqlspatial.rb +0 -170
  51. data/test/active_record/tc_postgis.rb +0 -282
  52. data/test/active_record/tc_spatialite.rb +0 -198
  53. data/test/shapefile/shapelib_testcases/readme.txt +0 -11
  54. data/test/shapefile/shapelib_testcases/test.dbf +0 -0
  55. data/test/shapefile/shapelib_testcases/test.shp +0 -0
  56. data/test/shapefile/shapelib_testcases/test.shx +0 -0
  57. data/test/shapefile/shapelib_testcases/test0.shp +0 -0
  58. data/test/shapefile/shapelib_testcases/test0.shx +0 -0
  59. data/test/shapefile/shapelib_testcases/test1.shp +0 -0
  60. data/test/shapefile/shapelib_testcases/test1.shx +0 -0
  61. data/test/shapefile/shapelib_testcases/test10.shp +0 -0
  62. data/test/shapefile/shapelib_testcases/test10.shx +0 -0
  63. data/test/shapefile/shapelib_testcases/test11.shp +0 -0
  64. data/test/shapefile/shapelib_testcases/test11.shx +0 -0
  65. data/test/shapefile/shapelib_testcases/test12.shp +0 -0
  66. data/test/shapefile/shapelib_testcases/test12.shx +0 -0
  67. data/test/shapefile/shapelib_testcases/test13.shp +0 -0
  68. data/test/shapefile/shapelib_testcases/test13.shx +0 -0
  69. data/test/shapefile/shapelib_testcases/test2.shp +0 -0
  70. data/test/shapefile/shapelib_testcases/test2.shx +0 -0
  71. data/test/shapefile/shapelib_testcases/test3.shp +0 -0
  72. data/test/shapefile/shapelib_testcases/test3.shx +0 -0
  73. data/test/shapefile/shapelib_testcases/test4.shp +0 -0
  74. data/test/shapefile/shapelib_testcases/test4.shx +0 -0
  75. data/test/shapefile/shapelib_testcases/test5.shp +0 -0
  76. data/test/shapefile/shapelib_testcases/test5.shx +0 -0
  77. data/test/shapefile/shapelib_testcases/test6.shp +0 -0
  78. data/test/shapefile/shapelib_testcases/test6.shx +0 -0
  79. data/test/shapefile/shapelib_testcases/test7.shp +0 -0
  80. data/test/shapefile/shapelib_testcases/test7.shx +0 -0
  81. data/test/shapefile/shapelib_testcases/test8.shp +0 -0
  82. data/test/shapefile/shapelib_testcases/test8.shx +0 -0
  83. data/test/shapefile/shapelib_testcases/test9.shp +0 -0
  84. data/test/shapefile/shapelib_testcases/test9.shx +0 -0
  85. data/test/shapefile/tc_shapelib_tests.rb +0 -527
  86. data/test/tc_geojson.rb +0 -279
data/Version CHANGED
@@ -1 +1 @@
1
- 0.1.22
1
+ 0.2.0
@@ -71,4 +71,4 @@ unless found_proj_
71
71
  puts "**** WARNING: Unable to find Proj headers or Proj version is too old."
72
72
  puts "**** Compiling without Proj support."
73
73
  end
74
- create_makefile('coord_sys/proj4_c_impl')
74
+ create_makefile('rgeo/coord_sys/proj4_c_impl')
@@ -37,95 +37,88 @@
37
37
  # RGeo is a spatial data library for Ruby. It focuses on the storage and
38
38
  # manipulation of spatial data types such as points, lines, and polygons.
39
39
  #
40
- # === RGeo Modules
41
- #
42
- # RGeo comprises a number of modules.
43
- #
44
- # The RGeo::Feature module contains interface specifications for spatial
45
- # objects implemented by RGeo. These interfaces closely follow the OGC
46
- # Simple Features Specifiation (SFS). This module forms the core of RGeo.
47
- #
48
- # The RGeo::CoordSys module contains classes for representing spatial
49
- # reference systems and coordinate transformations. For example, it
50
- # includes a wrapper for the Proj4 library, supporting many geographic
51
- # projections.
52
- #
53
- # The RGeo::Cartesian module provides a basic pure ruby implementation of
54
- # spatial objects in a Cartesian (flat) coordinate system. It does not
55
- # implement all the geometric analysis operations in the SFS, but it
56
- # implements the data structures without requiring an external C library,
57
- # so it is often sufficient for basic applications.
58
- #
59
- # The RGeo::Geos module is another Cartesian implementation that wraps
60
- # the GEOS library to provide a full, high-performance implementation of
61
- # Cartesian geometry that includes every operation defined in the SFS. It
62
- # requires GEOS 3.2 or later.
63
- #
64
- # The RGeo::Geographic module contains spatial implementations that
65
- # operate in latitude-longitude coordinates and are well-suited for
66
- # geographic location based applications. Geographic implementations may
67
- # also be linked to projections.
68
- #
69
- # The RGeo::WKRep module contains tools for reading and writing spatial
70
- # data in the OGC Well-Known Text (WKT) and Well-Known Binary (WKB)
71
- # representations. It also supports common variants such as the PostGIS
72
- # EWKT and EWKB representations.
73
- #
74
- # The RGeo::GeoJSON module contains tools for GeoJSON serialization of
75
- # spatial objects. These tools work with any of the spatial object
76
- # implementations.
77
- #
78
- # The RGeo::Shapefile module contains tools for reading ESRI shapefiles,
79
- # an industry standard (if somewhat legacy) file format commonly used for
80
- # providing geographic data sets.
81
- #
82
- # The RGeo::ActiveRecord module contains ActiveRecord connection adapters
83
- # for handling spatial data with MySQL Spatial, SpatiaLite, and PostGIS.
84
- # See the RGeo::ActiveRecord rdocs for more information on using these
85
- # adapters. However, you do not need to access or require this module
86
- # directly from code. ActiveRecord will load these adapters automatically
87
- # when they are requested.
88
- #
89
- # === Loading the library
90
- #
91
- # After installing the RGeo gem, you can load the library with:
92
- # require 'rgeo'
93
- #
94
- # This will "lazy-load" the modules as they are referenced or needed
95
- # (using autoload).
96
- #
97
- # If, for performance reasons, or because you want to run RGeo in a
98
- # multithreaded environment, you wish to eagerly load RGeo, you may do so
99
- # with:
100
- # require 'rgeo/all'
101
- #
102
- # You may also eagerly load individual modules:
103
- # require 'rgeo/feature'
104
- # require 'rgeo/cartesian'
105
- # require 'rgeo/coord_sys'
106
- # require 'rgeo/geographic'
107
- # require 'rgeo/geos'
108
- # require 'rgeo/geo_json'
109
- # require 'rgeo/shapefile'
110
- # require 'rgeo/wkrep'
111
- #
112
- # You do not need to explicitly require any files for access to the
113
- # spatial ActiveRecord adapters. ActiveRecord will load them
114
- # automatically when they are referenced.
40
+ # RGeo comprises a number of modules. The "rgeo" gem provides a suite of
41
+ # standard modules. Additional optional modules are provided by separate
42
+ # gems with names of the form "<tt>rgeo-*</tt>".
43
+ #
44
+ # === Standard modules
45
+ #
46
+ # These are the standard modules provided by the "rgeo" gem.
47
+ #
48
+ # * RGeo::Feature contains interface specifications for spatial
49
+ # objects implemented by RGeo. These interfaces closely follow the OGC
50
+ # Simple Features Specifiation (SFS). This module forms the core of RGeo.
51
+ #
52
+ # * RGeo::CoordSys contains classes for representing spatial
53
+ # reference systems and coordinate transformations. For example, it
54
+ # includes a wrapper for the Proj4 library, supporting many geographic
55
+ # projections.
56
+ #
57
+ # * RGeo::Cartesian is a gateway for geometric data implementations
58
+ # that operate in Caresian (flat) coordinate systems. It also provides a
59
+ # basic pure ruby Cartesian implementation. This implementation does not
60
+ # cover all the geometric analysis operations defined by the SFS, but it
61
+ # does not require an external C library and is often sufficient for
62
+ # basic applications.
63
+ #
64
+ # * RGeo::Geos is another Cartesian implementation that wraps the
65
+ # GEOS library to provide a full, high-performance implementation of
66
+ # Cartesian geometry that includes every operation defined in the SFS.
67
+ # It requires GEOS 3.2 or later.
68
+ #
69
+ # * RGeo::Geographic contains spatial implementations that operate
70
+ # in latitude-longitude coordinates and are well-suited for geographic
71
+ # location based applications. Geographic spatial objects may also be
72
+ # linked to projections.
73
+ #
74
+ # * RGeo::WKRep contains tools for reading and writing spatial
75
+ # data in the OGC Well-Known Text (WKT) and Well-Known Binary (WKB)
76
+ # representations. It also supports common variants such as the PostGIS
77
+ # EWKT and EWKB representations.
78
+ #
79
+ # === Optional Modules
80
+ #
81
+ # Here is a partial list of optional modules available as separate gems.
82
+ #
83
+ # * <b>rgeo-geojson</b> provides the RGeo::GeoJSON module, containing
84
+ # tools for GeoJSON encoding and decoding of spatial objects.
85
+ #
86
+ # * <b>rgeo-shapefile</b> provides the RGeo::Shapefile module, containing
87
+ # tools for reading ESRI shapefiles.
88
+ #
89
+ # * <b>rgeo-activerecord</b> provides the RGeo::ActiveRecord module,
90
+ # containing some ActiveRecord extensions for spatial databases, and a
91
+ # set of common tools for ActiveRecord spatial database adapters.
92
+ #
93
+ # Several ActiveRecord adapters use RGeo. These include:
94
+ #
95
+ # * <b>mysqlspatial</b>, an adapter for MySQL spatial extensions based on
96
+ # the mysql adapter. Available as the activerecord-mysqlspatial-adapter
97
+ # gem.
98
+ #
99
+ # * <b>mysql2spatial</b>, an adapter for MySQL spatial extensions based on
100
+ # the mysql2 adapter. Available as the activerecord-mysql2spatial-adapter
101
+ # gem.
102
+ #
103
+ # * <b>spatialite</b>, an adapter for the SpatiaLite extension to the
104
+ # Sqlite3 database, and based on the sqlite3 adapter. Available as the
105
+ # activerecord-spatialite-adapter gem.
106
+ #
107
+ # * <b>postgis</b>, an adapter for the PostGIS extension to the PostgreSQL
108
+ # database, and based on the postgresql adapter. Available as the
109
+ # activerecord-postgis-adapter gem.
115
110
 
116
111
  module RGeo
117
-
118
- autoload(:Cartesian, 'rgeo/cartesian')
119
- autoload(:CoordSys, 'rgeo/coord_sys')
120
- autoload(:Error, 'rgeo/error')
121
- autoload(:Feature, 'rgeo/feature')
122
- autoload(:GeoJSON, 'rgeo/geo_json')
123
- autoload(:Geographic, 'rgeo/geographic')
124
- autoload(:Geos, 'rgeo/geos')
125
- autoload(:ImplHelper, 'rgeo/impl_helper')
126
- autoload(:Shapefile, 'rgeo/shapefile')
127
- autoload(:WKRep, 'rgeo/wkrep')
128
-
129
112
  end
130
113
 
114
+
115
+ # Core modules
131
116
  require 'rgeo/version'
117
+ require 'rgeo/error'
118
+ require 'rgeo/feature'
119
+ require 'rgeo/coord_sys'
120
+ require 'rgeo/impl_helper'
121
+ require 'rgeo/wkrep'
122
+ require 'rgeo/geos'
123
+ require 'rgeo/cartesian'
124
+ require 'rgeo/geographic'
@@ -34,10 +34,6 @@
34
34
  ;
35
35
 
36
36
 
37
- # Parent file
38
- require 'rgeo'
39
-
40
-
41
37
  module RGeo
42
38
 
43
39
 
@@ -54,12 +50,6 @@ module RGeo
54
50
  end
55
51
 
56
52
 
57
- # Dependency files.
58
- require 'rgeo/feature'
59
- require 'rgeo/geos'
60
- require 'rgeo/wkrep'
61
- require 'rgeo/impl_helper'
62
-
63
53
  # Implementation files.
64
54
  require 'rgeo/cartesian/calculations'
65
55
  require 'rgeo/cartesian/feature_methods'
@@ -34,10 +34,6 @@
34
34
  ;
35
35
 
36
36
 
37
- # Parent file
38
- require 'rgeo'
39
-
40
-
41
37
  module RGeo
42
38
 
43
39
 
@@ -57,9 +53,6 @@ module RGeo
57
53
  end
58
54
 
59
55
 
60
- # Dependency files
61
- require 'rgeo/feature'
62
-
63
56
  # Implementation files
64
57
  require 'rgeo/coord_sys/proj4_c_impl'
65
58
  require 'rgeo/coord_sys/proj4'
@@ -176,13 +176,13 @@ module RGeo
176
176
 
177
177
 
178
178
  # Create a new Proj4 object, given a definition, which may be
179
- # either a string or a hash. Raises Error::UnsupportedCapability
179
+ # either a string or a hash. Raises Error::UnsupportedOperation
180
180
  # if the given definition is invalid or Proj4 is not supported.
181
181
 
182
182
  def new(defn_)
183
183
  result_ = create(defn_)
184
184
  unless result_
185
- raise Error::UnsupportedCapability, "Proj4 not supported in this installation"
185
+ raise Error::UnsupportedOperation, "Proj4 not supported in this installation"
186
186
  end
187
187
  result_
188
188
  end
@@ -34,10 +34,6 @@
34
34
  ;
35
35
 
36
36
 
37
- # Parent file
38
- require 'rgeo'
39
-
40
-
41
37
  module RGeo
42
38
 
43
39
 
@@ -53,8 +49,8 @@ module RGeo
53
49
  class InvalidGeometry < RGeoError
54
50
  end
55
51
 
56
- # The specified capability is not supported or not implemented
57
- class UnsupportedCapability < RGeoError
52
+ # The specified operation is not supported or not implemented
53
+ class UnsupportedOperation < RGeoError
58
54
  end
59
55
 
60
56
  # Parsing failed
@@ -34,10 +34,6 @@
34
34
  ;
35
35
 
36
36
 
37
- # Parent file
38
- require 'rgeo'
39
-
40
-
41
37
  module RGeo
42
38
 
43
39
 
@@ -72,9 +68,6 @@ module RGeo
72
68
  end
73
69
 
74
70
 
75
- # Dependency files
76
- require 'rgeo/error'
77
-
78
71
  # Implementation files
79
72
  require 'rgeo/feature/factory'
80
73
  require 'rgeo/feature/types'
@@ -88,7 +88,7 @@ module RGeo
88
88
  # Returns a floating-point scalar value.
89
89
 
90
90
  def length
91
- raise Error::UnsupportedCapability, "Method Curve#length not defined."
91
+ raise Error::UnsupportedOperation, "Method Curve#length not defined."
92
92
  end
93
93
 
94
94
 
@@ -101,7 +101,7 @@ module RGeo
101
101
  # Returns an object that supports the Point interface.
102
102
 
103
103
  def start_point
104
- raise Error::UnsupportedCapability, "Method Curve#start_point not defined."
104
+ raise Error::UnsupportedOperation, "Method Curve#start_point not defined."
105
105
  end
106
106
 
107
107
 
@@ -114,7 +114,7 @@ module RGeo
114
114
  # Returns an object that supports the Point interface.
115
115
 
116
116
  def end_point
117
- raise Error::UnsupportedCapability, "Method Curve#end_point not defined."
117
+ raise Error::UnsupportedOperation, "Method Curve#end_point not defined."
118
118
  end
119
119
 
120
120
 
@@ -128,7 +128,7 @@ module RGeo
128
128
  # specification, which stipulates an integer return value.
129
129
 
130
130
  def is_closed?
131
- raise Error::UnsupportedCapability, "Method Curve#is_closed? not defined."
131
+ raise Error::UnsupportedOperation, "Method Curve#is_closed? not defined."
132
132
  end
133
133
 
134
134
 
@@ -144,7 +144,7 @@ module RGeo
144
144
  # specification, which stipulates an integer return value.
145
145
 
146
146
  def is_ring?
147
- raise Error::UnsupportedCapability, "Method Curve#is_ring? not defined."
147
+ raise Error::UnsupportedOperation, "Method Curve#is_ring? not defined."
148
148
  end
149
149
 
150
150
 
@@ -78,7 +78,7 @@ module RGeo
78
78
  #
79
79
  # Each property has a symbolic name. Names that have no periods are
80
80
  # considered well-known names and are reserved for use by RGeo. If
81
- # you want to define your own capabilities, use a name that is
81
+ # you want to define your own properties, use a name that is
82
82
  # namespaced with periods, such as <tt>:'mycompany.myprop'</tt>.
83
83
  #
84
84
  # Property values are dependent on the individual property.
@@ -131,9 +131,9 @@ module RGeo
131
131
  # Create a feature of type Point.
132
132
  # The x and y parameters should be Float values.
133
133
  #
134
- # The extra parameters should be the Z and/or M coordinates, if the
135
- # capabilities are supported. If both Z and M capabilities are
136
- # supported, Z should be passed first.
134
+ # The extra parameters should be the Z and/or M coordinates, if
135
+ # supported. If both Z and M coordinates are supported, Z should
136
+ # be passed first.
137
137
 
138
138
  def point(x_, y_, *extra_)
139
139
  nil
@@ -143,6 +143,11 @@ module RGeo
143
143
  # Create a feature of type LineString.
144
144
  # The given points argument should be an Enumerable of Point
145
145
  # objects, or objects that can be cast to Point.
146
+ #
147
+ # Although implementations are free to attempt to handle input
148
+ # objects that are not of this factory, strictly speaking, the
149
+ # result of building geometries from objects of the wrong factory
150
+ # is undefined.
146
151
 
147
152
  def line_string(points_)
148
153
  nil
@@ -152,6 +157,11 @@ module RGeo
152
157
  # Create a feature of type Line.
153
158
  # The given point arguments should be Point objects, or objects
154
159
  # that can be cast to Point.
160
+ #
161
+ # Although implementations are free to attempt to handle input
162
+ # objects that are not of this factory, strictly speaking, the
163
+ # result of building geometries from objects of the wrong factory
164
+ # is undefined.
155
165
 
156
166
  def line(start_, end_)
157
167
  nil
@@ -164,6 +174,11 @@ module RGeo
164
174
  # If the first and last points are not equal, the ring is
165
175
  # automatically closed by appending the first point to the end of the
166
176
  # string.
177
+ #
178
+ # Although implementations are free to attempt to handle input
179
+ # objects that are not of this factory, strictly speaking, the
180
+ # result of building geometries from objects of the wrong factory
181
+ # is undefined.
167
182
 
168
183
  def linear_ring(points_)
169
184
  nil
@@ -176,6 +191,11 @@ module RGeo
176
191
  # The inner_rings should be a possibly empty Enumerable of
177
192
  # LinearRing (or objects that can be casted to LinearRing).
178
193
  # You may also pass nil to indicate no inner rings.
194
+ #
195
+ # Although implementations are free to attempt to handle input
196
+ # objects that are not of this factory, strictly speaking, the
197
+ # result of building geometries from objects of the wrong factory
198
+ # is undefined.
179
199
 
180
200
  def polygon(outer_ring_, inner_rings_=nil)
181
201
  nil
@@ -184,6 +204,11 @@ module RGeo
184
204
 
185
205
  # Create a feature of type GeometryCollection.
186
206
  # The elems should be an Enumerable of Geometry objects.
207
+ #
208
+ # Although implementations are free to attempt to handle input
209
+ # objects that are not of this factory, strictly speaking, the
210
+ # result of building geometries from objects of the wrong factory
211
+ # is undefined.
187
212
 
188
213
  def collection(elems_)
189
214
  nil
@@ -195,6 +220,11 @@ module RGeo
195
220
  # that can be cast to Point.
196
221
  # Returns nil if any of the contained geometries is not a Point,
197
222
  # which would break the MultiPoint contract.
223
+ #
224
+ # Although implementations are free to attempt to handle input
225
+ # objects that are not of this factory, strictly speaking, the
226
+ # result of building geometries from objects of the wrong factory
227
+ # is undefined.
198
228
 
199
229
  def multi_point(elems_)
200
230
  nil
@@ -206,6 +236,11 @@ module RGeo
206
236
  # cast to LineString or any of its subclasses.
207
237
  # Returns nil if any of the contained geometries is not a
208
238
  # LineString, which would break the MultiLineString contract.
239
+ #
240
+ # Although implementations are free to attempt to handle input
241
+ # objects that are not of this factory, strictly speaking, the
242
+ # result of building geometries from objects of the wrong factory
243
+ # is undefined.
209
244
 
210
245
  def multi_line_string(elems_)
211
246
  nil
@@ -219,6 +254,11 @@ module RGeo
219
254
  # which would break the MultiPolygon contract.
220
255
  # Also returns nil if any of the other assertions for MultiPolygon
221
256
  # are not met, e.g. if any of the polygons overlap.
257
+ #
258
+ # Although implementations are free to attempt to handle input
259
+ # objects that are not of this factory, strictly speaking, the
260
+ # result of building geometries from objects of the wrong factory
261
+ # is undefined.
222
262
 
223
263
  def multi_polygon(elems_)
224
264
  nil
@@ -239,7 +279,7 @@ module RGeo
239
279
  # system.
240
280
  #
241
281
  # NOTE: This is a required method of the factory interface, but the
242
- # coordinate system objects themselves are not yet available, so
282
+ # coordinate system classes themselves are not yet available, so
243
283
  # implementations should just return nil for now.
244
284
 
245
285
  def coord_sys