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.
- data/History.rdoc +8 -0
- data/README.rdoc +2 -2
- data/Version +1 -1
- data/lib/rgeo/cartesian/factory.rb +10 -1
- data/lib/rgeo/cartesian/interface.rb +46 -2
- data/lib/rgeo/coord_sys/cs/entities.rb +758 -39
- data/lib/rgeo/coord_sys/cs/factories.rb +82 -12
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +1 -0
- data/lib/rgeo/coord_sys/srs_database/active_record_table.rb +83 -1
- data/lib/rgeo/coord_sys/srs_database/interface.rb +53 -0
- data/lib/rgeo/coord_sys/srs_database/proj4_data.rb +60 -15
- data/lib/rgeo/coord_sys/srs_database/sr_org.rb +20 -0
- data/lib/rgeo/coord_sys/srs_database/url_reader.rb +18 -0
- data/lib/rgeo/feature/factory_generator.rb +17 -4
- data/lib/rgeo/geographic/factory.rb +5 -1
- data/lib/rgeo/geographic/interface.rb +205 -71
- data/lib/rgeo/geographic/proj4_projector.rb +1 -1
- data/lib/rgeo/geographic/simple_mercator_projector.rb +17 -1
- data/lib/rgeo/geos/factory.rb +10 -1
- data/lib/rgeo/geos/interface.rb +26 -0
- data/lib/rgeo/geos/zm_factory.rb +18 -2
- data/test/coord_sys/tc_active_record_table.rb +8 -3
- metadata +3 -3
@@ -40,93 +40,163 @@ module RGeo
|
|
40
40
|
|
41
41
|
|
42
42
|
# This module contains an implementation of the CS (coordinate
|
43
|
-
# systems) package of the OGC Coordinate Transform spec. It
|
43
|
+
# systems) package of the OGC Coordinate Transform spec. It provides
|
44
44
|
# classes for representing ellipsoids, datums, coordinate systems,
|
45
45
|
# and other related concepts, as well as a parser for the WKT format
|
46
46
|
# for specifying coordinate systems.
|
47
47
|
#
|
48
48
|
# Generally, the easiest way to create coordinate system objects is
|
49
49
|
# to use RGeo::CoordSys::CS.create_from_wkt, which parses the WKT
|
50
|
-
# format.
|
51
|
-
#
|
50
|
+
# format. You can also use the create methods available for each
|
51
|
+
# object class.
|
52
52
|
#
|
53
|
-
#
|
53
|
+
# Most but not all of the spec is implemented here.
|
54
|
+
# Currently missing are:
|
54
55
|
#
|
55
56
|
# * XML format is not implemented. We're assuming that WKT is the
|
56
57
|
# preferred format.
|
57
58
|
# * The PT and CT packages are not implemented.
|
58
59
|
# * FittedCoordinateSystem is not implemented.
|
60
|
+
# * The defaultEnvelope attribute of CS_CoordinateSystem is not
|
61
|
+
# implemented.
|
59
62
|
|
60
63
|
module CS
|
61
64
|
|
62
65
|
|
63
|
-
|
66
|
+
# A class implementing the CS_CoordinateSystemFactory interface.
|
67
|
+
# It provides methods for building up complex objects from simpler
|
68
|
+
# objects or values.
|
69
|
+
#
|
70
|
+
# Note that the methods of CS_CoordinateSystemFactory do not provide
|
71
|
+
# facilities for setting the authority. If you need to set authority
|
72
|
+
# values, use the create methods for the object classes themselves.
|
73
|
+
|
74
|
+
class CoordinateSystemFactory
|
75
|
+
|
76
|
+
|
77
|
+
# Create a CompoundCoordinateSystem from a name, and two
|
78
|
+
# constituent coordinate systems.
|
64
79
|
|
65
80
|
def create_compound_coordinate_system(name_, head_, tail_)
|
66
81
|
CompoundCoordinateSystem.create(name_, head_, tail_)
|
67
82
|
end
|
68
83
|
|
84
|
+
|
85
|
+
# Create an Ellipsoid from a name, semi-major axis, and semi-minor
|
86
|
+
# axis. You can also provide a LinearUnit, but this is optional
|
87
|
+
# and may be set to nil.
|
88
|
+
|
69
89
|
def create_ellipsoid(name_, semi_major_axis_, semi_minor_axis_, linear_unit_)
|
70
90
|
Ellipsoid.create_ellipsoid(name_, semi_major_axis_, semi_minor_axis_, linear_unit_)
|
71
91
|
end
|
72
92
|
|
93
|
+
|
94
|
+
# Create an Ellipsoid from a name, semi-major axis, and an inverse
|
95
|
+
# flattening factor. You can also provide a LinearUnit, but this
|
96
|
+
# is optional and may be set to nil.
|
97
|
+
|
73
98
|
def create_flattened_sphere(name_, semi_major_axis_, inverse_flattening_, linear_unit_)
|
74
99
|
Ellipsoid.create_flattened_sphere(name_, semi_major_axis_, inverse_flattening_, linear_unit_)
|
75
100
|
end
|
76
101
|
|
102
|
+
|
103
|
+
# Create any object given the OGC WKT format. Raises
|
104
|
+
# Error::ParseError if a syntax error is encounterred.
|
105
|
+
|
77
106
|
def create_from_wkt(str_)
|
78
107
|
WKTParser.new(str_).parse
|
79
108
|
end
|
80
109
|
|
110
|
+
|
111
|
+
# Create a GeographicCoordinateSystem, given a name, an
|
112
|
+
# AngularUnit, a HorizontalDatum, a PrimeMeridian, and two
|
113
|
+
# AxisInfo objects. The AxisInfo objects are optional and may be
|
114
|
+
# set to nil.
|
115
|
+
|
81
116
|
def create_geographic_coordinate_system(name_, angular_unit_, horizontal_datum_, prime_meridian_, axis0_, axis1_)
|
82
117
|
GeographicCoordinateSystem.create(name_, angular_unit_, horizontal_datum_, prime_meridian_, axis0_, axis1_)
|
83
118
|
end
|
84
119
|
|
120
|
+
|
121
|
+
# Create a HorizontalDatum given a name, a horizontal datum type
|
122
|
+
# code, an Ellipsoid, and a WGS84ConversionInfo. The
|
123
|
+
# WGS84ConversionInfo is optional and may be set to nil.
|
124
|
+
|
85
125
|
def create_horizontal_datum(name_, horizontal_datum_type_, ellipsoid_, to_wgs84_)
|
86
126
|
HorizontalDatum.create(name_, horizontal_datum_type_, ellipsoid_, to_wgs84_)
|
87
127
|
end
|
88
128
|
|
129
|
+
|
130
|
+
# Create a LocalCoordinateSystem given a name, a LocalDatum, a
|
131
|
+
# Unit, and an array of at least one AxisInfo.
|
132
|
+
|
89
133
|
def create_local_coordinate_system(name_, datum_, unit_, axes_)
|
90
134
|
LocalCoordinateSystem.create(name_, datum_, unit_, axes_)
|
91
135
|
end
|
92
136
|
|
137
|
+
|
138
|
+
# Create a LocalDatum given a name and a local datum type code.
|
139
|
+
|
93
140
|
def create_local_datum(name_, local_datum_type_)
|
94
141
|
LocalDatum.create(name, local_datum_type_)
|
95
142
|
end
|
96
143
|
|
144
|
+
|
145
|
+
# Create a PrimeMeridian given a name, an AngularUnit, and a
|
146
|
+
# longitude offset.
|
147
|
+
|
97
148
|
def create_prime_meridian(name_, angular_unit_, longitude_)
|
98
149
|
PrimeMeridian.create(name, angular_unit_, longitude_)
|
99
150
|
end
|
100
151
|
|
152
|
+
|
153
|
+
# Create a ProjectedCoordinateSystem given a name, a
|
154
|
+
# GeographicCoordinateSystem, and Projection, a LinearUnit, and
|
155
|
+
# two AxisInfo objects. The AxisInfo objects are optional and may
|
156
|
+
# be set to nil.
|
157
|
+
|
101
158
|
def create_projected_coordinate_system(name_, gcs_, projection_, linear_unit_, axis0_, axis1_)
|
102
159
|
ProjectedCoordinateSystem.create(name_, gcs_, projection_, linear_unit_, axis0_, axis1_)
|
103
160
|
end
|
104
161
|
|
162
|
+
|
163
|
+
# Create a Projection given a name, a projection class, and an
|
164
|
+
# array of ProjectionParameter.
|
165
|
+
|
105
166
|
def create_projection(name_, wkt_projection_class_, parameters_)
|
106
167
|
Projection.create(name_, wkt_projection_class_, parameters_)
|
107
168
|
end
|
108
169
|
|
170
|
+
|
171
|
+
# Create a VerticalCoordinateSystem given a name, a VerticalDatum,
|
172
|
+
# a VerticalUnit, and an AxisInfo. The AxisInfo is optional and
|
173
|
+
# may be nil.
|
174
|
+
|
109
175
|
def create_vertical_coordinate_system(name_, vertical_datum_, vertical_unit_, axis_)
|
110
176
|
VerticalCoordinateSystem.create(name_, vertical_datum_, vertical_unit_, axis_)
|
111
177
|
end
|
112
178
|
|
179
|
+
|
180
|
+
# Create a VerticalDatum given a name ane a datum type code.
|
181
|
+
|
113
182
|
def create_vertical_datum(name_, vertical_datum_type_)
|
114
183
|
VerticalDatum.create(name_, vertical_datum_type_)
|
115
184
|
end
|
116
185
|
|
117
|
-
end
|
118
|
-
|
119
|
-
|
120
|
-
class CoordinateSystemFactory
|
121
|
-
|
122
|
-
include FactoryMethods
|
123
186
|
|
124
187
|
end
|
125
188
|
|
126
189
|
|
127
190
|
class << self
|
128
191
|
|
129
|
-
|
192
|
+
|
193
|
+
# Parsees OGC WKT format and returns the object created. Raises
|
194
|
+
# Error::ParseError if a syntax error is encounterred.
|
195
|
+
|
196
|
+
def create_from_wkt(str_)
|
197
|
+
WKTParser.new(str_).parse
|
198
|
+
end
|
199
|
+
|
130
200
|
|
131
201
|
end
|
132
202
|
|
@@ -41,11 +41,84 @@ module RGeo
|
|
41
41
|
module SRSDatabase
|
42
42
|
|
43
43
|
|
44
|
+
# A spatial reference database implementation that uses ActiveRecord
|
45
|
+
# to access a spatial reference table provided by a spatial database
|
46
|
+
# implementation. You can use this class to obtain coordinate system
|
47
|
+
# information from your installation of, e.g. PostGIS.
|
48
|
+
|
44
49
|
class ActiveRecordTable
|
45
50
|
|
46
51
|
@@class_counter = 0
|
47
52
|
|
48
53
|
|
54
|
+
# Create a new ActiveRecord-backed database connection.
|
55
|
+
#
|
56
|
+
# Options include:
|
57
|
+
#
|
58
|
+
# <tt>:ar_class</tt>::
|
59
|
+
# An ActiveRecord class to use. You may provide this if you
|
60
|
+
# already have an ActiveRecord class that accesses the table.
|
61
|
+
# If not provided, an ActiveRecord class will be generated
|
62
|
+
# for you, using the <tt>:ar_base_class</tt>,
|
63
|
+
# <tt>:database_config</tt>, and <tt>:table_name</tt> options.
|
64
|
+
# <tt>:ar_base_class</tt>::
|
65
|
+
# Specify an ActiveRecord base class to use when generating an
|
66
|
+
# ActiveRecord class. Default is ::ActiveRecord::Base. You may
|
67
|
+
# want to use this if you have a base class already that
|
68
|
+
# specifies an existing database connection and/or other
|
69
|
+
# class-scope options.
|
70
|
+
# <tt>:database_config</tt>::
|
71
|
+
# If provided, <tt>establish_connection</tt> will be called on
|
72
|
+
# the generated ActiveRecord class, with the given value.
|
73
|
+
# <tt>:table_name</tt>::
|
74
|
+
# The table name for the new ActiveRecord class. Defaults to
|
75
|
+
# the value <tt>spatial_ref_sys</tt>, which is the OGC-specified
|
76
|
+
# name for this table.
|
77
|
+
# <tt>:srid_column</tt>::
|
78
|
+
# The name of the SRID column. Defaults to "srid", which is the
|
79
|
+
# OGC-specified name for this column.
|
80
|
+
# <tt>:auth_name_column</tt>::
|
81
|
+
# The name of the authority name column. On an OGC-compliant
|
82
|
+
# database, this column should be named "auth_name". However,
|
83
|
+
# the default is set to nil; you should set this option
|
84
|
+
# explicitly if you want to read the authority name.
|
85
|
+
# <tt>:auth_srid_column</tt>::
|
86
|
+
# The name of the authority srid column. On an OGC-compliant
|
87
|
+
# database, this column should be named "auth_srid". However,
|
88
|
+
# the default is set to nil; you should set this option
|
89
|
+
# explicitly if you want to read the authority's srid.
|
90
|
+
# <tt>:name_column</tt>::
|
91
|
+
# The name of the coordinate system name column. This column is
|
92
|
+
# not part of the OGC spec, but it is included in some spatial
|
93
|
+
# database implementations. Default is nil.
|
94
|
+
# <tt>:description_column</tt>::
|
95
|
+
# The name of the coordinate system description column. This
|
96
|
+
# column is not part of the OGC spec, but may be included in
|
97
|
+
# some spatial database implementations. Default is nil.
|
98
|
+
# <tt>:srtext_column</tt>::
|
99
|
+
# The name of the spatial reference WKT column. On an
|
100
|
+
# OGC-compliant database, this column should be named "srtext".
|
101
|
+
# However, not all databases include this column, so the default
|
102
|
+
# is set to nil; you should set this option explicitly if you
|
103
|
+
# want to read the OGC coordinate system specification.
|
104
|
+
# <tt>:proj4text_column</tt>::
|
105
|
+
# The name of the Proj4 format projection spec column. This
|
106
|
+
# column is not part of the OGC spec, but may be included in
|
107
|
+
# some spatial database implementations. Default is nil.
|
108
|
+
# <tt>:cache</tt>::
|
109
|
+
# If set to true, entries are cached when first retrieved, so
|
110
|
+
# subsequent requests do not have to make a database round trip.
|
111
|
+
# Default is false.
|
112
|
+
#
|
113
|
+
# Some option settings may be provided by the ActiveRecord
|
114
|
+
# connection adapter, if the ActiveRecord class's connection uses
|
115
|
+
# an adapter that is RGeo-savvy. The "postgis" and "spatialite"
|
116
|
+
# adapters are such adapters. They automatically provide the
|
117
|
+
# <tt>:table_name</tt> and all the relevant column settings for
|
118
|
+
# the database-provided spatial reference table as defaults.
|
119
|
+
# However, you can still override those settings if you want to
|
120
|
+
# use a custom table.
|
121
|
+
|
49
122
|
def initialize(opts_={})
|
50
123
|
@cache = opts_[:cache] ? {} : nil
|
51
124
|
@ar_class = opts_[:ar_class]
|
@@ -55,13 +128,18 @@ module RGeo
|
|
55
128
|
self.class.const_set("Klass#{@@class_counter}", @ar_class)
|
56
129
|
@@class_counter += 1
|
57
130
|
@ar_class.class_eval do
|
58
|
-
|
131
|
+
establish_connection(opts_[:database_config]) if opts_[:database_config]
|
59
132
|
end
|
60
133
|
end
|
61
134
|
connection_ = @ar_class.connection
|
62
135
|
if connection_.respond_to?(:srs_database_columns)
|
63
136
|
opts_ = connection_.srs_database_columns.merge(opts_)
|
64
137
|
end
|
138
|
+
unless opts_[:ar_class]
|
139
|
+
@ar_class.class_eval do
|
140
|
+
set_table_name(opts_[:table_name] || 'spatial_ref_sys')
|
141
|
+
end
|
142
|
+
end
|
65
143
|
@srid_column = opts_[:srid_column] || 'srid'
|
66
144
|
@auth_name_column = opts_[:auth_name_column]
|
67
145
|
@auth_srid_column = opts_[:auth_srid_column]
|
@@ -72,6 +150,8 @@ module RGeo
|
|
72
150
|
end
|
73
151
|
|
74
152
|
|
153
|
+
# Retrieve an Entry given an integer SRID.
|
154
|
+
|
75
155
|
def get(ident_)
|
76
156
|
ident_ = ident_.to_i
|
77
157
|
return @cache[ident_] if @cache && @cache.include?(ident_)
|
@@ -97,6 +177,8 @@ module RGeo
|
|
97
177
|
end
|
98
178
|
|
99
179
|
|
180
|
+
# Clears the cache if a cache is active.
|
181
|
+
|
100
182
|
def clear_cache
|
101
183
|
@cache.clear if @cache
|
102
184
|
end
|
@@ -51,14 +51,25 @@ module RGeo
|
|
51
51
|
module SRSDatabase
|
52
52
|
|
53
53
|
|
54
|
+
# Interface specification for spatial reference system databases.
|
55
|
+
# This module exists primarily for the sake of documentation.
|
56
|
+
# Database implementations need not actually include this module,
|
57
|
+
# but at least need to duck-type its methods.
|
58
|
+
|
54
59
|
module Interface
|
55
60
|
|
56
61
|
|
62
|
+
# Retrieve an Entry given an identifier. The identifier is usually
|
63
|
+
# a numeric spatial reference ID (SRID), but could be a string
|
64
|
+
# value for certain database types.
|
65
|
+
|
57
66
|
def get(ident_)
|
58
67
|
nil
|
59
68
|
end
|
60
69
|
|
61
70
|
|
71
|
+
# Clears any cache utilized by this database.
|
72
|
+
|
62
73
|
def clear_cache
|
63
74
|
nil
|
64
75
|
end
|
@@ -67,8 +78,35 @@ module RGeo
|
|
67
78
|
end
|
68
79
|
|
69
80
|
|
81
|
+
# An entry in a spatial reference system database.
|
82
|
+
# Every entry has an identifier, but all the other attributes are
|
83
|
+
# optional and may or may not be present depending on the database.
|
84
|
+
|
70
85
|
class Entry
|
71
86
|
|
87
|
+
|
88
|
+
# Create an entry.
|
89
|
+
# You must provide an identifier, which may be numeric or a
|
90
|
+
# string. The data hash should contain any other attributes,
|
91
|
+
# keyed by symbol.
|
92
|
+
#
|
93
|
+
# Some attribute inputs have special behaviors:
|
94
|
+
#
|
95
|
+
# <tt>:coord_sys</tt>::
|
96
|
+
# You can pass a CS coordinate system object, or a string in
|
97
|
+
# WKT format.
|
98
|
+
# <tt>:proj4</tt>::
|
99
|
+
# You can pass a Proj4 object, or a proj4-format string.
|
100
|
+
# <tt>:name</tt>::
|
101
|
+
# If the name is not provided directly, it is taken from the
|
102
|
+
# coord_sys.
|
103
|
+
# <tt>:authority</tt>::
|
104
|
+
# If the authority name is not provided directly, it is taken
|
105
|
+
# from the coord_sys.
|
106
|
+
# <tt>:authority_code</tt>::
|
107
|
+
# If the authority code is not provided directly, it is taken
|
108
|
+
# from the coord_sys.
|
109
|
+
|
72
110
|
def initialize(ident_, data_={})
|
73
111
|
@identifier = ident_
|
74
112
|
@authority = data_[:authority]
|
@@ -94,14 +132,29 @@ module RGeo
|
|
94
132
|
end
|
95
133
|
end
|
96
134
|
|
135
|
+
|
136
|
+
# The database key or identifier.
|
97
137
|
attr_reader :identifier
|
138
|
+
|
139
|
+
# The authority name, if present. Example: "epsg".
|
98
140
|
attr_reader :authority
|
141
|
+
|
142
|
+
# The authority code, e.g. an EPSG code.
|
99
143
|
attr_reader :authority_code
|
144
|
+
|
145
|
+
# A human-readable name for this coordinate system.
|
100
146
|
attr_reader :name
|
147
|
+
|
148
|
+
# A human-readable description for this coordinate system.
|
101
149
|
attr_reader :description
|
150
|
+
|
151
|
+
# The CS::CoordinateSystem object.
|
102
152
|
attr_reader :coord_sys
|
153
|
+
|
154
|
+
# The Proj4 object.
|
103
155
|
attr_reader :proj4
|
104
156
|
|
157
|
+
|
105
158
|
end
|
106
159
|
|
107
160
|
|
@@ -41,10 +41,44 @@ module RGeo
|
|
41
41
|
module SRSDatabase
|
42
42
|
|
43
43
|
|
44
|
+
# A spatial reference database implementation backed by coordinate
|
45
|
+
# system files installed as part of the proj4 library. For a given
|
46
|
+
# Proj4Data object, you specify a single file (e.g. the epsg data
|
47
|
+
# file), and you can retrieve records by ID number.
|
48
|
+
|
44
49
|
class Proj4Data
|
45
50
|
|
46
51
|
|
47
|
-
|
52
|
+
# Connect to one of the proj4 data files. You should provide the
|
53
|
+
# file name, optionally the installation directory if it is not
|
54
|
+
# in a typical location, and several additional options.
|
55
|
+
#
|
56
|
+
# These options are recognized:
|
57
|
+
#
|
58
|
+
# <tt>:dir</tt>::
|
59
|
+
# The path for the share/proj directory that contains the
|
60
|
+
# requested data file. By default, the Proj4Data class will
|
61
|
+
# try a number of directories for you, including
|
62
|
+
# /usr/local/share/proj, /opt/local/share/proj, /usr/share/proj,
|
63
|
+
# and a few other variants. However, if you have proj4 installed
|
64
|
+
# elsewhere, you can provide an explicit directory using this
|
65
|
+
# option. You may also pass nil as the value, in which case all
|
66
|
+
# the normal lookup paths will be disabled, and you will have to
|
67
|
+
# provide the full path as the file name.
|
68
|
+
# <tt>:cache</tt>::
|
69
|
+
# If set to true, this class caches previously looked up entries
|
70
|
+
# so subsequent lookups do not have to reread the file. If set
|
71
|
+
# to <tt>:read_all</tt>, then ALL values in the file are read in
|
72
|
+
# and cached the first time a lookup is done. If set to
|
73
|
+
# <tt>:preload</tt>, then ALL values in the file are read in
|
74
|
+
# immediately when the database is created. Default is false,
|
75
|
+
# indicating that the file will be reread on every lookup.
|
76
|
+
# <tt>:authority</tt>::
|
77
|
+
# If set, its value is taken as the authority name for all
|
78
|
+
# entries. The authority code will be set to the identifier. If
|
79
|
+
# not set, then the authority fields of entries will be blank.
|
80
|
+
|
81
|
+
def initialize(filename_, opts_={})
|
48
82
|
dir_ = nil
|
49
83
|
if opts_.include?(:dir)
|
50
84
|
dir_ = opts_[:dir]
|
@@ -56,36 +90,47 @@ module RGeo
|
|
56
90
|
end
|
57
91
|
end
|
58
92
|
end
|
59
|
-
@path = dir_ ? "#{dir_}/#{
|
60
|
-
@cache = opts_[:cache] ? {} : nil
|
93
|
+
@path = dir_ ? "#{dir_}/#{filename_}" : filename_
|
61
94
|
@authority = opts_[:authority]
|
62
|
-
|
95
|
+
if opts_[:cache]
|
96
|
+
@cache = {}
|
97
|
+
case opts_[:cache]
|
98
|
+
when :read_all
|
99
|
+
@populate_state = 1
|
100
|
+
when :preload
|
101
|
+
_search_file(nil)
|
102
|
+
@populate_state = 2
|
103
|
+
else
|
104
|
+
@populate_state = 0
|
105
|
+
end
|
106
|
+
else
|
107
|
+
@cache = nil
|
108
|
+
@populate_state = 0
|
109
|
+
end
|
63
110
|
end
|
64
111
|
|
65
112
|
|
113
|
+
# Retrieve the Entry for the given ID number.
|
114
|
+
|
66
115
|
def get(ident_)
|
67
116
|
ident_ = ident_.to_s
|
68
117
|
return @cache[ident_] if @cache && @cache.include?(ident_)
|
69
118
|
result_ = nil
|
70
119
|
if @populate_state == 0
|
71
120
|
data_ = _search_file(ident_)
|
72
|
-
|
73
|
-
@cache[ident_] = nil if @cache
|
74
|
-
return nil
|
75
|
-
end
|
76
|
-
result_ = Entry.new(ident_, :authority => @authority, :authority_code => @authority ? ident_ : nil, :name => data_[1], :proj4 => data_[2])
|
121
|
+
result_ = Entry.new(ident_, :authority => @authority, :authority_code => @authority ? ident_ : nil, :name => data_[1], :proj4 => data_[2]) if data_
|
77
122
|
@cache[ident_] = result_ if @cache
|
78
123
|
elsif @populate_state == 1
|
79
|
-
_search_file(nil)
|
80
|
-
|
81
|
-
result_ = @cache[id_] if id_ == ident_
|
82
|
-
end
|
124
|
+
_search_file(nil)
|
125
|
+
result_ = @cache[ident_]
|
83
126
|
@populate_state = 2
|
84
127
|
end
|
85
128
|
result_
|
86
129
|
end
|
87
130
|
|
88
131
|
|
132
|
+
# Clear the cache if one exists.
|
133
|
+
|
89
134
|
def clear_cache
|
90
135
|
@cache.clear if @cache
|
91
136
|
@populate_state = 1 if @populate_state == 2
|
@@ -114,8 +159,8 @@ module RGeo
|
|
114
159
|
if line_[-2..-1] == '<>'
|
115
160
|
cur_text_ << line_[0..-3].strip
|
116
161
|
cur_text_ = cur_text_.join(' ')
|
117
|
-
if
|
118
|
-
|
162
|
+
if ident_.nil?
|
163
|
+
@cache[ident_] = Entry.new(ident_, :authority => @authority, :authority_code => @authority ? id_ : nil, :name => cur_name_, :proj4 => cur_text_)
|
119
164
|
end
|
120
165
|
if cur_ident_ == ident_
|
121
166
|
return [ident_, cur_name_, cur_text_]
|