From f9b860c58dfde000fee3cf771621be7833c2eb38 Mon Sep 17 00:00:00 2001 From: Doug Wright Date: Fri, 22 Oct 2021 21:32:02 +0100 Subject: [PATCH] Correct the decoding of sexagesimal DMS degree fractional components. Fixes #39 --- src/UnitOfMeasure/Angle/Degree.php | 5 +++-- tests/CoordinateOperation/AutoConversionTest.php | 10 ++++++++++ tests/UnitOfMeasure/Angle/DegreeTest.php | 6 ++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/UnitOfMeasure/Angle/Degree.php b/src/UnitOfMeasure/Angle/Degree.php index b6c2cc226..4dafc7c67 100644 --- a/src/UnitOfMeasure/Angle/Degree.php +++ b/src/UnitOfMeasure/Angle/Degree.php @@ -16,6 +16,7 @@ use function str_pad; use const STR_PAD_RIGHT; use function str_replace; +use function strlen; use function strpos; class Degree extends Angle @@ -147,9 +148,9 @@ private static function fromRegex(string $angle, string $regex): self $degrees = ($angleParts['degrees'] * 1); $degrees += (($angleParts['arcminutes'] ?? 0) / 60); - $degrees += (($angleParts['fractionarcminutes'] ?? 0) / 60 / 100); + $degrees += isset($angleParts['fractionarcminutes']) ? ($angleParts['fractionarcminutes'] / 60 / 10 ** (strlen($angleParts['fractionarcminutes']))) : 0; $degrees += (($angleParts['arcseconds'] ?? 0) / 3600); - $degrees += (($angleParts['fractionarcseconds'] ?? 0) / 3600 / 100); + $degrees += isset($angleParts['fractionarcseconds']) ? ($angleParts['fractionarcseconds'] / 3600 / 10 ** (strlen($angleParts['fractionarcseconds']))) : 0; if ($angleParts['negative'] ?? '' || in_array($angleParts['hemisphere'] ?? [], ['S', 'W'], true)) { $degrees *= -1; diff --git a/tests/CoordinateOperation/AutoConversionTest.php b/tests/CoordinateOperation/AutoConversionTest.php index 1a4a814ae..4bbee5c7f 100644 --- a/tests/CoordinateOperation/AutoConversionTest.php +++ b/tests/CoordinateOperation/AutoConversionTest.php @@ -278,6 +278,16 @@ public function testNAD27ToNAD83Canada(): void } } + public function testAmersfoortRDNewToWGS84(): void + { + $from = ProjectedPoint::createFromEastingNorthing(new Metre(86058.2205), new Metre(445832.8025), Projected::fromSRID(Projected::EPSG_AMERSFOORT_RD_NEW)); + $toCRS = Geographic2D::fromSRID(Geographic2D::EPSG_WGS_84); + $to = $from->convert($toCRS); + + self::assertEqualsWithDelta(51.996591992, $to->getLatitude()->asDegrees()->getValue(), 0.0000001); + self::assertEqualsWithDelta(4.383328547, $to->getLongitude()->asDegrees()->getValue(), 0.0000001); + } + /** * @group integration * @dataProvider EPSGConcatenatedOperations diff --git a/tests/UnitOfMeasure/Angle/DegreeTest.php b/tests/UnitOfMeasure/Angle/DegreeTest.php index c109d11d2..6277bce37 100644 --- a/tests/UnitOfMeasure/Angle/DegreeTest.php +++ b/tests/UnitOfMeasure/Angle/DegreeTest.php @@ -327,6 +327,12 @@ public function testSexagesimalDMS(): void self::assertEquals(35.5, $original->getValue()); } + public function testSexagesimalDMSFractionalSeconds(): void + { + $original = Degree::fromSexagesimalDMS('52.0922178'); + self::assertEqualsWithDelta(0.910296727, $original->asRadians()->getValue(), 0.000000001); + } + public function testSexagesimalDMSNegative(): void { $original = Degree::fromSexagesimalDMS('-35.3');