rgeo 0.1.18 → 0.1.19

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/History.rdoc +11 -0
  2. data/README.rdoc +17 -30
  3. data/Version +1 -1
  4. data/ext/geos_c_impl/factory.c +4 -9
  5. data/ext/geos_c_impl/factory.h +8 -8
  6. data/ext/geos_c_impl/geometry.c +19 -2
  7. data/ext/geos_c_impl/geometry_collection.c +1 -1
  8. data/ext/geos_c_impl/polygon.c +2 -2
  9. data/lib/active_record/connection_adapters/mysql2spatial_adapter.rb +8 -6
  10. data/lib/active_record/connection_adapters/mysqlspatial_adapter.rb +8 -6
  11. data/lib/rgeo/active_record/arel_modifications.rb +4 -0
  12. data/lib/rgeo/active_record/base_modifications.rb +37 -2
  13. data/lib/rgeo/active_record/mysql_common.rb +2 -2
  14. data/lib/rgeo/cartesian.rb +6 -22
  15. data/lib/rgeo/cartesian/analysis.rb +3 -0
  16. data/lib/rgeo/cartesian/bounding_box.rb +337 -0
  17. data/lib/rgeo/cartesian/feature_classes.rb +11 -11
  18. data/lib/rgeo/cartesian/feature_methods.rb +5 -0
  19. data/lib/rgeo/cartesian/interface.rb +21 -4
  20. data/lib/rgeo/features/geometry.rb +0 -15
  21. data/lib/rgeo/geography/interface.rb +33 -6
  22. data/lib/rgeo/geography/simple_mercator/feature_classes.rb +30 -17
  23. data/lib/rgeo/geography/simple_mercator/feature_methods.rb +1 -1
  24. data/lib/rgeo/geography/simple_spherical/feature_classes.rb +38 -11
  25. data/lib/rgeo/geos.rb +2 -0
  26. data/lib/rgeo/geos/factory.rb +37 -21
  27. data/lib/rgeo/geos/impl_additions.rb +20 -0
  28. data/lib/rgeo/geos/interface.rb +17 -8
  29. data/lib/rgeo/geos/zm_factory.rb +241 -0
  30. data/lib/rgeo/geos/zm_impl.rb +432 -0
  31. data/lib/rgeo/impl_helpers/basic_geometry_collection_methods.rb +39 -0
  32. data/lib/rgeo/impl_helpers/basic_geometry_methods.rb +0 -5
  33. data/lib/rgeo/impl_helpers/basic_line_string_methods.rb +10 -1
  34. data/lib/rgeo/impl_helpers/basic_point_methods.rb +1 -13
  35. data/lib/rgeo/impl_helpers/basic_polygon_methods.rb +10 -0
  36. data/tests/common/geometry_collection_tests.rb +16 -0
  37. data/tests/common/point_tests.rb +27 -1
  38. data/tests/geos/tc_point.rb +2 -0
  39. data/tests/geos/tc_zmfactory.rb +85 -0
  40. data/tests/simple_cartesian/tc_geometry_collection.rb +1 -0
  41. data/tests/simple_cartesian/tc_point.rb +2 -1
  42. data/tests/simple_mercator/tc_point.rb +2 -0
  43. data/tests/simple_spherical/tc_geometry_collection.rb +2 -0
  44. data/tests/simple_spherical/tc_point.rb +2 -1
  45. data/tests/tc_oneoff.rb +0 -1
  46. data/tests/wkrep/tc_wkb_generator.rb +4 -4
  47. data/tests/wkrep/tc_wkb_parser.rb +2 -2
  48. data/tests/wkrep/tc_wkt_generator.rb +4 -4
  49. data/tests/wkrep/tc_wkt_parser.rb +5 -5
  50. metadata +23 -3
data/History.rdoc CHANGED
@@ -1,3 +1,14 @@
1
+ === 0.1.19 / 2010-11-23
2
+
3
+ * The GEOS implementation now supports ZM (4-dimensional data), via a wrapper since the underlying GEOS library doesn't support 4d data natively.
4
+ * Added a BoundingBox tool to the Cartesian module.
5
+ * Fleshed out a few more methods of SimpleCartesian and SimpleSpherical.
6
+ * The simple Cartesian point implementation included a bit more leakage from the Geography implementations (pole equivalence, lat/lon methods). Fixed.
7
+ * Under certain circumstances, collections and polygons using GEOS could lose their Z or M coordinates. Fixed.
8
+ * There were some cases when implementations based on ImplHelpers were pulling in the wrong methods. Fixed.
9
+ * Taking the envelope of an empty GEOS collection yielded an illegal object that could cause a crash. Fixed. It now yields an empty collection.
10
+ * Taking the boundary of an empty GEOS collection yielded nil. Fixed. It now yields an empty collection.
11
+
1
12
  === 0.1.18 / 2010-11-22
2
13
 
3
14
  * API CHANGE: GeoJSON defaults to no JSON parser rather than to the JSON library. GeoJSON also fails better when attempting to use a JSON parser that isn't installed.
data/README.rdoc CHANGED
@@ -5,7 +5,7 @@ RGeo is a spatial data library for Ruby.
5
5
  It provides an implementation of the Open Geospatial Consortium's Simple
6
6
  Features Specification, used by most standard spatial/geographic data
7
7
  storage systems such as PostGIS. It also provides a suite of useful tools
8
- for writing location-based applications using Ruby-based frameworks such
8
+ for writing location-aware applications using Ruby-based frameworks such
9
9
  as Ruby On Rails.
10
10
 
11
11
  IMPORTANT: RGeo is currently under development, and we consider it to be
@@ -16,10 +16,10 @@ use of RGeo in production.
16
16
 
17
17
  === Summary
18
18
 
19
- RGeo is a core component for writing location-based applications in the
19
+ RGeo is a core component for writing location-aware applications in the
20
20
  Ruby programming language. It provides the basic tools for modeling
21
- location data and communicating with geolocation-aware storage systems
22
- and location-based services.
21
+ location data and communicating with location-aware storage systems
22
+ and services.
23
23
 
24
24
  Use RGeo to:
25
25
 
@@ -35,8 +35,7 @@ Use RGeo to:
35
35
  location-based web services such as SimpleGeo.
36
36
  * Read legacy GIS data from ESRI shapefiles.
37
37
  * Extend Ruby On Rails to handle location data in a web application.
38
- * Write spatial applications following the latest open standards from
39
- the Open Geospatial Consortium.
38
+ * Follow the latest standards from the Open Geospatial Consortium.
40
39
 
41
40
  === Requirements
42
41
 
@@ -44,7 +43,7 @@ RGeo has the following prerequisites:
44
43
 
45
44
  * Ruby 1.8.7 or later. Ruby 1.9.2 or later preferred.
46
45
  Rubinius and JRuby are not yet supported.
47
- * GEOS 3.2 or later highly recommended. Some functions will not be
46
+ * GEOS 3.2 or later is highly recommended. Some functions will not be
48
47
  available without it. This C/C++ library may be available via your
49
48
  operating system's package manager, or you can download it from
50
49
  http://geos.osgeo.org/
@@ -52,7 +51,7 @@ RGeo has the following prerequisites:
52
51
  install the "json" gem. Ruby 1.9 has JSON support in its standard
53
52
  library and does not require the gem.
54
53
  * If you are using the shapefile reader, you should install the "dbf"
55
- gem for access to shape attributes.
54
+ gem version 1.5.2 or later, which is required to read the attributes.
56
55
  * The ActiveRecord adapters for MySQL Spatial, PostGIS, and SpatiaLite
57
56
  require ActiveRecord 3.0.3 or later, Arel 2.0 or later, and the
58
57
  corresponding database driver gems (e.g. "mysql" or "mysql2").
@@ -78,33 +77,21 @@ the switches interpreted by the gem command. For example:
78
77
 
79
78
  gem install rgeo -- --with-geos-dir=/path/to/my/geos/installation
80
79
 
81
- === Known issues
82
-
83
- * Some planned and documented functionality on the SimpleCartesian and
84
- SimpleSpherical data implementations is not yet implemented.
85
- * Reading of shapefile attributes is dependent on the "dbf" gem.
86
- Unfortunately, the current version of dbf, 1.5.0, has a hard dependency
87
- on ActiveSupport 3.0.1, which renders it incompatible with the
88
- ActiveRecord adapters, which require at least ActiveRecord 3.0.3
89
- (not to mention also rendering it incompatible with Rails 3.0.3...)
90
- I have filed a bug report with dbf to try to get this resolved.
91
-
92
80
  === To-do items
93
81
 
94
- This is our potential feature roadmap.
82
+ This is our planned feature roadmap, in rough priority order.
95
83
 
84
+ * Projection subsystem, and support for arbitrary projections in the
85
+ geography module, utilizing proj4.
96
86
  * SpatiaLite and PostGIS adapters for ActiveRecord. (We already have an
97
87
  adapter for MySQL Spatial.)
88
+ * Integration with certain third-party services such as SimpleGeo.
98
89
  * Support for bbox and crs elements of GeoJSON.
99
- * Support for writing shapefiles. (Reading is now implemented.)
100
- * Projection subsystem, and support for arbitrary projections in the
101
- geography module, utilizing proj4.
102
- * Geography implementation utilizing ellipsoidal geometry, probably
103
- utilizing geographiclib.
104
- * Integration with other third-party formats and services, potentially
105
- including SimpleGeo, GeoRSS, KML.
106
- * JRuby support via JTS integration.
90
+ * Ellipsoidal geography implementation, probably utilizing geographiclib.
107
91
  * Rubinius support for GEOS integration.
92
+ * JRuby support via JTS integration.
93
+ * Support for writing shapefiles. (Reading is already implemented.)
94
+ * Read and write other formats such as GeoRSS and KML.
108
95
 
109
96
  === Development and support
110
97
 
@@ -128,8 +115,8 @@ projects can be found on OSGeo's web site (http://www.osgeo.org/).
128
115
 
129
116
  The ActiveRecord adapters owe some debt to the spatial_adapter plugin
130
117
  (http://github.com/fragility/spatial_adapter). We made a few different
131
- design decisions for RGeo, but studying the spatial_adapter source gave us
132
- a head start on our implementation.
118
+ design decisions for RGeo, but studying the spatial_adapter source gave
119
+ us a head start on our implementation.
133
120
 
134
121
  Although we don't use shapelib (http://shapelib.maptools.org/) to read
135
122
  ESRI shapefiles, we did borrow a bunch of their test cases.
data/Version CHANGED
@@ -1 +1 @@
1
- 0.1.18
1
+ 0.1.19
@@ -121,12 +121,11 @@ static void destroy_globals_func(RGeo_Globals* data)
121
121
  }
122
122
 
123
123
 
124
- // Mark function for globals data. This marks the default factory held
125
- // by the globals so it doesn't get collected.
124
+ // Mark function for globals data. This should mark any globals that
125
+ // need to be held through garbage collection (none at the moment.)
126
126
 
127
127
  static void mark_globals_func(RGeo_Globals* data)
128
128
  {
129
- rb_gc_mark(data->default_factory);
130
129
  }
131
130
 
132
131
 
@@ -225,7 +224,6 @@ RGeo_Globals* rgeo_init_geos_factory()
225
224
  VALUE rgeo_module = rb_define_module("RGeo");
226
225
  globals->geos_module = rb_define_module_under(rgeo_module, "Geos");
227
226
  globals->features_module = rb_define_module_under(rgeo_module, "Features");
228
- globals->default_factory = Qnil;
229
227
 
230
228
  // Add C methods to the factory.
231
229
  VALUE geos_factory_class = rb_const_get_at(globals->geos_module, rb_intern("Factory"));
@@ -241,9 +239,6 @@ RGeo_Globals* rgeo_init_geos_factory()
241
239
  VALUE wrapped_globals = Data_Wrap_Struct(rb_cObject, mark_globals_func, destroy_globals_func, globals);
242
240
  rb_define_const(geos_factory_class, "INTERNAL_CGLOBALS", wrapped_globals);
243
241
 
244
- // Default factory used internally.
245
- globals->default_factory = rb_funcall(geos_factory_class, rb_intern("create"), 0);
246
-
247
242
  return globals;
248
243
  }
249
244
 
@@ -336,12 +331,12 @@ const GEOSGeometry* rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALU
336
331
  }
337
332
 
338
333
 
339
- GEOSGeometry* rgeo_convert_to_detached_geos_geometry(RGeo_Globals* globals, VALUE obj, VALUE type, VALUE* klasses)
334
+ GEOSGeometry* rgeo_convert_to_detached_geos_geometry(VALUE obj, VALUE factory, VALUE type, VALUE* klasses)
340
335
  {
341
336
  if (klasses) {
342
337
  *klasses = Qnil;
343
338
  }
344
- VALUE object = rb_funcall(globals->features_module, rb_intern("cast"), 5, obj, globals->default_factory, type, ID2SYM(rb_intern("force_new")), ID2SYM(rb_intern("keep_subtype")));
339
+ VALUE object = rb_funcall(RGEO_GLOBALS_FROM_FACTORY(factory)->features_module, rb_intern("cast"), 5, obj, factory, type, ID2SYM(rb_intern("force_new")), ID2SYM(rb_intern("keep_subtype")));
345
340
  GEOSGeometry* geom = NULL;
346
341
  if (!NIL_P(object)) {
347
342
  geom = RGEO_GEOMETRY_DATA_PTR(object)->geom;
@@ -47,7 +47,6 @@ RGEO_BEGIN_C
47
47
  // Per-interpreter globals
48
48
 
49
49
  typedef struct {
50
- VALUE default_factory;
51
50
  VALUE features_module;
52
51
  VALUE geos_module;
53
52
  } RGeo_Globals;
@@ -164,21 +163,22 @@ VALUE rgeo_wrap_geos_geometry_clone(VALUE factory, const GEOSGeometry* geom, VAL
164
163
  const GEOSGeometry* rgeo_convert_to_geos_geometry(VALUE factory, VALUE obj, VALUE type);
165
164
 
166
165
  /*
167
- Gets a GEOS geometry for a given ruby Geometry object. If the given
168
- ruby object is not a GEOS geometry implementation, it is converted to a
169
- GEOS implementation first. You may also optionally cast it to a type,
166
+ Gets a GEOS geometry for a given ruby Geometry object. You must provide
167
+ a GEOS factory for the geometry; the object is cast to that factory if
168
+ it is not already of it. You may also optionally cast it to a type,
170
169
  specified by an appropriate feature module. Passing Qnil for the type
171
170
  disables this auto-cast. The returned GEOS geometry is owned by the
172
- caller-- that is, if the original ruby object is a GEOS implementation,
173
- the returned GEOS geometry is a clone of the original.
174
- If the klasses parameters is not NULL, its referent is set to the
171
+ caller-- that is, if the original ruby object is already of the desired
172
+ factory, the returned GEOS geometry is a clone of the original.
173
+
174
+ If the klasses parameter is not NULL, its referent is set to the
175
175
  klasses saved in the original ruby Geometry object (if any), or else to
176
176
  the class of the converted GEOS object. This is so that you can use the
177
177
  result of this function to build a GEOS-backed clone of the original
178
178
  geometry, or to include the given geometry in a collection while keeping
179
179
  the klasses intact.
180
180
  */
181
- GEOSGeometry* rgeo_convert_to_detached_geos_geometry(RGeo_Globals* globals, VALUE obj, VALUE type, VALUE* klasses);
181
+ GEOSGeometry* rgeo_convert_to_detached_geos_geometry(VALUE obj, VALUE factory, VALUE type, VALUE* klasses);
182
182
 
183
183
  /*
184
184
  Returns 1 if the given ruby object is a GEOS Geometry implementation,
@@ -161,7 +161,18 @@ static VALUE method_geometry_envelope(VALUE self)
161
161
  VALUE result = Qnil;
162
162
  const GEOSGeometry* self_geom = RGEO_GET_GEOS_GEOMETRY(self);
163
163
  if (self_geom) {
164
- result = rgeo_wrap_geos_geometry(RGEO_FACTORY_FROM_GEOMETRY(self), GEOSEnvelope_r(RGEO_CONTEXT_FROM_GEOMETRY(self), self_geom), Qnil);
164
+ GEOSGeometry* envelope = GEOSEnvelope_r(RGEO_CONTEXT_FROM_GEOMETRY(self), self_geom);
165
+ // GEOS returns an "empty" point for an empty collection's envelope.
166
+ // We don't allow that type, so we replace it with an empty collection.
167
+ if (!envelope ||
168
+ GEOSGeomTypeId_r(RGEO_CONTEXT_FROM_GEOMETRY(self), envelope) == GEOS_POINT &&
169
+ GEOSGetNumCoordinates_r(RGEO_CONTEXT_FROM_GEOMETRY(self), envelope) == 0) {
170
+ if (envelope) {
171
+ GEOSGeom_destroy_r(RGEO_CONTEXT_FROM_GEOMETRY(self), envelope);
172
+ }
173
+ envelope = GEOSGeom_createCollection_r(RGEO_CONTEXT_FROM_GEOMETRY(self), GEOS_GEOMETRYCOLLECTION, NULL, 0);
174
+ }
175
+ result = rgeo_wrap_geos_geometry(RGEO_FACTORY_FROM_GEOMETRY(self), envelope, Qnil);
165
176
  }
166
177
  return result;
167
178
  }
@@ -172,7 +183,13 @@ static VALUE method_geometry_boundary(VALUE self)
172
183
  VALUE result = Qnil;
173
184
  const GEOSGeometry* self_geom = RGEO_GET_GEOS_GEOMETRY(self);
174
185
  if (self_geom) {
175
- result = rgeo_wrap_geos_geometry(RGEO_FACTORY_FROM_GEOMETRY(self), GEOSBoundary_r(RGEO_CONTEXT_FROM_GEOMETRY(self), self_geom), Qnil);
186
+ GEOSGeometry* boundary = GEOSBoundary_r(RGEO_CONTEXT_FROM_GEOMETRY(self), self_geom);
187
+ // GEOS returns NULL for the boundary of an empty collection.
188
+ // Replace that with an empty collection.
189
+ if (!boundary) {
190
+ boundary = GEOSGeom_createCollection_r(RGEO_CONTEXT_FROM_GEOMETRY(self), GEOS_GEOMETRYCOLLECTION, NULL, 0);
191
+ }
192
+ result = rgeo_wrap_geos_geometry(RGEO_FACTORY_FROM_GEOMETRY(self), boundary, Qnil);
176
193
  }
177
194
  return result;
178
195
  }
@@ -80,7 +80,7 @@ static VALUE create_geometry_collection(VALUE module, int type, VALUE factory, V
80
80
  break;
81
81
  }
82
82
  for (i=0; i<len; ++i) {
83
- GEOSGeometry* geom = rgeo_convert_to_detached_geos_geometry(RGEO_GLOBALS_FROM_FACTORY(factory), rb_ary_entry(array, i), cast_type, &klass);
83
+ GEOSGeometry* geom = rgeo_convert_to_detached_geos_geometry(rb_ary_entry(array, i), factory, cast_type, &klass);
84
84
  if (!geom) {
85
85
  break;
86
86
  }
@@ -165,7 +165,7 @@ static VALUE cmethod_create(VALUE module, VALUE factory, VALUE exterior, VALUE i
165
165
  {
166
166
  Check_Type(interior_array, T_ARRAY);
167
167
  VALUE linear_ring_type = rb_const_get_at(RGEO_GLOBALS_FROM_FACTORY(factory)->features_module, rb_intern("LinearRing"));
168
- GEOSGeometry* exterior_geom = rgeo_convert_to_detached_geos_geometry(RGEO_GLOBALS_FROM_FACTORY(factory), exterior, linear_ring_type, NULL);
168
+ GEOSGeometry* exterior_geom = rgeo_convert_to_detached_geos_geometry(exterior, factory, linear_ring_type, NULL);
169
169
  if (exterior_geom) {
170
170
  unsigned int len = (unsigned int)RARRAY_LEN(interior_array);
171
171
  GEOSGeometry** interior_geoms = ALLOC_N(GEOSGeometry*, len == 0 ? 1 : len);
@@ -173,7 +173,7 @@ static VALUE cmethod_create(VALUE module, VALUE factory, VALUE exterior, VALUE i
173
173
  unsigned int actual_len = 0;
174
174
  unsigned int i;
175
175
  for (i=0; i<len; ++i) {
176
- GEOSGeometry* interior_geom = rgeo_convert_to_detached_geos_geometry(RGEO_GLOBALS_FROM_FACTORY(factory), rb_ary_entry(interior_array, i), linear_ring_type, NULL);
176
+ GEOSGeometry* interior_geom = rgeo_convert_to_detached_geos_geometry(rb_ary_entry(interior_array, i), factory, linear_ring_type, NULL);
177
177
  if (interior_geom) {
178
178
  interior_geoms[actual_len++] = interior_geom;
179
179
  }
@@ -38,12 +38,14 @@ require 'rgeo/active_record/mysql_common'
38
38
  require 'active_record/connection_adapters/mysql2_adapter'
39
39
 
40
40
 
41
- module ActiveRecord # :nodoc:
41
+ module ActiveRecord
42
42
 
43
- class Base # :nodoc:
43
+ class Base
44
44
 
45
45
 
46
- def self.mysql2spatial_connection(config_) # :nodoc:
46
+ # Create a mysql2spatial connection adapter
47
+
48
+ def self.mysql2spatial_connection(config_)
47
49
  config_[:username] = 'root' if config_[:username].nil?
48
50
  if ::Mysql2::Client.const_defined?(:FOUND_ROWS)
49
51
  config_[:flags] = ::Mysql2::Client::FOUND_ROWS
@@ -57,12 +59,12 @@ module ActiveRecord # :nodoc:
57
59
  end
58
60
 
59
61
 
60
- module ConnectionAdapters
62
+ module ConnectionAdapters # :nodoc:
61
63
 
62
- class Mysql2SpatialAdapter < Mysql2Adapter
64
+ class Mysql2SpatialAdapter < Mysql2Adapter # :nodoc:
63
65
 
64
66
 
65
- class SpatialColumn < ConnectionAdapters::Mysql2Column
67
+ class SpatialColumn < ConnectionAdapters::Mysql2Column # :nodoc:
66
68
 
67
69
  include ::RGeo::ActiveRecord::MysqlCommon::ColumnMethods
68
70
 
@@ -38,12 +38,14 @@ require 'rgeo/active_record/mysql_common'
38
38
  require 'active_record/connection_adapters/mysql_adapter'
39
39
 
40
40
 
41
- module ActiveRecord # :nodoc:
41
+ module ActiveRecord
42
42
 
43
- class Base # :nodoc:
43
+ class Base
44
44
 
45
45
 
46
- def self.mysqlspatial_connection(config_) # :nodoc:
46
+ # Create a mysqlspatial connection adapter
47
+
48
+ def self.mysqlspatial_connection(config_)
47
49
  unless defined?(::Mysql)
48
50
  begin
49
51
  require 'mysql'
@@ -67,12 +69,12 @@ module ActiveRecord # :nodoc:
67
69
  end
68
70
 
69
71
 
70
- module ConnectionAdapters
72
+ module ConnectionAdapters # :nodoc:
71
73
 
72
- class MysqlSpatialAdapter < MysqlAdapter
74
+ class MysqlSpatialAdapter < MysqlAdapter # :nodoc:
73
75
 
74
76
 
75
- class SpatialColumn < ConnectionAdapters::MysqlColumn
77
+ class SpatialColumn < ConnectionAdapters::MysqlColumn # :nodoc:
76
78
 
77
79
  include ::RGeo::ActiveRecord::MysqlCommon::ColumnMethods
78
80
 
@@ -37,6 +37,8 @@
37
37
  require 'arel'
38
38
 
39
39
 
40
+ # :stopdoc:
41
+
40
42
  module Arel
41
43
 
42
44
  module Attributes
@@ -71,3 +73,5 @@ module Arel
71
73
  end
72
74
 
73
75
  end
76
+
77
+ # :startdoc:
@@ -37,24 +37,57 @@
37
37
  require 'active_record'
38
38
 
39
39
 
40
- module ActiveRecord # :nodoc:
40
+ # RGeo extensions to ActiveRecord are installed when one of the spatial
41
+ # connection adapters is needed. These modifications require ActiveRecord
42
+ # 3.0.3 or later.
43
+
44
+ module ActiveRecord
45
+
46
+
47
+ # RGeo extends ActiveRecord::Base to include the following new class
48
+ # attributes. These attributes are inherited by subclasses, and can
49
+ # be overridden in subclasses.
50
+ #
51
+ # === ActiveRecord::Base::rgeo_factory_generator
52
+ #
53
+ # The value of this attribute is a RGeo::Features::FactoryGenerator
54
+ # that is used to generate the proper factory when loading geometry
55
+ # objects from the database. For example, if the data being loaded
56
+ # has M but not Z coordinates, and an embedded SRID, then this
57
+ # FactoryGenerator is called with the appropriate configuration to
58
+ # obtain a factory with those properties. This factory is the one
59
+ # associated with the actual geometry properties of the ActiveRecord
60
+ # object.
61
+ #
62
+ # === ActiveRecord::Base::rgeo_default_factory
63
+ #
64
+ # The default factory used to load RGeo geometry objects from the
65
+ # database. This is used when there is no rgeo_factory_generator.
41
66
 
42
- class Base # :nodoc:
67
+ class Base
68
+
43
69
 
44
70
  self.attribute_types_cached_by_default << :geometry
45
71
 
72
+
46
73
  class_attribute :rgeo_default_factory, :instance_writer => false
47
74
  self.rgeo_default_factory = nil
48
75
 
49
76
  class_attribute :rgeo_factory_generator, :instance_writer => false
50
77
  self.rgeo_factory_generator = nil
51
78
 
79
+
80
+ # This is a convenient way to set the rgeo_factory_generator by
81
+ # passing a block.
82
+
52
83
  def self.to_generate_rgeo_factory(&block_)
53
84
  self.rgeo_factory_generator = block_
54
85
  end
55
86
 
87
+
56
88
  class << self
57
89
 
90
+ # :stopdoc:
58
91
  alias_method :columns_without_rgeo_modification, :columns
59
92
  def columns
60
93
  unless defined?(@columns) && @columns
@@ -64,9 +97,11 @@ module ActiveRecord # :nodoc:
64
97
  end
65
98
  @columns
66
99
  end
100
+ # :startdoc:
67
101
 
68
102
  end
69
103
 
70
104
  end
71
105
 
106
+
72
107
  end
@@ -42,10 +42,10 @@ require 'rgeo/active_record/common'
42
42
 
43
43
  module RGeo
44
44
 
45
- module ActiveRecord
45
+ module ActiveRecord # :nodoc:
46
46
 
47
47
 
48
- module MysqlCommon
48
+ module MysqlCommon # :nodoc:
49
49
 
50
50
 
51
51
  module AdapterMethods # :nodoc:
@@ -41,28 +41,11 @@ require 'rgeo'
41
41
  module RGeo
42
42
 
43
43
 
44
- # The Cartesian module provides a simple spatial implementation using
45
- # the Cartesian coordinate system. This is the default implementation
46
- # used by RGeo if no full-featured implementation, such as Geos, is
47
- # available.
48
- #
49
- # The Cartesian implementation can handle all the SFS 1.1 types, and
50
- # provides extensions for Z and M coordinates. It also provides WKT
51
- # and WKB serialization using the WKRep module.
52
- #
53
- # However, the Cartesian implementation does not implement many of
54
- # the more advanced geometric operations. Limitations include:
55
- # * relational operators such as Features::Geometry#intersects? are
56
- # not implemented for most types.
57
- # * relational constructors such as Features::Geometry#union are
58
- # not implemented for most types.
59
- # * buffer, boundary, and convex hull calculation are not implemented
60
- # for most types.
61
- # * distance and area calculation are not implemented for most types,
62
- # though length for LineStrings is implemented.
63
- # * equality and simplicity evaluation are implemented for some types
64
- # but not all types.
65
- # * assertions for polygons and multipolygons are not implemented.
44
+ # The Cartesian module is a gateway to implementations that use the
45
+ # Cartesian (i.e. flat) coordinate system. It provides convenient
46
+ # access to Cartesian factories such as the Geos implementation and
47
+ # the simple Cartesian implementation. It also provides a namespace
48
+ # for Cartesian-specific analysis tools.
66
49
 
67
50
  module Cartesian
68
51
  end
@@ -82,4 +65,5 @@ require 'rgeo/cartesian/feature_methods'
82
65
  require 'rgeo/cartesian/feature_classes'
83
66
  require 'rgeo/cartesian/factory'
84
67
  require 'rgeo/cartesian/interface'
68
+ require 'rgeo/cartesian/bounding_box'
85
69
  require 'rgeo/cartesian/analysis'