jeorgy / laravel-postgis
v1.12.0
2021-05-22 16:08 UTC
Requires
- php: >=7.1.3
- laravel/framework: ^6.0 || ^7.0|| ^8.0
- mstaack/laravel-postgis: ^5.2
README
Biblioteca para consultas geoespaciais em Eloquent com PostgreSQL/PostGIS: cálculo de distâncias e filtros por polígonos GeoJSON, com API moderna e tipada.
Requisitos
- PHP >= 8.1
- Laravel ^9.0 || ^10.0 || ^11.0
- PostgreSQL com extensão PostGIS habilitada (
CREATE EXTENSION postgis;)
Instalação
composer require jeorgy/laravel-postgis
Compatibilização em um projeto Laravel
- Habilite PostGIS na base de dados utilizada pela aplicação.
- Adicione a trait ao seu modelo que possui a coluna geoespacial.
- Garanta o tipo da coluna como
geography(Point, 4326)ou equivalente na migration. - Opcional: configure o nome da coluna e a unidade de distância no modelo.
Exemplo de modelo
use Illuminate\Database\Eloquent\Model; use Jeorgy\LaravelPostgis\Geometries\Point; use Jeorgy\LaravelPostgis\Postgis; class Place extends Model { use Postgis; // Opcional: coluna personalizada e unidade protected $location = 'geo'; // default: location protected $unit = 'km'; // opções: meter (default), km, mile }
Escopos disponíveis
- withDistance(Point|array|string $location): adiciona coluna
distanceà seleção usandoST_DistanceSphere(bindings seguros). Arrays/strings aceitam[lat, lng]ou"lat,lng". - whereDistance(Point|array $location, string $operator, float|int $units): filtro por distância com operador (
<,<=,>,>=,=) e valor em unidades do modelo. - orWhereDistance(Point|array $location, string $operator, float|int $units): versão OR do filtro de distância.
- whereCovers(Polygon|object $geoJson) / orWhereCovers(...): filtra registros cobertos por polígono GeoJSON (ou
Polygoninterno), gerandoSRID=4326;POLYGON(...)com anel fechado.
Geometrias internas
- Point:
new Point($lat, $lng) - Polygon:
new Polygon([ [[$lng, $lat], ...] ])ouPolygon::fromGeoJson($geoJsonObject)
Exemplos de uso
$origin = new Point(10, 20); $places = Place::query() ->withDistance($origin) ->whereDistance($origin, '<', 5000) ->get(); $geoJson = json_decode('{"geometry":{"coordinates":[[[30,10],[10,20],[20,40],[40,40],[30,10]]]}}'); $inside = Place::query() ->whereCovers($geoJson) ->get();
Testes
vendor/bin/phpunit