LeafletJS Map Picker
Interactive Leaflet map for selecting and storing geographical coordinates.
Author:
Azad Furkan ŞAKAR
Documentation
- Features
- Installation
- Usage
- Screenshots
- Testing
- Changelog
- Contributing
- Security Vulnerabilities
- Credits
- License
A Filament Forms component that provides an interactive Leaflet map for selecting and storing geographical coordinates.

#Features
- Interactive map for location selection
- Customizable map height
- Default location configuration
- Adjustable zoom level
- Draggable and clickable markers
- "My Location" button for quick navigation to user's current position
- Support for different tile providers (OpenStreetMap by default)
- Custom tile layer support
- Custom marker configuration

#Installation
You can install the package via composer:
composer require afsakar/filament-leaflet-map-picker
php artisan vendor:publish --tag="filament-leaflet-map-picker-assets"
#Database Migration
Create a column in your table to store the location data. You can use a text or json column type:
Schema::create('properties', function (Blueprint $table) {
$table->id();
// Other columns
$table->text('location')->nullable(); // Stores coordinates as JSON string
// OR
$table->json('location')->nullable(); // Alternative approach
$table->timestamps();
});
#Preparing the models
To use the LeafletMapPicker component, you need to prepare your database and model to store geographical coordinates. The component stores location data as a JSON string in the format [lat, lng].
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
class Property extends Model
{
protected $fillable = [
// Other fillable fields
'location',
];
protected $casts = [
'location' => 'array',
];
}
You can publish the lang files with:
php artisan vendor:publish --tag="filament-leaflet-map-picker-translations"
Optionally, you can publish the views using
php artisan vendor:publish --tag="filament-leaflet-map-picker-views"
#Usage
#Form
use Afsakar\LeafletMapPicker\LeafletMapPicker;
// Basic usage
LeafletMapPicker::make('location')
->label('Select Location')
// Advanced usage with customization
LeafletMapPicker::make('location')
->label('Property Location')
->height('500px')
->defaultLocation([41.0082, 28.9784]) // Istanbul coordinates
->defaultZoom(15)
->draggable() // default true
->clickable() // default true
->myLocationButtonLabel('Go to My Location')
->hideTileControl()
->readOnly() // default false, when you set this to true, the marker will not be draggable or clickable and current location and search location buttons will be hidden
->tileProvider('openstreetmap') // default options: openstreetmap, google, googleSatellite, googleTerrain, googleHybrid, esri
->customTiles([
'mapbox' => [
'url' => 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
'options' => [
'attribution' => '© <a href="https://www.mapbox.com/">Mapbox</a>',
'id' => 'mapbox/streets-v11',
'maxZoom' => 19,
'accessToken' => 'YOUR_MAPBOX_TOKEN',
]
]
])
->customMarker([
'iconUrl' => asset('pin-2.png'),
'iconSize' => [38, 38],
'iconAnchor' => [19, 38],
'popupAnchor' => [0, -38]
])
#Infolist
use Afsakar\LeafletMapPicker\LeafletMapPickerEntry;
// Basic usage
LeafletMapPickerEntry::make('location')
->label('Location')
// Advanced usage with customization
LeafletMapPickerEntry::make('location')
->label('Property Location')
->height('500px')
->defaultLocation([41.0082, 28.9784])
->tileProvider('openstreetmap') // default options: openstreetmap, google, googleSatellite, googleTerrain, googleHybrid, esri
->hideTileControl()
->customTiles([
'mapbox' => [
'url' => 'https://api.mapbox.com/styles/v1/{id}/tiles/{z}/{x}/{y}?access_token={accessToken}',
'options' => [
'attribution' => '© <a href="https://www.mapbox.com/">Mapbox</a>',
'id' => 'mapbox/streets-v11',
'maxZoom' => 19,
'accessToken' => 'YOUR_MAPBOX_TOKEN',
]
]
])
->customMarker([
'iconUrl' => asset('pin-2.png'),
'iconSize' => [38, 38],
'iconAnchor' => [19, 38],
'popupAnchor' => [0, -38]
])
#Screenshots
Default:

Custom Marker:

Custom Tile:

#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
#License
The MIT License (MIT). Please see License File for more information.
The author
I'm a former Civil Engineer turned Backend Developer, specializing in Laravel. I develop and maintain scalable web applications at Penta Yazılım, delivering efficient backend solutions.
From the same author
Form Builder
A powerful, flexible form builder package for FilamentPHP that enables you to create, manage, and process dynamic forms with advanced features including custom field types, email templates, bulk sending capabilities, and comprehensive submission tracking.
Author:
Azad Furkan ŞAKAR
OTP Login
OTP Login for FilamentPHP.
Author:
Azad Furkan ŞAKAR
Translatable Pro
Streamlines multi-language management in FilamentPHP projects, enabling developers to build immersive, multilingual applications with ease.
Author:
Azad Furkan ŞAKAR
Translate Action
Translate action for FilamentPHP.
Author:
Azad Furkan ŞAKAR
Featured Plugins
A selection of plugins curated by the Filament team
Custom Dashboards
Let your users build and share their own dashboards with a drag-and-drop interface. Define your data sources in PHP and let them do the rest.
Filament
Advanced Tables (formerly Filter Sets)
Supercharge your tables with powerful features like user-customizable views, quick filters, multi-column sorting, advanced table searching, convenient view management, and more. Compatible with Resource Panel Tables, Relation Managers, Table Widgets, and Table Builder!
Kenneth Sese
Data Lens
Advanced Data Visualization for Laravel Filament - a premium reporting solution enabling custom column creation, sophisticated filtering, and enterprise-grade data insights within admin panels.
Padmission