Passed
Push — 4.x ( 17e0c5...e9b635 )
by Doug
07:44
created

CoordinateOperationMethods   F

Complexity

Total Complexity 155

Size/Duplication

Total Lines 2497
Duplicated Lines 0 %

Test Coverage

Coverage 37.86%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
wmc 155
eloc 362
c 1
b 0
f 0
dl 0
loc 2497
ccs 173
cts 457
cp 0.3786
rs 2

146 Methods

Rating   Name   Duplication   Size   Complexity  
A EPSG_MADRID_TO_ED50_POLYNOMIAL() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_HDM_TO_DMSH() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM02_IRE() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_2D_CONVERSION() 0 2 1
A EPSG_TIME_SPECIFIC_POSITION_VECTOR_TRANSFORM_GEOCEN() 0 2 1
A EPSG_MERCATOR_VARIANT_B() 0 2 1
A EPSG_NTV1() 0 2 1
A EPSG_GEOCENTRIC_TRANSLATIONS_GEOG2D_DOMAIN() 0 2 1
A EPSG_LAMBERT_CONIC_CONFORMAL_1SP() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_IGN1997() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_HDEG_TO_DMSH() 0 2 1
A EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_BEV_AT() 0 2 1
A EPSG_COMPLEX_POLYNOMIAL_OF_DEGREE_3() 0 2 1
A geocentricPositionVectorTransformation() 0 24 1
A EPSG_LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN() 0 2 1
A EPSG_LONGITUDE_ROTATION() 0 2 1
A EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_NZLVD() 0 2 1
A EPSG_ALBERS_EQUAL_AREA() 0 2 1
A EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_ASC() 0 2 1
A EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOCEN() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_GRAVSOFT() 0 2 1
A geographicAbridgedMolodensky() 0 35 3
A EPSG_NTV2() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_EGM2008() 0 2 1
A EPSG_LAMBERT_AZIMUTHAL_EQUAL_AREA() 0 2 1
A EPSG_NADCON() 0 2 1
A EPSG_BONNE() 0 2 1
A EPSG_LABORDE_OBLIQUE_MERCATOR() 0 2 1
A operationByEPSGCode() 0 18 1
A EPSG_VERTICAL_PERSPECTIVE_ORTHOGRAPHIC_CASE() 0 2 1
A EPSG_KROVAK_NORTH_ORIENTATED() 0 2 1
A EPSG_EQUAL_EARTH() 0 2 1
A EPSG_MERCATOR_SPHERICAL() 0 2 1
A EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_GTX() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_DMH_TO_DMSH() 0 2 1
A EPSG_GEOCENTRIC_TOPOCENTRIC_CONVERSIONS() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_GTX() 0 2 1
A EPSG_CHANGE_OF_VERTICAL_UNIT() 0 2 1
A geographicPositionVectorMolodenskyBadekas() 0 38 2
A EPSG_NEW_ZEALAND_MAP_GRID() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM_GB() 0 2 1
A EPSG_LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL() 0 2 1
A EPSG_GEOG3D_TO_GEOG2D_PLUS_GRAVITYRELATEDHEIGHT_US_GTX() 0 2 1
A EPSG_GEOG3D_TO_GEOG2D_PLUS_VERTICAL_AUSGEOID_V2() 0 2 1
A geocentricCoordinateFrameMolodenskyBadekas() 0 33 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_CI() 0 2 1
A EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_2() 0 2 1
A EPSG_POINT_MOTION_GEOCENTRIC_CARTESIAN() 0 2 1
A geographicCoordinateFrameMolodenskyBadekas() 0 38 2
A EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOG3D() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_AUSGEOID_V2() 0 2 1
A EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_13() 0 2 1
A EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOG3D() 0 2 1
A EPSG_BONNE_SOUTH_ORIENTATED() 0 2 1
A EPSG_GUAM_PROJECTION() 0 2 1
A EPSG_EQUIDISTANT_CYLINDRICAL_SPHERICAL() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_DMS_TO_DMSH() 0 2 1
A EPSG_ORDNANCE_SURVEY_NATIONAL_TRANSFORMATION() 0 2 1
A EPSG_POINT_MOTION_ELLIPSOIDAL() 0 2 1
A EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOCENTRIC() 0 2 1
A EPSG_VERTICAL_OFFSET() 0 2 1
A EPSG_CARTESIAN_GRID_OFFSETS_FROM_FORM_FUNCTION() 0 2 1
A EPSG_VERTICAL_PERSPECTIVE() 0 2 1
A EPSG_MERCATOR_VARIANT_A() 0 2 1
A EPSG_AFFINE_GEOMETRIC_TRANSFORMATION() 0 2 1
A EPSG_HYPERBOLIC_CASSINI_SOLDNER() 0 2 1
A EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_4() 0 2 1
A EPSG_LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM() 0 2 1
A geocentricCoordinateFrameRotation() 0 24 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_EGM() 0 2 1
A EPSG_GEOCENTRIC_TRANSLATION_BY_GRID_INTERPOLATION_IGN() 0 2 1
A EPSG_AFFINE_PARAMETRIC_TRANSFORMATION() 0 2 1
A EPSG_POINT_MOTION_GEOCEN_BY_GRID_INADEFORM() 0 2 1
A EPSG_LAMBERT_CYLINDRICAL_EQUAL_AREA() 0 2 1
A EPSG_GNTRANS() 0 2 1
A EPSG_LAMBERT_CONIC_CONFORMAL_WEST_ORIENTATED() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_DM_TO_DMSH() 0 2 1
A geographicCoordinateFrameRotation() 0 24 1
A EPSG_HEIGHT_DEPTH_REVERSAL() 0 2 1
A EPSG_NORWAY_OFFSHORE_INTERPOLATION() 0 2 1
A EPSG_POLAR_STEREOGRAPHIC_VARIANT_B() 0 2 1
A EPSG_NADCON5_2D() 0 2 1
A EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOG2D() 0 2 1
A EPSG_PSEUDO_PLATE_CARREE() 0 2 1
A EPSG_SWISS_OBLIQUE_CYLINDRICAL() 0 2 1
A EPSG_COMPLEX_POLYNOMIAL_OF_DEGREE_4() 0 2 1
A EPSG_GEOCENTRIC_TRANSLATIONS_GEOCENTRIC_DOMAIN() 0 2 1
A geographicGeocentricConversion() 0 41 4
A EPSG_GEOCENTRIC_TRANSLATIONS_GEOG3D_DOMAIN() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_CGG2013() 0 2 1
A EPSG_GEOGRAPHIC3D_OFFSETS() 0 2 1
A EPSG_POLAR_STEREOGRAPHIC_VARIANT_A() 0 2 1
A EPSG_TRANSVERSE_MERCATOR() 0 2 1
A EPSG_GEOGRAPHIC2D_WITH_HEIGHT_OFFSETS() 0 2 1
A EPSG_GEOGRAPHIC2D_OFFSETS() 0 2 1
A EPSG_CASSINI_SOLDNER() 0 2 1
A EPSG_TIME_SPECIFIC_COORDINATE_FRAME_ROTATION_GEOCEN() 0 2 1
A geographicMolodensky() 0 36 3
A EPSG_POINT_MOTION_BY_GRID_CANADA_NTV2_VEL() 0 2 1
A EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_2() 0 2 1
A EPSG_SIMILARITY_TRANSFORMATION() 0 2 1
A EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_3() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_HDMS_TO_DMSH() 0 2 1
A EPSG_KROVAK_MODIFIED_NORTH_ORIENTATED() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_DEG_TO_DMSH() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_IGN2009() 0 2 1
A EPSG_AXIS_ORDER_REVERSAL_GEOGRAPHIC3D_HORIZONTAL() 0 2 1
A EPSG_LAMBERT_CONIC_NEAR_CONFORMAL() 0 2 1
A EPSG_LAMBERT_CONIC_CONFORMAL_2SP() 0 2 1
A EPSG_DEGREE_REPRESENTATION_CONVERSION_DEGH_TO_DMSH() 0 2 1
A EPSG_POPULAR_VISUALISATION_PSEUDO_MERCATOR() 0 2 1
A EPSG_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED() 0 2 1
A EPSG_KROVAK_MODIFIED() 0 2 1
A EPSG_NEW_ZEALAND_DEFORMATION_MODEL() 0 2 1
A EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_4() 0 2 1
A EPSG_GEOGRAPHIC_TOPOCENTRIC_CONVERSIONS() 0 2 1
A EPSG_VERTICAL_OFFSET_AND_SLOPE() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_AUSGEOID98() 0 2 1
A EPSG_AXIS_ORDER_REVERSAL_2D() 0 2 1
A EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_VERTCON() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_NZGEOID() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_PNG() 0 2 1
A EPSG_HOTINE_OBLIQUE_MERCATOR_VARIANT_A() 0 2 1
A EPSG_POLAR_STEREOGRAPHIC_VARIANT_C() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_SA_2010() 0 2 1
A EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOG2D() 0 2 1
A EPSG_OBLIQUE_STEREOGRAPHIC() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_BEV_AT() 0 2 1
A EPSG_HOTINE_OBLIQUE_MERCATOR_VARIANT_B() 0 2 1
A EPSG_AMERICAN_POLYCONIC() 0 2 1
A EPSG_EQUIDISTANT_CYLINDRICAL() 0 2 1
A EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_6() 0 2 1
A EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM15_IRE() 0 2 1
A EPSG_MARITIME_PROVINCES_POLYNOMIAL_INTERPOLATION() 0 2 1
A geocentricPositionVectorMolodenskyBadekas() 0 33 1
A EPSG_NADCON5_3D() 0 2 1
A EPSG_ORTHOGRAPHIC() 0 2 1
A EPSG_CARTESIAN_GRID_OFFSETS() 0 2 1
A EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_3() 0 2 1
A EPSG_COLOMBIA_URBAN() 0 2 1
A geographicPositionVectorTransformation() 0 24 1
A EPSG_MODIFIED_AZIMUTHAL_EQUIDISTANT() 0 2 1
A EPSG_MERCATOR_VARIANT_C() 0 2 1
A EPSG_LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL() 0 2 1
A EPSG_KROVAK() 0 2 1
A EPSG_TRANSVERSE_MERCATOR_ZONED_GRID_SYSTEM() 0 2 1

How to fix   Complexity   

Complex Class

Complex classes like CoordinateOperationMethods often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.

Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.

While breaking up the class, it is a good idea to analyze how other classes use CoordinateOperationMethods, and based on these observations, apply Extract Interface, too.

1
<?php
2
3
/**
4
 * PHPCoord.
5
 *
6
 * @author Doug Wright
7
 */
8
declare(strict_types=1);
9
10
namespace PHPCoord\CoordinateOperation;
11
12
use InvalidArgumentException;
13
use PHPCoord\CoordinateReferenceSystem\CoordinateReferenceSystem;
14
use PHPCoord\CoordinateReferenceSystem\Geocentric;
15
use PHPCoord\CoordinateReferenceSystem\Geographic2D;
16
use PHPCoord\CoordinateReferenceSystem\Geographic3D;
17
use PHPCoord\Datum\Ellipsoid;
18
use PHPCoord\GeocentricPoint;
19
use PHPCoord\GeographicPoint;
20
use PHPCoord\Point;
21
use PHPCoord\UnitOfMeasure\Angle\Angle;
22
use PHPCoord\UnitOfMeasure\Angle\ArcSecond;
23
use PHPCoord\UnitOfMeasure\Angle\Radian;
24
use PHPCoord\UnitOfMeasure\Length\Length;
25
use PHPCoord\UnitOfMeasure\Length\Metre;
26
use PHPCoord\UnitOfMeasure\Scale\Scale;
27
28
class CoordinateOperationMethods
29
{
30
    /**
31
     * Abridged Molodensky
32
     * This transformation is a truncated Taylor series expansion of a transformation between two geographic coordinate
33
     * systems, modelled as a set of geocentric translations.
34
     */
35
    public const EPSG_ABRIDGED_MOLODENSKY = 9605;
36
37
    /**
38
     * Affine geometric transformation.
39
     */
40
    public const EPSG_AFFINE_GEOMETRIC_TRANSFORMATION = 9623;
41
42
    /**
43
     * Affine parametric transformation.
44
     */
45
    public const EPSG_AFFINE_PARAMETRIC_TRANSFORMATION = 9624;
46
47
    /**
48
     * Albers Equal Area.
49
     */
50
    public const EPSG_ALBERS_EQUAL_AREA = 9822;
51
52
    /**
53
     * American Polyconic
54
     * See information source for formula and example.
55
     */
56
    public const EPSG_AMERICAN_POLYCONIC = 9818;
57
58
    /**
59
     * Axis Order Reversal (2D)
60
     * This is a parameter-less conversion to reverse the order of the axes of a 2D CRS.
61
     */
62
    public const EPSG_AXIS_ORDER_REVERSAL_2D = 9843;
63
64
    /**
65
     * Axis Order Reversal (Geographic3D horizontal)
66
     * This is a parameter-less conversion to change the order of horizontal coordinates of a geographic 3D CRS.
67
     */
68
    public const EPSG_AXIS_ORDER_REVERSAL_GEOGRAPHIC3D_HORIZONTAL = 9844;
69
70
    /**
71
     * Bonne.
72
     */
73
    public const EPSG_BONNE = 9827;
74
75
    /**
76
     * Bonne (South Orientated).
77
     */
78
    public const EPSG_BONNE_SOUTH_ORIENTATED = 9828;
79
80
    /**
81
     * Cartesian Grid Offsets
82
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
83
     * coordinate values of the point in the source system.
84
     */
85
    public const EPSG_CARTESIAN_GRID_OFFSETS = 9656;
86
87
    /**
88
     * Cartesian Grid Offsets from Form Function
89
     * Used in German state of Schleswig-Holstein.
90
     */
91
    public const EPSG_CARTESIAN_GRID_OFFSETS_FROM_FORM_FUNCTION = 1036;
92
93
    /**
94
     * Cassini-Soldner.
95
     */
96
    public const EPSG_CASSINI_SOLDNER = 9806;
97
98
    /**
99
     * Change of Vertical Unit.
100
     */
101
    public const EPSG_CHANGE_OF_VERTICAL_UNIT = 1069;
102
103
    /**
104
     * Colombia Urban.
105
     */
106
    public const EPSG_COLOMBIA_URBAN = 1052;
107
108
    /**
109
     * Complex polynomial of degree 3
110
     * Coordinate pairs treated as complex numbers.  This exploits the correlation between the polynomial coefficients
111
     * and leads to a smaller number of coefficients than the general polynomial of degree 3.
112
     */
113
    public const EPSG_COMPLEX_POLYNOMIAL_OF_DEGREE_3 = 9652;
114
115
    /**
116
     * Complex polynomial of degree 4
117
     * Coordinate pairs treated as complex numbers.  This exploits the correlation between the polynomial coefficients
118
     * and leads to a smaller number of coefficients than the general polynomial of degree 4.
119
     */
120
    public const EPSG_COMPLEX_POLYNOMIAL_OF_DEGREE_4 = 9653;
121
122
    /**
123
     * Coordinate Frame rotation (geocentric domain)
124
     * This method is a specific case of the Molodensky-Badekas (CF) method (code 1034) in which the evaluation point
125
     * is at the geocentre with coordinate values of zero. Note the analogy with the Position Vector method (code 1033)
126
     * but beware of the differences!
127
     */
128
    public const EPSG_COORDINATE_FRAME_ROTATION_GEOCENTRIC_DOMAIN = 1032;
129
130
    /**
131
     * Coordinate Frame rotation (geog2D domain)
132
     * Note the analogy with the Position Vector tfm (code 9606) but beware of the differences!  The Position Vector
133
     * convention is used by IAG and recommended by ISO 19111. See methods 1032 and 1038 for similar tfms operating
134
     * between other CRS types.
135
     */
136
    public const EPSG_COORDINATE_FRAME_ROTATION_GEOG2D_DOMAIN = 9607;
137
138
    /**
139
     * Coordinate Frame rotation (geog3D domain)
140
     * Note the analogy with the Position Vector tfm (code 1037) but beware of the differences!  The Position Vector
141
     * convention is used by IAG and recommended by ISO 19111. See methods 1032 and 9607 for similar tfms operating
142
     * between other CRS types.
143
     */
144
    public const EPSG_COORDINATE_FRAME_ROTATION_GEOG3D_DOMAIN = 1038;
145
146
    /**
147
     * Degree representation conversion: DM to DMSH
148
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
149
     * @deprecated
150
     */
151
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_DM_TO_DMSH = 9640;
152
153
    /**
154
     * Degree representation conversion: DMH to DMSH
155
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
156
     * @deprecated
157
     */
158
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_DMH_TO_DMSH = 9641;
159
160
    /**
161
     * Degree representation conversion: DMS to DMSH
162
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
163
     * @deprecated
164
     */
165
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_DMS_TO_DMSH = 9643;
166
167
    /**
168
     * Degree representation conversion: HDM to DMSH
169
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
170
     * @deprecated
171
     */
172
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_HDM_TO_DMSH = 9642;
173
174
    /**
175
     * Degree representation conversion: HDMS to DMSH
176
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
177
     * @deprecated
178
     */
179
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_HDMS_TO_DMSH = 9644;
180
181
    /**
182
     * Degree representation conversion: Hdeg to DMSH
183
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
184
     * @deprecated
185
     */
186
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_HDEG_TO_DMSH = 9639;
187
188
    /**
189
     * Degree representation conversion: deg to DMSH
190
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
191
     * @deprecated
192
     */
193
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_DEG_TO_DMSH = 9637;
194
195
    /**
196
     * Degree representation conversion: degH to DMSH
197
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
198
     * @deprecated
199
     */
200
    public const EPSG_DEGREE_REPRESENTATION_CONVERSION_DEGH_TO_DMSH = 9638;
201
202
    /**
203
     * Equal Earth.
204
     */
205
    public const EPSG_EQUAL_EARTH = 1078;
206
207
    /**
208
     * Equidistant Cylindrical
209
     * See method code 1029 for spherical development. See also Pseudo Plate Carree, method code 9825.
210
     */
211
    public const EPSG_EQUIDISTANT_CYLINDRICAL = 1028;
212
213
    /**
214
     * Equidistant Cylindrical (Spherical)
215
     * See method code 1028 for ellipsoidal development. If the latitude of natural origin is at the equator, also
216
     * known as Plate Carrée. See also Pseudo Plate Carree, method code 9825.
217
     */
218
    public const EPSG_EQUIDISTANT_CYLINDRICAL_SPHERICAL = 1029;
219
220
    /**
221
     * GNTRANS.
222
     */
223
    public const EPSG_GNTRANS = 1040;
224
225
    /**
226
     * General polynomial of degree 2.
227
     */
228
    public const EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_2 = 9645;
229
230
    /**
231
     * General polynomial of degree 3.
232
     */
233
    public const EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_3 = 9646;
234
235
    /**
236
     * General polynomial of degree 4.
237
     */
238
    public const EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_4 = 9647;
239
240
    /**
241
     * General polynomial of degree 6.
242
     */
243
    public const EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_6 = 9648;
244
245
    /**
246
     * Geocentric translation by Grid Interpolation (IGN).
247
     */
248
    public const EPSG_GEOCENTRIC_TRANSLATION_BY_GRID_INTERPOLATION_IGN = 1087;
249
250
    /**
251
     * Geocentric translations  (geog3D domain)
252
     * See methods 1031 and 9603 for similar tfms operating between other CRSs types.
253
     */
254
    public const EPSG_GEOCENTRIC_TRANSLATIONS_GEOG3D_DOMAIN = 1035;
255
256
    /**
257
     * Geocentric translations (geocentric domain)
258
     * This method allows calculation of geocentric coords in the target system by adding the parameter values to the
259
     * corresponding coordinates of the point in the source system. See methods 1035 and 9603 for similar tfms
260
     * operating between other CRSs types.
261
     */
262
    public const EPSG_GEOCENTRIC_TRANSLATIONS_GEOCENTRIC_DOMAIN = 1031;
263
264
    /**
265
     * Geocentric translations (geog2D domain)
266
     * See methods 1031 and 1035 for similar tfms operating between other CRSs types.
267
     */
268
    public const EPSG_GEOCENTRIC_TRANSLATIONS_GEOG2D_DOMAIN = 9603;
269
270
    /**
271
     * Geocentric/topocentric conversions.
272
     */
273
    public const EPSG_GEOCENTRIC_TOPOCENTRIC_CONVERSIONS = 9836;
274
275
    /**
276
     * Geog3D to Geog2D+GravityRelatedHeight (US .gtx)
277
     * Transformation from a Geographic 3D CRS to a Compound CRS consisting of a Geographic 2D CRS and a Vertical CRS,
278
     * or vice versa. The Geographic 3D and the Geographic 2D CRS must be based on the same Geodetic Datum.
279
     */
280
    public const EPSG_GEOG3D_TO_GEOG2D_PLUS_GRAVITYRELATEDHEIGHT_US_GTX = 9635;
281
282
    /**
283
     * Geog3D to Geog2D+Vertical (AUSGeoid v2)
284
     * Transformation from a Geographic 3D CRS to a Compound CRS consisting of a Geographic 2D CRS and a Vertical CRS,
285
     * or vice versa. The Geographic 3D CRS and the Geographic 2D CRS must be based on the same Geodetic Datum.
286
     */
287
    public const EPSG_GEOG3D_TO_GEOG2D_PLUS_VERTICAL_AUSGEOID_V2 = 1083;
288
289
    /**
290
     * Geographic/geocentric conversions
291
     * This is a parameter-less conversion. In applications it is often concatenated with the 3- 7- or 10-parameter
292
     * transformations 9603, 9606, 9607 or 9636 to form a geographic to geographic transformation.
293
     */
294
    public const EPSG_GEOGRAPHIC_GEOCENTRIC_CONVERSIONS = 9602;
295
296
    /**
297
     * Geographic/topocentric conversions.
298
     */
299
    public const EPSG_GEOGRAPHIC_TOPOCENTRIC_CONVERSIONS = 9837;
300
301
    /**
302
     * Geographic2D offsets
303
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
304
     * coordinate values of the point in the source system.
305
     */
306
    public const EPSG_GEOGRAPHIC2D_OFFSETS = 9619;
307
308
    /**
309
     * Geographic2D with Height Offsets
310
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
311
     * coordinate values of the point in the source system.
312
     */
313
    public const EPSG_GEOGRAPHIC2D_WITH_HEIGHT_OFFSETS = 9618;
314
315
    /**
316
     * Geographic3D offsets
317
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
318
     * coordinate values of the point in the source system.
319
     */
320
    public const EPSG_GEOGRAPHIC3D_OFFSETS = 9660;
321
322
    /**
323
     * Geographic3D to 2D conversion
324
     * This is a parameter-less conversion.
325
     */
326
    public const EPSG_GEOGRAPHIC3D_TO_2D_CONVERSION = 9659;
327
328
    /**
329
     * Geographic3D to GravityRelatedHeight (AUSGeoid v2)
330
     * The Information Source references software which offers both bi-cubic and bi-linear interpolation methods.
331
     * Unlike earlier AUSGeoid98 method which used bi-linear interpolation, Ausgeoid v2 uses bi-cubic. See Info Source
332
     * for file format documentation.
333
     */
334
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_AUSGEOID_V2 = 1048;
335
336
    /**
337
     * Geographic3D to GravityRelatedHeight (AUSGeoid98).
338
     */
339
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_AUSGEOID98 = 9662;
340
341
    /**
342
     * Geographic3D to GravityRelatedHeight (BEV AT).
343
     */
344
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_BEV_AT = 1081;
345
346
    /**
347
     * Geographic3D to GravityRelatedHeight (CGG2013)
348
     * For consistency with earlier models the Information Source references software which uses bi-quadratic
349
     * interpolation. Because of denser node spacing in CGG2013 bi-linear interpolation will be sufficient for most
350
     * uses. See Info Source for file format doc.
351
     */
352
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_CGG2013 = 1060;
353
354
    /**
355
     * Geographic3D to GravityRelatedHeight (CI).
356
     */
357
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_CI = 1050;
358
359
    /**
360
     * Geographic3D to GravityRelatedHeight (EGM)
361
     * Applies to EGM84 and EGM96 models. For later model see Geographic3D to GravityRelatedHeight (EGM2008), method
362
     * code 1025.
363
     */
364
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_EGM = 9661;
365
366
    /**
367
     * Geographic3D to GravityRelatedHeight (EGM2008)
368
     * For earlier EGM84 and EGM96 models see Geographic3D to GravityRelatedHeight (EGM), method code 9661.
369
     */
370
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_EGM2008 = 1025;
371
372
    /**
373
     * Geographic3D to GravityRelatedHeight (Gravsoft).
374
     */
375
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_GRAVSOFT = 1047;
376
377
    /**
378
     * Geographic3D to GravityRelatedHeight (IGN1997)
379
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
380
     */
381
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_IGN1997 = 9664;
382
383
    /**
384
     * Geographic3D to GravityRelatedHeight (IGN2009)
385
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS. File header of method code
386
     * 9664  (4 lines) has changed in this method (1 line);  recommended interpolation method now in a separate XML
387
     * file with same name as the grid.
388
     */
389
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_IGN2009 = 1073;
390
391
    /**
392
     * Geographic3D to GravityRelatedHeight (NZgeoid)
393
     * EPSG initially gave this method the name "Geographic3D to GravityRelatedHeight (NZgeoid2009)". As the same file
394
     * format was retained for the 2016 geoid, date removed from the method name.
395
     */
396
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_NZGEOID = 1030;
397
398
    /**
399
     * Geographic3D to GravityRelatedHeight (OSGM-GB)
400
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
401
     */
402
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM_GB = 9663;
403
404
    /**
405
     * Geographic3D to GravityRelatedHeight (OSGM02-Ire)
406
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
407
     */
408
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM02_IRE = 1045;
409
410
    /**
411
     * Geographic3D to GravityRelatedHeight (OSGM15-Ire)
412
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
413
     */
414
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM15_IRE = 1072;
415
416
    /**
417
     * Geographic3D to GravityRelatedHeight (PNG)
418
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
419
     */
420
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_PNG = 1059;
421
422
    /**
423
     * Geographic3D to GravityRelatedHeight (SA 2010)
424
     * File format: space-separated ascii file, no header, columns: latitude, longitude, separation.
425
     */
426
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_SA_2010 = 1082;
427
428
    /**
429
     * Geographic3D to GravityRelatedHeight (gtx)
430
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS. Grid file format: US NGS .gtx
431
     * (in US sometimes also referred to as 'vdatum format').
432
     */
433
    public const EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_GTX = 9665;
434
435
    /**
436
     * Guam Projection
437
     * Simplified form of Oblique Azimuthal Equidistant projection method.
438
     */
439
    public const EPSG_GUAM_PROJECTION = 9831;
440
441
    /**
442
     * Height Depth Reversal
443
     * This is a parameter-less conversion.
444
     */
445
    public const EPSG_HEIGHT_DEPTH_REVERSAL = 1068;
446
447
    /**
448
     * Hotine Oblique Mercator (variant A).
449
     */
450
    public const EPSG_HOTINE_OBLIQUE_MERCATOR_VARIANT_A = 9812;
451
452
    /**
453
     * Hotine Oblique Mercator (variant B).
454
     */
455
    public const EPSG_HOTINE_OBLIQUE_MERCATOR_VARIANT_B = 9815;
456
457
    /**
458
     * Hyperbolic Cassini-Soldner.
459
     */
460
    public const EPSG_HYPERBOLIC_CASSINI_SOLDNER = 9833;
461
462
    /**
463
     * Krovak.
464
     */
465
    public const EPSG_KROVAK = 9819;
466
467
    /**
468
     * Krovak (North Orientated).
469
     */
470
    public const EPSG_KROVAK_NORTH_ORIENTATED = 1041;
471
472
    /**
473
     * Krovak Modified
474
     * Incorporates a polynomial transformation which is defined to be exact and for practical purposes is considered
475
     * to be a map projection.
476
     */
477
    public const EPSG_KROVAK_MODIFIED = 1042;
478
479
    /**
480
     * Krovak Modified (North Orientated)
481
     * Incorporates a polynomial transformation which is defined to be exact and for practical purposes is considered
482
     * to be a map projection.
483
     */
484
    public const EPSG_KROVAK_MODIFIED_NORTH_ORIENTATED = 1043;
485
486
    /**
487
     * Laborde Oblique Mercator.
488
     */
489
    public const EPSG_LABORDE_OBLIQUE_MERCATOR = 9813;
490
491
    /**
492
     * Lambert Azimuthal Equal Area
493
     * This is the ellipsoidal form of the projection.
494
     */
495
    public const EPSG_LAMBERT_AZIMUTHAL_EQUAL_AREA = 9820;
496
497
    /**
498
     * Lambert Azimuthal Equal Area (Spherical)
499
     * This is the spherical form of the projection.  See coordinate operation method Lambert Azimuthal Equal Area
500
     * (code 9820) for ellipsoidal form.  Differences of several tens of metres result from comparison of the two
501
     * methods.
502
     */
503
    public const EPSG_LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL = 1027;
504
505
    /**
506
     * Lambert Conic Conformal (1SP).
507
     */
508
    public const EPSG_LAMBERT_CONIC_CONFORMAL_1SP = 9801;
509
510
    /**
511
     * Lambert Conic Conformal (2SP Belgium)
512
     * In 2000 this modification was replaced through use of the regular Lambert Conic Conformal (2SP) method [9802]
513
     * with appropriately modified parameter values.
514
     */
515
    public const EPSG_LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM = 9803;
516
517
    /**
518
     * Lambert Conic Conformal (2SP Michigan).
519
     */
520
    public const EPSG_LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN = 1051;
521
522
    /**
523
     * Lambert Conic Conformal (2SP).
524
     */
525
    public const EPSG_LAMBERT_CONIC_CONFORMAL_2SP = 9802;
526
527
    /**
528
     * Lambert Conic Conformal (West Orientated).
529
     */
530
    public const EPSG_LAMBERT_CONIC_CONFORMAL_WEST_ORIENTATED = 9826;
531
532
    /**
533
     * Lambert Conic Near-Conformal
534
     * The Lambert Near-Conformal projection is derived from the Lambert Conformal Conic projection by truncating the
535
     * series expansion of the projection formulae.
536
     */
537
    public const EPSG_LAMBERT_CONIC_NEAR_CONFORMAL = 9817;
538
539
    /**
540
     * Lambert Cylindrical Equal Area
541
     * This is the ellipsoidal form of the projection.
542
     */
543
    public const EPSG_LAMBERT_CYLINDRICAL_EQUAL_AREA = 9835;
544
545
    /**
546
     * Lambert Cylindrical Equal Area (Spherical)
547
     * This is the spherical form of the projection.  See coordinate operation method Lambert Cylindrical Equal Area
548
     * (code 9835) for ellipsoidal form.  Differences of several tens of metres result from comparison of the two
549
     * methods.
550
     */
551
    public const EPSG_LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL = 9834;
552
553
    /**
554
     * Longitude rotation
555
     * This transformation allows calculation of the longitude of a point in the target system by adding the parameter
556
     * value to the longitude value of the point in the source system.
557
     */
558
    public const EPSG_LONGITUDE_ROTATION = 9601;
559
560
    /**
561
     * Madrid to ED50 polynomial.
562
     */
563
    public const EPSG_MADRID_TO_ED50_POLYNOMIAL = 9617;
564
565
    /**
566
     * Maritime Provinces polynomial interpolation
567
     * This transformation is an executable module within the application NBGeocalc.  It is an adaptation of the ESTPM
568
     * program developed by Geodetic Survey of Canada.
569
     */
570
    public const EPSG_MARITIME_PROVINCES_POLYNOMIAL_INTERPOLATION = 9634;
571
572
    /**
573
     * Mercator (Spherical).
574
     */
575
    public const EPSG_MERCATOR_SPHERICAL = 1026;
576
577
    /**
578
     * Mercator (variant A)
579
     * Note that in these formulas the parameter latitude of natural origin (latO) is not used. However for this
580
     * Mercator (variant A) method the EPSG dataset includes this parameter, which must have a value of zero, for
581
     * completeness in CRS labelling.
582
     */
583
    public const EPSG_MERCATOR_VARIANT_A = 9804;
584
585
    /**
586
     * Mercator (variant B)
587
     * Used for most nautical charts.
588
     */
589
    public const EPSG_MERCATOR_VARIANT_B = 9805;
590
591
    /**
592
     * Mercator (variant C).
593
     */
594
    public const EPSG_MERCATOR_VARIANT_C = 1044;
595
596
    /**
597
     * Modified Azimuthal Equidistant
598
     * Modified form of Oblique Azimuthal Equidistant projection method developed for Polynesian islands. For the
599
     * distances over which these projections are used (under 800km) this modification introduces no significant error.
600
     */
601
    public const EPSG_MODIFIED_AZIMUTHAL_EQUIDISTANT = 9832;
602
603
    /**
604
     * Molodensky
605
     * See Abridged Molodensky.
606
     */
607
    public const EPSG_MOLODENSKY = 9604;
608
609
    /**
610
     * Molodensky-Badekas (CF geocentric domain)
611
     * See method codes 1039 and 9636 for this operation in other coordinate domains and method code 1061 for opposite
612
     * rotation convention in geocentric domain.
613
     */
614
    public const EPSG_MOLODENSKY_BADEKAS_CF_GEOCENTRIC_DOMAIN = 1034;
615
616
    /**
617
     * Molodensky-Badekas (CF geog2D domain)
618
     * See method codes 1034 and 1039 for this operation in other coordinate domains and method code 1063 for the
619
     * opposite rotation convention in geographic 2D domain.
620
     */
621
    public const EPSG_MOLODENSKY_BADEKAS_CF_GEOG2D_DOMAIN = 9636;
622
623
    /**
624
     * Molodensky-Badekas (CF geog3D domain)
625
     * See method codes 1034 and 9636 for this operation in other coordinate domains and method code 1062 for opposite
626
     * rotation convention in geographic 3D domain.
627
     */
628
    public const EPSG_MOLODENSKY_BADEKAS_CF_GEOG3D_DOMAIN = 1039;
629
630
    /**
631
     * Molodensky-Badekas (PV geocentric domain)
632
     * See method codes 1062 and 1063 for this operation in other coordinate domains and method code 1034 for opposite
633
     * rotation convention in geocentric domain.
634
     */
635
    public const EPSG_MOLODENSKY_BADEKAS_PV_GEOCENTRIC_DOMAIN = 1061;
636
637
    /**
638
     * Molodensky-Badekas (PV geog2D domain)
639
     * See method codes 1061 and 1062 for this operation in other coordinate domains and method code 9636 for opposite
640
     * rotation in geographic 2D domain.
641
     */
642
    public const EPSG_MOLODENSKY_BADEKAS_PV_GEOG2D_DOMAIN = 1063;
643
644
    /**
645
     * Molodensky-Badekas (PV geog3D domain)
646
     * See method codes 1061 and 1063 for this operation in other coordinate domains and method code 1039 for opposite
647
     * rotation convention in geographic 3D domain.
648
     */
649
    public const EPSG_MOLODENSKY_BADEKAS_PV_GEOG3D_DOMAIN = 1062;
650
651
    /**
652
     * NADCON
653
     * Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Input
654
     * expects longitudes to be positive west.
655
     */
656
    public const EPSG_NADCON = 9613;
657
658
    /**
659
     * NADCON5 (2D)
660
     * Geodetic transformation operating on geographic coordinate differences by bi-quadratic interpolation.  Input
661
     * expects longitudes to be positive east in range 0-360° (0° = Greenwich).
662
     */
663
    public const EPSG_NADCON5_2D = 1074;
664
665
    /**
666
     * NADCON5 (3D)
667
     * Geodetic transformation operating on geographic coordinate differences by bi-quadratic interpolation.  Input
668
     * expects longitudes to be positive east in range 0-360° (0° = Greenwich).
669
     */
670
    public const EPSG_NADCON5_3D = 1075;
671
672
    /**
673
     * NTv1
674
     * Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Superseded in
675
     * 1997 by NTv2 (transformation method code 9615).  Input expects longitudes to be positive west.
676
     */
677
    public const EPSG_NTV1 = 9614;
678
679
    /**
680
     * NTv2
681
     * Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Supersedes
682
     * NTv1 (transformation method code 9614).  Input expects longitudes to be positive west.
683
     */
684
    public const EPSG_NTV2 = 9615;
685
686
    /**
687
     * New Zealand Deformation Model
688
     * Zip final contains a set of CSV files documentation for a secular tectonic plate velocity model and patches
689
     * which account for movements due to specific deformation events (earthquakes).
690
     */
691
    public const EPSG_NEW_ZEALAND_DEFORMATION_MODEL = 1079;
692
693
    /**
694
     * New Zealand Map Grid.
695
     */
696
    public const EPSG_NEW_ZEALAND_MAP_GRID = 9811;
697
698
    /**
699
     * Norway Offshore Interpolation
700
     * Although in principle this method is not reversible, in practice reversibility is better than 10 cm. For the
701
     * applications for which it was designed it may be considered reversible.
702
     */
703
    public const EPSG_NORWAY_OFFSHORE_INTERPOLATION = 9620;
704
705
    /**
706
     * Oblique Stereographic
707
     * This is not the same as the projection method of the same name in USGS Professional Paper no. 1395, "Map
708
     * Projections - A Working Manual" by John P. Snyder.
709
     */
710
    public const EPSG_OBLIQUE_STEREOGRAPHIC = 9809;
711
712
    /**
713
     * Ordnance Survey National Transformation
714
     * Geodetic transformation between ETRS89 (or WGS 84) and OSGB36 / National Grid.  Uses ETRS89 / National Grid as
715
     * an intermediate coordinate system for bi-linear interpolation of gridded grid coordinate differences.
716
     */
717
    public const EPSG_ORDNANCE_SURVEY_NATIONAL_TRANSFORMATION = 9633;
718
719
    /**
720
     * Orthographic
721
     * If the natural origin of the projection is at the topocentric origin, this is a special case of the Vertical
722
     * Perspective (orthographic case) (method code 9839) in which the ellipsoid height of all mapped points is zero (h
723
     * = 0).
724
     */
725
    public const EPSG_ORTHOGRAPHIC = 9840;
726
727
    /**
728
     * Point motion (ellipsoidal).
729
     */
730
    public const EPSG_POINT_MOTION_ELLIPSOIDAL = 1067;
731
732
    /**
733
     * Point motion (geocen) by grid (INADEFORM).
734
     */
735
    public const EPSG_POINT_MOTION_GEOCEN_BY_GRID_INADEFORM = 1086;
736
737
    /**
738
     * Point motion (geocentric Cartesian).
739
     */
740
    public const EPSG_POINT_MOTION_GEOCENTRIC_CARTESIAN = 1064;
741
742
    /**
743
     * Point motion by grid (Canada NTv2_Vel)
744
     * Interpolation within the grid is in the horizontal component of the source CRS.
745
     */
746
    public const EPSG_POINT_MOTION_BY_GRID_CANADA_NTV2_VEL = 1070;
747
748
    /**
749
     * Polar Stereographic (variant A)
750
     * Latitude of natural origin must be either 90 degrees or -90 degrees (or equivalent in alternative angle unit).
751
     */
752
    public const EPSG_POLAR_STEREOGRAPHIC_VARIANT_A = 9810;
753
754
    /**
755
     * Polar Stereographic (variant B).
756
     */
757
    public const EPSG_POLAR_STEREOGRAPHIC_VARIANT_B = 9829;
758
759
    /**
760
     * Polar Stereographic (variant C).
761
     */
762
    public const EPSG_POLAR_STEREOGRAPHIC_VARIANT_C = 9830;
763
764
    /**
765
     * Popular Visualisation Pseudo Mercator
766
     * Applies spherical formulas to the ellipsoid. As such does not have the properties of a true Mercator projection.
767
     */
768
    public const EPSG_POPULAR_VISUALISATION_PSEUDO_MERCATOR = 1024;
769
770
    /**
771
     * Position Vector transformation (geocentric domain)
772
     * This method is a specific case of the Molodensky-Badekas (PV) method (code 1061) in which the evaluation point
773
     * is the geocentre with coordinate values of zero. Note the analogy with the Coordinate Frame method (code 1032)
774
     * but beware of the differences!
775
     */
776
    public const EPSG_POSITION_VECTOR_TRANSFORMATION_GEOCENTRIC_DOMAIN = 1033;
777
778
    /**
779
     * Position Vector transformation (geog2D domain)
780
     * Note the analogy with the Coordinate Frame rotation (code 9607) but beware of the differences!  The Position
781
     * Vector convention is used by IAG and recommended by ISO 19111. See methods 1033 and 1037 for similar tfms
782
     * operating between other CRS types.
783
     */
784
    public const EPSG_POSITION_VECTOR_TRANSFORMATION_GEOG2D_DOMAIN = 9606;
785
786
    /**
787
     * Position Vector transformation (geog3D domain)
788
     * Note the analogy with the Coordinate Frame rotation (code 1038) but beware of the differences!  The Position
789
     * Vector convention is used by IAG and recommended by ISO 19111. See methods 1033 and 9606 for similar tfms
790
     * operating between other CRS types.
791
     */
792
    public const EPSG_POSITION_VECTOR_TRANSFORMATION_GEOG3D_DOMAIN = 1037;
793
794
    /**
795
     * Pseudo Plate Carree
796
     * Used only for depiction of graticule (latitude/longitude) coordinates on a computer display. The axes units are
797
     * decimal degrees and of variable scale. The origin is at Lat = 0, Long = 0. See Equidistant Cylindrical, code
798
     * 1029, for proper Plate Carrée.
799
     */
800
    public const EPSG_PSEUDO_PLATE_CARREE = 9825;
801
802
    /**
803
     * Reversible polynomial of degree 13.
804
     */
805
    public const EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_13 = 9654;
806
807
    /**
808
     * Reversible polynomial of degree 2
809
     * Reversibility is subject to constraints.  See Guidance Note 7 for conditions and clarification.
810
     */
811
    public const EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_2 = 9649;
812
813
    /**
814
     * Reversible polynomial of degree 3
815
     * Reversibility is subject to constraints.  See Guidance Note 7 for conditions and clarification.
816
     */
817
    public const EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_3 = 9650;
818
819
    /**
820
     * Reversible polynomial of degree 4
821
     * Reversibility is subject to constraints.  See Guidance Note 7 for conditions and clarification.
822
     */
823
    public const EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_4 = 9651;
824
825
    /**
826
     * Similarity transformation
827
     * Defined for two-dimensional coordinate systems.
828
     */
829
    public const EPSG_SIMILARITY_TRANSFORMATION = 9621;
830
831
    /**
832
     * Swiss Oblique Cylindrical
833
     * Can be accommodated by Oblique Mercator method (code 9815), for which this method is an approximation (see BfL
834
     * document swissprojectionen.pdf at www.swisstopo.com).
835
     */
836
    public const EPSG_SWISS_OBLIQUE_CYLINDRICAL = 9814;
837
838
    /**
839
     * Time-dependent Coordinate Frame rotation (geocen)
840
     * Note the analogy with the Time-dependent Position Vector transformation (code 1053) but beware of the
841
     * differences!  The Position Vector convention is used by IAG. See method codes 1057 and 1058 for similar methods
842
     * operating between other CRS types.
843
     */
844
    public const EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOCEN = 1056;
845
846
    /**
847
     * Time-dependent Coordinate Frame rotation (geog2D)
848
     * Note the analogy with the Time-dependent Position Vector transformation (code 1054) but beware of the
849
     * differences!  The Position Vector convention is used by IAG. See methods 1056 and 1058 for similar tfms
850
     * operating between other CRS types.
851
     */
852
    public const EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOG2D = 1057;
853
854
    /**
855
     * Time-dependent Coordinate Frame rotation (geog3D)
856
     * Note the analogy with the Time-dependent Position Vector transformation (code 1055) but beware of the
857
     * differences!  The Position Vector convention is used by IAG. See method codes 1056 and 1057 for similar methods
858
     * operating between other CRS types.
859
     */
860
    public const EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOG3D = 1058;
861
862
    /**
863
     * Time-dependent Position Vector tfm (geocentric)
864
     * Note the analogy with the Time-dependent Coordinate Frame rotation (code 1056) but beware of the differences!
865
     * The Position Vector convention is used by IAG. See method codes 1054 and 1055 for similar methods operating
866
     * between other CRS types.
867
     */
868
    public const EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOCENTRIC = 1053;
869
870
    /**
871
     * Time-dependent Position Vector tfm (geog2D)
872
     * Note the analogy with the Time-dependent Coordinate Frame rotation (code 1057) but beware of the differences!
873
     * The Position Vector convention is used by IAG. See method codes 1053 and 1055 for similar methods operating
874
     * between other CRS types.
875
     */
876
    public const EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOG2D = 1054;
877
878
    /**
879
     * Time-dependent Position Vector tfm (geog3D)
880
     * Note the analogy with the Coordinate Frame rotation (code 1058) but beware of the differences!  The Position
881
     * Vector convention is used by IAG. See method codes 1053 and 1054 for similar methods operating between other CRS
882
     * types.
883
     */
884
    public const EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOG3D = 1055;
885
886
    /**
887
     * Time-specific Coordinate Frame rotation (geocen)
888
     * Note the analogy with the Time-specific Position Vector method (code 1065) but beware of the differences!
889
     */
890
    public const EPSG_TIME_SPECIFIC_COORDINATE_FRAME_ROTATION_GEOCEN = 1066;
891
892
    /**
893
     * Time-specific Position Vector transform (geocen)
894
     * Note the analogy with the Time-specifc Coordinate Frame method (code 1066) but beware of the differences!
895
     */
896
    public const EPSG_TIME_SPECIFIC_POSITION_VECTOR_TRANSFORM_GEOCEN = 1065;
897
898
    /**
899
     * Transverse Mercator.
900
     */
901
    public const EPSG_TRANSVERSE_MERCATOR = 9807;
902
903
    /**
904
     * Transverse Mercator (South Orientated).
905
     */
906
    public const EPSG_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED = 9808;
907
908
    /**
909
     * Transverse Mercator Zoned Grid System
910
     * If locations fall outwith the fixed zones the general Transverse Mercator method (code 9807) must be used for
911
     * each zone.
912
     */
913
    public const EPSG_TRANSVERSE_MERCATOR_ZONED_GRID_SYSTEM = 9824;
914
915
    /**
916
     * Vertical Offset
917
     * This transformation allows calculation of height (or depth) in the target system by adding the parameter value
918
     * to the height (or depth)-value of the point in the source system.
919
     */
920
    public const EPSG_VERTICAL_OFFSET = 9616;
921
922
    /**
923
     * Vertical Offset and Slope
924
     * This transformation allows calculation of height in the target system by applying the parameter values to the
925
     * height value of the point in the source system.
926
     */
927
    public const EPSG_VERTICAL_OFFSET_AND_SLOPE = 1046;
928
929
    /**
930
     * Vertical Offset by Grid Interpolation (BEV AT).
931
     */
932
    public const EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_BEV_AT = 1080;
933
934
    /**
935
     * Vertical Offset by Grid Interpolation (NZLVD).
936
     */
937
    public const EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_NZLVD = 1071;
938
939
    /**
940
     * Vertical Offset by Grid Interpolation (VERTCON)
941
     * Any NAD realization may be used as the Interpolation CRS; bi-linear interpolation is used. Input expects
942
     * longitudes to be positive west.
943
     */
944
    public const EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_VERTCON = 9658;
945
946
    /**
947
     * Vertical Offset by Grid Interpolation (asc).
948
     */
949
    public const EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_ASC = 1085;
950
951
    /**
952
     * Vertical Offset by Grid Interpolation (gtx).
953
     */
954
    public const EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_GTX = 1084;
955
956
    /**
957
     * Vertical Perspective
958
     * For a viewing point height approaching or at infinity, see the Vertical Perspective (orthographic case) (method
959
     * code 9839).
960
     */
961
    public const EPSG_VERTICAL_PERSPECTIVE = 9838;
962
963
    /**
964
     * Vertical Perspective (Orthographic case)
965
     * This is a special case of the general Vertical Perspective (method code 9838) in which the viewing point at
966
     * infinity.
967
     */
968
    public const EPSG_VERTICAL_PERSPECTIVE_ORTHOGRAPHIC_CASE = 9839;
969
970
    public function operationByEPSGCode(int $epsgCode)
0 ignored issues
show
Unused Code introduced by
The parameter $epsgCode is not used and could be removed. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-unused  annotation

970
    public function operationByEPSGCode(/** @scrutinizer ignore-unused */ int $epsgCode)

This check looks for parameters that have been defined for a function or method, but which are not used in the method body.

Loading history...
971
    {
972
        return [
973
            self::EPSG_ABRIDGED_MOLODENSKY => 'geographicAbridgedMolodensky',
974
            self::EPSG_MOLODENSKY => 'geographicMolodensky',
975
            self::EPSG_GEOGRAPHIC_GEOCENTRIC_CONVERSIONS => 'geographicGeocentricConversion',
976
            self::EPSG_COORDINATE_FRAME_ROTATION_GEOCENTRIC_DOMAIN => 'geocentricCoordinateFrameRotation',
977
            self::EPSG_COORDINATE_FRAME_ROTATION_GEOG2D_DOMAIN => 'geographicCoordinateFrameRotation',
978
            self::EPSG_COORDINATE_FRAME_ROTATION_GEOG3D_DOMAIN => 'geographicCoordinateFrameRotation',
979
            self::EPSG_POSITION_VECTOR_TRANSFORMATION_GEOCENTRIC_DOMAIN => 'geocentricPositionVectorTransformation',
980
            self::EPSG_POSITION_VECTOR_TRANSFORMATION_GEOG2D_DOMAIN => 'geographicPositionVectorTransformation',
981
            self::EPSG_POSITION_VECTOR_TRANSFORMATION_GEOG3D_DOMAIN => 'geographicPositionVectorTransformation',
982
            self::EPSG_MOLODENSKY_BADEKAS_CF_GEOCENTRIC_DOMAIN => 'geocentricCoordinateFrameMolodenskyBadekas',
983
            self::EPSG_MOLODENSKY_BADEKAS_CF_GEOG2D_DOMAIN => 'geographicCoordinateFrameMolodenskyBadekas',
984
            self::EPSG_MOLODENSKY_BADEKAS_CF_GEOG3D_DOMAIN => 'geographicCoordinateFrameMolodenskyBadekas',
985
            self::EPSG_MOLODENSKY_BADEKAS_PV_GEOCENTRIC_DOMAIN => 'geocentricPositionVectorMolodenskyBadekas',
986
            self::EPSG_MOLODENSKY_BADEKAS_PV_GEOG2D_DOMAIN => 'geographicPositionVectorMolodenskyBadekas',
987
            self::EPSG_MOLODENSKY_BADEKAS_PV_GEOG3D_DOMAIN => 'geographicPositionVectorMolodenskyBadekas',
988
        ];
989
    }
990
991
    /**
992
     * Abridged Molodensky
993
     * This transformation is a truncated Taylor series expansion of a transformation between two geographic coordinate
994
     * systems, modelled as a set of geocentric translations.
995
     */
996 2
    public function geographicAbridgedMolodensky(
997
        GeographicPoint $from,
998
        CoordinateReferenceSystem $to,
999
        Length $translationX,
1000
        Length $translationY,
1001
        Length $translationZ,
1002
        Length $differenceInSemiMajorAxis,
1003
        Scale $differenceInFlattening
1004
    ): GeographicPoint {
1005 2
        $fromLatitude = $from->getLatitude()->asRadians()->getValue();
1006 2
        $fromLongitude = $from->getLongitude()->asRadians()->getValue() - $from->getCRS()->getDatum()->getPrimeMeridian()->getGreenwichLongitude()->asRadians()->getValue();
1007 2
        $fromHeight = $from->getHeight() ? $from->getHeight()->asMetres()->getValue() : 0;
1008 2
        $tx = $translationX->asMetres()->getValue();
1009 2
        $ty = $translationY->asMetres()->getValue();
1010 2
        $tz = $translationZ->asMetres()->getValue();
1011 2
        $da = $differenceInSemiMajorAxis->asMetres()->getValue();
1012 2
        $df = $differenceInFlattening->asUnity()->getValue();
1013
1014 2
        $a = $from->getCRS()->getDatum()->getEllipsoid()->getSemiMajorAxis()->getValue();
1015 2
        $e2 = $from->getCRS()->getDatum()->getEllipsoid()->getEccentricitySquared();
1016
1017 2
        $rho = $a * (1 - $e2) / (1 - $e2 * sin($fromLatitude) ** 2) ** (3 / 2);
1018 2
        $nu = $a / ((1 - $e2 * (sin($fromLatitude) ** 2)) ** 0.5);
1019
1020 2
        $f = $from->getCRS()->getDatum()->getEllipsoid()->getInverseFlattening();
1021
1022 2
        $dLatitude = ((-$tx * sin($fromLatitude) * cos($fromLongitude)) - ($ty * sin($fromLatitude) * sin($fromLongitude)) + ($tz * cos($fromLatitude)) + ((($a * $df) + ($from->getCRS()->getDatum()->getEllipsoid()->getInverseFlattening() * $da)) * sin(2 * $fromLatitude))) / ($rho * sin((new ArcSecond(1))->asRadians()->getValue()));
1023 2
        $dLongitude = (-$tx * sin($fromLongitude) + $ty * cos($fromLongitude)) / (($nu * cos($fromLatitude)) * sin((new ArcSecond(1))->asRadians()->getValue()));
1024 2
        $dHeight = ($tx * cos($fromLatitude) * cos($fromLongitude)) + ($ty * cos($fromLatitude) * sin($fromLongitude)) + ($tz * sin($fromLatitude)) + (($a * $df + $f * $da) * (sin($fromLatitude) ** 2)) - $da;
1025
1026 2
        $toLatitude = $fromLatitude + (new ArcSecond($dLatitude))->asRadians()->getValue();
1027 2
        $toLongitude = $fromLongitude + (new ArcSecond($dLongitude))->asRadians()->getValue();
1028 2
        $toHeight = $fromHeight + $dHeight;
1029
1030 2
        return new GeographicPoint(new Radian($toLatitude), new Radian($toLongitude), $to instanceof Geographic3D ? new Metre($toHeight) : null, $to);
1031
    }
1032
1033
    /**
1034
     * Affine geometric transformation.
1035
     */
1036
    public function EPSG_AFFINE_GEOMETRIC_TRANSFORMATION(): Point
1037
    {
1038
    }
1039
1040
    /**
1041
     * Affine parametric transformation.
1042
     */
1043
    public function EPSG_AFFINE_PARAMETRIC_TRANSFORMATION(): Point
1044
    {
1045
    }
1046
1047
    /**
1048
     * Albers Equal Area.
1049
     */
1050
    public function EPSG_ALBERS_EQUAL_AREA(): Point
1051
    {
1052
    }
1053
1054
    /**
1055
     * American Polyconic
1056
     * See information source for formula and example.
1057
     */
1058
    public function EPSG_AMERICAN_POLYCONIC(): Point
1059
    {
1060
    }
1061
1062
    /**
1063
     * Axis Order Reversal (2D)
1064
     * This is a parameter-less conversion to reverse the order of the axes of a 2D CRS.
1065
     */
1066
    public function EPSG_AXIS_ORDER_REVERSAL_2D(): Point
1067
    {
1068
    }
1069
1070
    /**
1071
     * Axis Order Reversal (Geographic3D horizontal)
1072
     * This is a parameter-less conversion to change the order of horizontal coordinates of a geographic 3D CRS.
1073
     */
1074
    public function EPSG_AXIS_ORDER_REVERSAL_GEOGRAPHIC3D_HORIZONTAL(): Point
1075
    {
1076
    }
1077
1078
    /**
1079
     * Bonne.
1080
     */
1081
    public function EPSG_BONNE(): Point
1082
    {
1083
    }
1084
1085
    /**
1086
     * Bonne (South Orientated).
1087
     */
1088
    public function EPSG_BONNE_SOUTH_ORIENTATED(): Point
1089
    {
1090
    }
1091
1092
    /**
1093
     * Cartesian Grid Offsets
1094
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
1095
     * coordinate values of the point in the source system.
1096
     */
1097
    public function EPSG_CARTESIAN_GRID_OFFSETS(): Point
1098
    {
1099
    }
1100
1101
    /**
1102
     * Cartesian Grid Offsets from Form Function
1103
     * Used in German state of Schleswig-Holstein.
1104
     */
1105
    public function EPSG_CARTESIAN_GRID_OFFSETS_FROM_FORM_FUNCTION(): Point
1106
    {
1107
    }
1108
1109
    /**
1110
     * Cassini-Soldner.
1111
     */
1112
    public function EPSG_CASSINI_SOLDNER(): Point
1113
    {
1114
    }
1115
1116
    /**
1117
     * Change of Vertical Unit.
1118
     */
1119
    public function EPSG_CHANGE_OF_VERTICAL_UNIT(): Point
1120
    {
1121
    }
1122
1123
    /**
1124
     * Colombia Urban.
1125
     */
1126
    public function EPSG_COLOMBIA_URBAN(): Point
1127
    {
1128
    }
1129
1130
    /**
1131
     * Complex polynomial of degree 3
1132
     * Coordinate pairs treated as complex numbers.  This exploits the correlation between the polynomial coefficients
1133
     * and leads to a smaller number of coefficients than the general polynomial of degree 3.
1134
     */
1135
    public function EPSG_COMPLEX_POLYNOMIAL_OF_DEGREE_3(): Point
1136
    {
1137
    }
1138
1139
    /**
1140
     * Complex polynomial of degree 4
1141
     * Coordinate pairs treated as complex numbers.  This exploits the correlation between the polynomial coefficients
1142
     * and leads to a smaller number of coefficients than the general polynomial of degree 4.
1143
     */
1144
    public function EPSG_COMPLEX_POLYNOMIAL_OF_DEGREE_4(): Point
1145
    {
1146
    }
1147
1148
    /**
1149
     * Coordinate Frame rotation (geocentric domain)
1150
     * This method is a specific case of the Molodensky-Badekas (CF) method (code 1034) in which the evaluation point
1151
     * is at the geocentre with coordinate values of zero. Note the analogy with the Position Vector method (code 1033)
1152
     * but beware of the differences!
1153
     */
1154 3
    public function geocentricCoordinateFrameRotation(
1155
        GeocentricPoint $from,
1156
        Geocentric $to,
1157
        Length $translationX,
1158
        Length $translationY,
1159
        Length $translationZ,
1160
        Angle $rotationX,
1161
        Angle $rotationY,
1162
        Angle $rotationZ,
1163
        Scale $scaleFactor
1164
    ): GeocentricPoint {
1165 3
        return $this->geocentricCoordinateFrameMolodenskyBadekas(
1166 3
            $from,
1167
            $to,
1168
            $translationX,
1169
            $translationY,
1170
            $translationZ,
1171
            $rotationX,
1172
            $rotationY,
1173
            $rotationZ,
1174
            $scaleFactor,
1175 3
            new Metre(0),
1176 3
            new Metre(0),
1177 3
            new Metre(0)
1178
        );
1179
    }
1180
1181
    /**
1182
     * Coordinate Frame rotation (geog2D/geog3D domain)
1183
     * Note the analogy with the Position Vector tfm (codes 9606/1037) but beware of the differences!  The Position Vector
1184
     * convention is used by IAG and recommended by ISO 19111. See methods 1032/1038/9607 for similar tfms operating
1185
     * between other CRS types.
1186
     * @param Geographic2D|Geographic3D $to
1187
     */
1188 2
    public function geographicCoordinateFrameRotation(
1189
        GeographicPoint $from,
1190
        CoordinateReferenceSystem $to,
1191
        Length $translationX,
1192
        Length $translationY,
1193
        Length $translationZ,
1194
        Angle $rotationX,
1195
        Angle $rotationY,
1196
        Angle $rotationZ,
1197
        Scale $scaleFactor
1198
    ): GeographicPoint {
1199 2
        return $this->geographicCoordinateFrameMolodenskyBadekas(
1200 2
            $from,
1201
            $to,
1202
            $translationX,
1203
            $translationY,
1204
            $translationZ,
1205
            $rotationX,
1206
            $rotationY,
1207
            $rotationZ,
1208
            $scaleFactor,
1209 2
            new Metre(0),
1210 2
            new Metre(0),
1211 2
            new Metre(0)
1212
        );
1213
    }
1214
1215
    /**
1216
     * Degree representation conversion: DM to DMSH
1217
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1218
     * @deprecated
1219
     */
1220
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_DM_TO_DMSH(): Point
1221
    {
1222
    }
1223
1224
    /**
1225
     * Degree representation conversion: DMH to DMSH
1226
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1227
     * @deprecated
1228
     */
1229
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_DMH_TO_DMSH(): Point
1230
    {
1231
    }
1232
1233
    /**
1234
     * Degree representation conversion: DMS to DMSH
1235
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1236
     * @deprecated
1237
     */
1238
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_DMS_TO_DMSH(): Point
1239
    {
1240
    }
1241
1242
    /**
1243
     * Degree representation conversion: HDM to DMSH
1244
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1245
     * @deprecated
1246
     */
1247
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_HDM_TO_DMSH(): Point
1248
    {
1249
    }
1250
1251
    /**
1252
     * Degree representation conversion: HDMS to DMSH
1253
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1254
     * @deprecated
1255
     */
1256
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_HDMS_TO_DMSH(): Point
1257
    {
1258
    }
1259
1260
    /**
1261
     * Degree representation conversion: Hdeg to DMSH
1262
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1263
     * @deprecated
1264
     */
1265
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_HDEG_TO_DMSH(): Point
1266
    {
1267
    }
1268
1269
    /**
1270
     * Degree representation conversion: deg to DMSH
1271
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1272
     * @deprecated
1273
     */
1274
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_DEG_TO_DMSH(): Point
1275
    {
1276
    }
1277
1278
    /**
1279
     * Degree representation conversion: degH to DMSH
1280
     * Applies to 2D and the horizontal component of 3D ellipsoidal  systems.
1281
     * @deprecated
1282
     */
1283
    public function EPSG_DEGREE_REPRESENTATION_CONVERSION_DEGH_TO_DMSH(): Point
1284
    {
1285
    }
1286
1287
    /**
1288
     * Equal Earth.
1289
     */
1290
    public function EPSG_EQUAL_EARTH(): Point
1291
    {
1292
    }
1293
1294
    /**
1295
     * Equidistant Cylindrical
1296
     * See method code 1029 for spherical development. See also Pseudo Plate Carree, method code 9825.
1297
     */
1298
    public function EPSG_EQUIDISTANT_CYLINDRICAL(): Point
1299
    {
1300
    }
1301
1302
    /**
1303
     * Equidistant Cylindrical (Spherical)
1304
     * See method code 1028 for ellipsoidal development. If the latitude of natural origin is at the equator, also
1305
     * known as Plate Carrée. See also Pseudo Plate Carree, method code 9825.
1306
     */
1307
    public function EPSG_EQUIDISTANT_CYLINDRICAL_SPHERICAL(): Point
1308
    {
1309
    }
1310
1311
    /**
1312
     * GNTRANS.
1313
     */
1314
    public function EPSG_GNTRANS(): Point
1315
    {
1316
    }
1317
1318
    /**
1319
     * General polynomial of degree 2.
1320
     */
1321
    public function EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_2(): Point
1322
    {
1323
    }
1324
1325
    /**
1326
     * General polynomial of degree 3.
1327
     */
1328
    public function EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_3(): Point
1329
    {
1330
    }
1331
1332
    /**
1333
     * General polynomial of degree 4.
1334
     */
1335
    public function EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_4(): Point
1336
    {
1337
    }
1338
1339
    /**
1340
     * General polynomial of degree 6.
1341
     */
1342
    public function EPSG_GENERAL_POLYNOMIAL_OF_DEGREE_6(): Point
1343
    {
1344
    }
1345
1346
    /**
1347
     * Geocentric translation by Grid Interpolation (IGN).
1348
     */
1349
    public function EPSG_GEOCENTRIC_TRANSLATION_BY_GRID_INTERPOLATION_IGN(): Point
1350
    {
1351
    }
1352
1353
    /**
1354
     * Geocentric translations  (geog3D domain)
1355
     * See methods 1031 and 9603 for similar tfms operating between other CRSs types.
1356
     */
1357
    public function EPSG_GEOCENTRIC_TRANSLATIONS_GEOG3D_DOMAIN(): Point
1358
    {
1359
    }
1360
1361
    /**
1362
     * Geocentric translations (geocentric domain)
1363
     * This method allows calculation of geocentric coords in the target system by adding the parameter values to the
1364
     * corresponding coordinates of the point in the source system. See methods 1035 and 9603 for similar tfms
1365
     * operating between other CRSs types.
1366
     */
1367
    public function EPSG_GEOCENTRIC_TRANSLATIONS_GEOCENTRIC_DOMAIN(): Point
1368
    {
1369
    }
1370
1371
    /**
1372
     * Geocentric translations (geog2D domain)
1373
     * See methods 1031 and 1035 for similar tfms operating between other CRSs types.
1374
     */
1375
    public function EPSG_GEOCENTRIC_TRANSLATIONS_GEOG2D_DOMAIN(): Point
1376
    {
1377
    }
1378
1379
    /**
1380
     * Geocentric/topocentric conversions.
1381
     */
1382
    public function EPSG_GEOCENTRIC_TOPOCENTRIC_CONVERSIONS(): Point
1383
    {
1384
    }
1385
1386
    /**
1387
     * Geog3D to Geog2D+GravityRelatedHeight (US .gtx)
1388
     * Transformation from a Geographic 3D CRS to a Compound CRS consisting of a Geographic 2D CRS and a Vertical CRS,
1389
     * or vice versa. The Geographic 3D and the Geographic 2D CRS must be based on the same Geodetic Datum.
1390
     */
1391
    public function EPSG_GEOG3D_TO_GEOG2D_PLUS_GRAVITYRELATEDHEIGHT_US_GTX(): Point
1392
    {
1393
    }
1394
1395
    /**
1396
     * Geog3D to Geog2D+Vertical (AUSGeoid v2)
1397
     * Transformation from a Geographic 3D CRS to a Compound CRS consisting of a Geographic 2D CRS and a Vertical CRS,
1398
     * or vice versa. The Geographic 3D CRS and the Geographic 2D CRS must be based on the same Geodetic Datum.
1399
     */
1400
    public function EPSG_GEOG3D_TO_GEOG2D_PLUS_VERTICAL_AUSGEOID_V2(): Point
1401
    {
1402
    }
1403
1404
    /**
1405
     * Geographic/geocentric conversions
1406
     * This is a parameter-less conversion. In applications it is often concatenated with the 3- 7- or 10-parameter
1407
     * transformations 9603, 9606, 9607 or 9636 to form a geographic to geographic transformation.
1408
     * @param  GeocentricValue|GeographicValue $point
1409
     * @return GeocentricValue|GeographicValue
1410
     */
1411 11
    public function geographicGeocentricConversion($point, CoordinateReferenceSystem $crs)
1412
    {
1413 11
        $a = $crs->getDatum()->getEllipsoid()->getSemiMajorAxis()->getValue();
1414 11
        $e2 = $crs->getDatum()->getEllipsoid()->getEccentricitySquared();
1415
1416 11
        if ($point instanceof GeocentricValue) {
1417 9
            $x = $point->getX()->asMetres()->getValue();
1418 9
            $y = $point->getY()->asMetres()->getValue();
1419 9
            $z = $point->getZ()->asMetres()->getValue();
1420
1421 9
            $longitude = atan2($y, $x);
1422 9
            $p = sqrt(($x ** 2) + ($y ** 2));
1423
1424 9
            $latitude = atan($z / ($p * (1 - $e2)));
1425
1426
            do {
1427 9
                $phi1 = $latitude;
1428 9
                $v = $a / sqrt(1 - $e2 * (sin($latitude) ** 2));
1429 9
                $latitude = atan(($z + ($e2 * $v * sin($latitude))) / $p);
1430 9
            } while (abs($latitude - $phi1) >= 0.0000000001);
1431
1432 9
            $latitude += $crs->getDatum()->getPrimeMeridian()->getGreenwichLongitude()->asRadians()->getValue();
1433 9
            $h = $p / cos($latitude) - $v;
1434
1435 9
            return new GeographicValue(new Radian($latitude), new Radian($longitude), new Metre($h));
1436
        }
1437
1438 10
        if ($point instanceof GeographicValue) {
0 ignored issues
show
introduced by
$point is always a sub-type of PHPCoord\CoordinateOperation\GeographicValue.
Loading history...
1439 10
            $latitude = $point->getLatitude()->asRadians()->getValue();
1440 10
            $longitude = $point->getLongitude()->asRadians()->getValue() - $crs->getDatum()->getPrimeMeridian()->getGreenwichLongitude()->asRadians()->getValue();
1441 10
            $h = $point->getHeight()->asMetres()->getValue();
1442
1443 10
            $nu = $a / sqrt(1 - $e2 * (sin($latitude) ** 2));
1444 10
            $x = ($nu + $h) * cos($latitude) * cos($longitude);
1445 10
            $y = ($nu + $h) * cos($latitude) * sin($longitude);
1446 10
            $z = ((1 - $e2) * $nu + $h) * sin($latitude);
1447
1448 10
            return new GeocentricValue(new Metre($x), new Metre($y), new Metre($z));
1449
        }
1450
1451
        throw new InvalidArgumentException('Wrong point type');
1452
    }
1453
1454
    /**
1455
     * Geographic/topocentric conversions.
1456
     */
1457
    public function EPSG_GEOGRAPHIC_TOPOCENTRIC_CONVERSIONS(): Point
1458
    {
1459
    }
1460
1461
    /**
1462
     * Geographic2D offsets
1463
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
1464
     * coordinate values of the point in the source system.
1465
     */
1466
    public function EPSG_GEOGRAPHIC2D_OFFSETS(): Point
1467
    {
1468
    }
1469
1470
    /**
1471
     * Geographic2D with Height Offsets
1472
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
1473
     * coordinate values of the point in the source system.
1474
     */
1475
    public function EPSG_GEOGRAPHIC2D_WITH_HEIGHT_OFFSETS(): Point
1476
    {
1477
    }
1478
1479
    /**
1480
     * Geographic3D offsets
1481
     * This transformation allows calculation of coordinates in the target system by adding the parameter value to the
1482
     * coordinate values of the point in the source system.
1483
     */
1484
    public function EPSG_GEOGRAPHIC3D_OFFSETS(): Point
1485
    {
1486
    }
1487
1488
    /**
1489
     * Geographic3D to 2D conversion
1490
     * This is a parameter-less conversion.
1491
     */
1492
    public function EPSG_GEOGRAPHIC3D_TO_2D_CONVERSION(): Point
1493
    {
1494
    }
1495
1496
    /**
1497
     * Geographic3D to GravityRelatedHeight (Ausgeoid v2)
1498
     * The Information Source references software which offers both bi-cubic and bi-linear interpolation methods.
1499
     * Unlike earlier Ausgeoid98 method which used bi-linear interpolation, Ausgeoid v2 uses bi-cubic. See Info Source
1500
     * for file format documentation.
1501
     */
1502
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_AUSGEOID_V2(): Point
1503
    {
1504
    }
1505
1506
    /**
1507
     * Geographic3D to GravityRelatedHeight (Ausgeoid98).
1508
     */
1509
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_AUSGEOID98(): Point
1510
    {
1511
    }
1512
1513
    /**
1514
     * Geographic3D to GravityRelatedHeight (BEV AT).
1515
     */
1516
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_BEV_AT(): Point
1517
    {
1518
    }
1519
1520
    /**
1521
     * Geographic3D to GravityRelatedHeight (CGG2013)
1522
     * For consistency with earlier models the Information Source references software which uses bi-quadratic
1523
     * interpolation. Because of denser node spacing in CGG2013 bi-linear interpolation will be sufficient for most
1524
     * uses. See Info Source for file format doc.
1525
     */
1526
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_CGG2013(): Point
1527
    {
1528
    }
1529
1530
    /**
1531
     * Geographic3D to GravityRelatedHeight (CI).
1532
     */
1533
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_CI(): Point
1534
    {
1535
    }
1536
1537
    /**
1538
     * Geographic3D to GravityRelatedHeight (EGM)
1539
     * Applies to EGM84 and EGM96 models. For later model see Geographic3D to GravityRelatedHeight (EGM2008), method
1540
     * code 1025.
1541
     */
1542
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_EGM(): Point
1543
    {
1544
    }
1545
1546
    /**
1547
     * Geographic3D to GravityRelatedHeight (EGM2008)
1548
     * For earlier EGM84 and EGM96 models see Geographic3D to GravityRelatedHeight (EGM), method code 9661.
1549
     */
1550
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_EGM2008(): Point
1551
    {
1552
    }
1553
1554
    /**
1555
     * Geographic3D to GravityRelatedHeight (Gravsoft).
1556
     */
1557
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_GRAVSOFT(): Point
1558
    {
1559
    }
1560
1561
    /**
1562
     * Geographic3D to GravityRelatedHeight (IGN1997)
1563
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
1564
     */
1565
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_IGN1997(): Point
1566
    {
1567
    }
1568
1569
    /**
1570
     * Geographic3D to GravityRelatedHeight (IGN2009)
1571
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS. File header of method code
1572
     * 9664  (4 lines) has changed in this method (1 line)(){}  recommended interpolation method now in a separate XML
1573
     * file with same name as the grid.
1574
     */
1575
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_IGN2009(): Point
1576
    {
1577
    }
1578
1579
    /**
1580
     * Geographic3D to GravityRelatedHeight (NZgeoid)
1581
     * EPSG initially gave this method the name "Geographic3D to GravityRelatedHeight (NZgeoid2009)". As the same file
1582
     * format was retained for the 2016 geoid, date removed from the method name.
1583
     */
1584
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_NZGEOID(): Point
1585
    {
1586
    }
1587
1588
    /**
1589
     * Geographic3D to GravityRelatedHeight (OSGM-GB)
1590
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
1591
     */
1592
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM_GB(): Point
1593
    {
1594
    }
1595
1596
    /**
1597
     * Geographic3D to GravityRelatedHeight (OSGM02-Ire)
1598
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
1599
     */
1600
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM02_IRE(): Point
1601
    {
1602
    }
1603
1604
    /**
1605
     * Geographic3D to GravityRelatedHeight (OSGM15-Ire)
1606
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
1607
     */
1608
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_OSGM15_IRE(): Point
1609
    {
1610
    }
1611
1612
    /**
1613
     * Geographic3D to GravityRelatedHeight (PNG)
1614
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS.
1615
     */
1616
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_PNG(): Point
1617
    {
1618
    }
1619
1620
    /**
1621
     * Geographic3D to GravityRelatedHeight (SA 2010)
1622
     * File format: space-separated ascii file, no header, columns: latitude, longitude, separation.
1623
     */
1624
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_SA_2010(): Point
1625
    {
1626
    }
1627
1628
    /**
1629
     * Geographic3D to GravityRelatedHeight (gtx)
1630
     * Transformation of the vertical component of a Geographic 3D CRS to a Vertical CRS. Grid file format: US NGS .gtx
1631
     * (in US sometimes also referred to as 'vdatum format').
1632
     */
1633
    public function EPSG_GEOGRAPHIC3D_TO_GRAVITYRELATEDHEIGHT_GTX(): Point
1634
    {
1635
    }
1636
1637
    /**
1638
     * Guam Projection
1639
     * Simplified form of Oblique Azimuthal Equidistant projection method.
1640
     */
1641
    public function EPSG_GUAM_PROJECTION(): Point
1642
    {
1643
    }
1644
1645
    /**
1646
     * Height Depth Reversal
1647
     * This is a parameter-less conversion.
1648
     */
1649
    public function EPSG_HEIGHT_DEPTH_REVERSAL(): Point
1650
    {
1651
    }
1652
1653
    /**
1654
     * Hotine Oblique Mercator (variant A).
1655
     */
1656
    public function EPSG_HOTINE_OBLIQUE_MERCATOR_VARIANT_A(): Point
1657
    {
1658
    }
1659
1660
    /**
1661
     * Hotine Oblique Mercator (variant B).
1662
     */
1663
    public function EPSG_HOTINE_OBLIQUE_MERCATOR_VARIANT_B(): Point
1664
    {
1665
    }
1666
1667
    /**
1668
     * Hyperbolic Cassini-Soldner.
1669
     */
1670
    public function EPSG_HYPERBOLIC_CASSINI_SOLDNER(): Point
1671
    {
1672
    }
1673
1674
    /**
1675
     * Krovak.
1676
     */
1677
    public function EPSG_KROVAK(): Point
1678
    {
1679
    }
1680
1681
    /**
1682
     * Krovak (North Orientated).
1683
     */
1684
    public function EPSG_KROVAK_NORTH_ORIENTATED(): Point
1685
    {
1686
    }
1687
1688
    /**
1689
     * Krovak Modified
1690
     * Incorporates a polynomial transformation which is defined to be exact and for practical purposes is considered
1691
     * to be a map projection.
1692
     */
1693
    public function EPSG_KROVAK_MODIFIED(): Point
1694
    {
1695
    }
1696
1697
    /**
1698
     * Krovak Modified (North Orientated)
1699
     * Incorporates a polynomial transformation which is defined to be exact and for practical purposes is considered
1700
     * to be a map projection.
1701
     */
1702
    public function EPSG_KROVAK_MODIFIED_NORTH_ORIENTATED(): Point
1703
    {
1704
    }
1705
1706
    /**
1707
     * Laborde Oblique Mercator.
1708
     */
1709
    public function EPSG_LABORDE_OBLIQUE_MERCATOR(): Point
1710
    {
1711
    }
1712
1713
    /**
1714
     * Lambert Azimuthal Equal Area
1715
     * This is the ellipsoidal form of the projection.
1716
     */
1717
    public function EPSG_LAMBERT_AZIMUTHAL_EQUAL_AREA(): Point
1718
    {
1719
    }
1720
1721
    /**
1722
     * Lambert Azimuthal Equal Area (Spherical)
1723
     * This is the spherical form of the projection.  See coordinate operation method Lambert Azimuthal Equal Area
1724
     * (code 9820) for ellipsoidal form.  Differences of several tens of metres result from comparison of the two
1725
     * methods.
1726
     */
1727
    public function EPSG_LAMBERT_AZIMUTHAL_EQUAL_AREA_SPHERICAL(): Point
1728
    {
1729
    }
1730
1731
    /**
1732
     * Lambert Conic Conformal (1SP).
1733
     */
1734
    public function EPSG_LAMBERT_CONIC_CONFORMAL_1SP(): Point
1735
    {
1736
    }
1737
1738
    /**
1739
     * Lambert Conic Conformal (2SP Belgium)
1740
     * In 2000 this modification was replaced through use of the regular Lambert Conic Conformal (2SP) method [9802]
1741
     * with appropriately modified parameter values.
1742
     */
1743
    public function EPSG_LAMBERT_CONIC_CONFORMAL_2SP_BELGIUM(): Point
1744
    {
1745
    }
1746
1747
    /**
1748
     * Lambert Conic Conformal (2SP Michigan).
1749
     */
1750
    public function EPSG_LAMBERT_CONIC_CONFORMAL_2SP_MICHIGAN(): Point
1751
    {
1752
    }
1753
1754
    /**
1755
     * Lambert Conic Conformal (2SP).
1756
     */
1757
    public function EPSG_LAMBERT_CONIC_CONFORMAL_2SP(): Point
1758
    {
1759
    }
1760
1761
    /**
1762
     * Lambert Conic Conformal (West Orientated).
1763
     */
1764
    public function EPSG_LAMBERT_CONIC_CONFORMAL_WEST_ORIENTATED(): Point
1765
    {
1766
    }
1767
1768
    /**
1769
     * Lambert Conic Near-Conformal
1770
     * The Lambert Near-Conformal projection is derived from the Lambert Conformal Conic projection by truncating the
1771
     * series expansion of the projection formulae.
1772
     */
1773
    public function EPSG_LAMBERT_CONIC_NEAR_CONFORMAL(): Point
1774
    {
1775
    }
1776
1777
    /**
1778
     * Lambert Cylindrical Equal Area
1779
     * This is the ellipsoidal form of the projection.
1780
     */
1781
    public function EPSG_LAMBERT_CYLINDRICAL_EQUAL_AREA(): Point
1782
    {
1783
    }
1784
1785
    /**
1786
     * Lambert Cylindrical Equal Area (Spherical)
1787
     * This is the spherical form of the projection.  See coordinate operation method Lambert Cylindrical Equal Area
1788
     * (code 9835) for ellipsoidal form.  Differences of several tens of metres result from comparison of the two
1789
     * methods.
1790
     */
1791
    public function EPSG_LAMBERT_CYLINDRICAL_EQUAL_AREA_SPHERICAL(): Point
1792
    {
1793
    }
1794
1795
    /**
1796
     * Longitude rotation
1797
     * This transformation allows calculation of the longitude of a point in the target system by adding the parameter
1798
     * value to the longitude value of the point in the source system.
1799
     */
1800
    public function EPSG_LONGITUDE_ROTATION(): Point
1801
    {
1802
    }
1803
1804
    /**
1805
     * Madrid to ED50 polynomial.
1806
     */
1807
    public function EPSG_MADRID_TO_ED50_POLYNOMIAL(): Point
1808
    {
1809
    }
1810
1811
    /**
1812
     * Maritime Provinces polynomial interpolation
1813
     * This transformation is an executable module within the application NBGeocalc.  It is an adaptation of the ESTPM
1814
     * program developed by Geodetic Survey of Canada.
1815
     */
1816
    public function EPSG_MARITIME_PROVINCES_POLYNOMIAL_INTERPOLATION(): Point
1817
    {
1818
    }
1819
1820
    /**
1821
     * Mercator (Spherical).
1822
     */
1823
    public function EPSG_MERCATOR_SPHERICAL(): Point
1824
    {
1825
    }
1826
1827
    /**
1828
     * Mercator (variant A)
1829
     * Note that in these formulas the parameter latitude of natural origin (latO) is not used. However for this
1830
     * Mercator (variant A) method the EPSG dataset includes this parameter, which must have a value of zero, for
1831
     * completeness in CRS labelling.
1832
     */
1833
    public function EPSG_MERCATOR_VARIANT_A(): Point
1834
    {
1835
    }
1836
1837
    /**
1838
     * Mercator (variant B)
1839
     * Used for most nautical charts.
1840
     */
1841
    public function EPSG_MERCATOR_VARIANT_B(): Point
1842
    {
1843
    }
1844
1845
    /**
1846
     * Mercator (variant C).
1847
     */
1848
    public function EPSG_MERCATOR_VARIANT_C(): Point
1849
    {
1850
    }
1851
1852
    /**
1853
     * Modified Azimuthal Equidistant
1854
     * Modified form of Oblique Azimuthal Equidistant projection method developed for Polynesian islands. For the
1855
     * distances over which these projections are used (under 800km) this modification introduces no significant error.
1856
     */
1857
    public function EPSG_MODIFIED_AZIMUTHAL_EQUIDISTANT(): Point
1858
    {
1859
    }
1860
1861
    /**
1862
     * Molodensky
1863
     * See Abridged Molodensky.
1864
     */
1865 2
    public function geographicMolodensky(
1866
        GeographicPoint $from,
1867
        CoordinateReferenceSystem $to,
1868
        Length $translationX,
1869
        Length $translationY,
1870
        Length $translationZ,
1871
        Length $differenceInSemiMajorAxis,
1872
        Scale $differenceInFlattening
1873
    ): GeographicPoint {
1874 2
        $fromLatitude = $from->getLatitude()->asRadians()->getValue();
1875 2
        $fromLongitude = $from->getLongitude()->asRadians()->getValue() - $from->getCRS()->getDatum()->getPrimeMeridian()->getGreenwichLongitude()->asRadians()->getValue();
1876 2
        $fromHeight = $from->getHeight() ? $from->getHeight()->asMetres()->getValue() : 0;
1877 2
        $tx = $translationX->asMetres()->getValue();
1878 2
        $ty = $translationY->asMetres()->getValue();
1879 2
        $tz = $translationZ->asMetres()->getValue();
1880 2
        $da = $differenceInSemiMajorAxis->asMetres()->getValue();
1881 2
        $df = $differenceInFlattening->asUnity()->getValue();
1882
1883 2
        $a = $from->getCRS()->getDatum()->getEllipsoid()->getSemiMajorAxis()->getValue();
1884 2
        $b = $from->getCRS()->getDatum()->getEllipsoid()->getSemiMinorAxis()->getValue();
1885 2
        $e2 = $from->getCRS()->getDatum()->getEllipsoid()->getEccentricitySquared();
1886
1887 2
        $rho = $a * (1 - $e2) / (1 - $e2 * sin($fromLatitude) ** 2) ** (3 / 2);
1888 2
        $nu = $a / ((1 - $e2 * (sin($fromLatitude) ** 2)) ** 0.5);
1889
1890 2
        $f = $from->getCRS()->getDatum()->getEllipsoid()->getInverseFlattening();
0 ignored issues
show
Unused Code introduced by
The assignment to $f is dead and can be removed.
Loading history...
1891
1892 2
        $dLatitude = ((-$tx * sin($fromLatitude) * cos($fromLongitude)) - ($ty * sin($fromLatitude) * sin($fromLongitude)) + ($tz * cos($fromLatitude)) + ($da * ($nu * $e2 * sin($fromLatitude) * cos($fromLatitude)) / $a + $df * ($rho * ($a / $b) + $nu * ($b / $a)) * sin($fromLatitude) * cos($fromLatitude))) / (($rho + $fromHeight) * sin((new ArcSecond(1))->asRadians()->getValue()));
1893 2
        $dLongitude = (-$tx * sin($fromLongitude) + $ty * cos($fromLongitude)) / ((($nu + $fromHeight) * cos($fromLatitude)) * sin((new ArcSecond(1))->asRadians()->getValue()));
1894 2
        $dHeight = ($tx * cos($fromLatitude) * cos($fromLongitude)) + ($ty * cos($fromLatitude) * sin($fromLongitude)) + ($tz * sin($fromLatitude)) - $da * $a / $nu + $df * $b / $a * $nu * sin($fromLatitude) ** 2;
1895
1896 2
        $toLatitude = $fromLatitude + (new ArcSecond($dLatitude))->asRadians()->getValue();
1897 2
        $toLongitude = $fromLongitude + (new ArcSecond($dLongitude))->asRadians()->getValue();
1898 2
        $toHeight = $fromHeight + $dHeight;
1899
1900 2
        return new GeographicPoint(new Radian($toLatitude), new Radian($toLongitude), $to instanceof Geographic3D ? new Metre($toHeight) : null, $to);
1901
    }
1902
1903
    /**
1904
     * Molodensky-Badekas (CF geocentric domain)
1905
     * See method codes 1039 and 9636 for this operation in other coordinate domains and method code 1061 for opposite
1906
     * rotation convention in geocentric domain.
1907
     */
1908 4
    public function geocentricCoordinateFrameMolodenskyBadekas(
1909
        GeocentricPoint $from,
1910
        Geocentric $to,
1911
        Length $translationX,
1912
        Length $translationY,
1913
        Length $translationZ,
1914
        Angle $rotationX,
1915
        Angle $rotationY,
1916
        Angle $rotationZ,
1917
        Scale $scaleFactor,
1918
        Length $pivotX,
1919
        Length $pivotY,
1920
        Length $pivotZ
1921
    ): GeocentricPoint {
1922 4
        $xs = $from->getX()->asMetres()->getValue();
1923 4
        $ys = $from->getY()->asMetres()->getValue();
1924 4
        $zs = $from->getZ()->asMetres()->getValue();
1925 4
        $tx = $translationX->asMetres()->getValue();
1926 4
        $ty = $translationY->asMetres()->getValue();
1927 4
        $tz = $translationZ->asMetres()->getValue();
1928 4
        $rx = $rotationX->asRadians()->getValue();
1929 4
        $ry = $rotationY->asRadians()->getValue();
1930 4
        $rz = $rotationZ->asRadians()->getValue();
1931 4
        $M = 1 + $scaleFactor->asUnity()->getValue();
1932 4
        $xp = $pivotX->asMetres()->getValue();
1933 4
        $yp = $pivotY->asMetres()->getValue();
1934 4
        $zp = $pivotZ->asMetres()->getValue();
1935
1936 4
        $xt = $M * ((($xs - $xp) * 1) + (($ys - $yp) * $rz) + (($zs - $zp) * -$ry)) + $tx + $xp;
1937 4
        $yt = $M * ((($xs - $xp) * -$rz) + (($ys - $yp) * 1) + (($zs - $zp) * $rx)) + $ty + $yp;
1938 4
        $zt = $M * ((($xs - $xp) * $ry) + (($ys - $yp) * -$rx) + (($zs - $zp) * 1)) + $tz + $zp;
1939
1940 4
        return new GeocentricPoint(new Metre($xt), new Metre($yt), new Metre($zt), $to);
1941
    }
1942
1943
    /**
1944
     * Molodensky-Badekas (CF geog2D/geog3D domain)
1945
     * See method codes 1034 and 1039/9636 for this operation in other coordinate domains and method code 1062/1063 for the
1946
     * opposite rotation convention in geographic 2D domain.
1947
     */
1948 4
    public function geographicCoordinateFrameMolodenskyBadekas(
1949
        GeographicPoint $from,
1950
        CoordinateReferenceSystem $to,
1951
        Length $translationX,
1952
        Length $translationY,
1953
        Length $translationZ,
1954
        Angle $rotationX,
1955
        Angle $rotationY,
1956
        Angle $rotationZ,
1957
        Scale $scaleFactor,
1958
        Length $pivotX,
1959
        Length $pivotY,
1960
        Length $pivotZ
1961
    ): GeographicPoint {
1962 4
        $geographicValue = new GeographicValue($from->getLatitude(), $from->getLongitude(), $from->getHeight());
1963 4
        $asGeocentric = $this->geographicGeocentricConversion($geographicValue, $from->getCRS());
1964
1965 4
        $xs = $asGeocentric->getX()->asMetres()->getValue();
1966 4
        $ys = $asGeocentric->getY()->asMetres()->getValue();
1967 4
        $zs = $asGeocentric->getZ()->asMetres()->getValue();
1968 4
        $tx = $translationX->asMetres()->getValue();
1969 4
        $ty = $translationY->asMetres()->getValue();
1970 4
        $tz = $translationZ->asMetres()->getValue();
1971 4
        $rx = $rotationX->asRadians()->getValue();
1972 4
        $ry = $rotationY->asRadians()->getValue();
1973 4
        $rz = $rotationZ->asRadians()->getValue();
1974 4
        $M = 1 + $scaleFactor->asUnity()->getValue();
1975 4
        $xp = $pivotX->asMetres()->getValue();
1976 4
        $yp = $pivotY->asMetres()->getValue();
1977 4
        $zp = $pivotZ->asMetres()->getValue();
1978
1979 4
        $xt = $M * ((($xs - $xp) * 1) + (($ys - $yp) * $rz) + (($zs - $zp) * -$ry)) + $tx + $xp;
1980 4
        $yt = $M * ((($xs - $xp) * -$rz) + (($ys - $yp) * 1) + (($zs - $zp) * $rx)) + $ty + $yp;
1981 4
        $zt = $M * ((($xs - $xp) * $ry) + (($ys - $yp) * -$rx) + (($zs - $zp) * 1)) + $tz + $zp;
1982 4
        $newGeocentric = new GeocentricValue(new Metre($xt), new Metre($yt), new Metre($zt));
1983 4
        $newGeographic = $this->geographicGeocentricConversion($newGeocentric, $to);
1984
1985 4
        return new GeographicPoint($newGeographic->getLatitude(), $newGeographic->getLongitude(), $to instanceof Geographic3D ? $newGeographic->getHeight() : null, $to);
1986
    }
1987
1988
    /**
1989
     * Molodensky-Badekas (PV geocentric domain)
1990
     * See method codes 1062 and 1063 for this operation in other coordinate domains and method code 1034 for opposite
1991
     * rotation convention in geocentric domain.
1992
     */
1993 4
    public function geocentricPositionVectorMolodenskyBadekas(
1994
        GeocentricPoint $from,
1995
        Geocentric $to,
1996
        Length $translationX,
1997
        Length $translationY,
1998
        Length $translationZ,
1999
        Angle $rotationX,
2000
        Angle $rotationY,
2001
        Angle $rotationZ,
2002
        Scale $scaleFactor,
2003
        Length $pivotX,
2004
        Length $pivotY,
2005
        Length $pivotZ
2006
    ): GeocentricPoint {
2007 4
        $xs = $from->getX()->asMetres()->getValue();
2008 4
        $ys = $from->getY()->asMetres()->getValue();
2009 4
        $zs = $from->getZ()->asMetres()->getValue();
2010 4
        $tx = $translationX->asMetres()->getValue();
2011 4
        $ty = $translationY->asMetres()->getValue();
2012 4
        $tz = $translationZ->asMetres()->getValue();
2013 4
        $rx = $rotationX->asRadians()->getValue();
2014 4
        $ry = $rotationY->asRadians()->getValue();
2015 4
        $rz = $rotationZ->asRadians()->getValue();
2016 4
        $M = 1 + $scaleFactor->asUnity()->getValue();
2017 4
        $xp = $pivotX->asMetres()->getValue();
2018 4
        $yp = $pivotY->asMetres()->getValue();
2019 4
        $zp = $pivotZ->asMetres()->getValue();
2020
2021 4
        $xt = $M * ((($xs - $xp) * 1) + (($ys - $yp) * -$rz) + (($zs - $zp) * $ry)) + $tx + $xp;
2022 4
        $yt = $M * ((($xs - $xp) * $rz) + (($ys - $yp) * 1) + (($zs - $zp) * -$rx)) + $ty + $yp;
2023 4
        $zt = $M * ((($xs - $xp) * -$ry) + (($ys - $yp) * $rx) + (($zs - $zp) * 1)) + $tz + $zp;
2024
2025 4
        return new GeocentricPoint(new Metre($xt), new Metre($yt), new Metre($zt), $to);
2026
    }
2027
2028
    /**
2029
     * Molodensky-Badekas (PV geog2D/geog3D domain)
2030
     * See method codes 1061 and 1062/1063 for this operation in other coordinate domains and method code 1039/9636 for opposite
2031
     * rotation in geographic 2D/3D domain.
2032
     */
2033 4
    public function geographicPositionVectorMolodenskyBadekas(
2034
        GeographicPoint $from,
2035
        CoordinateReferenceSystem $to,
2036
        Length $translationX,
2037
        Length $translationY,
2038
        Length $translationZ,
2039
        Angle $rotationX,
2040
        Angle $rotationY,
2041
        Angle $rotationZ,
2042
        Scale $scaleFactor,
2043
        Length $pivotX,
2044
        Length $pivotY,
2045
        Length $pivotZ
2046
    ): GeographicPoint {
2047 4
        $geographicValue = new GeographicValue($from->getLatitude(), $from->getLongitude(), $from->getHeight());
2048 4
        $asGeocentric = $this->geographicGeocentricConversion($geographicValue, $from->getCRS());
2049
2050 4
        $xs = $asGeocentric->getX()->asMetres()->getValue();
2051 4
        $ys = $asGeocentric->getY()->asMetres()->getValue();
2052 4
        $zs = $asGeocentric->getZ()->asMetres()->getValue();
2053 4
        $tx = $translationX->asMetres()->getValue();
2054 4
        $ty = $translationY->asMetres()->getValue();
2055 4
        $tz = $translationZ->asMetres()->getValue();
2056 4
        $rx = $rotationX->asRadians()->getValue();
2057 4
        $ry = $rotationY->asRadians()->getValue();
2058 4
        $rz = $rotationZ->asRadians()->getValue();
2059 4
        $M = 1 + $scaleFactor->asUnity()->getValue();
2060 4
        $xp = $pivotX->asMetres()->getValue();
2061 4
        $yp = $pivotY->asMetres()->getValue();
2062 4
        $zp = $pivotZ->asMetres()->getValue();
2063
2064 4
        $xt = $M * ((($xs - $xp) * 1) + (($ys - $yp) * -$rz) + (($zs - $zp) * $ry)) + $tx + $xp;
2065 4
        $yt = $M * ((($xs - $xp) * $rz) + (($ys - $yp) * 1) + (($zs - $zp) * -$rx)) + $ty + $yp;
2066 4
        $zt = $M * ((($xs - $xp) * -$ry) + (($ys - $yp) * $rx) + (($zs - $zp) * 1)) + $tz + $zp;
2067 4
        $newGeocentric = new GeocentricValue(new Metre($xt), new Metre($yt), new Metre($zt));
2068 4
        $newGeographic = $this->geographicGeocentricConversion($newGeocentric, $to);
2069
2070 4
        return new GeographicPoint($newGeographic->getLatitude(), $newGeographic->getLongitude(), $to instanceof Geographic3D ? $newGeographic->getHeight() : null, $to);
2071
    }
2072
2073
    /**
2074
     * NADCON
2075
     * Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Input
2076
     * expects longitudes to be positive west.
2077
     */
2078
    public function EPSG_NADCON(): Point
2079
    {
2080
    }
2081
2082
    /**
2083
     * NADCON5 (2D)
2084
     * Geodetic transformation operating on geographic coordinate differences by bi-quadratic interpolation.  Input
2085
     * expects longitudes to be positive east in range 0-360° (0° = Greenwich).
2086
     */
2087
    public function EPSG_NADCON5_2D(): Point
2088
    {
2089
    }
2090
2091
    /**
2092
     * NADCON5 (3D)
2093
     * Geodetic transformation operating on geographic coordinate differences by bi-quadratic interpolation.  Input
2094
     * expects longitudes to be positive east in range 0-360° (0° = Greenwich).
2095
     */
2096
    public function EPSG_NADCON5_3D(): Point
2097
    {
2098
    }
2099
2100
    /**
2101
     * NTv1
2102
     * Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation. Superseded in
2103
     * 1997 by NTv2 (transformation method code 9615).  Input expects longitudes to be positive west.
2104
     */
2105
    public function EPSG_NTV1(): Point
2106
    {
2107
    }
2108
2109
    /**
2110
     * NTv2
2111
     * Geodetic transformation operating on geographic coordinate differences by bi-linear interpolation.  Supersedes
2112
     * NTv1 (transformation method code 9614).  Input expects longitudes to be positive west.
2113
     */
2114
    public function EPSG_NTV2(): Point
2115
    {
2116
    }
2117
2118
    /**
2119
     * New Zealand Deformation Model
2120
     * Zip final contains a set of CSV files documentation for a secular tectonic plate velocity model and patches
2121
     * which account for movements due to specific deformation events (earthquakes).
2122
     */
2123
    public function EPSG_NEW_ZEALAND_DEFORMATION_MODEL(): Point
2124
    {
2125
    }
2126
2127
    /**
2128
     * New Zealand Map Grid.
2129
     */
2130
    public function EPSG_NEW_ZEALAND_MAP_GRID(): Point
2131
    {
2132
    }
2133
2134
    /**
2135
     * Norway Offshore Interpolation
2136
     * Although in principle this method is not reversible, in practice reversibility is better than 10 cm. For the
2137
     * applications for which it was designed it may be considered reversible.
2138
     */
2139
    public function EPSG_NORWAY_OFFSHORE_INTERPOLATION(): Point
2140
    {
2141
    }
2142
2143
    /**
2144
     * Oblique Stereographic
2145
     * This is not the same as the projection method of the same name in USGS Professional Paper no. 1395, "Map
2146
     * Projections - A Working Manual" by John P. Snyder.
2147
     */
2148
    public function EPSG_OBLIQUE_STEREOGRAPHIC(): Point
2149
    {
2150
    }
2151
2152
    /**
2153
     * Ordnance Survey National Transformation
2154
     * Geodetic transformation between ETRS89 (or WGS 84) and OSGB36 / National Grid.  Uses ETRS89 / National Grid as
2155
     * an intermediate coordinate system for bi-linear interpolation of gridded grid coordinate differences.
2156
     */
2157
    public function EPSG_ORDNANCE_SURVEY_NATIONAL_TRANSFORMATION(): Point
2158
    {
2159
    }
2160
2161
    /**
2162
     * Orthographic
2163
     * If the natural origin of the projection is at the topocentric origin, this is a special case of the Vertical
2164
     * Perspective (orthographic case) (method code 9839) in which the ellipsoid height of all mapped points is zero (h
2165
     * = 0).
2166
     */
2167
    public function EPSG_ORTHOGRAPHIC(): Point
2168
    {
2169
    }
2170
2171
    /**
2172
     * Point motion (ellipsoidal).
2173
     */
2174
    public function EPSG_POINT_MOTION_ELLIPSOIDAL(): Point
2175
    {
2176
    }
2177
2178
    /**
2179
     * Point motion (geocen) by grid (INADEFORM).
2180
     */
2181
    public function EPSG_POINT_MOTION_GEOCEN_BY_GRID_INADEFORM(): Point
2182
    {
2183
    }
2184
2185
    /**
2186
     * Point motion (geocentric Cartesian).
2187
     */
2188
    public function EPSG_POINT_MOTION_GEOCENTRIC_CARTESIAN(): Point
2189
    {
2190
    }
2191
2192
    /**
2193
     * Point motion by grid (Canada NTv2_Vel)
2194
     * Interpolation within the grid is in the horizontal component of the source CRS.
2195
     */
2196
    public function EPSG_POINT_MOTION_BY_GRID_CANADA_NTV2_VEL(): Point
2197
    {
2198
    }
2199
2200
    /**
2201
     * Polar Stereographic (variant A)
2202
     * Latitude of natural origin must be either 90 degrees or -90 degrees (or equivalent in alternative angle unit).
2203
     */
2204
    public function EPSG_POLAR_STEREOGRAPHIC_VARIANT_A(): Point
2205
    {
2206
    }
2207
2208
    /**
2209
     * Polar Stereographic (variant B).
2210
     */
2211
    public function EPSG_POLAR_STEREOGRAPHIC_VARIANT_B(): Point
2212
    {
2213
    }
2214
2215
    /**
2216
     * Polar Stereographic (variant C).
2217
     */
2218
    public function EPSG_POLAR_STEREOGRAPHIC_VARIANT_C(): Point
2219
    {
2220
    }
2221
2222
    /**
2223
     * Popular Visualisation Pseudo Mercator
2224
     * Applies spherical formulas to the ellipsoid. As such does not have the properties of a true Mercator projection.
2225
     */
2226
    public function EPSG_POPULAR_VISUALISATION_PSEUDO_MERCATOR(): Point
2227
    {
2228
    }
2229
2230
    /**
2231
     * Position Vector transformation (geocentric domain)
2232
     * This method is a specific case of the Molodensky-Badekas (PV) method (code 1061) in which the evaluation point
2233
     * is the geocentre with coordinate values of zero. Note the analogy with the Coordinate Frame method (code 1032)
2234
     * but beware of the differences!
2235
     */
2236 3
    public function geocentricPositionVectorTransformation(
2237
        GeocentricPoint $from,
2238
        Geocentric $to,
2239
        Length $translationX,
2240
        Length $translationY,
2241
        Length $translationZ,
2242
        Angle $rotationX,
2243
        Angle $rotationY,
2244
        Angle $rotationZ,
2245
        Scale $scaleFactor
2246
    ): GeocentricPoint {
2247 3
        return $this->geocentricPositionVectorMolodenskyBadekas(
2248 3
            $from,
2249
            $to,
2250
            $translationX,
2251
            $translationY,
2252
            $translationZ,
2253
            $rotationX,
2254
            $rotationY,
2255
            $rotationZ,
2256
            $scaleFactor,
2257 3
            new Metre(0),
2258 3
            new Metre(0),
2259 3
            new Metre(0)
2260
        );
2261
    }
2262
2263
    /**
2264
     * Position Vector transformation (geog2D/geog3D domain)
2265
     * Note the analogy with the Coordinate Frame rotation (code 9607/1038) but beware of the differences!  The Position
2266
     * Vector convention is used by IAG and recommended by ISO 19111. See methods 1033/1037/9606 for similar tfms
2267
     * operating between other CRS types.
2268
     * @param Geographic2D|Geographic3D $to
2269
     */
2270 2
    public function geographicPositionVectorTransformation(
2271
        GeographicPoint $from,
2272
        CoordinateReferenceSystem $to,
2273
        Length $translationX,
2274
        Length $translationY,
2275
        Length $translationZ,
2276
        Angle $rotationX,
2277
        Angle $rotationY,
2278
        Angle $rotationZ,
2279
        Scale $scaleFactor
2280
    ): GeographicPoint {
2281 2
        return $this->geographicPositionVectorMolodenskyBadekas(
2282 2
            $from,
2283
            $to,
2284
            $translationX,
2285
            $translationY,
2286
            $translationZ,
2287
            $rotationX,
2288
            $rotationY,
2289
            $rotationZ,
2290
            $scaleFactor,
2291 2
            new Metre(0),
2292 2
            new Metre(0),
2293 2
            new Metre(0)
2294
        );
2295
    }
2296
2297
    /**
2298
     * Pseudo Plate Carree
2299
     * Used only for depiction of graticule (latitude/longitude) coordinates on a computer display. The axes units are
2300
     * decimal degrees and of variable scale. The origin is at Lat = 0, Long = 0. See Equidistant Cylindrical, code
2301
     * 1029, for proper Plate Carrée.
2302
     */
2303
    public function EPSG_PSEUDO_PLATE_CARREE(): Point
2304
    {
2305
    }
2306
2307
    /**
2308
     * Reversible polynomial of degree 13.
2309
     */
2310
    public function EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_13(): Point
2311
    {
2312
    }
2313
2314
    /**
2315
     * Reversible polynomial of degree 2
2316
     * Reversibility is subject to constraints.  See Guidance Note 7 for conditions and clarification.
2317
     */
2318
    public function EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_2(): Point
2319
    {
2320
    }
2321
2322
    /**
2323
     * Reversible polynomial of degree 3
2324
     * Reversibility is subject to constraints.  See Guidance Note 7 for conditions and clarification.
2325
     */
2326
    public function EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_3(): Point
2327
    {
2328
    }
2329
2330
    /**
2331
     * Reversible polynomial of degree 4
2332
     * Reversibility is subject to constraints.  See Guidance Note 7 for conditions and clarification.
2333
     */
2334
    public function EPSG_REVERSIBLE_POLYNOMIAL_OF_DEGREE_4(): Point
2335
    {
2336
    }
2337
2338
    /**
2339
     * Similarity transformation
2340
     * Defined for two-dimensional coordinate systems.
2341
     */
2342
    public function EPSG_SIMILARITY_TRANSFORMATION(): Point
2343
    {
2344
    }
2345
2346
    /**
2347
     * Swiss Oblique Cylindrical
2348
     * Can be accommodated by Oblique Mercator method (code 9815), for which this method is an approximation (see BfL
2349
     * document swissprojectionen.pdf at www.swisstopo.com).
2350
     */
2351
    public function EPSG_SWISS_OBLIQUE_CYLINDRICAL(): Point
2352
    {
2353
    }
2354
2355
    /**
2356
     * Time-dependent Coordinate Frame rotation (geocen)
2357
     * Note the analogy with the Time-dependent Position Vector transformation (code 1053) but beware of the
2358
     * differences!  The Position Vector convention is used by IAG. See method codes 1057 and 1058 for similar methods
2359
     * operating between other CRS types.
2360
     */
2361
    public function EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOCEN(): Point
2362
    {
2363
    }
2364
2365
    /**
2366
     * Time-dependent Coordinate Frame rotation (geog2D)
2367
     * Note the analogy with the Time-dependent Position Vector transformation (code 1054) but beware of the
2368
     * differences!  The Position Vector convention is used by IAG. See methods 1056 and 1058 for similar tfms
2369
     * operating between other CRS types.
2370
     */
2371
    public function EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOG2D(): Point
2372
    {
2373
    }
2374
2375
    /**
2376
     * Time-dependent Coordinate Frame rotation (geog3D)
2377
     * Note the analogy with the Time-dependent Position Vector transformation (code 1055) but beware of the
2378
     * differences!  The Position Vector convention is used by IAG. See method codes 1056 and 1057 for similar methods
2379
     * operating between other CRS types.
2380
     */
2381
    public function EPSG_TIME_DEPENDENT_COORDINATE_FRAME_ROTATION_GEOG3D(): Point
2382
    {
2383
    }
2384
2385
    /**
2386
     * Time-dependent Position Vector tfm (geocentric)
2387
     * Note the analogy with the Time-dependent Coordinate Frame rotation (code 1056) but beware of the differences!
2388
     * The Position Vector convention is used by IAG. See method codes 1054 and 1055 for similar methods operating
2389
     * between other CRS types.
2390
     */
2391
    public function EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOCENTRIC(): Point
2392
    {
2393
    }
2394
2395
    /**
2396
     * Time-dependent Position Vector tfm (geog2D)
2397
     * Note the analogy with the Time-dependent Coordinate Frame rotation (code 1057) but beware of the differences!
2398
     * The Position Vector convention is used by IAG. See method codes 1053 and 1055 for similar methods operating
2399
     * between other CRS types.
2400
     */
2401
    public function EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOG2D(): Point
2402
    {
2403
    }
2404
2405
    /**
2406
     * Time-dependent Position Vector tfm (geog3D)
2407
     * Note the analogy with the Coordinate Frame rotation (code 1058) but beware of the differences!  The Position
2408
     * Vector convention is used by IAG. See method codes 1053 and 1054 for similar methods operating between other CRS
2409
     * types.
2410
     */
2411
    public function EPSG_TIME_DEPENDENT_POSITION_VECTOR_TFM_GEOG3D(): Point
2412
    {
2413
    }
2414
2415
    /**
2416
     * Time-specific Coordinate Frame rotation (geocen)
2417
     * Note the analogy with the Time-specific Position Vector method (code 1065) but beware of the differences!
2418
     */
2419
    public function EPSG_TIME_SPECIFIC_COORDINATE_FRAME_ROTATION_GEOCEN(): Point
2420
    {
2421
    }
2422
2423
    /**
2424
     * Time-specific Position Vector transform (geocen)
2425
     * Note the analogy with the Time-specifc Coordinate Frame method (code 1066) but beware of the differences!
2426
     */
2427
    public function EPSG_TIME_SPECIFIC_POSITION_VECTOR_TRANSFORM_GEOCEN(): Point
2428
    {
2429
    }
2430
2431
    /**
2432
     * Transverse Mercator.
2433
     */
2434
    public function EPSG_TRANSVERSE_MERCATOR(): Point
2435
    {
2436
    }
2437
2438
    /**
2439
     * Transverse Mercator (South Orientated).
2440
     */
2441
    public function EPSG_TRANSVERSE_MERCATOR_SOUTH_ORIENTATED(): Point
2442
    {
2443
    }
2444
2445
    /**
2446
     * Transverse Mercator Zoned Grid System
2447
     * If locations fall outwith the fixed zones the general Transverse Mercator method (code 9807) must be used for
2448
     * each zone.
2449
     */
2450
    public function EPSG_TRANSVERSE_MERCATOR_ZONED_GRID_SYSTEM(): Point
2451
    {
2452
    }
2453
2454
    /**
2455
     * Vertical Offset
2456
     * This transformation allows calculation of height (or depth) in the target system by adding the parameter value
2457
     * to the height (or depth)-value of the point in the source system.
2458
     */
2459
    public function EPSG_VERTICAL_OFFSET(): Point
2460
    {
2461
    }
2462
2463
    /**
2464
     * Vertical Offset and Slope
2465
     * This transformation allows calculation of height in the target system by applying the parameter values to the
2466
     * height value of the point in the source system.
2467
     */
2468
    public function EPSG_VERTICAL_OFFSET_AND_SLOPE(): Point
2469
    {
2470
    }
2471
2472
    /**
2473
     * Vertical Offset by Grid Interpolation (BEV AT).
2474
     */
2475
    public function EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_BEV_AT(): Point
2476
    {
2477
    }
2478
2479
    /**
2480
     * Vertical Offset by Grid Interpolation (NZLVD).
2481
     */
2482
    public function EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_NZLVD(): Point
2483
    {
2484
    }
2485
2486
    /**
2487
     * Vertical Offset by Grid Interpolation (VERTCON)
2488
     * Any NAD realization may be used as the Interpolation CRS(){} bi-linear interpolation is used. Input expects
2489
     * longitudes to be positive west.
2490
     */
2491
    public function EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_VERTCON(): Point
2492
    {
2493
    }
2494
2495
    /**
2496
     * Vertical Offset by Grid Interpolation (asc).
2497
     */
2498
    public function EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_ASC(): Point
2499
    {
2500
    }
2501
2502
    /**
2503
     * Vertical Offset by Grid Interpolation (gtx).
2504
     */
2505
    public function EPSG_VERTICAL_OFFSET_BY_GRID_INTERPOLATION_GTX(): Point
2506
    {
2507
    }
2508
2509
    /**
2510
     * Vertical Perspective
2511
     * For a viewing point height approaching or at infinity, see the Vertical Perspective (orthographic case) (method
2512
     * code 9839).
2513
     */
2514
    public function EPSG_VERTICAL_PERSPECTIVE(): Point
2515
    {
2516
    }
2517
2518
    /**
2519
     * Vertical Perspective (Orthographic case)
2520
     * This is a special case of the general Vertical Perspective (method code 9838) in which the viewing point at
2521
     * infinity.
2522
     */
2523
    public function EPSG_VERTICAL_PERSPECTIVE_ORTHOGRAPHIC_CASE(): Point
2524
    {
2525
    }
2526
}
2527