PHPackages                             mohamedhabibwork/laravel-postgis - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Database &amp; ORM](/categories/database)
4. /
5. mohamedhabibwork/laravel-postgis

ActiveLibrary[Database &amp; ORM](/categories/database)

mohamedhabibwork/laravel-postgis
================================

Postgis extensions for laravel. Aims to make it easy to work with geometries from laravel models

00PHP

Since Aug 17Pushed 2y agoCompare

[ Source](https://github.com/mohamedhabibwork/laravel-postgis)[ Packagist](https://packagist.org/packages/mohamedhabibwork/laravel-postgis)[ RSS](/packages/mohamedhabibwork-laravel-postgis/feed)WikiDiscussions master Synced 1mo ago

READMEChangelogDependenciesVersions (1)Used By (0)

Laravel Wrapper for PostgreSQL's Geo-Extension Postgis
======================================================

[](#laravel-wrapper-for-postgresqls-geo-extension-postgis)

[![Build Status](https://github.com/mstaack/laravel-postgis/workflows/Test%20Suite/badge.svg)](https://github.com/mstaack/laravel-postgis/workflows/Test%20Suite/badge.svg)

Features
--------

[](#features)

- Work with geometry classes instead of arrays.

```
$model->myPoint = new Point(1,2);  //lat, long
```

- Adds helpers in migrations.

```
$table->polygon('myColumn');
```

Warning
-------

[](#warning)

This Package has been moved to a new owner and aims for Laravel 6/7/8/9 and PHP 7 support only soon!

Replace all your references to the new namespace:

```
MStaack\LaravelPostgis

```

Thanks to :

-
-
-

Fluent in Laravel Packages and Postgres/Postgis? Consider contributing! We are looking for anyone that wants to help out!

Installation
------------

[](#installation)

- Use 3.\* for Laravel 5

```
composer require "mstaack/laravel-postgis:3.*"
```

- Use 5.\* for Laravel 6/7/8/9

```
composer require mstaack/laravel-postgis
```

For laravel &gt;=5.5 that's all. This package supports Laravel new [Package Discovery](https://laravel.com/docs/5.5/packages#package-discovery).

If you are using Laravel &lt; 5.5, you also need to add the DatabaseServiceProvider to your `config/app.php` file.

```
'MStaack\LaravelPostgis\DatabaseServiceProvider',
```

Usage
-----

[](#usage)

To start, ensure you have PostGIS enabled in your database - you can do this in a Laravel migration or manually via SQL.

### Enable PostGIS via a Laravel migration

[](#enable-postgis-via-a-laravel-migration)

You need to publish the migration to easily enable PostGIS:

```
php artisan vendor:publish --provider="MStaack\LaravelPostgis\DatabaseServiceProvider" --tag="migrations"
```

And then you run the migrations:

```
php artisan migrate
```

These methods are safe to use and will only enable / disable the PostGIS extension if relevant - they won't cause an error if PostGIS is / isn't already enabled.

If you prefer, you can use the `enablePostgis()` method which will throw an error if PostGIS is already enabled, and the `disablePostgis()` method twhich will throw an error if PostGIS isn't enabled.

### Enable PostGIS manually

[](#enable-postgis-manually)

Use an SQL client to connect to your database and run the following command:

```
CREATE EXTENSION postgis;

```

To verify that PostGIS is enabled you can run:

```
SELECT postgis_full_version();

```

### Migrations

[](#migrations)

Now create a model with a migration by running

```
php artisan make:model Location

```

If you don't want a model and just a migration run

```
php artisan make:migration create_locations_table

```

Open the created migrations with your editor.

```
use Illuminate\Database\Migrations\Migration;
use MStaack\LaravelPostgis\Schema\Blueprint;

class CreateLocationsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('locations', function(Blueprint $table)
        {
            $table->increments('id');
            $table->string('name');
            $table->string('address')->unique();
            $table->point('location'); // GEOGRAPHY POINT column with SRID of 4326 (these are the default values).
            $table->point('location2', 'GEOGRAPHY', 4326); // GEOGRAPHY POINT column with SRID of 4326 with optional parameters.
            $table->point('location3', 'GEOMETRY', 27700); // GEOMETRY column with SRID of 27700.
            $table->polygon('polygon'); // GEOGRAPHY POLYGON column with SRID of 4326.
            $table->polygon('polygon2', 'GEOMETRY', 27700); // GEOMETRY POLYGON column with SRID of 27700.
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('locations');
    }

}
```

Available blueprint geometries:

- point
- multipoint
- linestring
- multilinestring
- polygon
- multipolygon
- geometrycollection

other methods:

- enablePostgis
- disablePostgis

### Models

[](#models)

All models which are to be PostGis enabled **must** use the *PostgisTrait*.

You must also define an array called `$postgisFields` which defines what attributes/columns on your model are to be considered geometry objects. By default, all attributes are of type `geography`. If you want to use `geometry` with a custom SRID, you have to define an array called `$postgisTypes`. The keys of this assoc array must match the entries in `$postgisFields` (all missing keys default to `geography`), the values are assoc arrays, too. They must have two keys: `geomtype` which is either `geography` or `geometry` and `srid` which is the desired SRID. **Note**: Custom SRID is only supported for `geometry`, not `geography`.

```
use Illuminate\Database\Eloquent\Model;
use MStaack\LaravelPostgis\Eloquent\PostgisTrait;
use MStaack\LaravelPostgis\Geometries\Point;

class Location extends Model
{
    use PostgisTrait;

    protected $fillable = [
        'name',
        'address'
    ];

    protected $postgisFields = [
        'location',
        'location2',
        'location3',
        'polygon',
        'polygon2'
    ];

    protected $postgisTypes = [
        'location' => [
            'geomtype' => 'geography',
            'srid' => 4326
        ],
        'location2' => [
            'geomtype' => 'geography',
            'srid' => 4326
        ],
        'location3' => [
            'geomtype' => 'geometry',
            'srid' => 27700
        ],
        'polygon' => [
            'geomtype' => 'geography',
            'srid' => 4326
        ],
        'polygon2' => [
            'geomtype' => 'geometry',
            'srid' => 27700
        ]
    ]
}

$linestring = new LineString(
    [
        new Point(0, 0),
        new Point(0, 1),
        new Point(1, 1),
        new Point(1, 0),
        new Point(0, 0)
    ]
);

$location1 = new Location();
$location1->name = 'Googleplex';
$location1->address = '1600 Amphitheatre Pkwy Mountain View, CA 94043';
$location1->location = new Point(37.422009, -122.084047);
$location1->location2 = new Point(37.422009, -122.084047);
$location1->location3 = new Point(37.422009, -122.084047);
$location1->polygon = new Polygon([$linestring]);
$location1->polygon2 = new Polygon([$linestring]);
$location1->save();

$location2 = Location::first();
$location2->location instanceof Point // true
```

Available geometry classes:

- Point
- MultiPoint
- LineString
- MultiLineString
- Polygon
- MultiPolygon
- GeometryCollection

Publishing config
-----------------

[](#publishing-config)

A configuration file exists for overriding default values. To add to your project, run:

```
php artisan vendor:publish --provider="MStaack\LaravelPostgis\DatabaseServiceProvider" --tag="postgis"
```

### Coordinate precision

[](#coordinate-precision)

The precision of stored/displayed coordinated can be customised in the config.

```
# config/postgis.php
return [
    ...
    'precision' => 6,
];
```

See [http://wiki.gis.com/wiki/index.php/Decimal\_degrees#Accuracy](http://wiki.gis.com/wiki/index.php/Decimal_degrees#Accuracy) for more information

###  Health Score

14

—

LowBetter than 2% of packages

Maintenance20

Infrequent updates — may be unmaintained

Popularity0

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity21

Early-stage or recently created project

 Bus Factor3

3 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/465ce474e9c105751d2df13e0aa0f243cdd37909529b7f957cac01251644b1b1?d=identicon)[mohamedhabibwork](/maintainers/mohamedhabibwork)

---

Top Contributors

[![phaza](https://avatars.githubusercontent.com/u/4553?v=4)](https://github.com/phaza "phaza (54 commits)")[![njbarrett](https://avatars.githubusercontent.com/u/241407?v=4)](https://github.com/njbarrett "njbarrett (34 commits)")[![mstaack](https://avatars.githubusercontent.com/u/10169509?v=4)](https://github.com/mstaack "mstaack (22 commits)")[![metalmatze](https://avatars.githubusercontent.com/u/872251?v=4)](https://github.com/metalmatze "metalmatze (21 commits)")[![v1r0x](https://avatars.githubusercontent.com/u/9248714?v=4)](https://github.com/v1r0x "v1r0x (20 commits)")[![nickbarrettjb](https://avatars.githubusercontent.com/u/16773808?v=4)](https://github.com/nickbarrettjb "nickbarrettjb (10 commits)")[![opengisdev](https://avatars.githubusercontent.com/u/57539707?v=4)](https://github.com/opengisdev "opengisdev (5 commits)")[![gbuckingham89](https://avatars.githubusercontent.com/u/1455253?v=4)](https://github.com/gbuckingham89 "gbuckingham89 (4 commits)")[![scottlimmer](https://avatars.githubusercontent.com/u/23328069?v=4)](https://github.com/scottlimmer "scottlimmer (4 commits)")[![mohamedhabibwork](https://avatars.githubusercontent.com/u/64292519?v=4)](https://github.com/mohamedhabibwork "mohamedhabibwork (3 commits)")[![dena-a](https://avatars.githubusercontent.com/u/4950968?v=4)](https://github.com/dena-a "dena-a (3 commits)")[![grimzy](https://avatars.githubusercontent.com/u/1837678?v=4)](https://github.com/grimzy "grimzy (3 commits)")[![mirzap](https://avatars.githubusercontent.com/u/991967?v=4)](https://github.com/mirzap "mirzap (2 commits)")[![ajthinking](https://avatars.githubusercontent.com/u/3457668?v=4)](https://github.com/ajthinking "ajthinking (2 commits)")[![jonnybarnes](https://avatars.githubusercontent.com/u/108303?v=4)](https://github.com/jonnybarnes "jonnybarnes (2 commits)")[![studnitz](https://avatars.githubusercontent.com/u/9549394?v=4)](https://github.com/studnitz "studnitz (2 commits)")[![luizguilhermefr](https://avatars.githubusercontent.com/u/6135939?v=4)](https://github.com/luizguilhermefr "luizguilhermefr (2 commits)")[![vlktomas](https://avatars.githubusercontent.com/u/13019480?v=4)](https://github.com/vlktomas "vlktomas (1 commits)")[![chrudosvorlicek](https://avatars.githubusercontent.com/u/4454957?v=4)](https://github.com/chrudosvorlicek "chrudosvorlicek (1 commits)")[![davidpiesse](https://avatars.githubusercontent.com/u/800650?v=4)](https://github.com/davidpiesse "davidpiesse (1 commits)")

### Embed Badge

![Health badge](/badges/mohamedhabibwork-laravel-postgis/health.svg)

```
[![Health](https://phpackages.com/badges/mohamedhabibwork-laravel-postgis/health.svg)](https://phpackages.com/packages/mohamedhabibwork-laravel-postgis)
```

###  Alternatives

[doctrine/orm

Object-Relational-Mapper for PHP

10.2k285.3M6.2k](/packages/doctrine-orm)[jdorn/sql-formatter

a PHP SQL highlighting library

3.9k115.1M102](/packages/jdorn-sql-formatter)[illuminate/database

The Illuminate Database package.

2.8k52.4M9.4k](/packages/illuminate-database)[mongodb/mongodb

MongoDB driver library

1.6k64.0M546](/packages/mongodb-mongodb)[ramsey/uuid-doctrine

Use ramsey/uuid as a Doctrine field type.

90340.3M211](/packages/ramsey-uuid-doctrine)[reliese/laravel

Reliese Components for Laravel Framework code generation.

1.7k3.4M16](/packages/reliese-laravel)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
