From a8fb8e93c8dd1275385e3ef65e201d1d22f11349 Mon Sep 17 00:00:00 2001 From: Nabeel Shahzad Date: Sun, 3 May 2020 11:06:49 -0400 Subject: [PATCH] METAR: KM as unit in visibility #680 --- app/Support/Metar.php | 34 ++++++++++++++++++++++++++-------- tests/MetarTest.php | 14 ++++++++++++++ 2 files changed, 40 insertions(+), 8 deletions(-) diff --git a/app/Support/Metar.php b/app/Support/Metar.php index 21cfa874..95146e74 100644 --- a/app/Support/Metar.php +++ b/app/Support/Metar.php @@ -843,6 +843,7 @@ class Metar implements \ArrayAccess * if visibility is limited to an integer mile plus a fraction part. * Format is mmSM for mm = statute miles, or m n/dSM for m = mile and n/d = fraction of a mile, * or just a 4-digit number nnnn (with leading zeros) for nnnn = meters. + * Unit can also be in KM * * @param mixed $part * @@ -858,7 +859,7 @@ class Metar implements \ArrayAccess .'([\d]{0,2})?' // 3 .'(([1357])' // 4 .'/(2|4|8|16))?' // 5 - .'SM|////)$@'; // 6 + .'(SM|KM|M|MI)|////)$@'; // 6 if (!preg_match($r, $part, $found)) { return false; @@ -884,8 +885,7 @@ class Metar implements \ArrayAccess // ICAO visibility (in meters) if (isset($found[2]) && !empty($found[2])) { $visibility = $this->createDistance((int) $found[2], 'm'); - } // US visibility (in miles) - else { + } else { if (isset($found[3]) && !empty($found[3])) { $prefix = 'Less than '; } @@ -896,16 +896,34 @@ class Metar implements \ArrayAccess $visibility = (int) $found[4]; } - $visibility = $this->createDistance($visibility, 'mi'); + $units = strtoupper($found[8]); + if ($units == 'MI' || $units == 'SM') { + $unit = 'mi'; + } elseif ($units == 'M') { + $unit = 'm'; + } elseif ($units == 'KM') { + $unit = 'km'; + } else { + $unit = $units; + } + + $visibility = $this->createDistance($visibility, $unit); } - $unit = ' meters'; - if ($visibility['m'] <= 1) { - $unit = ' meter'; + if ($visibility['m'] > 1000) { + $unit = ' km'; + $report = $prefix.$visibility['km'].$unit; + } else { + $unit = ' meters'; + if ($visibility['m'] <= 1) { + $unit = ' meter'; + } + + $report = $prefix.$visibility['m'].$unit; } $this->set_result_value('visibility', $visibility); - $this->set_result_value('visibility_report', $prefix.$visibility['m'].$unit); + $this->set_result_value('visibility_report', $report); } return true; diff --git a/tests/MetarTest.php b/tests/MetarTest.php index 54af0367..a4cc9f51 100644 --- a/tests/MetarTest.php +++ b/tests/MetarTest.php @@ -148,6 +148,20 @@ class MetarTest extends TestCase $this->assertEquals('A few at 1500 feet; a few at 25000 feet', $metar['clouds_report_ft']); } + /** + * Visibility in KM not parsed + * + * https://github.com/nabeelio/phpvms/issues/680 + */ + public function testMetar5() + { + $metar = 'NZOH 031300Z 04004KT 38KM SCT075 BKN090 15/14 Q1002 RMK AUTO NZPM VATSIM USE ONL'; + $metar = Metar::parse($metar); + + $this->assertEquals(38, $metar['visibility']['km']); + $this->assertEquals('38 km', $metar['visibility_report']); + } + public function testHttpCallSuccess() { $this->mockXmlResponse('aviationweather/kjfk.xml');