Spatial Map Fields for Laravel Nova
Map Field for Laravel Nova
Using this package, you can use spatial fields in Laravel Nova.
Requirements:
- PHP 8.0.2 or higher
- Laravel 8 or higher
Installation
-
Install the package via composer:
composer require mostafaznv/nova-map-field
-
Publish config and assets:
php artisan vendor:publish --provider="Mostafaznv\NovaMapField\NovaMapFieldServiceProvider"
-
Done
Usage
-
Create table with spatial fields
<?php return new class extends Migration { public function up() { Schema::create('locations', function (Blueprint $table) { $table->id(); $table->string('title', 150); $table->point('location')->nullable(); $table->polygon('area')->nullable(); $table->timestamps(); }); } };
-
Add
HasSpatialColumns
trait to model<?php namespace App\Models; use Mostafaznv\NovaMapField\Traits\HasSpatialColumns; class Location extends Model { use HasSpatialColumns; }
-
Define spatial columns of model
<?php namespace App\Models; use MatanYadaev\EloquentSpatial\Objects\Point; use MatanYadaev\EloquentSpatial\Objects\Polygon; class Location extends Model { use HasSpatialColumns; protected $casts = [ 'location' => Point::class, 'area' => Polygon::class ]; }
-
Add map fields to resource
<?php namespace App\Nova\Resources; use Mostafaznv\NovaMapField\Fields\MapPointField; use Mostafaznv\NovaMapField\Fields\MapPolygonField; class Location extends Resource { public function fields(Request $request): array { return [ MapPointField::make('location'), MapPolygonField::make('area') ]; } }
-
Done
Map Field Methods
method | Arguments | description |
---|---|---|
defaultLatitude | latitude float |
Specifies latitude of map on page load |
defaultLongitude | longitude float |
Specifies longitude of map on page load |
zoom | zoom integer |
Specifies default map zoom |
withoutZoomControl | status bool default: true |
Specifies whether zoom in/out button should display on map or not |
withoutZoomSlider | status bool default: true |
Specifies whether zoom slider should display on map or not |
withFullScreenControl | status bool default: true |
Specifies whether full screen button should display on map or not |
mapHeight | height integer default: 400 |
Map’s height |
markerIcon | icon integer available: 1, 2, 3 |
Marker icon |
required | Makes field required | |
requiredOnCreate | status bool default: true |
Makes field required on creation |
requiredOnUpdate | status bool default: true |
Makes field required on update |
Config Properties
Method | Type | Default | Description |
---|---|---|---|
default-latitude | bool | 0 | Default latitude of map |
default-longitude | bool | 0 | Default longitude of map |
zoom | int | 12 | Default zoom of map |
controls.zoom-control | bool | true | Specifies if map should display zoom controls (zoom in/out buttons) or not |
controls.zoom-slider | bool | true | Specifies if map should display zoom slider or not |
controls.full-screen-control | bool | false | Specifies if map should display full screen button or not |
map-height | int | 400 | Specifies map height |
icon | int | 1 | Specifies marker icon. available values: 1, 2, 3 |
Using Spatial Columns over Application
This package uses Laravel Eloquent Spatial under the hood. to use columns and querying them over the application, please read Laravel Eloquent Spatial documentation
Complete Example
<?php
namespace App\Nova\Resources;
use App\Nova\Resource;
use Illuminate\Http\Request;
use Laravel\Nova\Fields\ID;
use Laravel\Nova\Fields\Text;
use App\Models\Location as Model;
use Mostafaznv\NovaMapField\Fields\MapPointField;
use Mostafaznv\NovaMapField\Fields\MapPolygonField;
class Location extends Resource
{
public static string $model = Model::class;
public function fields(Request $request): array
{
return [
ID::make()->sortable(),
Text::make('Title')
->sortable()
->rules('required', 'max:255'),
MapPointField::make(trans('Location'), 'location')
->defaultLatitude(35.6978527)
->defaultLongitude(51.4037269)
->zoom(14)
->withoutZoomControl()
->withoutZoomSlider()
->withFullScreenControl()
->mapHeight(360)
->markerIcon(3)
->required()
->requiredOnCreate()
->requiredOnUpdate()
->stacked(),
];
}
}
License
This software is released under The MIT License (MIT).