Your IP : 216.73.216.86


Current Path : /var/www/homesaver/www/bitrix/modules/location/lib/geometry/converter/
Upload File :
Current File : /var/www/homesaver/www/bitrix/modules/location/lib/geometry/converter/arrayconverter.php

<?php

namespace Bitrix\Location\Geometry\Converter;

use Bitrix\Location\Geometry\Type\BaseGeometry;
use Bitrix\Location\Geometry\Type\LineString;
use Bitrix\Location\Geometry\Type\MultiLineString;
use Bitrix\Location\Geometry\Type\MultiPoint;
use Bitrix\Location\Geometry\Type\MultiPolygon;
use Bitrix\Location\Geometry\Type\Point;
use Bitrix\Location\Geometry\Type\Polygon;

class ArrayConverter extends Converter
{
	/**
	 * @param $input
	 * @return BaseGeometry|null
	 */
	public function read($input): ?BaseGeometry
	{
		if (
			!is_array($input)
			|| !isset($input['type'])
			|| !is_string($input['type'])
		)
		{
			return null;
		}

		$method = 'arrayTo' . $input['type'];

		return method_exists($this, $method)
			? $this->$method($input['coordinates'])
			: null;
	}

	/**
	 * @inheritDoc
	 */
	public function write(BaseGeometry $geometry)
	{
		return $this->getArray($geometry);
	}

	/**
	 * @param BaseGeometry $geometry
	 * @return array
	 */
	private function getArray($geometry): array
	{
		return [
			'type' => $geometry->getGeometryType(),
			'coordinates' => $geometry->asArray(),
		];
	}

	/**
	 * @param array $array
	 * @return Point
	 */
	private function arrayToPoint(array $array): Point
	{
		return new Point($array[1], $array[0]);
	}

	/**
	 * @param array $array
	 * @return LineString
	 */
	private function arrayToLineString(array $array): LineString
	{
		$points = [];

		foreach ($array as $item)
		{
			$points[] = $this->arrayToPoint($item);
		}

		return new LineString($points);
	}

	/**
	 * @param array $array
	 * @return Polygon
	 */
	private function arrayToPolygon(array $array): Polygon
	{
		$lines = [];

		foreach ($array as $item)
		{
			$lines[] = $this->arrayToLineString($item);
		}

		return new Polygon($lines);
	}

	/**
	 * @param array $array
	 * @return MultiPoint
	 */
	private function arrayToMultiPoint(array $array): MultiPoint
	{
		$points = [];

		foreach ($array as $item)
		{
			$points[] = $this->arrayToPoint($item);
		}

		return new MultiPoint($points);
	}

	/**
	 * @param array $array
	 * @return MultiLineString
	 */
	private function arrayToMultiLineString(array $array): MultiLineString
	{
		$lines = [];

		foreach ($array as $item)
		{
			$lines[] = $this->arrayToLineString($item);
		}

		return new MultiLineString($lines);
	}

	/**
	 * @param array $array
	 * @return MultiPolygon
	 */
	private function arrayToMultiPolygon(array $array): MultiPolygon
	{
		$polys = [];

		foreach ($array as $item)
		{
			$polys[] = $this->arrayToPolygon($item);
		}

		return new MultiPolygon($polys);
	}
}