Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/artisanweblab/spatial

Spatial package (PostgreSQL, PostGIS, MySQL, MariaDB) for Laravel Framework
https://github.com/artisanweblab/spatial

eloquent laravel mariadb mysql pgsql postgis postgresql spatial

Last synced: 4 months ago
JSON representation

Spatial package (PostgreSQL, PostGIS, MySQL, MariaDB) for Laravel Framework

Awesome Lists containing this project

README

        

# Laravel Spatial

```shell
composer require artisanweblab/spatial
```

## PostgreSQL and PostGIS

PostGIS is a spatial database extender for PostgreSQL object-relational database. It adds support for geographic objects allowing location queries to be run in SQL.

[PostGIS Official Documentation](https://postgis.net/documentation)

[Install PostGIS to your Web server](https://postgis.net/install/)

[Install PostGIS to your Docker container](https://github.com/postgis/docker-postgis)

## MySQL and MariaDB

MySQL and MariaDB have built-in support for spatial data.

## Integration with your project

### Prepare your table

Add fields with the required data type:

Laravel 10 and before:

```php
$table->point('point')->isGeometry()->nullable();
```

Laravel 11 and after:

```php
$table->geometry('point', 'point')->nullable();
```

### Prepare your model

```php
SpatialCast::class,
];
}
```

### Example of Input and Output spatial data

```php
first();

// Longitude, Latitude
$user->point = Point::xy(2.2945022, 48.8582687);

$user->save();

//...

$user = User::query()->first();

get_class($user->point); // Brick\Geo\Point
```

### How to find records by Geometry

```php
withSpatialDistance('point', $point)
->whereSpatialDistanceSphere('point', $point, '<=', 1000) // 1000 meters
->get();
```

### Available Eloquent methods

```php
withSpatialDistance(string $column, Geometry $geometry, string $alias = null): Builder

whereSpatialDistance(string $column, Geometry $geometry, string $operator, int|float $distance, string $boolean = 'and'): Builder

orWhereSpatialDistance(string $column, Geometry $geometry, string $operator, int|float $distance): Builder
```

## Geometry Raw

```php
use Brick\Geo\IO\GeoJSONReader;
use Brick\Geo\IO\GeoJSONWriter;
use Brick\Geo\Point;
use Illuminate\Support\Facades\DB;

// Longitude, Latitude
$point = Point::xy(2.2945022, 48.8582687);

$query = sprintf(
"ST_AsGeoJSON(ST_Buffer(ST_GeomFromGeoJSON('%s'), 10)) as response",
(new GeoJSONWriter(false))->write($point)
);

$result = DB::query()->selectRaw($query)->first();

$geometry = $result ? (new GeoJSONReader(true))->read($result->response) : null;
```

```json
{
"type":"Polygon",
"coordinates":[
[
[58.8582687,2.2945022],
[58.666121504,0.34359898],
//...
]
]
}
```