%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /www/loslex/demo/vendor/asanikovich/laravel-spatial/src/Geometry/
Upload File :
Create Path :
Current File : /www/loslex/demo/vendor/asanikovich/laravel-spatial/src/Geometry/Geometry.php

<?php

declare(strict_types=1);

namespace ASanikovich\LaravelSpatial\Geometry;

use ASanikovich\LaravelSpatial\Database\Connection;
use ASanikovich\LaravelSpatial\Eloquent\GeometryCast;
use ASanikovich\LaravelSpatial\Exceptions\LaravelSpatialException;
use ASanikovich\LaravelSpatial\Exceptions\LaravelSpatialJsonException;
use geoPHP;
use Illuminate\Contracts\Database\Eloquent\Castable;
use Illuminate\Contracts\Database\Eloquent\CastsAttributes;
use Illuminate\Contracts\Database\Query\Expression;
use Illuminate\Contracts\Support\Arrayable;
use Illuminate\Contracts\Support\Jsonable;
use Illuminate\Database\ConnectionInterface;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Traits\Macroable;
use JsonException;
use JsonSerializable;
use Stringable;
use Throwable;
use WKB as geoPHPWkb;

abstract class Geometry implements Castable, Arrayable, Jsonable, JsonSerializable, Stringable
{
    use Macroable;

    public int $srid = 0;

    abstract public function toWkt(): string;

    abstract public function getWktData(): string;

    public function __toString(): string
    {
        return $this->toWkt();
    }

    /**
     * @throws LaravelSpatialJsonException
     */
    public function toJson($options = 0): string
    {
        try {
            return json_encode($this, $options | JSON_THROW_ON_ERROR);
        } catch (JsonException $e) { // @codeCoverageIgnore
            throw new LaravelSpatialJsonException($e->getMessage(), previous: $e); // @codeCoverageIgnore
        } // @codeCoverageIgnore
    }

    /**
     * @throws LaravelSpatialException
     */
    public function toWkb(): string
    {
        try {
            $geoPHPGeometry = geoPHP::load($this->toJson());
        } catch (Throwable $e) { // @codeCoverageIgnore
            throw new LaravelSpatialException($e->getMessage(), previous: $e); // @codeCoverageIgnore
        } // @codeCoverageIgnore

        $sridInBinary = pack('L', $this->srid);

        // @phpstan-ignore-next-line
        $wkbWithoutSrid = (new geoPHPWkb)->write($geoPHPGeometry);

        return $sridInBinary.$wkbWithoutSrid;
    }

    public static function fromWkb(string $wkb): Geometry
    {
        $srid = substr($wkb, 0, 4);
        // @phpstan-ignore-next-line
        $srid = unpack('L', $srid)[1];

        $wkb = substr($wkb, 4);

        $geometry = GeometryFactory::parse($wkb, static::class);
        $geometry->srid = $srid;

        if (! ($geometry instanceof static)) {
            throw new LaravelSpatialException(sprintf('Expected %s, %s given.', static::class, $geometry::class));
        }

        return $geometry;
    }

    public static function fromWkt(string $wkt, int $srid = 0): static
    {
        $geometry = GeometryFactory::parse($wkt, static::class);
        $geometry->srid = $srid;

        if (! ($geometry instanceof static)) {
            throw new LaravelSpatialException(sprintf('Expected %s, %s given.', static::class, $geometry::class));
        }

        return $geometry;
    }

    public static function fromJson(string $geoJson, int $srid = 0): static
    {
        $geometry = GeometryFactory::parse($geoJson, static::class);
        $geometry->srid = $srid;

        if (! ($geometry instanceof static)) {
            throw new LaravelSpatialException(sprintf('Expected %s, %s given.', static::class, $geometry::class));
        }

        return $geometry;
    }

    /**
     * @param  array<mixed>  $geometry
     *
     * @throws LaravelSpatialJsonException
     */
    public static function fromArray(array $geometry): static
    {
        try {
            $geoJson = json_encode($geometry, JSON_THROW_ON_ERROR);
        } catch (JsonException $e) { // @codeCoverageIgnore
            throw new LaravelSpatialJsonException($e->getMessage(), previous: $e); // @codeCoverageIgnore
        } // @codeCoverageIgnore

        return static::fromJson($geoJson);
    }

    /**
     * @return array<mixed>
     */
    public function jsonSerialize(): array
    {
        return $this->toArray();
    }

    /**
     * @return array{type: string, coordinates: array<mixed>}
     */
    public function toArray(): array
    {
        return [
            'type' => class_basename(static::class),
            'coordinates' => $this->getCoordinates(),
        ];
    }

    /**
     * @throws JsonException
     */
    public function toFeatureCollectionJson(): string
    {
        if (static::class === GeometryCollection::class) {
            /** @var GeometryCollection $this */
            $geometries = $this->geometries;
        } else {
            $geometries = collect([$this]);
        }

        $features = $geometries->map(static function (self $geometry): array {
            return [
                'type' => 'Feature',
                'properties' => [],
                'geometry' => $geometry->toArray(),
            ];
        });

        return json_encode([
            'type' => 'FeatureCollection',
            'features' => $features,
        ], JSON_THROW_ON_ERROR);
    }

    /**
     * @return array<mixed>
     */
    abstract public function getCoordinates(): array;

    /**
     * @param  array<string>  $arguments
     */
    public static function castUsing(array $arguments): CastsAttributes
    {
        return new GeometryCast(static::class);
    }

    public function toSqlExpression(ConnectionInterface $connection): Expression
    {
        $wkt = $this->toWkt();

        if (! (new Connection())->isSupportAxisOrder($connection)) {
            // @codeCoverageIgnoreStart
            return DB::raw(sprintf("ST_GeomFromText('%s', %d)", $wkt, $this->srid));
            // @codeCoverageIgnoreEnd
        }

        return DB::raw(sprintf("ST_GeomFromText('%s', %d, 'axis-order=long-lat')", $wkt, $this->srid));
    }
}

Zerion Mini Shell 1.0