shabushabu / laravel-postgis
PostGIS query expression collection for Laravel
Fund package maintenance!
boris-glumpler
Requires
- php: ^8.2
- illuminate/contracts: ^11.0
- tpetry/laravel-query-expressions: ^1.3
Requires (Dev)
- larastan/larastan: ^2.9
- laravel/pint: ^1.14
- nunomaduro/collision: ^8.1.1
- orchestra/testbench: ^9.0
- pestphp/pest: ^2.34
- pestphp/pest-plugin-arch: ^2.7
- pestphp/pest-plugin-laravel: ^2.3
- pestphp/pest-plugin-type-coverage: ^2.8
- phpstan/extension-installer: ^1.3
- phpstan/phpstan-deprecation-rules: ^1.1
- phpstan/phpstan-phpunit: ^1.3
This package is auto-updated.
Last update: 2024-10-21 11:20:24 UTC
README
Laravel PostGIS
Select collection of Laravel query expressions for PostGIS.
Supported minimum versions
Installation
Caution
Please note that this is a new package and, even though it is well tested, it should be considered pre-release software
Before installing the package you should install and enable the PostGIS extension.
You can install the package via composer:
composer require shabushabu/laravel-postgis
Usage
Please see the expressions folder for a full list of supported PostGIS functions.
We do accept pull requests for any additional functions!
The expressions can be used in queries or in migrations.
PostGIS queries often have subtle differences between them, so the way we use this package at ShabuShabu is to extend the Eloquent builder for a given model and use the expressions in there.
Query examples
Getting the GeoJSON representation of a geometry column
use ShabuShabu\PostGIS\Expressions\As; use Tpetry\QueryExpressions\Language\Alias; use ShabuShabu\PostGIS\Expressions\Enums\Option; Track::query() ->select(new Alias(new As\GeoJSON('geom', 6, Option::bbox), 'json')) ->where('trail_id', 27) ->value('json');
Get an elevation profile from a linestring zm
use Tpetry\QueryExpressions\Language\Alias; use ShabuShabu\PostGIS\Expressions\Collect; use ShabuShabu\PostGIS\Expressions\Simplify; use ShabuShabu\PostGIS\Expressions\DumpPoints; use ShabuShabu\PostGIS\Expressions\Position\Elevation; use ShabuShabu\PostGIS\Expressions\Position\Timestamp; DB::query()->select([ new Alias(new Elevation('geom'), 'x'), new Alias(new Timestamp('geom'), 'y'), ])->from( Track::query()->select( new Alias(new DumpPoints(new Simplify(new Collect('geom'), 0.15)), 'geom') )->where('trail_id', 27), 't' );
Migration examples
Adding a generated column from coordinate columns
use ShabuShabu\PostGIS\Expressions\SetSRID; use ShabuShabu\PostGIS\Expressions\Position\MakePoint; Schema::create('locations', static function (Blueprint $table) { // all the other table columns... $table->decimal('lat', 10, 6)->nullable(); $table->decimal('lng', 10, 6)->nullable(); $table ->geometry('geom', 'point', 4326) ->storedAs(new SetSRID(new MakePoint('lng', 'lat'), 4326)); });
Setting the center for a given multipolygon
use ShabuShabu\PostGIS\Expressions\Centroid; Schema::create('countries', static function (Blueprint $table) { // all the other table columns... $table->geometry('geom', 'multipolygon', 4326); $table ->geometry('center', 'point', 4326) ->storedAs(new Centroid('geom')); });
Setting the area in square kilometers
use ShabuShabu\PostGIS\Expressions\Area; use Tpetry\QueryExpressions\Value\Value; use ShabuShabu\PostGIS\Expressions\Math\Round; use ShabuShabu\PostGIS\Expressions\Casts\AsNumeric; use ShabuShabu\PostGIS\Expressions\Casts\AsGeography; use Tpetry\QueryExpressions\Operator\Arithmetic\Divide; Schema::create('provinces', static function (Blueprint $table) { // all the other table columns... $table->geometry('geom', 'multipolygon', 4326); $table ->integer('area_km2') ->storedAs(new Round( new AsNumeric( new Divide( new Area(new AsGeography('geom')), new Value(1e+6) ) ) )); });
Testing
composer test
Changelog
Please see CHANGELOG for more information on what has changed recently.
Contributing
Please see CONTRIBUTING for details.
Security Vulnerabilities
Please review our security policy on how to report security vulnerabilities.
Credits
Disclaimer
This is a 3rd party package and ShabuShabu is not affiliated with either Laravel or PostGIS.
License
The MIT License (MIT). Please see License File for more information.