rgeo 0.3.3 → 0.3.4
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 +6 -0
- data/README.rdoc +1 -1
- data/Version +1 -1
- data/ext/geos_c_impl/extconf.rb +13 -13
- data/ext/geos_c_impl/factory.c +30 -18
- data/ext/geos_c_impl/factory.h +18 -12
- data/ext/geos_c_impl/geometry.c +11 -11
- data/ext/geos_c_impl/geometry.h +7 -7
- data/ext/geos_c_impl/geometry_collection.c +15 -15
- data/ext/geos_c_impl/geometry_collection.h +8 -8
- data/ext/geos_c_impl/line_string.c +14 -14
- data/ext/geos_c_impl/line_string.h +7 -7
- data/ext/geos_c_impl/main.c +7 -7
- data/ext/geos_c_impl/point.c +9 -9
- data/ext/geos_c_impl/point.h +7 -7
- data/ext/geos_c_impl/polygon.c +9 -9
- data/ext/geos_c_impl/polygon.h +7 -7
- data/ext/geos_c_impl/preface.h +7 -7
- data/ext/proj4_c_impl/extconf.rb +13 -13
- data/ext/proj4_c_impl/main.c +12 -12
- data/lib/rgeo.rb +26 -26
- data/lib/rgeo/cartesian.rb +12 -12
- data/lib/rgeo/cartesian/analysis.rb +26 -26
- data/lib/rgeo/cartesian/bounding_box.rb +83 -83
- data/lib/rgeo/cartesian/calculations.rb +36 -36
- data/lib/rgeo/cartesian/factory.rb +78 -78
- data/lib/rgeo/cartesian/feature_classes.rb +74 -74
- data/lib/rgeo/cartesian/feature_methods.rb +34 -34
- data/lib/rgeo/cartesian/interface.rb +33 -33
- data/lib/rgeo/coord_sys.rb +15 -15
- data/lib/rgeo/coord_sys/cs/entities.rb +533 -534
- data/lib/rgeo/coord_sys/cs/factories.rb +69 -69
- data/lib/rgeo/coord_sys/cs/wkt_parser.rb +44 -44
- data/lib/rgeo/coord_sys/proj4.rb +85 -85
- data/lib/rgeo/coord_sys/srs_database/active_record_table.rb +31 -31
- data/lib/rgeo/coord_sys/srs_database/interface.rb +44 -44
- data/lib/rgeo/coord_sys/srs_database/proj4_data.rb +31 -31
- data/lib/rgeo/coord_sys/srs_database/sr_org.rb +31 -31
- data/lib/rgeo/coord_sys/srs_database/url_reader.rb +29 -29
- data/lib/rgeo/error.rb +17 -17
- data/lib/rgeo/feature.rb +15 -15
- data/lib/rgeo/feature/curve.rb +58 -58
- data/lib/rgeo/feature/factory.rb +84 -84
- data/lib/rgeo/feature/factory_generator.rb +32 -32
- data/lib/rgeo/feature/geometry.rb +215 -215
- data/lib/rgeo/feature/geometry_collection.rb +46 -46
- data/lib/rgeo/feature/line.rb +21 -21
- data/lib/rgeo/feature/line_string.rb +35 -35
- data/lib/rgeo/feature/linear_ring.rb +20 -20
- data/lib/rgeo/feature/mixins.rb +61 -61
- data/lib/rgeo/feature/multi_curve.rb +37 -37
- data/lib/rgeo/feature/multi_line_string.rb +20 -20
- data/lib/rgeo/feature/multi_point.rb +22 -22
- data/lib/rgeo/feature/multi_polygon.rb +28 -28
- data/lib/rgeo/feature/multi_surface.rb +39 -39
- data/lib/rgeo/feature/point.rb +42 -42
- data/lib/rgeo/feature/polygon.rb +50 -50
- data/lib/rgeo/feature/surface.rb +42 -42
- data/lib/rgeo/feature/types.rb +58 -58
- data/lib/rgeo/geographic.rb +14 -14
- data/lib/rgeo/geographic/factory.rb +87 -87
- data/lib/rgeo/geographic/interface.rb +55 -55
- data/lib/rgeo/geographic/proj4_projector.rb +35 -35
- data/lib/rgeo/geographic/projected_feature_classes.rb +95 -95
- data/lib/rgeo/geographic/projected_feature_methods.rb +81 -81
- data/lib/rgeo/geographic/projected_window.rb +103 -103
- data/lib/rgeo/geographic/simple_mercator_projector.rb +32 -32
- data/lib/rgeo/geographic/spherical_feature_classes.rb +93 -93
- data/lib/rgeo/geographic/spherical_feature_methods.rb +25 -25
- data/lib/rgeo/geographic/spherical_math.rb +58 -58
- data/lib/rgeo/geos.rb +22 -17
- data/lib/rgeo/geos/factory.rb +93 -93
- data/lib/rgeo/geos/ffi_classes.rb +306 -231
- data/lib/rgeo/geos/ffi_factory.rb +100 -96
- data/lib/rgeo/geos/impl_additions.rb +22 -22
- data/lib/rgeo/geos/interface.rb +45 -45
- data/lib/rgeo/geos/zm_factory.rb +90 -90
- data/lib/rgeo/geos/zm_impl.rb +167 -167
- data/lib/rgeo/impl_helper.rb +11 -11
- data/lib/rgeo/impl_helper/basic_geometry_collection_methods.rb +71 -71
- data/lib/rgeo/impl_helper/basic_geometry_methods.rb +29 -29
- data/lib/rgeo/impl_helper/basic_line_string_methods.rb +61 -61
- data/lib/rgeo/impl_helper/basic_point_methods.rb +43 -43
- data/lib/rgeo/impl_helper/basic_polygon_methods.rb +35 -35
- data/lib/rgeo/impl_helper/math.rb +13 -13
- data/lib/rgeo/version.rb +10 -10
- data/lib/rgeo/wkrep.rb +16 -16
- data/lib/rgeo/wkrep/wkb_generator.rb +51 -51
- data/lib/rgeo/wkrep/wkb_parser.rb +52 -52
- data/lib/rgeo/wkrep/wkt_generator.rb +51 -51
- data/lib/rgeo/wkrep/wkt_parser.rb +66 -66
- data/lib/rgeo/yaml.rb +14 -14
- data/test/common/geometry_collection_tests.rb +53 -53
- data/test/common/line_string_tests.rb +57 -57
- data/test/common/multi_line_string_tests.rb +43 -43
- data/test/common/multi_point_tests.rb +43 -43
- data/test/common/multi_polygon_tests.rb +43 -43
- data/test/common/point_tests.rb +75 -75
- data/test/common/polygon_tests.rb +37 -37
- data/test/coord_sys/tc_active_record_table.rb +25 -25
- data/test/coord_sys/tc_ogc_cs.rb +72 -72
- data/test/coord_sys/tc_proj4.rb +51 -51
- data/test/coord_sys/tc_proj4_srs_data.rb +17 -17
- data/test/coord_sys/tc_sr_org.rb +15 -15
- data/test/coord_sys/tc_url_reader.rb +19 -19
- data/test/geos_capi/tc_factory.rb +21 -21
- data/test/geos_capi/tc_geometry_collection.rb +15 -15
- data/test/geos_capi/tc_line_string.rb +15 -15
- data/test/geos_capi/tc_misc.rb +33 -22
- data/test/geos_capi/tc_multi_line_string.rb +15 -15
- data/test/geos_capi/tc_multi_point.rb +15 -15
- data/test/geos_capi/tc_multi_polygon.rb +15 -15
- data/test/geos_capi/tc_parsing_unparsing.rb +19 -19
- data/test/geos_capi/tc_point.rb +21 -21
- data/test/geos_capi/tc_polygon.rb +19 -19
- data/test/geos_capi/tc_zmfactory.rb +17 -17
- data/test/geos_ffi/tc_factory.rb +21 -21
- data/test/geos_ffi/tc_geometry_collection.rb +15 -15
- data/test/geos_ffi/tc_line_string.rb +15 -15
- data/test/geos_ffi/tc_misc.rb +49 -15
- data/test/geos_ffi/tc_multi_line_string.rb +15 -15
- data/test/geos_ffi/tc_multi_point.rb +15 -15
- data/test/geos_ffi/tc_multi_polygon.rb +15 -15
- data/test/geos_ffi/tc_parsing_unparsing.rb +19 -19
- data/test/geos_ffi/tc_point.rb +21 -21
- data/test/geos_ffi/tc_polygon.rb +19 -19
- data/test/geos_ffi/tc_zmfactory.rb +17 -17
- data/test/projected_geographic/tc_geometry_collection.rb +15 -15
- data/test/projected_geographic/tc_line_string.rb +15 -15
- data/test/projected_geographic/tc_multi_line_string.rb +15 -15
- data/test/projected_geographic/tc_multi_point.rb +15 -15
- data/test/projected_geographic/tc_multi_polygon.rb +15 -15
- data/test/projected_geographic/tc_point.rb +23 -23
- data/test/projected_geographic/tc_polygon.rb +15 -15
- data/test/simple_cartesian/tc_calculations.rb +31 -31
- data/test/simple_cartesian/tc_geometry_collection.rb +17 -17
- data/test/simple_cartesian/tc_line_string.rb +17 -17
- data/test/simple_cartesian/tc_multi_line_string.rb +17 -17
- data/test/simple_cartesian/tc_multi_point.rb +17 -17
- data/test/simple_cartesian/tc_multi_polygon.rb +17 -17
- data/test/simple_cartesian/tc_point.rb +21 -21
- data/test/simple_cartesian/tc_polygon.rb +17 -17
- data/test/simple_mercator/tc_geometry_collection.rb +15 -15
- data/test/simple_mercator/tc_line_string.rb +15 -15
- data/test/simple_mercator/tc_multi_line_string.rb +15 -15
- data/test/simple_mercator/tc_multi_point.rb +15 -15
- data/test/simple_mercator/tc_multi_polygon.rb +15 -15
- data/test/simple_mercator/tc_point.rb +23 -23
- data/test/simple_mercator/tc_polygon.rb +15 -15
- data/test/simple_mercator/tc_window.rb +50 -50
- data/test/spherical_geographic/tc_calculations.rb +47 -47
- data/test/spherical_geographic/tc_geometry_collection.rb +17 -17
- data/test/spherical_geographic/tc_line_string.rb +17 -17
- data/test/spherical_geographic/tc_multi_line_string.rb +17 -17
- data/test/spherical_geographic/tc_multi_point.rb +17 -17
- data/test/spherical_geographic/tc_multi_polygon.rb +17 -17
- data/test/spherical_geographic/tc_point.rb +23 -23
- data/test/spherical_geographic/tc_polygon.rb +17 -17
- data/test/tc_cartesian_analysis.rb +23 -23
- data/test/tc_mixins.rb +39 -39
- data/test/tc_oneoff.rb +15 -15
- data/test/tc_types.rb +17 -17
- data/test/wkrep/tc_wkb_generator.rb +67 -67
- data/test/wkrep/tc_wkb_parser.rb +73 -73
- data/test/wkrep/tc_wkt_generator.rb +75 -75
- data/test/wkrep/tc_wkt_parser.rb +97 -97
- metadata +3 -3
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Cartesian common methods
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
|
-
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
6
|
+
# Copyright 2010-2012 Daniel Azuma
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -35,29 +35,29 @@
|
|
35
35
|
|
36
36
|
|
37
37
|
module RGeo
|
38
|
-
|
38
|
+
|
39
39
|
module Cartesian
|
40
|
-
|
41
|
-
|
40
|
+
|
41
|
+
|
42
42
|
module GeometryMethods # :nodoc:
|
43
|
-
|
44
|
-
|
43
|
+
|
44
|
+
|
45
45
|
def srid
|
46
46
|
factory.srid
|
47
47
|
end
|
48
|
-
|
49
|
-
|
48
|
+
|
49
|
+
|
50
50
|
def envelope
|
51
51
|
BoundingBox.new(factory).add(self).to_geometry
|
52
52
|
end
|
53
|
-
|
54
|
-
|
53
|
+
|
54
|
+
|
55
55
|
end
|
56
|
-
|
57
|
-
|
56
|
+
|
57
|
+
|
58
58
|
module PointMethods # :nodoc:
|
59
|
-
|
60
|
-
|
59
|
+
|
60
|
+
|
61
61
|
def distance(rhs_)
|
62
62
|
rhs_ = ::RGeo::Feature.cast(rhs_, @factory)
|
63
63
|
case rhs_
|
@@ -69,14 +69,14 @@ module RGeo
|
|
69
69
|
super
|
70
70
|
end
|
71
71
|
end
|
72
|
-
|
73
|
-
|
72
|
+
|
73
|
+
|
74
74
|
end
|
75
|
-
|
76
|
-
|
75
|
+
|
76
|
+
|
77
77
|
module LineStringMethods # :nodoc:
|
78
|
-
|
79
|
-
|
78
|
+
|
79
|
+
|
80
80
|
def _segments
|
81
81
|
unless @segments
|
82
82
|
@segments = (0..num_points-2).map do |i_|
|
@@ -85,8 +85,8 @@ module RGeo
|
|
85
85
|
end
|
86
86
|
@segments
|
87
87
|
end
|
88
|
-
|
89
|
-
|
88
|
+
|
89
|
+
|
90
90
|
def is_simple?
|
91
91
|
segs_ = _segments
|
92
92
|
len_ = segs_.length
|
@@ -111,15 +111,15 @@ module RGeo
|
|
111
111
|
end
|
112
112
|
true
|
113
113
|
end
|
114
|
-
|
115
|
-
|
114
|
+
|
115
|
+
|
116
116
|
def length
|
117
117
|
@segments.inject(0.0){ |sum_, seg_| sum_ + seg_.length }
|
118
118
|
end
|
119
|
-
|
120
|
-
|
119
|
+
|
120
|
+
|
121
121
|
end
|
122
|
-
|
122
|
+
|
123
123
|
end
|
124
|
-
|
124
|
+
|
125
125
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Cartesian toplevel interface
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
|
-
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
6
|
+
# Copyright 2010-2012 Daniel Azuma
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -35,15 +35,15 @@
|
|
35
35
|
|
36
36
|
|
37
37
|
module RGeo
|
38
|
-
|
38
|
+
|
39
39
|
module Cartesian
|
40
|
-
|
40
|
+
|
41
41
|
class << self
|
42
|
-
|
43
|
-
|
42
|
+
|
43
|
+
|
44
44
|
# Creates and returns a cartesian factory of the preferred
|
45
45
|
# Cartesian implementation.
|
46
|
-
#
|
46
|
+
#
|
47
47
|
# The actual implementation returned depends on which ruby
|
48
48
|
# interpreter is running and what libraries are available.
|
49
49
|
# RGeo will try to provide a fully-functional and performant
|
@@ -51,13 +51,13 @@ module RGeo
|
|
51
51
|
# implementation will be returned.
|
52
52
|
# In practice, this means it returns a Geos implementation if
|
53
53
|
# available; otherwise it falls back to the simple implementation.
|
54
|
-
#
|
54
|
+
#
|
55
55
|
# The given options are passed to the factory's constructor.
|
56
56
|
# What options are available depends on the particular
|
57
57
|
# implementation. See RGeo::Geos.factory and
|
58
58
|
# RGeo::Cartesian.simple_factory for details. Unsupported options
|
59
59
|
# are ignored.
|
60
|
-
|
60
|
+
|
61
61
|
def preferred_factory(opts_={})
|
62
62
|
if ::RGeo::Geos.supported?
|
63
63
|
::RGeo::Geos.factory(opts_)
|
@@ -66,14 +66,14 @@ module RGeo
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
alias_method :factory, :preferred_factory
|
69
|
-
|
70
|
-
|
69
|
+
|
70
|
+
|
71
71
|
# Returns a factory for the simple Cartesian implementation. This
|
72
72
|
# implementation provides all SFS 1.1 types, and also allows Z and
|
73
73
|
# M coordinates. It does not depend on external libraries, and is
|
74
74
|
# thus always available, but it does not implement many of the more
|
75
75
|
# advanced geometric operations. These limitations are:
|
76
|
-
#
|
76
|
+
#
|
77
77
|
# * Relational operators such as Feature::Geometry#intersects? are
|
78
78
|
# not implemented for most types.
|
79
79
|
# * Relational constructors such as Feature::Geometry#union are
|
@@ -85,12 +85,12 @@ module RGeo
|
|
85
85
|
# * Equality and simplicity evaluation are implemented for some but
|
86
86
|
# not all types.
|
87
87
|
# * Assertions for polygons and multipolygons are not implemented.
|
88
|
-
#
|
88
|
+
#
|
89
89
|
# Unimplemented operations may raise Error::UnsupportedOperation
|
90
90
|
# if invoked.
|
91
|
-
#
|
91
|
+
#
|
92
92
|
# Options include:
|
93
|
-
#
|
93
|
+
#
|
94
94
|
# [<tt>:srid</tt>]
|
95
95
|
# Set the SRID returned by geometries created by this factory.
|
96
96
|
# Default is 0.
|
@@ -130,41 +130,41 @@ module RGeo
|
|
130
130
|
# configuration parameters for WKRep::WKTGenerator.new.
|
131
131
|
# Default is the empty hash, indicating the default configuration
|
132
132
|
# for WKRep::WKBGenerator.
|
133
|
-
|
133
|
+
|
134
134
|
def simple_factory(opts_={})
|
135
135
|
Cartesian::Factory.new(opts_)
|
136
136
|
end
|
137
|
-
|
138
|
-
|
137
|
+
|
138
|
+
|
139
139
|
# Returns a Feature::FactoryGenerator that creates preferred
|
140
140
|
# factories. The given options are used as the default options.
|
141
|
-
#
|
141
|
+
#
|
142
142
|
# A common case for this is to provide the <tt>:srs_database</tt>
|
143
143
|
# as a default. Then, the factory generator need only be passed
|
144
144
|
# an SRID and it will automatically fetch the appropriate Proj4
|
145
145
|
# and CoordSys objects.
|
146
|
-
|
146
|
+
|
147
147
|
def preferred_factory_generator(defaults_={})
|
148
148
|
::Proc.new{ |c_| preferred_factory(defaults_.merge(c_)) }
|
149
149
|
end
|
150
150
|
alias_method :factory_generator, :preferred_factory_generator
|
151
|
-
|
152
|
-
|
151
|
+
|
152
|
+
|
153
153
|
# Returns a Feature::FactoryGenerator that creates simple factories.
|
154
154
|
# The given options are used as the default options.
|
155
|
-
#
|
155
|
+
#
|
156
156
|
# A common case for this is to provide the <tt>:srs_database</tt>
|
157
157
|
# as a default. Then, the factory generator need only be passed
|
158
158
|
# an SRID and it will automatically fetch the appropriate Proj4
|
159
159
|
# and CoordSys objects.
|
160
|
-
|
160
|
+
|
161
161
|
def simple_factory_generator(defaults_={})
|
162
162
|
::Proc.new{ |c_| simple_factory(defaults_.merge(c_)) }
|
163
163
|
end
|
164
|
-
|
165
|
-
|
164
|
+
|
165
|
+
|
166
166
|
end
|
167
|
-
|
167
|
+
|
168
168
|
end
|
169
|
-
|
169
|
+
|
170
170
|
end
|
data/lib/rgeo/coord_sys.rb
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
# -----------------------------------------------------------------------------
|
2
|
-
#
|
2
|
+
#
|
3
3
|
# Coordinate systems for RGeo
|
4
|
-
#
|
4
|
+
#
|
5
5
|
# -----------------------------------------------------------------------------
|
6
|
-
# Copyright 2010 Daniel Azuma
|
7
|
-
#
|
6
|
+
# Copyright 2010-2012 Daniel Azuma
|
7
|
+
#
|
8
8
|
# All rights reserved.
|
9
|
-
#
|
9
|
+
#
|
10
10
|
# Redistribution and use in source and binary forms, with or without
|
11
11
|
# modification, are permitted provided that the following conditions are met:
|
12
|
-
#
|
12
|
+
#
|
13
13
|
# * Redistributions of source code must retain the above copyright notice,
|
14
14
|
# this list of conditions and the following disclaimer.
|
15
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -18,7 +18,7 @@
|
|
18
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
19
19
|
# contributors to this software, may be used to endorse or promote products
|
20
20
|
# derived from this software without specific prior written permission.
|
21
|
-
#
|
21
|
+
#
|
22
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
23
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
24
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -35,32 +35,32 @@
|
|
35
35
|
|
36
36
|
|
37
37
|
module RGeo
|
38
|
-
|
39
|
-
|
38
|
+
|
39
|
+
|
40
40
|
# This module provides data structures and tools related to coordinate
|
41
41
|
# systems and coordinate transforms. It comprises the following parts:
|
42
|
-
#
|
42
|
+
#
|
43
43
|
# RGeo::CoordSys::Proj4 is a wrapper around the proj4 library, which
|
44
44
|
# defines a commonly-used syntax for specifying geographic and projected
|
45
45
|
# coordinate systems, and performs coordinate transformations.
|
46
|
-
#
|
46
|
+
#
|
47
47
|
# The RGeo::CoordSys::CS module contains an implementation of the CS
|
48
48
|
# (coordinate systems) package of the OGC Coordinate Transform spec.
|
49
49
|
# This includes classes for representing ellipsoids, datums, coordinate
|
50
50
|
# systems, and other related concepts, as well as a parser for the WKT
|
51
51
|
# format for specifying coordinate systems.
|
52
|
-
#
|
52
|
+
#
|
53
53
|
# The RGeo::CoordSys::SRSDatabase module contains tools for accessing
|
54
54
|
# spatial reference databases, from which you can look up coordinate
|
55
55
|
# system specifications. You can access the <tt>spatial_ref_sys</tt>
|
56
56
|
# table provided with OGC-compliant spatial databases such as PostGIS,
|
57
57
|
# read the databases provided with the proj4 library, or access URLs
|
58
58
|
# such as those provided by spatialreference.org.
|
59
|
-
|
59
|
+
|
60
60
|
module CoordSys
|
61
61
|
end
|
62
|
-
|
63
|
-
|
62
|
+
|
63
|
+
|
64
64
|
end
|
65
65
|
|
66
66
|
|
@@ -1,16 +1,15 @@
|
|
1
|
-
# -*- coding: utf-8 -*-
|
2
1
|
# -----------------------------------------------------------------------------
|
3
|
-
#
|
2
|
+
#
|
4
3
|
# OGC CS objects for RGeo
|
5
|
-
#
|
4
|
+
#
|
6
5
|
# -----------------------------------------------------------------------------
|
7
|
-
# Copyright 2010 Daniel Azuma
|
8
|
-
#
|
6
|
+
# Copyright 2010-2012 Daniel Azuma
|
7
|
+
#
|
9
8
|
# All rights reserved.
|
10
|
-
#
|
9
|
+
#
|
11
10
|
# Redistribution and use in source and binary forms, with or without
|
12
11
|
# modification, are permitted provided that the following conditions are met:
|
13
|
-
#
|
12
|
+
#
|
14
13
|
# * Redistributions of source code must retain the above copyright notice,
|
15
14
|
# this list of conditions and the following disclaimer.
|
16
15
|
# * Redistributions in binary form must reproduce the above copyright notice,
|
@@ -19,7 +18,7 @@
|
|
19
18
|
# * Neither the name of the copyright holder, nor the names of any other
|
20
19
|
# contributors to this software, may be used to endorse or promote products
|
21
20
|
# derived from this software without specific prior written permission.
|
22
|
-
#
|
21
|
+
#
|
23
22
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
24
23
|
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
25
24
|
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
@@ -36,57 +35,57 @@
|
|
36
35
|
|
37
36
|
|
38
37
|
module RGeo
|
39
|
-
|
38
|
+
|
40
39
|
module CoordSys
|
41
|
-
|
42
|
-
|
40
|
+
|
41
|
+
|
43
42
|
module CS
|
44
|
-
|
45
|
-
|
43
|
+
|
44
|
+
|
46
45
|
# An axis orientation constant for AxisInfo.
|
47
46
|
# Unknown or unspecified axis orientation. This can be used for
|
48
47
|
# local or fitted coordinate systems.
|
49
48
|
AO_OTHER = 0
|
50
|
-
|
49
|
+
|
51
50
|
# An axis orientation constant for AxisInfo.
|
52
51
|
# Increasing ordinates values go North. This is usually used for
|
53
52
|
# Grid Y coordinates and Latitude.
|
54
53
|
AO_NORTH = 1
|
55
|
-
|
54
|
+
|
56
55
|
# An axis orientation constant for AxisInfo.
|
57
56
|
# Increasing ordinates values go South. This is rarely used.
|
58
57
|
AO_SOUTH = 2
|
59
|
-
|
58
|
+
|
60
59
|
# An axis orientation constant for AxisInfo.
|
61
60
|
# Increasing ordinates values go East. This is rarely used.
|
62
61
|
AO_EAST = 3
|
63
|
-
|
62
|
+
|
64
63
|
# An axis orientation constant for AxisInfo.
|
65
64
|
# Increasing ordinates values go West. This is usually used for
|
66
65
|
# Grid X coordinates and Longitude.
|
67
66
|
AO_WEST = 4
|
68
|
-
|
67
|
+
|
69
68
|
# An axis orientation constant for AxisInfo.
|
70
69
|
# Increasing ordinates values go up. This is used for vertical
|
71
70
|
# coordinate systems.
|
72
71
|
AO_UP = 5
|
73
|
-
|
72
|
+
|
74
73
|
# An axis orientation constant for AxisInfo.
|
75
74
|
# Increasing ordinates values go down. This is used for vertical
|
76
75
|
# coordinate systems.
|
77
76
|
AO_DOWN = 6
|
78
|
-
|
79
|
-
|
77
|
+
|
78
|
+
|
80
79
|
# A datum type constant for HorizontalDatum.
|
81
80
|
# Lowest possible value for horizontal datum types.
|
82
81
|
HD_MIN = 1000
|
83
|
-
|
82
|
+
|
84
83
|
# A datum type constant for HorizontalDatum.
|
85
84
|
# Unspecified horizontal datum type. Horizontal datums with this
|
86
85
|
# type should never supply a conversion to WGS84 using Bursa Wolf
|
87
86
|
# parameters.
|
88
87
|
HD_OTHER = 1000
|
89
|
-
|
88
|
+
|
90
89
|
# A datum type constant for HorizontalDatum.
|
91
90
|
# These datums, such as ED50, NAD27 and NAD83, have been designed
|
92
91
|
# to support horizontal positions on the ellipsoid as opposed to
|
@@ -94,7 +93,7 @@ module RGeo
|
|
94
93
|
# support a horizontal component of a position in a domain of
|
95
94
|
# limited extent, such as a country, a region or a continent.
|
96
95
|
HD_CLASSIC = 1001
|
97
|
-
|
96
|
+
|
98
97
|
# A datum type constant for HorizontalDatum.
|
99
98
|
# A geocentric datum is a "satellite age" modern geodetic datum
|
100
99
|
# mainly of global extent, such as WGS84 (used in GPS), PZ90 (used
|
@@ -103,30 +102,30 @@ module RGeo
|
|
103
102
|
# position (through ellipsoidal heights). The regional realizations
|
104
103
|
# of ITRF, such as ETRF, are also included in this category.
|
105
104
|
HD_GEOCENTRIC = 1002
|
106
|
-
|
105
|
+
|
107
106
|
# A datum type constant for HorizontalDatum.
|
108
107
|
# Highest possible value for horizontal datum types.
|
109
108
|
HD_MAX = 1999
|
110
|
-
|
109
|
+
|
111
110
|
# A datum type constant for VerticalDatum.
|
112
111
|
# Lowest possible value for vertical datum types.
|
113
112
|
VD_MIN = 2000
|
114
|
-
|
113
|
+
|
115
114
|
# A datum type constant for VerticalDatum.
|
116
115
|
# Unspecified vertical datum type.
|
117
116
|
VD_OTHER = 2000
|
118
|
-
|
117
|
+
|
119
118
|
# A datum type constant for VerticalDatum.
|
120
119
|
# A vertical datum for orthometric heights that are measured along
|
121
120
|
# the plumb line.
|
122
121
|
VD_ORTHOMETRIC = 2001
|
123
|
-
|
122
|
+
|
124
123
|
# A datum type constant for VerticalDatum.
|
125
124
|
# A vertical datum for ellipsoidal heights that are measured along
|
126
125
|
# the normal to the ellipsoid used in the definition of horizontal
|
127
126
|
# datum.
|
128
127
|
VD_ELLIPSOIDAL = 2002
|
129
|
-
|
128
|
+
|
130
129
|
# A datum type constant for VerticalDatum.
|
131
130
|
# The vertical datum of altitudes or heights in the atmosphere.
|
132
131
|
# These are approximations of orthometric heights obtained with the
|
@@ -135,11 +134,11 @@ module RGeo
|
|
135
134
|
# millibars (used to measure pressure levels), or theta value (units
|
136
135
|
# used to measure geopotential height).
|
137
136
|
VD_ALTITUDE_BAROMETRIC = 2003
|
138
|
-
|
137
|
+
|
139
138
|
# A datum type constant for VerticalDatum.
|
140
139
|
# A normal height system.
|
141
140
|
VD_NORMAL = 2004
|
142
|
-
|
141
|
+
|
143
142
|
# A datum type constant for VerticalDatum.
|
144
143
|
# A vertical datum of geoid model derived heights, also called
|
145
144
|
# GPS-derived heights. These heights are approximations of
|
@@ -147,7 +146,7 @@ module RGeo
|
|
147
146
|
# (h) by the use of the given geoid undulation model (N) through
|
148
147
|
# the equation: H=h-N.
|
149
148
|
VD_GEOID_MODE_DERIVED = 2005
|
150
|
-
|
149
|
+
|
151
150
|
# A datum type constant for VerticalDatum.
|
152
151
|
# This attribute is used to support the set of datums generated for
|
153
152
|
# hydrographic engineering projects where depth measurements below
|
@@ -156,61 +155,61 @@ module RGeo
|
|
156
155
|
# (approximately) to the actual equipotential surfaces of the
|
157
156
|
# earth's gravity field, using such procedures as echo-sounding.
|
158
157
|
VD_DEPTH = 2006
|
159
|
-
|
158
|
+
|
160
159
|
# A datum type constant for VerticalDatum.
|
161
160
|
# Highest possible value for vertical datum types.
|
162
161
|
VD_MAX = 2999
|
163
|
-
|
162
|
+
|
164
163
|
# A datum type constant for LocalDatum.
|
165
164
|
# Lowest possible value for local datum types.
|
166
165
|
LD_MIN = 10000
|
167
|
-
|
166
|
+
|
168
167
|
# A datum type constant for LocalDatum.
|
169
168
|
# Highest possible value for local datum types.
|
170
169
|
LD_MAX = 32767
|
171
|
-
|
172
|
-
|
170
|
+
|
171
|
+
|
173
172
|
# This is a base class for all OGC coordinate system objects.
|
174
173
|
# This includes both interfaces and data types from the OGC
|
175
174
|
# Coordinate Transformation spec.
|
176
|
-
#
|
175
|
+
#
|
177
176
|
# This is a non-instantiable abstract class.
|
178
|
-
|
177
|
+
|
179
178
|
class Base
|
180
|
-
|
181
|
-
|
179
|
+
|
180
|
+
|
182
181
|
def inspect # :nodoc:
|
183
182
|
"#<#{self.class}:0x#{object_id.to_s(16)} #{to_wkt}>"
|
184
183
|
end
|
185
|
-
|
186
|
-
|
184
|
+
|
185
|
+
|
187
186
|
# Tests for equality. Two objects are defined as equal if they
|
188
187
|
# have the same type (class) and the same WKT representation.
|
189
|
-
|
188
|
+
|
190
189
|
def eql?(rhs_)
|
191
190
|
rhs_.class == self.class && rhs_.to_wkt == self.to_wkt
|
192
191
|
end
|
193
192
|
alias_method :==, :eql?
|
194
|
-
|
195
|
-
|
193
|
+
|
194
|
+
|
196
195
|
# Returns the default WKT representation.
|
197
|
-
|
196
|
+
|
198
197
|
def to_s
|
199
198
|
to_wkt
|
200
199
|
end
|
201
|
-
|
202
|
-
|
200
|
+
|
201
|
+
|
203
202
|
# Computes the WKT representation. Options include:
|
204
|
-
#
|
203
|
+
#
|
205
204
|
# [<tt>:standard_brackets</tt>]
|
206
205
|
# If set to true, outputs parentheses rather than square
|
207
206
|
# brackets. Default is false.
|
208
|
-
|
207
|
+
|
209
208
|
def to_wkt(opts_={})
|
210
209
|
opts_[:standard_brackets] ? _to_wkt('(', ')') : _to_wkt('[', ']')
|
211
210
|
end
|
212
|
-
|
213
|
-
|
211
|
+
|
212
|
+
|
214
213
|
def _to_wkt(open_, close_) # :nodoc:
|
215
214
|
content_ = _wkt_content(open_, close_).map{ |obj_| ",#{obj_}" }.join
|
216
215
|
if defined?(@authority) && @authority
|
@@ -220,14 +219,14 @@ module RGeo
|
|
220
219
|
end
|
221
220
|
"#{_wkt_typename}#{open_}#{@name.inspect}#{content_}#{authority_}#{close_}"
|
222
221
|
end
|
223
|
-
|
224
|
-
|
222
|
+
|
223
|
+
|
225
224
|
# Marshal support
|
226
|
-
|
225
|
+
|
227
226
|
def marshal_dump # :nodoc:
|
228
227
|
to_wkt
|
229
228
|
end
|
230
|
-
|
229
|
+
|
231
230
|
def marshal_load(data_) # :nodoc:
|
232
231
|
data_ = data_['wkt'] if data_.is_a?(::Hash)
|
233
232
|
temp_ = CS.create_from_wkt(data_)
|
@@ -239,10 +238,10 @@ module RGeo
|
|
239
238
|
raise ::TypeError, 'Bad Marshal data'
|
240
239
|
end
|
241
240
|
end
|
242
|
-
|
243
|
-
|
241
|
+
|
242
|
+
|
244
243
|
# Psych support
|
245
|
-
|
244
|
+
|
246
245
|
def init_with(coder_) # :nodoc:
|
247
246
|
temp_ = CS.create_from_wkt(coder_.type == :scalar ? coder_.scalar : coder_['wkt'] )
|
248
247
|
if temp_.class == self.class
|
@@ -253,33 +252,33 @@ module RGeo
|
|
253
252
|
raise ::TypeError, 'Bad YAML data'
|
254
253
|
end
|
255
254
|
end
|
256
|
-
|
255
|
+
|
257
256
|
def encode_with(coder_) # :nodoc:
|
258
257
|
coder_['wkt'] = to_wkt
|
259
258
|
end
|
260
|
-
|
261
|
-
|
259
|
+
|
260
|
+
|
262
261
|
class << self
|
263
|
-
|
262
|
+
|
264
263
|
private :new
|
265
|
-
|
264
|
+
|
266
265
|
end
|
267
|
-
|
268
|
-
|
266
|
+
|
267
|
+
|
269
268
|
end
|
270
|
-
|
271
|
-
|
269
|
+
|
270
|
+
|
272
271
|
# == OGC spec description
|
273
|
-
#
|
272
|
+
#
|
274
273
|
# Details of axis. This is used to label axes, and indicate the
|
275
274
|
# orientation.
|
276
|
-
|
275
|
+
|
277
276
|
class AxisInfo < Base
|
278
|
-
|
277
|
+
|
279
278
|
# :stopdoc:
|
280
279
|
NAMES_BY_VALUE = ['OTHER', 'NORTH', 'SOUTH', 'EAST', 'WEST', 'UP', 'DOWN']
|
281
280
|
# :startdoc:
|
282
|
-
|
281
|
+
|
283
282
|
def initialize(name_, orientation_) # :nodoc:
|
284
283
|
@name = name_
|
285
284
|
case orientation_
|
@@ -289,28 +288,28 @@ module RGeo
|
|
289
288
|
@orientation = orientation_.to_i
|
290
289
|
end
|
291
290
|
end
|
292
|
-
|
293
|
-
|
291
|
+
|
292
|
+
|
294
293
|
# Human readable name for axis. Possible values are "X", "Y",
|
295
294
|
# "Long", "Lat" or any other short string.
|
296
295
|
attr_reader :name
|
297
|
-
|
296
|
+
|
298
297
|
# Gets enumerated value for orientation.
|
299
298
|
attr_reader :orientation
|
300
|
-
|
301
|
-
|
299
|
+
|
300
|
+
|
302
301
|
def _wkt_typename # :nodoc:
|
303
302
|
"AXIS"
|
304
303
|
end
|
305
|
-
|
304
|
+
|
306
305
|
def _wkt_content(open_, close_) # :nodoc:
|
307
306
|
[NAMES_BY_VALUE[@orientation]]
|
308
307
|
end
|
309
|
-
|
310
|
-
|
308
|
+
|
309
|
+
|
311
310
|
class << self
|
312
|
-
|
313
|
-
|
311
|
+
|
312
|
+
|
314
313
|
# Creates an AxisInfo. you must pass the human readable name for
|
315
314
|
# the axis (e.g. "X", "Y", "Long", "Lat", or other short string)
|
316
315
|
# and either an integer orientation code or a string. Possible
|
@@ -318,73 +317,73 @@ module RGeo
|
|
318
317
|
# "<tt>SOUTH</tt>", "<tt>EAST</tt>", "<tt>WEST</tt>",
|
319
318
|
# "<tt>UP</tt>", and "<tt>DOWN</tt>", or the corresponding
|
320
319
|
# integer values 0-5.
|
321
|
-
|
320
|
+
|
322
321
|
def create(name_, orientation_)
|
323
322
|
new(name_, orientation_)
|
324
323
|
end
|
325
|
-
|
326
|
-
|
324
|
+
|
325
|
+
|
327
326
|
end
|
328
|
-
|
327
|
+
|
329
328
|
end
|
330
|
-
|
331
|
-
|
329
|
+
|
330
|
+
|
332
331
|
# == OGC spec description
|
333
|
-
#
|
332
|
+
#
|
334
333
|
# A named projection parameter value. The linear units of
|
335
334
|
# parameters' values match the linear units of the containing
|
336
335
|
# projected coordinate system. The angular units of parameter
|
337
336
|
# values match the angular units of the geographic coordinate
|
338
337
|
# system that the projected coordinate system is based on.
|
339
|
-
|
338
|
+
|
340
339
|
class ProjectionParameter < Base
|
341
|
-
|
340
|
+
|
342
341
|
def initialize(name_, value_) # :nodoc:
|
343
342
|
@name = name_
|
344
343
|
@value = value_.to_f
|
345
344
|
end
|
346
|
-
|
347
|
-
|
345
|
+
|
346
|
+
|
348
347
|
# The parameter name.
|
349
348
|
attr_reader :name
|
350
|
-
|
349
|
+
|
351
350
|
# The parameter value.
|
352
351
|
attr_reader :value
|
353
|
-
|
354
|
-
|
352
|
+
|
353
|
+
|
355
354
|
def _wkt_typename # :nodoc:
|
356
355
|
"PARAMETER"
|
357
356
|
end
|
358
|
-
|
357
|
+
|
359
358
|
def _wkt_content(open_, close_) # :nodoc:
|
360
359
|
[@value]
|
361
360
|
end
|
362
|
-
|
363
|
-
|
361
|
+
|
362
|
+
|
364
363
|
class << self
|
365
|
-
|
366
|
-
|
364
|
+
|
365
|
+
|
367
366
|
# Create a parameter given the name and value.
|
368
|
-
|
367
|
+
|
369
368
|
def create(name_, value_)
|
370
369
|
new(name_, value_)
|
371
370
|
end
|
372
|
-
|
373
|
-
|
371
|
+
|
372
|
+
|
374
373
|
end
|
375
|
-
|
374
|
+
|
376
375
|
end
|
377
|
-
|
378
|
-
|
376
|
+
|
377
|
+
|
379
378
|
# == OGC spec description
|
380
|
-
#
|
379
|
+
#
|
381
380
|
# Parameters for a geographic transformation into WGS84. The Bursa
|
382
381
|
# Wolf parameters should be applied to geocentric coordinates, where
|
383
382
|
# the X axis points towards the Greenwich Prime Meridian, the Y axis
|
384
383
|
# points East, and the Z axis points North.
|
385
|
-
|
384
|
+
|
386
385
|
class WGS84ConversionInfo < Base
|
387
|
-
|
386
|
+
|
388
387
|
def initialize(dx_, dy_, dz_, ex_, ey_, ez_, ppm_) # :nodoc:
|
389
388
|
@dx = dx_.to_f
|
390
389
|
@dy = dy_.to_f
|
@@ -394,65 +393,65 @@ module RGeo
|
|
394
393
|
@ez = ez_.to_f
|
395
394
|
@ppm = ppm_.to_f
|
396
395
|
end
|
397
|
-
|
398
|
-
|
396
|
+
|
397
|
+
|
399
398
|
# Bursa Wolf shift in meters.
|
400
399
|
attr_reader :dx
|
401
|
-
|
400
|
+
|
402
401
|
# Bursa Wolf shift in meters.
|
403
402
|
attr_reader :dy
|
404
|
-
|
403
|
+
|
405
404
|
# Bursa Wolf shift in meters.
|
406
405
|
attr_reader :dz
|
407
|
-
|
406
|
+
|
408
407
|
# Bursa Wolf rotation in arc seconds.
|
409
408
|
attr_reader :ex
|
410
|
-
|
409
|
+
|
411
410
|
# Bursa Wolf rotation in arc seconds.
|
412
411
|
attr_reader :ey
|
413
|
-
|
412
|
+
|
414
413
|
# Bursa Wolf rotation in arc seconds.
|
415
414
|
attr_reader :ez
|
416
|
-
|
415
|
+
|
417
416
|
# Bursa Wolf scaling in in parts per million.
|
418
417
|
attr_reader :ppm
|
419
|
-
|
420
|
-
|
418
|
+
|
419
|
+
|
421
420
|
def _to_wkt(open_, close_) # :nodoc:
|
422
421
|
"TOWGS84#{open_}#{@dx},#{@dy},#{@dz},#{@ex},#{@ey},#{@ez},#{@ppm}#{close_}"
|
423
422
|
end
|
424
|
-
|
425
|
-
|
423
|
+
|
424
|
+
|
426
425
|
class << self
|
427
|
-
|
428
|
-
|
426
|
+
|
427
|
+
|
429
428
|
# Create the horizontal datum shift transformation into WGS84,
|
430
429
|
# given the seven Bursa Wolf parameters.
|
431
430
|
# The Bursa Wolf shift should be in meters, the rotation in arc
|
432
431
|
# seconds, and the scaling in parts per million.
|
433
|
-
|
432
|
+
|
434
433
|
def create(dx_, dy_, dz_, ex_, ey_, ez_, ppm_)
|
435
434
|
new(dx_, dy_, dz_, ex_, ey_, ez_, ppm_)
|
436
435
|
end
|
437
|
-
|
438
|
-
|
436
|
+
|
437
|
+
|
439
438
|
end
|
440
|
-
|
439
|
+
|
441
440
|
end
|
442
|
-
|
443
|
-
|
441
|
+
|
442
|
+
|
444
443
|
# == OGC spec description
|
445
|
-
#
|
444
|
+
#
|
446
445
|
# A base interface for metadata applicable to coordinate system
|
447
446
|
# objects.
|
448
|
-
#
|
447
|
+
#
|
449
448
|
# The metadata items "Abbreviation"’, "Alias", "Authority",
|
450
449
|
# "AuthorityCode", "Name" and "Remarks" were specified in the Simple
|
451
450
|
# Features interfaces, so they have been kept here.
|
452
|
-
#
|
451
|
+
#
|
453
452
|
# This specification does not dictate what the contents of these
|
454
453
|
# items should be. However, the following guidelines are suggested:
|
455
|
-
#
|
454
|
+
#
|
456
455
|
# When CS_CoordinateSystemAuthorityFactory is used to create an
|
457
456
|
# object, the "Authority" and "AuthorityCode" values should be set
|
458
457
|
# to the authority name of the factory object, and the authority
|
@@ -460,27 +459,27 @@ module RGeo
|
|
460
459
|
# may not be set. (If the authority is EPSG, the implementer may
|
461
460
|
# consider using the corresponding metadata values in the EPSG
|
462
461
|
# tables.)
|
463
|
-
#
|
462
|
+
#
|
464
463
|
# When CS_CoordinateSystemFactory creates an object, the "Name"
|
465
464
|
# should be set to the value supplied by the client. All of the
|
466
465
|
# other metadata items should be left empty.
|
467
|
-
#
|
466
|
+
#
|
468
467
|
# == Notes
|
469
|
-
#
|
468
|
+
#
|
470
469
|
# This is a non-instantiable abstract class.
|
471
|
-
#
|
470
|
+
#
|
472
471
|
# Most subclasses will have a set of optional parameters in their
|
473
472
|
# "create" method to set the metadata fields. These parameters are,
|
474
473
|
# in order:
|
475
|
-
#
|
474
|
+
#
|
476
475
|
# * <b>authority</b>: authority name
|
477
476
|
# * <b>authority_code</b>: authority-specific identification code
|
478
477
|
# * <b>abbreviation</b>: an abbreviation
|
479
478
|
# * <b>alias</b>: an alias
|
480
479
|
# * <b>remarks</b>: provider-supplied remarks.
|
481
|
-
|
480
|
+
|
482
481
|
class Info < Base
|
483
|
-
|
482
|
+
|
484
483
|
def initialize(name_, authority_=nil, authority_code_=nil, abbreviation_=nil, alias_=nil, remarks_=nil) # :nodoc:
|
485
484
|
@name = name_
|
486
485
|
@authority = authority_ ? authority_.to_s : nil
|
@@ -489,14 +488,14 @@ module RGeo
|
|
489
488
|
@alias = alias_ ? alias_.to_s : nil
|
490
489
|
@remarks = remarks_ ? remarks_.to_s : nil
|
491
490
|
end
|
492
|
-
|
493
|
-
|
491
|
+
|
492
|
+
|
494
493
|
# Gets the abbreviation.
|
495
494
|
attr_reader :abbreviation
|
496
|
-
|
495
|
+
|
497
496
|
# Gets the alias.
|
498
497
|
attr_reader :alias
|
499
|
-
|
498
|
+
|
500
499
|
# Gets the authority name.
|
501
500
|
# An Authority is an organization that maintains definitions of
|
502
501
|
# Authority Codes. For example the European Petroleum Survey Group
|
@@ -505,7 +504,7 @@ module RGeo
|
|
505
504
|
# ID. For example, the EPSG code for a WGS84 Lat/Lon coordinate
|
506
505
|
# system is "4326".
|
507
506
|
attr_reader :authority
|
508
|
-
|
507
|
+
|
509
508
|
# Gets the authority-specific identification code.
|
510
509
|
# The AuthorityCode is a compact string defined by an Authority to
|
511
510
|
# reference a particular spatial reference object. For example,
|
@@ -514,187 +513,187 @@ module RGeo
|
|
514
513
|
# consist of a few digits. The EPSG code for WGS84 Lat/Lon is
|
515
514
|
# "4326".
|
516
515
|
attr_reader :authority_code
|
517
|
-
|
516
|
+
|
518
517
|
# Gets the name.
|
519
518
|
attr_reader :name
|
520
|
-
|
519
|
+
|
521
520
|
# Gets the provider-supplied remarks.
|
522
521
|
attr_reader :remarks
|
523
|
-
|
524
|
-
|
522
|
+
|
523
|
+
|
525
524
|
end
|
526
|
-
|
527
|
-
|
525
|
+
|
526
|
+
|
528
527
|
# == OGC spec description
|
529
|
-
#
|
528
|
+
#
|
530
529
|
# Base interface for defining units.
|
531
|
-
#
|
530
|
+
#
|
532
531
|
# == Notes
|
533
|
-
#
|
532
|
+
#
|
534
533
|
# Normally, you will instantiate one of the subclasses LinearUnit or
|
535
534
|
# AngularUnit. However, it is possible to instantiate Unit if it is
|
536
535
|
# not clear whether the data refers to a LinearUnit or AngularUnit.
|
537
|
-
|
536
|
+
|
538
537
|
class Unit < Info
|
539
|
-
|
538
|
+
|
540
539
|
def initialize(name_, conversion_factor_, *optional_) # :nodoc:
|
541
540
|
super(name_, *optional_)
|
542
541
|
@conversion_factor = conversion_factor_.to_f
|
543
542
|
end
|
544
|
-
|
545
|
-
|
543
|
+
|
544
|
+
|
546
545
|
# This field is not part of the OGC CT spec, but is part of the
|
547
546
|
# SFS. It is an alias of the appropriate field in the subclass,
|
548
547
|
# i.e. LinearUnit#meters_per_unit or AngularUnit#radians_per_unit.
|
549
548
|
attr_reader :conversion_factor
|
550
|
-
|
551
|
-
|
549
|
+
|
550
|
+
|
552
551
|
def _wkt_typename # :nodoc:
|
553
552
|
"UNIT"
|
554
553
|
end
|
555
|
-
|
554
|
+
|
556
555
|
def _wkt_content(open_, close_) # :nodoc:
|
557
556
|
[@conversion_factor]
|
558
557
|
end
|
559
|
-
|
560
|
-
|
558
|
+
|
559
|
+
|
561
560
|
class << self
|
562
|
-
|
563
|
-
|
561
|
+
|
562
|
+
|
564
563
|
# Create a bare Unit that does not specify whether it is a
|
565
564
|
# LinearUnit or an AngularUnit, given a unit name and a
|
566
565
|
# conversion factor. You may also provide the optional
|
567
566
|
# parameters specified by the Info interface.
|
568
|
-
|
567
|
+
|
569
568
|
def create(name_, conversion_factor_, *optional_)
|
570
569
|
new(name_, conversion_factor_, *optional_)
|
571
570
|
end
|
572
|
-
|
573
|
-
|
571
|
+
|
572
|
+
|
574
573
|
end
|
575
|
-
|
574
|
+
|
576
575
|
end
|
577
|
-
|
578
|
-
|
576
|
+
|
577
|
+
|
579
578
|
# == OGC spec description
|
580
|
-
#
|
579
|
+
#
|
581
580
|
# Definition of linear units.
|
582
|
-
|
581
|
+
|
583
582
|
class LinearUnit < Unit
|
584
|
-
|
585
|
-
|
583
|
+
|
584
|
+
|
586
585
|
# Returns the number of meters per LinearUnit.
|
587
586
|
# Also available as Unit#conversion_factor.
|
588
|
-
|
587
|
+
|
589
588
|
def meters_per_unit
|
590
589
|
@conversion_factor
|
591
590
|
end
|
592
|
-
|
593
|
-
|
591
|
+
|
592
|
+
|
594
593
|
class << self
|
595
|
-
|
596
|
-
|
594
|
+
|
595
|
+
|
597
596
|
# Create a LinearUnit given a unit name and a conversion factor
|
598
597
|
# in meters per unit. You may also provide the optional
|
599
598
|
# parameters specified by the Info interface.
|
600
|
-
|
599
|
+
|
601
600
|
def create(name_, meters_per_unit_, *optional_)
|
602
601
|
new(name_, meters_per_unit_, *optional_)
|
603
602
|
end
|
604
|
-
|
605
|
-
|
603
|
+
|
604
|
+
|
606
605
|
end
|
607
|
-
|
606
|
+
|
608
607
|
end
|
609
|
-
|
610
|
-
|
608
|
+
|
609
|
+
|
611
610
|
# == OGC spec description
|
612
|
-
#
|
611
|
+
#
|
613
612
|
# Definition of angular units.
|
614
|
-
|
613
|
+
|
615
614
|
class AngularUnit < Unit
|
616
|
-
|
617
|
-
|
615
|
+
|
616
|
+
|
618
617
|
# Returns the number of radians per AngularUnit.
|
619
618
|
# Also available as Unit#conversion_factor.
|
620
|
-
|
619
|
+
|
621
620
|
def radians_per_unit
|
622
621
|
@conversion_factor
|
623
622
|
end
|
624
|
-
|
625
|
-
|
623
|
+
|
624
|
+
|
626
625
|
class << self
|
627
|
-
|
628
|
-
|
626
|
+
|
627
|
+
|
629
628
|
# Create an AngularUnit given a unit name and a conversion
|
630
629
|
# factor in radians per unit. You may also provide the optional
|
631
630
|
# parameters specified by the Info interface.
|
632
|
-
|
631
|
+
|
633
632
|
def create(name_, radians_per_unit_, *optional_)
|
634
633
|
new(name_, radians_per_unit_, *optional_)
|
635
634
|
end
|
636
|
-
|
637
|
-
|
635
|
+
|
636
|
+
|
638
637
|
end
|
639
|
-
|
638
|
+
|
640
639
|
end
|
641
|
-
|
642
|
-
|
640
|
+
|
641
|
+
|
643
642
|
# == OGC spec description
|
644
|
-
#
|
643
|
+
#
|
645
644
|
# A meridian used to take longitude measurements from.
|
646
|
-
|
645
|
+
|
647
646
|
class PrimeMeridian < Info
|
648
|
-
|
647
|
+
|
649
648
|
def initialize(name_, angular_unit_, longitude_, *optional_) # :nodoc:
|
650
649
|
super(name_, *optional_)
|
651
650
|
@angular_unit = angular_unit_
|
652
651
|
@longitude = longitude_.to_f
|
653
652
|
end
|
654
|
-
|
655
|
-
|
653
|
+
|
654
|
+
|
656
655
|
# Returns the AngularUnits.
|
657
656
|
attr_reader :angular_unit
|
658
|
-
|
657
|
+
|
659
658
|
# Returns the longitude value relative to the Greenwich Meridian.
|
660
659
|
# The longitude is expressed in this objects angular units.
|
661
660
|
attr_reader :longitude
|
662
|
-
|
663
|
-
|
661
|
+
|
662
|
+
|
664
663
|
def _wkt_typename # :nodoc:
|
665
664
|
"PRIMEM"
|
666
665
|
end
|
667
|
-
|
666
|
+
|
668
667
|
def _wkt_content(open_, close_) # :nodoc:
|
669
668
|
[@longitude]
|
670
669
|
end
|
671
|
-
|
672
|
-
|
670
|
+
|
671
|
+
|
673
672
|
class << self
|
674
|
-
|
675
|
-
|
673
|
+
|
674
|
+
|
676
675
|
# Create a PrimeMeridian given a name, AngularUnits, and the
|
677
676
|
# longitude relative to the Greenwich Meridian, expressed in
|
678
677
|
# the AngularUnits. You may also provide the optional parameters
|
679
678
|
# specified by the Info interface.
|
680
|
-
|
679
|
+
|
681
680
|
def create(name_, angular_unit_, longitude_, *optional_)
|
682
681
|
new(name_, angular_unit_, longitude_, *optional_)
|
683
682
|
end
|
684
|
-
|
685
|
-
|
683
|
+
|
684
|
+
|
686
685
|
end
|
687
|
-
|
688
|
-
|
686
|
+
|
687
|
+
|
689
688
|
end
|
690
|
-
|
691
|
-
|
689
|
+
|
690
|
+
|
692
691
|
# == OGC spec description
|
693
|
-
#
|
692
|
+
#
|
694
693
|
# An approximation of the Earth's surface as a squashed sphere.
|
695
|
-
|
694
|
+
|
696
695
|
class Ellipsoid < Info
|
697
|
-
|
696
|
+
|
698
697
|
def initialize(name_, semi_major_axis_, semi_minor_axis_, inverse_flattening_, ivf_definitive_, linear_unit_, *optional_) # :nodoc:
|
699
698
|
super(name_, *optional_)
|
700
699
|
@semi_major_axis = semi_major_axis_.to_f
|
@@ -703,64 +702,64 @@ module RGeo
|
|
703
702
|
@ivf_definitive = ivf_definitive_ ? true : false
|
704
703
|
@linear_unit = linear_unit_
|
705
704
|
end
|
706
|
-
|
707
|
-
|
705
|
+
|
706
|
+
|
708
707
|
# Gets the equatorial radius. The returned length is expressed in
|
709
708
|
# this object's axis units.
|
710
709
|
attr_reader :semi_major_axis
|
711
|
-
|
710
|
+
|
712
711
|
# Gets the polar radius. The returned length is expressed in this
|
713
712
|
# object's axis units.
|
714
713
|
attr_reader :semi_minor_axis
|
715
|
-
|
714
|
+
|
716
715
|
# Returns the value of the inverse of the flattening constant. The
|
717
716
|
# inverse flattening is related to the equatorial/polar radius by
|
718
717
|
# the formula ivf=re/(re-rp). For perfect spheres, this formula
|
719
718
|
# breaks down, and a special IVF value of zero is used.
|
720
719
|
attr_reader :inverse_flattening
|
721
|
-
|
720
|
+
|
722
721
|
# Is the Inverse Flattening definitive for this ellipsoid? Some
|
723
722
|
# ellipsoids use the IVF as the defining value, and calculate the
|
724
723
|
# polar radius whenever asked. Other ellipsoids use the polar
|
725
724
|
# radius to calculate the IVF whenever asked. This distinction can
|
726
725
|
# be important to avoid floating-point rounding errors.
|
727
726
|
attr_reader :ivf_definitive
|
728
|
-
|
727
|
+
|
729
728
|
# Returns the LinearUnit. The units of the semi-major and
|
730
729
|
# semi-minor axis values.
|
731
730
|
attr_reader :axis_unit
|
732
|
-
|
733
|
-
|
731
|
+
|
732
|
+
|
734
733
|
def _wkt_typename # :nodoc:
|
735
734
|
"SPHEROID"
|
736
735
|
end
|
737
|
-
|
736
|
+
|
738
737
|
def _wkt_content(open_, close_) # :nodoc:
|
739
738
|
[@semi_major_axis, @inverse_flattening]
|
740
739
|
end
|
741
|
-
|
742
|
-
|
740
|
+
|
741
|
+
|
743
742
|
class << self
|
744
|
-
|
745
|
-
|
743
|
+
|
744
|
+
|
746
745
|
# Create an Ellipsoid given a name, semi-major and semi-minor
|
747
746
|
# axes, the inverse flattening, a boolean indicating whether
|
748
747
|
# the inverse flattening is definitive, and the LinearUnit
|
749
748
|
# indicating the axis units. The LinearUnit is optional and
|
750
749
|
# may be set to nil. You may also provide the optional parameters
|
751
750
|
# specified by the Info interface.
|
752
|
-
|
751
|
+
|
753
752
|
def create(name_, semi_major_axis_, semi_minor_axis_, inverse_flattening_, ivf_definitive_, linear_unit_, *optional_)
|
754
753
|
new(name_, semi_major_axis_, semi_minor_axis_, inverse_flattening_, ivf_definitive_, linear_unit_, *optional_)
|
755
754
|
end
|
756
|
-
|
757
|
-
|
755
|
+
|
756
|
+
|
758
757
|
# Create an Ellipsoid given a name, semi-major and semi-minor
|
759
758
|
# axes, and the LinearUnit indicating the axis units. In the
|
760
759
|
# resulting ellipsoid, the inverse flattening is not definitive.
|
761
760
|
# The LinearUnit is optional and may be set to nil. You may also
|
762
761
|
# provide the optional parameters specified by the Info interface.
|
763
|
-
|
762
|
+
|
764
763
|
def create_ellipsoid(name_, semi_major_axis_, semi_minor_axis_, linear_unit_, *optional_)
|
765
764
|
semi_major_axis_ = semi_major_axis_.to_f
|
766
765
|
semi_minor_axis_ = semi_minor_axis_.to_f
|
@@ -768,14 +767,14 @@ module RGeo
|
|
768
767
|
inverse_flattening_ = 0.0 if inverse_flattening_.infinite?
|
769
768
|
new(name_, semi_major_axis_, semi_minor_axis_, inverse_flattening_, false, linear_unit_, *optional_)
|
770
769
|
end
|
771
|
-
|
772
|
-
|
770
|
+
|
771
|
+
|
773
772
|
# Create an Ellipsoid given a name, semi-major axis, inverse
|
774
773
|
# flattening, and the LinearUnit indicating the axis units. In
|
775
774
|
# the resulting ellipsoid, the inverse flattening is definitive.
|
776
775
|
# The LinearUnit is optional and may be set to nil. You may also
|
777
776
|
# provide the optional parameters specified by the Info interface.
|
778
|
-
|
777
|
+
|
779
778
|
def create_flattened_sphere(name_, semi_major_axis_, inverse_flattening_, linear_unit_, *optional_)
|
780
779
|
semi_major_axis_ = semi_major_axis_.to_f
|
781
780
|
inverse_flattening_ = inverse_flattening_.to_f
|
@@ -783,15 +782,15 @@ module RGeo
|
|
783
782
|
semi_minor_axis_ = semi_major_axis_ if semi_minor_axis_.infinite?
|
784
783
|
new(name_, semi_major_axis_, semi_minor_axis_, inverse_flattening_, true, linear_unit_, *optional_)
|
785
784
|
end
|
786
|
-
|
787
|
-
|
785
|
+
|
786
|
+
|
788
787
|
end
|
789
|
-
|
788
|
+
|
790
789
|
end
|
791
|
-
|
792
|
-
|
790
|
+
|
791
|
+
|
793
792
|
# == OGC spec description
|
794
|
-
#
|
793
|
+
#
|
795
794
|
# A set of quantities from which other quantities are calculated.
|
796
795
|
# For the OGC abstract model, it can be defined as a set of real
|
797
796
|
# points on the earth that have coordinates. EG. A datum can be
|
@@ -803,344 +802,344 @@ module RGeo
|
|
803
802
|
# as axis of spin). The definition of the datum may also include
|
804
803
|
# the temporal behavior (such as the rate of change of the
|
805
804
|
# orientation of the coordinate axes).
|
806
|
-
#
|
805
|
+
#
|
807
806
|
# == Notes
|
808
|
-
#
|
807
|
+
#
|
809
808
|
# This is a non-instantiable abstract class. You must instantiate
|
810
809
|
# one of the subclasses HorizontalDatum, VerticalDatum, or
|
811
810
|
# LocalDatum.
|
812
|
-
|
811
|
+
|
813
812
|
class Datum < Info
|
814
|
-
|
813
|
+
|
815
814
|
def initialize(name_, datum_type_, *optional_) # :nodoc:
|
816
815
|
super(name_, *optional_)
|
817
816
|
@datum_type = datum_type_.to_i
|
818
817
|
end
|
819
|
-
|
820
|
-
|
818
|
+
|
819
|
+
|
821
820
|
# Gets the type of the datum as an enumerated code.
|
822
821
|
attr_reader :datum_type
|
823
|
-
|
824
|
-
|
822
|
+
|
823
|
+
|
825
824
|
def _wkt_content(open_, close_) # :nodoc:
|
826
825
|
[]
|
827
826
|
end
|
828
|
-
|
829
|
-
|
827
|
+
|
828
|
+
|
830
829
|
end
|
831
|
-
|
832
|
-
|
830
|
+
|
831
|
+
|
833
832
|
# == OGC spec description
|
834
|
-
#
|
833
|
+
#
|
835
834
|
# Procedure used to measure vertical distances.
|
836
|
-
|
835
|
+
|
837
836
|
class VerticalDatum < Datum
|
838
|
-
|
837
|
+
|
839
838
|
def _wkt_typename # :nodoc:
|
840
839
|
"VERT_DATUM"
|
841
840
|
end
|
842
|
-
|
841
|
+
|
843
842
|
def _wkt_content(open_, close_) # :nodoc:
|
844
843
|
[@datum_type]
|
845
844
|
end
|
846
|
-
|
845
|
+
|
847
846
|
class << self
|
848
|
-
|
849
|
-
|
847
|
+
|
848
|
+
|
850
849
|
# Create a VerticalDatum given a name and a datum type code.
|
851
850
|
# You may also provide the optional parameters specified by the
|
852
851
|
# Info interface.
|
853
|
-
|
852
|
+
|
854
853
|
def create(name_, datum_type_, *optional_)
|
855
854
|
new(name_, datum_type_, *optional_)
|
856
855
|
end
|
857
|
-
|
858
|
-
|
856
|
+
|
857
|
+
|
859
858
|
end
|
860
|
-
|
859
|
+
|
861
860
|
end
|
862
|
-
|
863
|
-
|
861
|
+
|
862
|
+
|
864
863
|
# == OGC spec description
|
865
|
-
#
|
864
|
+
#
|
866
865
|
# Local datum. If two local datum objects have the same datum type
|
867
866
|
# and name, then they can be considered equal. This means that
|
868
867
|
# coordinates can be transformed between two different local
|
869
868
|
# coordinate systems, as long as they are based on the same local
|
870
869
|
# datum.
|
871
|
-
|
870
|
+
|
872
871
|
class LocalDatum < Datum
|
873
|
-
|
872
|
+
|
874
873
|
def _wkt_typename # :nodoc:
|
875
874
|
"LOCAL_DATUM"
|
876
875
|
end
|
877
|
-
|
876
|
+
|
878
877
|
def _wkt_content(open_, close_) # :nodoc:
|
879
878
|
[@datum_type]
|
880
879
|
end
|
881
|
-
|
880
|
+
|
882
881
|
class << self
|
883
|
-
|
884
|
-
|
882
|
+
|
883
|
+
|
885
884
|
# Create a LocalDatum given a name and a datum type code. You
|
886
885
|
# may also provide the optional parameters specified by the
|
887
886
|
# Info interface.
|
888
|
-
|
887
|
+
|
889
888
|
def create(name_, datum_type_, *optional_)
|
890
889
|
new(name_, datum_type_, *optional_)
|
891
890
|
end
|
892
|
-
|
893
|
-
|
891
|
+
|
892
|
+
|
894
893
|
end
|
895
|
-
|
894
|
+
|
896
895
|
end
|
897
|
-
|
898
|
-
|
896
|
+
|
897
|
+
|
899
898
|
# == OGC spec description
|
900
|
-
#
|
899
|
+
#
|
901
900
|
# Procedure used to measure positions on the surface of the Earth.
|
902
|
-
|
901
|
+
|
903
902
|
class HorizontalDatum < Datum
|
904
|
-
|
903
|
+
|
905
904
|
def initialize(name_, datum_type_, ellipsoid_, wgs84_parameters_, *optional_) # :nodoc:
|
906
905
|
super(name_, datum_type_, *optional_)
|
907
906
|
@ellipsoid = ellipsoid_
|
908
907
|
@wgs84_parameters = wgs84_parameters_
|
909
908
|
end
|
910
|
-
|
911
|
-
|
909
|
+
|
910
|
+
|
912
911
|
# Returns the Ellipsoid.
|
913
912
|
attr_reader :ellipsoid
|
914
|
-
|
913
|
+
|
915
914
|
# Gets preferred parameters for a Bursa Wolf transformation into
|
916
915
|
# WGS84. The 7 returned values correspond to (dx,dy,dz) in meters,
|
917
916
|
# (ex,ey,ez) in arc-seconds, and scaling in parts-per-million.
|
918
917
|
attr_reader :wgs84_parameters
|
919
|
-
|
920
|
-
|
918
|
+
|
919
|
+
|
921
920
|
def _wkt_typename # :nodoc:
|
922
921
|
"DATUM"
|
923
922
|
end
|
924
|
-
|
923
|
+
|
925
924
|
def _wkt_content(open_, close_) # :nodoc:
|
926
925
|
array_ = [@ellipsoid._to_wkt(open_, close_)]
|
927
926
|
array_ << @wgs84_parameters._to_wkt(open_, close_) if @wgs84_parameters
|
928
927
|
array_
|
929
928
|
end
|
930
|
-
|
931
|
-
|
929
|
+
|
930
|
+
|
932
931
|
class << self
|
933
|
-
|
934
|
-
|
932
|
+
|
933
|
+
|
935
934
|
# Create a HorizontalDatum given a name, datum type code,
|
936
935
|
# Ellipsoid, and WGS84ConversionInfo. The WGS84ConversionInfo
|
937
936
|
# is optional and may be set to nil. You may also provide the
|
938
937
|
# optional parameters specified by the Info interface.
|
939
|
-
|
938
|
+
|
940
939
|
def create(name_, datum_type_, ellipsoid_, wgs84_parameters_, *optional_)
|
941
940
|
new(name_, datum_type_, ellipsoid_, wgs84_parameters_, *optional_)
|
942
941
|
end
|
943
|
-
|
944
|
-
|
942
|
+
|
943
|
+
|
945
944
|
end
|
946
|
-
|
945
|
+
|
947
946
|
end
|
948
|
-
|
949
|
-
|
947
|
+
|
948
|
+
|
950
949
|
# == OGC spec description
|
951
|
-
#
|
950
|
+
#
|
952
951
|
# A projection from geographic coordinates to projected coordinates.
|
953
|
-
|
952
|
+
|
954
953
|
class Projection < Info
|
955
|
-
|
954
|
+
|
956
955
|
def initialize(name_, class_name_, parameters_, *optional_) # :nodoc:
|
957
956
|
super(name_, *optional_)
|
958
957
|
@class_name = class_name_.to_s
|
959
958
|
@parameters = parameters_ ? parameters_.dup : []
|
960
959
|
end
|
961
|
-
|
962
|
-
|
960
|
+
|
961
|
+
|
963
962
|
# Gets the projection classification name
|
964
963
|
# (e.g. "Transverse_Mercator").
|
965
964
|
attr_reader :class_name
|
966
|
-
|
967
|
-
|
965
|
+
|
966
|
+
|
968
967
|
# Gets number of parameters of the projection.
|
969
|
-
|
968
|
+
|
970
969
|
def num_parameters
|
971
970
|
@parameters.size
|
972
971
|
end
|
973
|
-
|
974
|
-
|
972
|
+
|
973
|
+
|
975
974
|
# Gets an inexed parameter of the projection.
|
976
|
-
|
975
|
+
|
977
976
|
def get_parameter(index_)
|
978
977
|
@parameters[index_]
|
979
978
|
end
|
980
|
-
|
981
|
-
|
979
|
+
|
980
|
+
|
982
981
|
# Iterates over the parameters of the projection.
|
983
|
-
|
982
|
+
|
984
983
|
def each_parameter(&block_)
|
985
984
|
@parameters.each(&block_)
|
986
985
|
end
|
987
|
-
|
988
|
-
|
986
|
+
|
987
|
+
|
989
988
|
def _wkt_typename # :nodoc:
|
990
989
|
"PROJECTION"
|
991
990
|
end
|
992
|
-
|
991
|
+
|
993
992
|
def _wkt_content(open_, close_) # :nodoc:
|
994
993
|
[]
|
995
994
|
end
|
996
|
-
|
997
|
-
|
995
|
+
|
996
|
+
|
998
997
|
class << self
|
999
|
-
|
1000
|
-
|
998
|
+
|
999
|
+
|
1001
1000
|
# Create a Projection given a name, a projection class, and an
|
1002
1001
|
# array of ProjectionParameter. You may also provide the
|
1003
1002
|
# optional parameters specified by the Info interface.
|
1004
|
-
|
1003
|
+
|
1005
1004
|
def create(name_, class_name_, parameters_, *optional_)
|
1006
1005
|
new(name_, class_name_, parameters_, *optional_)
|
1007
1006
|
end
|
1008
|
-
|
1009
|
-
|
1007
|
+
|
1008
|
+
|
1010
1009
|
end
|
1011
|
-
|
1010
|
+
|
1012
1011
|
end
|
1013
|
-
|
1014
|
-
|
1012
|
+
|
1013
|
+
|
1015
1014
|
# == OGC spec description
|
1016
|
-
#
|
1015
|
+
#
|
1017
1016
|
# Base interface for all coordinate systems.
|
1018
|
-
#
|
1017
|
+
#
|
1019
1018
|
# A coordinate system is a mathematical space, where the elements
|
1020
1019
|
# of the space are called positions. Each position is described by
|
1021
1020
|
# a list of numbers. The length of the list corresponds to the
|
1022
1021
|
# dimension of the coordinate system. So in a 2D coordinate system
|
1023
1022
|
# each position is described by a list containing 2 numbers.
|
1024
|
-
#
|
1023
|
+
#
|
1025
1024
|
# However, in a coordinate system, not all lists of numbers
|
1026
1025
|
# correspond to a position -- some lists may be outside the domain
|
1027
1026
|
# of the coordinate system. For example, in a 2D Lat/Lon coordinate
|
1028
1027
|
# system, the list (91,91) does not correspond to a position.
|
1029
|
-
#
|
1028
|
+
#
|
1030
1029
|
# Some coordinate systems also have a mapping from the mathematical
|
1031
1030
|
# space into locations in the real world. So in a Lat/Lon coordinate
|
1032
1031
|
# system, the mathematical position (lat, long) corresponds to a
|
1033
1032
|
# location on the surface of the Earth. This mapping from the
|
1034
1033
|
# mathematical space into real-world locations is called a Datum.
|
1035
|
-
#
|
1034
|
+
#
|
1036
1035
|
# == Notes
|
1037
|
-
#
|
1036
|
+
#
|
1038
1037
|
# This is a non-instantiable abstract class. You must instantiate
|
1039
1038
|
# one of the subclasses GeocentricCoordinateSystem,
|
1040
1039
|
# GeographicCoordinateSystem, ProjectedCoordinateSystem,
|
1041
1040
|
# VerticalCoordinateSystem, LocalCoordinateSystem, or
|
1042
1041
|
# CompoundCoordinateSystem.
|
1043
|
-
|
1042
|
+
|
1044
1043
|
class CoordinateSystem < Info
|
1045
|
-
|
1044
|
+
|
1046
1045
|
def initialize(name_, dimension_, *optional_) # :nodoc:
|
1047
1046
|
super(name_, *optional_)
|
1048
1047
|
@dimension = dimension_.to_i
|
1049
1048
|
end
|
1050
|
-
|
1051
|
-
|
1049
|
+
|
1050
|
+
|
1052
1051
|
# Dimension of the coordinate system
|
1053
1052
|
attr_reader :dimension
|
1054
|
-
|
1055
|
-
|
1053
|
+
|
1054
|
+
|
1056
1055
|
# Gets axis details for dimension within coordinate system. Each
|
1057
1056
|
# dimension in the coordinate system has a corresponding axis.
|
1058
|
-
|
1057
|
+
|
1059
1058
|
def get_axis(dimension_)
|
1060
1059
|
nil
|
1061
1060
|
end
|
1062
|
-
|
1063
|
-
|
1061
|
+
|
1062
|
+
|
1064
1063
|
# Gets units for dimension within coordinate system. Each
|
1065
1064
|
# dimension in the coordinate system has corresponding units.
|
1066
|
-
|
1065
|
+
|
1067
1066
|
def get_units(dimension_)
|
1068
1067
|
nil
|
1069
1068
|
end
|
1070
|
-
|
1071
|
-
|
1069
|
+
|
1070
|
+
|
1072
1071
|
end
|
1073
|
-
|
1074
|
-
|
1072
|
+
|
1073
|
+
|
1075
1074
|
# == OGC spec description
|
1076
|
-
#
|
1075
|
+
#
|
1077
1076
|
# An aggregate of two coordinate systems (CRS). One of these is
|
1078
1077
|
# usually a CRS based on a two dimensional coordinate system such
|
1079
1078
|
# as a geographic or a projected coordinate system with a horizontal
|
1080
1079
|
# datum. The other is a vertical CRS which is a one-dimensional
|
1081
1080
|
# coordinate system with a vertical datum.
|
1082
|
-
|
1081
|
+
|
1083
1082
|
class CompoundCoordinateSystem < CoordinateSystem
|
1084
|
-
|
1083
|
+
|
1085
1084
|
def initialize(name_, head_, tail_, *optional_) # :nodoc:
|
1086
1085
|
super(name_, head_.dimension + tail_.dimension, *optional_)
|
1087
1086
|
@head = head_
|
1088
1087
|
@tail = tail_
|
1089
1088
|
end
|
1090
|
-
|
1091
|
-
|
1089
|
+
|
1090
|
+
|
1092
1091
|
# Gets first sub-coordinate system.
|
1093
1092
|
attr_reader :head
|
1094
|
-
|
1093
|
+
|
1095
1094
|
# Gets second sub-coordinate system.
|
1096
1095
|
attr_reader :tail
|
1097
|
-
|
1098
|
-
|
1096
|
+
|
1097
|
+
|
1099
1098
|
# Implements CoordinateSystem#get_axis
|
1100
|
-
|
1099
|
+
|
1101
1100
|
def get_axis(index_)
|
1102
1101
|
hd_ = @head.dimension
|
1103
1102
|
index_ < hd_ ? @head.get_axis(index_) : @tail.get_axis(index_ - hd_)
|
1104
1103
|
end
|
1105
|
-
|
1106
|
-
|
1104
|
+
|
1105
|
+
|
1107
1106
|
# Implements CoordinateSystem#get_units
|
1108
|
-
|
1107
|
+
|
1109
1108
|
def get_units(index_)
|
1110
1109
|
hd_ = @head.dimension
|
1111
1110
|
index_ < hd_ ? @head.get_units(index_) : @tail.get_units(index_ - hd_)
|
1112
1111
|
end
|
1113
|
-
|
1114
|
-
|
1112
|
+
|
1113
|
+
|
1115
1114
|
def _wkt_typename # :nodoc:
|
1116
1115
|
"COMPD_CS"
|
1117
1116
|
end
|
1118
|
-
|
1117
|
+
|
1119
1118
|
def _wkt_content(open_, close_) # :nodoc:
|
1120
1119
|
[@head._to_wkt(open_, close_), @tail._to_wkt(open_, close_)]
|
1121
1120
|
end
|
1122
|
-
|
1123
|
-
|
1121
|
+
|
1122
|
+
|
1124
1123
|
class << self
|
1125
|
-
|
1126
|
-
|
1124
|
+
|
1125
|
+
|
1127
1126
|
# Create a CompoundCoordinateSystem given two sub-coordinate
|
1128
1127
|
# systems. You may also provide the optional parameters
|
1129
1128
|
# specified by the Info interface.
|
1130
|
-
|
1129
|
+
|
1131
1130
|
def create(name_, head_, tail_, *optional_)
|
1132
1131
|
new(name_, head_, tail_, *optional_)
|
1133
1132
|
end
|
1134
|
-
|
1135
|
-
|
1133
|
+
|
1134
|
+
|
1136
1135
|
end
|
1137
|
-
|
1138
|
-
|
1136
|
+
|
1137
|
+
|
1139
1138
|
end
|
1140
|
-
|
1141
|
-
|
1139
|
+
|
1140
|
+
|
1142
1141
|
# == OGC spec description
|
1143
|
-
#
|
1142
|
+
#
|
1144
1143
|
# A local coordinate system, with uncertain relationship to the
|
1145
1144
|
# world. In general, a local coordinate system cannot be related to
|
1146
1145
|
# other coordinate systems. However, if two objects supporting this
|
@@ -1152,78 +1151,78 @@ module RGeo
|
|
1152
1151
|
# have a mechanism for correlating local datums. (E.g. from a
|
1153
1152
|
# database of transformations, which is created and maintained from
|
1154
1153
|
# real-world measurements.)
|
1155
|
-
#
|
1154
|
+
#
|
1156
1155
|
# == Notes
|
1157
|
-
#
|
1156
|
+
#
|
1158
1157
|
# RGeo's implementation does not provide the Coordinate
|
1159
1158
|
# Transformation (CT) package.
|
1160
|
-
|
1159
|
+
|
1161
1160
|
class LocalCoordinateSystem < CoordinateSystem
|
1162
|
-
|
1161
|
+
|
1163
1162
|
def initialize(name_, local_datum_, unit_, axes_, *optional_) # :nodoc:
|
1164
1163
|
super(name_, axes_.size, *optional_)
|
1165
1164
|
@local_datum = local_datum_
|
1166
1165
|
@unit = unit_
|
1167
1166
|
@axes = axes_.dup
|
1168
1167
|
end
|
1169
|
-
|
1170
|
-
|
1168
|
+
|
1169
|
+
|
1171
1170
|
# Gets the local datum.
|
1172
1171
|
attr_reader :local_datum
|
1173
|
-
|
1174
|
-
|
1172
|
+
|
1173
|
+
|
1175
1174
|
# Implements CoordinateSystem#get_axis
|
1176
|
-
|
1175
|
+
|
1177
1176
|
def get_axis(index_)
|
1178
1177
|
@axes[index_]
|
1179
1178
|
end
|
1180
|
-
|
1181
|
-
|
1179
|
+
|
1180
|
+
|
1182
1181
|
# Implements CoordinateSystem#get_units
|
1183
|
-
|
1182
|
+
|
1184
1183
|
def get_units(index_)
|
1185
1184
|
@unit
|
1186
1185
|
end
|
1187
|
-
|
1188
|
-
|
1186
|
+
|
1187
|
+
|
1189
1188
|
def _wkt_typename # :nodoc:
|
1190
1189
|
"LOCAL_CS"
|
1191
1190
|
end
|
1192
|
-
|
1191
|
+
|
1193
1192
|
def _wkt_content(open_, close_) # :nodoc:
|
1194
1193
|
[@local_datum._to_wkt(open_, close_), @unit._to_wkt(open_, close_)] + @axes.map{ |ax_| ax_._to_wkt(open_, close_) }
|
1195
1194
|
end
|
1196
|
-
|
1197
|
-
|
1195
|
+
|
1196
|
+
|
1198
1197
|
class << self
|
1199
|
-
|
1200
|
-
|
1198
|
+
|
1199
|
+
|
1201
1200
|
# Create a LocalCoordinateSystem given a name, a LocalDatum, a
|
1202
1201
|
# Unit, and an array of at least one AxisInfo. You may also
|
1203
1202
|
# provide the optional parameters specified by the Info
|
1204
1203
|
# interface.
|
1205
|
-
|
1204
|
+
|
1206
1205
|
def create(name_, local_datum_, unit_, axes_, *optional_)
|
1207
1206
|
new(name_, local_datum_, unit_, axes_, *optional_)
|
1208
1207
|
end
|
1209
|
-
|
1210
|
-
|
1208
|
+
|
1209
|
+
|
1211
1210
|
end
|
1212
|
-
|
1211
|
+
|
1213
1212
|
end
|
1214
|
-
|
1215
|
-
|
1213
|
+
|
1214
|
+
|
1216
1215
|
# == OGC spec description
|
1217
|
-
#
|
1216
|
+
#
|
1218
1217
|
# A 3D coordinate system, with its origin at the centre of the
|
1219
1218
|
# Earth. The X axis points towards the prime meridian. The Y axis
|
1220
1219
|
# points East or West. The Z axis points North or South. By default
|
1221
1220
|
# the Z axis will point North, and the Y axis will point East (e.g.
|
1222
1221
|
# a right handed system), but you should check the axes for
|
1223
1222
|
# non-default values.
|
1224
|
-
|
1223
|
+
|
1225
1224
|
class GeocentricCoordinateSystem < CoordinateSystem
|
1226
|
-
|
1225
|
+
|
1227
1226
|
def initialize(name_, horizontal_datum_, prime_meridian_, linear_unit_, axis0_, axis1_, axis2_, *optional_) # :nodoc:
|
1228
1227
|
super(name_, 3, *optional_)
|
1229
1228
|
@horizontal_datum = horizontal_datum_
|
@@ -1233,39 +1232,39 @@ module RGeo
|
|
1233
1232
|
@axis1 = axis1_
|
1234
1233
|
@axis2 = axis2_
|
1235
1234
|
end
|
1236
|
-
|
1237
|
-
|
1235
|
+
|
1236
|
+
|
1238
1237
|
# Returns the HorizontalDatum. The horizontal datum is used to
|
1239
1238
|
# determine where the centre of the Earth is considered to be.
|
1240
1239
|
# All coordinate points will be measured from the centre of the
|
1241
1240
|
# Earth, and not the surface.
|
1242
1241
|
attr_reader :horizontal_datum
|
1243
|
-
|
1242
|
+
|
1244
1243
|
# Returns the PrimeMeridian.
|
1245
1244
|
attr_reader :prime_meridian
|
1246
|
-
|
1245
|
+
|
1247
1246
|
# Gets the units used along all the axes.
|
1248
1247
|
attr_reader :linear_unit
|
1249
|
-
|
1250
|
-
|
1248
|
+
|
1249
|
+
|
1251
1250
|
# Implements CoordinateSystem#get_units
|
1252
|
-
|
1251
|
+
|
1253
1252
|
def get_units(index_)
|
1254
1253
|
@linear_unit
|
1255
1254
|
end
|
1256
|
-
|
1257
|
-
|
1255
|
+
|
1256
|
+
|
1258
1257
|
# Implements CoordinateSystem#get_axis
|
1259
|
-
|
1258
|
+
|
1260
1259
|
def get_axis(index_)
|
1261
1260
|
[@axis0, @axis1, @axis2][index_]
|
1262
1261
|
end
|
1263
|
-
|
1264
|
-
|
1262
|
+
|
1263
|
+
|
1265
1264
|
def _wkt_typename # :nodoc:
|
1266
1265
|
"GEOCCS"
|
1267
1266
|
end
|
1268
|
-
|
1267
|
+
|
1269
1268
|
def _wkt_content(open_, close_) # :nodoc:
|
1270
1269
|
arr_ = [@horizontal_datum._to_wkt(open_, close_), @prime_meridian._to_wkt(open_, close_), @linear_unit._to_wkt(open_, close_)]
|
1271
1270
|
arr_ << @axis0._to_wkt(open_, close_) if @axis0
|
@@ -1273,130 +1272,130 @@ module RGeo
|
|
1273
1272
|
arr_ << @axis2._to_wkt(open_, close_) if @axis2
|
1274
1273
|
arr_
|
1275
1274
|
end
|
1276
|
-
|
1277
|
-
|
1275
|
+
|
1276
|
+
|
1278
1277
|
class << self
|
1279
|
-
|
1280
|
-
|
1278
|
+
|
1279
|
+
|
1281
1280
|
# Create a GeocentricCoordinateSystem given a name, a
|
1282
1281
|
# HorizontalDatum, a PrimeMeridian, a LinearUnit, and three
|
1283
1282
|
# AxisInfo objects. The AxisInfo are optional and may be nil.
|
1284
1283
|
# You may also provide the optional parameters specified by the
|
1285
1284
|
# Info interface.
|
1286
|
-
|
1285
|
+
|
1287
1286
|
def create(name_, horizontal_datum_, prime_meridian_, linear_unit_, axis0_, axis1_, axis2_, *optional_)
|
1288
1287
|
new(name_, horizontal_datum_, prime_meridian_, linear_unit_, axis0_, axis1_, axis2_, *optional_)
|
1289
1288
|
end
|
1290
|
-
|
1291
|
-
|
1289
|
+
|
1290
|
+
|
1292
1291
|
end
|
1293
|
-
|
1294
|
-
|
1292
|
+
|
1293
|
+
|
1295
1294
|
end
|
1296
|
-
|
1297
|
-
|
1295
|
+
|
1296
|
+
|
1298
1297
|
# == OGC spec description
|
1299
|
-
#
|
1298
|
+
#
|
1300
1299
|
# A one-dimensional coordinate system suitable for vertical
|
1301
1300
|
# measurements.
|
1302
|
-
|
1301
|
+
|
1303
1302
|
class VerticalCoordinateSystem < CoordinateSystem
|
1304
|
-
|
1303
|
+
|
1305
1304
|
def initialize(name_, vertical_datum_, vertical_unit_, axis_, *optional_) # :nodoc:
|
1306
1305
|
super(name_, 1, *optional_)
|
1307
1306
|
@vertical_datum = vertical_datum_
|
1308
1307
|
@vertical_unit = vertical_unit_
|
1309
1308
|
@axis = axis_
|
1310
1309
|
end
|
1311
|
-
|
1312
|
-
|
1310
|
+
|
1311
|
+
|
1313
1312
|
# Gets the vertical datum, which indicates the measurement method.
|
1314
1313
|
attr_reader :vertical_datum
|
1315
|
-
|
1314
|
+
|
1316
1315
|
# Gets the units used along the vertical axis. The vertical units
|
1317
1316
|
# must be the same as the CS_CoordinateSystem units.
|
1318
1317
|
attr_reader :vertical_unit
|
1319
|
-
|
1320
|
-
|
1318
|
+
|
1319
|
+
|
1321
1320
|
# Implements CoordinateSystem#get_units
|
1322
|
-
|
1321
|
+
|
1323
1322
|
def get_units(index_)
|
1324
1323
|
@vertical_unit
|
1325
1324
|
end
|
1326
|
-
|
1327
|
-
|
1325
|
+
|
1326
|
+
|
1328
1327
|
# Implements CoordinateSystem#get_axis
|
1329
|
-
|
1328
|
+
|
1330
1329
|
def get_axis(index_)
|
1331
1330
|
@axis
|
1332
1331
|
end
|
1333
|
-
|
1334
|
-
|
1332
|
+
|
1333
|
+
|
1335
1334
|
def _wkt_typename # :nodoc:
|
1336
1335
|
"VERT_CS"
|
1337
1336
|
end
|
1338
|
-
|
1337
|
+
|
1339
1338
|
def _wkt_content(open_, close_) # :nodoc:
|
1340
1339
|
arr_ = [@vertical_datum._to_wkt(open_, close_), @vertical_unit._to_wkt(open_, close_)]
|
1341
1340
|
arr_ << @axis._to_wkt(open_, close_) if @axis
|
1342
1341
|
arr_
|
1343
1342
|
end
|
1344
|
-
|
1345
|
-
|
1343
|
+
|
1344
|
+
|
1346
1345
|
class << self
|
1347
|
-
|
1348
|
-
|
1346
|
+
|
1347
|
+
|
1349
1348
|
# Create a VerticalCoordinateSystem given a name, a
|
1350
1349
|
# VerticalDatum, a LinearUnit, and an AxisInfo. The AxisInfo is
|
1351
1350
|
# optional and may be nil. You may also provide the optional
|
1352
1351
|
# parameters specified by the Info interface.
|
1353
|
-
|
1352
|
+
|
1354
1353
|
def create(name_, vertical_datum_, vertical_unit_, axis_, *optional_)
|
1355
1354
|
new(name_, vertical_datum_, vertical_unit_, axis_, *optional_)
|
1356
1355
|
end
|
1357
|
-
|
1358
|
-
|
1356
|
+
|
1357
|
+
|
1359
1358
|
end
|
1360
|
-
|
1361
|
-
|
1359
|
+
|
1360
|
+
|
1362
1361
|
end
|
1363
|
-
|
1364
|
-
|
1362
|
+
|
1363
|
+
|
1365
1364
|
# == OGC spec description
|
1366
|
-
#
|
1365
|
+
#
|
1367
1366
|
# A 2D coordinate system suitable for positions on the Earth's surface.
|
1368
|
-
#
|
1367
|
+
#
|
1369
1368
|
# == Notes
|
1370
|
-
#
|
1369
|
+
#
|
1371
1370
|
# This is a non-instantiable abstract class. You must instantiate
|
1372
1371
|
# one of the subclasses GeographicCoordinateSystem or
|
1373
1372
|
# ProjectedCoordinateSystem.
|
1374
|
-
|
1373
|
+
|
1375
1374
|
class HorizontalCoordinateSystem < CoordinateSystem
|
1376
|
-
|
1375
|
+
|
1377
1376
|
def initialize(name_, horizontal_datum_, *optional_) # :nodoc:
|
1378
1377
|
super(name_, 2, *optional_)
|
1379
1378
|
@horizontal_datum = horizontal_datum_
|
1380
1379
|
end
|
1381
|
-
|
1382
|
-
|
1380
|
+
|
1381
|
+
|
1383
1382
|
# Returns the HorizontalDatum.
|
1384
1383
|
attr_reader :horizontal_datum
|
1385
|
-
|
1386
|
-
|
1384
|
+
|
1385
|
+
|
1387
1386
|
end
|
1388
|
-
|
1389
|
-
|
1387
|
+
|
1388
|
+
|
1390
1389
|
# == OGC spec description
|
1391
|
-
#
|
1390
|
+
#
|
1392
1391
|
# A coordinate system based on latitude and longitude. Some
|
1393
1392
|
# geographic coordinate systems are Lat/Lon, and some are Lon/Lat.
|
1394
1393
|
# You can find out which this is by examining the axes. You should
|
1395
1394
|
# also check the angular units, since not all geographic coordinate
|
1396
1395
|
# systems use degrees.
|
1397
|
-
|
1396
|
+
|
1398
1397
|
class GeographicCoordinateSystem < HorizontalCoordinateSystem
|
1399
|
-
|
1398
|
+
|
1400
1399
|
def initialize(name_, angular_unit_, horizontal_datum_, prime_meridian_, axis0_, axis1_, *optional_) # :nodoc:
|
1401
1400
|
super(name_, horizontal_datum_, *optional_)
|
1402
1401
|
@prime_meridian = prime_meridian_
|
@@ -1404,86 +1403,86 @@ module RGeo
|
|
1404
1403
|
@axis0 = axis0_
|
1405
1404
|
@axis1 = axis1_
|
1406
1405
|
end
|
1407
|
-
|
1408
|
-
|
1406
|
+
|
1407
|
+
|
1409
1408
|
# Returns the PrimeMeridian.
|
1410
1409
|
attr_reader :prime_meridian
|
1411
|
-
|
1410
|
+
|
1412
1411
|
# Returns the AngularUnit. The angular unit must be the same as
|
1413
1412
|
# the CS_CoordinateSystem units.
|
1414
1413
|
attr_reader :angular_unit
|
1415
|
-
|
1416
|
-
|
1414
|
+
|
1415
|
+
|
1417
1416
|
# Implements CoordinateSystem#get_units
|
1418
|
-
|
1417
|
+
|
1419
1418
|
def get_units(index_)
|
1420
1419
|
@angular_unit
|
1421
1420
|
end
|
1422
|
-
|
1421
|
+
|
1423
1422
|
|
1424
1423
|
# Implements CoordinateSystem#get_axis
|
1425
|
-
|
1424
|
+
|
1426
1425
|
def get_axis(index_)
|
1427
1426
|
index_ == 1 ? @axis1 : @axis0
|
1428
1427
|
end
|
1429
|
-
|
1430
|
-
|
1428
|
+
|
1429
|
+
|
1431
1430
|
# Gets the number of available conversions to WGS84 coordinates.
|
1432
|
-
|
1431
|
+
|
1433
1432
|
def num_conversion_to_wgs84
|
1434
1433
|
@horizontal_datum.wgs84_parameters ? 1 : 0
|
1435
1434
|
end
|
1436
|
-
|
1437
|
-
|
1435
|
+
|
1436
|
+
|
1438
1437
|
# Gets details on a conversion to WGS84. Some geographic
|
1439
1438
|
# coordinate systems provide several transformations into WGS84,
|
1440
1439
|
# which are designed to provide good accuracy in different areas
|
1441
1440
|
# of interest. The first conversion (with index=0) should provide
|
1442
1441
|
# acceptable accuracy over the largest possible area of interest.
|
1443
|
-
|
1442
|
+
|
1444
1443
|
def get_wgs84_conversion_info(index_)
|
1445
1444
|
@horizontal_datum.wgs84_parameters
|
1446
1445
|
end
|
1447
|
-
|
1448
|
-
|
1446
|
+
|
1447
|
+
|
1449
1448
|
def _wkt_typename # :nodoc:
|
1450
1449
|
"GEOGCS"
|
1451
1450
|
end
|
1452
|
-
|
1451
|
+
|
1453
1452
|
def _wkt_content(open_, close_) # :nodoc:
|
1454
1453
|
arr_ = [@horizontal_datum._to_wkt(open_, close_), @prime_meridian._to_wkt(open_, close_), @angular_unit._to_wkt(open_, close_)]
|
1455
1454
|
arr_ << @axis0._to_wkt(open_, close_) if @axis0
|
1456
1455
|
arr_ << @axis1._to_wkt(open_, close_) if @axis1
|
1457
1456
|
arr_
|
1458
1457
|
end
|
1459
|
-
|
1460
|
-
|
1458
|
+
|
1459
|
+
|
1461
1460
|
class << self
|
1462
|
-
|
1463
|
-
|
1461
|
+
|
1462
|
+
|
1464
1463
|
# Create a GeographicCoordinateSystem, given a name, an
|
1465
1464
|
# AngularUnit, a HorizontalDatum, a PrimeMeridian, and two
|
1466
1465
|
# AxisInfo objects. The AxisInfo objects are optional and may
|
1467
1466
|
# be set to nil. You may also provide the optional parameters
|
1468
1467
|
# specified by the Info interface.
|
1469
|
-
|
1468
|
+
|
1470
1469
|
def create(name_, angular_unit_, horizontal_datum_, prime_meridian_, axis0_, axis1_, *optional_)
|
1471
1470
|
new(name_, angular_unit_, horizontal_datum_, prime_meridian_, axis0_, axis1_, *optional_)
|
1472
1471
|
end
|
1473
|
-
|
1474
|
-
|
1472
|
+
|
1473
|
+
|
1475
1474
|
end
|
1476
|
-
|
1477
|
-
|
1475
|
+
|
1476
|
+
|
1478
1477
|
end
|
1479
|
-
|
1480
|
-
|
1478
|
+
|
1479
|
+
|
1481
1480
|
# == OGC spec description
|
1482
|
-
#
|
1481
|
+
#
|
1483
1482
|
# A 2D cartographic coordinate system.
|
1484
|
-
|
1483
|
+
|
1485
1484
|
class ProjectedCoordinateSystem < HorizontalCoordinateSystem
|
1486
|
-
|
1485
|
+
|
1487
1486
|
def initialize(name_, geographic_coordinate_system_, projection_, linear_unit_, axis0_, axis1_, *optional_) # :nodoc:
|
1488
1487
|
super(name_, geographic_coordinate_system_.horizontal_datum, *optional_)
|
1489
1488
|
@geographic_coordinate_system = geographic_coordinate_system_
|
@@ -1492,37 +1491,37 @@ module RGeo
|
|
1492
1491
|
@axis0 = axis0_
|
1493
1492
|
@axis1 = axis1_
|
1494
1493
|
end
|
1495
|
-
|
1496
|
-
|
1494
|
+
|
1495
|
+
|
1497
1496
|
# Returns the GeographicCoordinateSystem.
|
1498
1497
|
attr_reader :geographic_coordinate_system
|
1499
|
-
|
1498
|
+
|
1500
1499
|
# Gets the projection.
|
1501
1500
|
attr_reader :projection
|
1502
|
-
|
1501
|
+
|
1503
1502
|
# Returns the LinearUnits. The linear unit must be the same as
|
1504
1503
|
# the CS_CoordinateSystem units.
|
1505
1504
|
attr_reader :linear_unit
|
1506
|
-
|
1507
|
-
|
1505
|
+
|
1506
|
+
|
1508
1507
|
# Implements CoordinateSystem#get_units
|
1509
|
-
|
1508
|
+
|
1510
1509
|
def get_units(index_)
|
1511
1510
|
@linear_unit
|
1512
1511
|
end
|
1513
|
-
|
1514
|
-
|
1512
|
+
|
1513
|
+
|
1515
1514
|
# Implements CoordinateSystem#get_axis
|
1516
|
-
|
1515
|
+
|
1517
1516
|
def get_axis(index_)
|
1518
1517
|
index_ == 1 ? @axis1 : @axis0
|
1519
1518
|
end
|
1520
|
-
|
1521
|
-
|
1519
|
+
|
1520
|
+
|
1522
1521
|
def _wkt_typename # :nodoc:
|
1523
1522
|
"PROJCS"
|
1524
1523
|
end
|
1525
|
-
|
1524
|
+
|
1526
1525
|
def _wkt_content(open_, close_) # :nodoc:
|
1527
1526
|
arr_ = [@geographic_coordinate_system._to_wkt(open_, close_), @projection._to_wkt(open_, close_)]
|
1528
1527
|
@projection.each_parameter{ |param_| arr_ << param_._to_wkt(open_, close_) }
|
@@ -1531,31 +1530,31 @@ module RGeo
|
|
1531
1530
|
arr_ << @axis1._to_wkt(open_, close_) if @axis1
|
1532
1531
|
arr_
|
1533
1532
|
end
|
1534
|
-
|
1535
|
-
|
1533
|
+
|
1534
|
+
|
1536
1535
|
class << self
|
1537
|
-
|
1538
|
-
|
1536
|
+
|
1537
|
+
|
1539
1538
|
# Create a ProjectedCoordinateSystem given a name, a
|
1540
1539
|
# GeographicCoordinateSystem, and Projection, a LinearUnit, and
|
1541
1540
|
# two AxisInfo objects. The AxisInfo objects are optional and
|
1542
1541
|
# may be set to nil. You may also provide the optional
|
1543
1542
|
# parameters specified by the Info interface.
|
1544
|
-
|
1543
|
+
|
1545
1544
|
def create(name_, geographic_coordinate_system_, projection_, linear_unit_, axis0_, axis1_, *optional_)
|
1546
1545
|
new(name_, geographic_coordinate_system_, projection_, linear_unit_, axis0_, axis1_, *optional_)
|
1547
1546
|
end
|
1548
|
-
|
1549
|
-
|
1547
|
+
|
1548
|
+
|
1550
1549
|
end
|
1551
|
-
|
1552
|
-
|
1550
|
+
|
1551
|
+
|
1553
1552
|
end
|
1554
|
-
|
1555
|
-
|
1553
|
+
|
1554
|
+
|
1556
1555
|
end
|
1557
|
-
|
1558
|
-
|
1556
|
+
|
1557
|
+
|
1559
1558
|
end
|
1560
|
-
|
1559
|
+
|
1561
1560
|
end
|