isEmpty) { return; } if ($this->exteriorRing()->numPoints() !== 4) { throw new InvalidGeometryException('A triangle must have exactly 4 (3 + 1) points.'); } if ($this->numInteriorRings() !== 0) { throw new InvalidGeometryException('A triangle must not have interior rings.'); } } #[NoProxy] public function geometryType() : string { return 'Triangle'; } #[NoProxy] public function geometryTypeBinary() : int { return Geometry::TRIANGLE; } public function project(Projector $projector): Triangle { return new Triangle( $projector->getTargetCoordinateSystem($this->coordinateSystem), ...array_map( fn (LineString $ring) => $ring->project($projector), $this->rings, ), ); } }