1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* PHPCoord. |
4
|
|
|
* |
5
|
|
|
* @author Doug Wright |
6
|
|
|
*/ |
7
|
|
|
declare(strict_types=1); |
8
|
|
|
|
9
|
|
|
namespace PHPCoord\CoordinateReferenceSystem; |
10
|
|
|
|
11
|
|
|
use function array_merge; |
12
|
|
|
use PHPCoord\CoordinateSystem\CoordinateSystem; |
13
|
|
|
use PHPCoord\Datum\Datum; |
14
|
|
|
use PHPCoord\Geometry\GeographicPolygon; |
15
|
|
|
|
16
|
|
|
abstract class CoordinateReferenceSystem |
17
|
|
|
{ |
18
|
|
|
public const CRS_TYPE_COMPOUND = 'compound'; |
19
|
|
|
|
20
|
|
|
public const CRS_TYPE_DERIVED = 'derived'; |
21
|
|
|
|
22
|
|
|
public const CRS_TYPE_DYNAMIC_GEOCENTRIC = 'dynamic geocentric'; |
23
|
|
|
|
24
|
|
|
public const CRS_TYPE_DYNAMIC_GEOGRAPHIC_2D = 'dynamic geographic 2D'; |
25
|
|
|
|
26
|
|
|
public const CRS_TYPE_DYNAMIC_GEOGRAPHIC_3D = 'dynamic geographic 3D'; |
27
|
|
|
|
28
|
|
|
public const CRS_TYPE_DYNAMIC_VERTICAL = 'dynamic vertical'; |
29
|
|
|
|
30
|
|
|
public const CRS_TYPE_ENGINEERING = 'engineering'; |
31
|
|
|
|
32
|
|
|
public const CRS_TYPE_GEOCENTRIC = 'geocentric'; |
33
|
|
|
|
34
|
|
|
public const CRS_TYPE_GEOGRAPHIC_2D = 'geographic 2D'; |
35
|
|
|
|
36
|
|
|
public const CRS_TYPE_GEOGRAPHIC_3D = 'geographic 3D'; |
37
|
|
|
|
38
|
|
|
public const CRS_TYPE_PROJECTED = 'projected'; |
39
|
|
|
|
40
|
|
|
public const CRS_TYPE_VERTICAL = 'vertical'; |
41
|
|
|
|
42
|
|
|
public const CRS_SRID_PREFIX_EPSG = 'urn:ogc:def:crs:EPSG::'; |
43
|
|
|
|
44
|
|
|
protected $srid; |
45
|
|
|
|
46
|
|
|
protected $coordinateSystem; |
47
|
|
|
|
48
|
|
|
protected $datum; |
49
|
|
|
|
50
|
|
|
protected $boundingBox; |
51
|
|
|
|
52
|
|
|
private static $cachedObjects = []; |
53
|
|
|
|
54
|
|
|
private static $supportedCache = []; |
55
|
|
|
|
56
|
154 |
|
public function getSRID(): string |
57
|
|
|
{ |
58
|
154 |
|
return $this->srid; |
59
|
|
|
} |
60
|
|
|
|
61
|
225 |
|
public function getCoordinateSystem(): CoordinateSystem |
62
|
|
|
{ |
63
|
225 |
|
return $this->coordinateSystem; |
64
|
|
|
} |
65
|
|
|
|
66
|
138 |
|
public function getDatum(): Datum |
67
|
|
|
{ |
68
|
138 |
|
return $this->datum; |
69
|
|
|
} |
70
|
|
|
|
71
|
|
|
public function getBoundingBox(): GeographicPolygon |
72
|
|
|
{ |
73
|
|
|
return $this->boundingBox; |
74
|
|
|
} |
75
|
|
|
|
76
|
21 |
|
public static function fromSRID(string $srid) |
77
|
|
|
{ |
78
|
21 |
|
if (!isset(self::$cachedObjects[$srid])) { |
79
|
12 |
|
if (isset(Projected::getSupportedSRIDs()[$srid])) { |
80
|
5 |
|
self::$cachedObjects[$srid] = Projected::fromSRID($srid); |
81
|
7 |
|
} elseif (isset(Geographic2D::getSupportedSRIDs()[$srid])) { |
82
|
6 |
|
self::$cachedObjects[$srid] = Geographic2D::fromSRID($srid); |
83
|
2 |
|
} elseif (isset(Geographic3D::getSupportedSRIDs()[$srid])) { |
84
|
2 |
|
self::$cachedObjects[$srid] = Geographic3D::fromSRID($srid); |
85
|
1 |
|
} elseif (isset(Geocentric::getSupportedSRIDs()[$srid])) { |
86
|
1 |
|
self::$cachedObjects[$srid] = Geocentric::fromSRID($srid); |
87
|
|
|
} elseif (isset(Vertical::getSupportedSRIDs()[$srid])) { |
88
|
|
|
self::$cachedObjects[$srid] = Vertical::fromSRID($srid); |
89
|
|
|
} elseif (isset(Compound::getSupportedSRIDs()[$srid])) { |
90
|
|
|
self::$cachedObjects[$srid] = Compound::fromSRID($srid); |
91
|
|
|
} |
92
|
|
|
} |
93
|
|
|
|
94
|
21 |
|
return self::$cachedObjects[$srid]; |
95
|
|
|
} |
96
|
|
|
|
97
|
11 |
|
public static function getSupportedSRIDs(): array |
98
|
|
|
{ |
99
|
11 |
|
if (!self::$supportedCache) { |
|
|
|
|
100
|
1 |
|
self::$supportedCache = array_merge(Compound::getSupportedSRIDs(), Geocentric::getSupportedSRIDs(), Geographic2D::getSupportedSRIDs(), Geographic3D::getSupportedSRIDs(), Projected::getSupportedSRIDs(), Vertical::getSupportedSRIDs()); |
101
|
|
|
} |
102
|
|
|
|
103
|
11 |
|
return self::$supportedCache; |
104
|
|
|
} |
105
|
|
|
} |
106
|
|
|
|
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.