diff --git a/app/GeoJson/BoundingBox.php b/app/GeoJson/BoundingBox.php index c5f23a3a..de27eb9b 100644 --- a/app/GeoJson/BoundingBox.php +++ b/app/GeoJson/BoundingBox.php @@ -2,6 +2,10 @@ namespace App\GeoJson; +use App\GeoJson\Geometry\Geometry; +use App\GeoJson\Geometry\Point; +use App\GeoJson\Geometry\Polygon; + class BoundingBox { public float $minX; @@ -19,4 +23,23 @@ public function __construct(float $minX, float $minY, float $maxX, float $maxY) $this->maxX = $maxX; $this->maxY = $maxY; } + + public function contains(Geometry $geometry) + { + + if ($geometry instanceof Point) { + return ($geometry->x >= $this->minX) && ($geometry->x <= $this->maxX) && ($geometry->y >= $this->minY) && ($geometry->y <= $this->maxY); + } + + if ($geometry instanceof Polygon) { + foreach ($geometry->points as $point) { + $contains = $this->contains($point); + if (! $contains) { + return false; + } + } + + return true; + } + } } diff --git a/tests/Unit/GeoJson/BoundingBoxTest.php b/tests/Unit/GeoJson/BoundingBoxTest.php new file mode 100644 index 00000000..cd46da24 --- /dev/null +++ b/tests/Unit/GeoJson/BoundingBoxTest.php @@ -0,0 +1,39 @@ +assertTrue($bbox->contains($pointContained)); + } + + public function test_does_not_contain_point(): void + { + $bbox = new BoundingBox(minX: 1, maxX: 4, minY: 1, maxY: 4); + $pointNotContained = new Point(x: 2, y: 5); + $this->assertFalse($bbox->contains($pointNotContained)); + } + + public function test_contains_polygon(): void + { + $bbox = new BoundingBox(minX: 1, maxX: 4, minY: 1, maxY: 4); + $pointContained = new Polygon(points: []); + $this->assertTrue($bbox->contains($pointContained)); + } + + public function test_does_not_contain_polygon(): void + { + $bbox = new BoundingBox(minX: 1, maxX: 4, minY: 1, maxY: 4); + $pointNotContained = new Polygon(points: []); + $this->assertFalse($bbox->contains($pointNotContained)); + } +}