diff --git a/.travis.yml b/.travis.yml index 22ee6ce7..978c87e8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -26,6 +26,10 @@ before_install: install: composer install before_script: + - php -m + - php --ini + - phpenv config-rm intl.ini || echo "intl PHP extension not available" + - php -m - mkdir -p build/logs - curl -L https://codeclimate.com/downloads/test-reporter/test-reporter-latest-linux-amd64 > ./cc-test-reporter - chmod +x ./cc-test-reporter diff --git a/composer.json b/composer.json index f9ac9e4f..3de19123 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,8 @@ "ext-json": "*", "illuminate/database": "^5.2|^6.0|^7.0", "geo-io/wkb-parser": "^1.0", - "jmikola/geojson": "^1.0" + "jmikola/geojson": "^1.0", + "symfony/polyfill-intl-icu": "^1.14" }, "require-dev": { "phpunit/phpunit": "~4.8|~5.7", diff --git a/src/Types/Point.php b/src/Types/Point.php index 40719af4..49652ee5 100644 --- a/src/Types/Point.php +++ b/src/Types/Point.php @@ -5,6 +5,7 @@ use GeoJson\GeoJson; use GeoJson\Geometry\Point as GeoJsonPoint; use Grimzy\LaravelMysqlSpatial\Exceptions\InvalidGeoJsonException; +use NumberFormatter; class Point extends Geometry { @@ -12,10 +13,15 @@ class Point extends Geometry protected $lng; + private $formatter; + public function __construct($lat, $lng) { $this->lat = (float) $lat; $this->lng = (float) $lng; + + $this->formatter = new NumberFormatter('en', NumberFormatter::DECIMAL); + $this->formatter->setAttribute(NumberFormatter::FRACTION_DIGITS, 12); } public function getLat() @@ -40,7 +46,10 @@ public function setLng($lng) public function toPair() { - return $this->getLng().' '.$this->getLat(); + $lng = $this->rtrimCoordinate($this->formatter->format($this->getLng())); + $lat = $this->rtrimCoordinate($this->formatter->format($this->getLat())); + + return $lng.' '.$lat; } public static function fromPair($pair) @@ -62,7 +71,7 @@ public static function fromString($wktArgument) public function __toString() { - return $this->getLng().' '.$this->getLat(); + return $this->toPair(); } /** @@ -94,4 +103,9 @@ public function jsonSerialize() { return new GeoJsonPoint([$this->getLng(), $this->getLat()]); } + + private function rtrimCoordinate($coordinate) + { + return rtrim(rtrim($coordinate, '0'), '.,'); + } } diff --git a/tests/Unit/Types/PointLocaleTest.php b/tests/Unit/Types/PointLocaleTest.php new file mode 100644 index 00000000..e6ed802a --- /dev/null +++ b/tests/Unit/Types/PointLocaleTest.php @@ -0,0 +1,103 @@ +assertInstanceOf(Point::class, $point); + $this->assertEquals(2, $point->getLat()); + $this->assertEquals(1, $point->getLng()); + } + + public function testToWKT() + { + $point = new Point(1, 2); + + $this->assertEquals('POINT(2 1)', $point->toWKT()); + } + + public function testGettersAndSetters() + { + $point = new Point(1, 2); + $this->assertSame(1.0, $point->getLat()); + $this->assertSame(2.0, $point->getLng()); + + $point->setLat('3'); + $point->setLng('4'); + + $this->assertSame(3.0, $point->getLat()); + $this->assertSame(4.0, $point->getLng()); + } + + public function testPairLocale() + { + setlocale(LC_ALL, 'pt_BR.UTF-8'); + $point = Point::fromPair('1.5 2'); + + $this->assertSame(1.5, $point->getLng()); + $this->assertSame(2.0, $point->getLat()); + + $this->assertSame('1.5 2', $point->toPair()); + setlocale(LC_ALL, 'en-US.UTF-8'); + } + + public function testPair() + { + $point = Point::fromPair('1.5 2'); + + $this->assertSame(1.5, $point->getLng()); + $this->assertSame(2.0, $point->getLat()); + + $this->assertSame('1.5 2', $point->toPair()); + } + + public function testToString() + { + $point = Point::fromString('1.3 2'); + + $this->assertSame(1.3, $point->getLng()); + $this->assertSame(2.0, $point->getLat()); + + $this->assertEquals('1.3 2', (string) $point); + } + + public function testFromJson() + { + $point = Point::fromJson('{"type":"Point","coordinates":[3.4,1.2]}'); + $this->assertInstanceOf(Point::class, $point); + $this->assertEquals(1.2, $point->getLat()); + $this->assertEquals(3.4, $point->getLng()); + } + + public function testInvalidGeoJsonException() + { + $this->setExpectedException(\Grimzy\LaravelMysqlSpatial\Exceptions\InvalidGeoJsonException::class); + Point::fromJson('{"type": "LineString","coordinates":[[1,1],[2,2]]}'); + } + + public function testJsonSerialize() + { + $point = new Point(1.2, 3.4); + + $this->assertInstanceOf(\GeoJson\Geometry\Point::class, $point->jsonSerialize()); + $this->assertSame('{"type":"Point","coordinates":[3.4,1.2]}', json_encode($point)); + } +}