humaidem/filament-map-picker

v0.1.5 2023-11-20 19:40 UTC

This package is auto-updated.

Last update: 2024-09-20 21:32:26 UTC


README

一个Filament字段,用于在地图上选择位置并返回地理坐标。

状态说明

此包仍在beta测试阶段,尚未完全测试。请自行承担风险使用。

支持的地图

  1. Open Street Map (OSM)

一旦证明需要,更多地图将添加到包中。

安装

您可以通过composer安装此包。

composer require humaidem/filament-map-picker

基本用法

资源文件

<?php
namespace App\Filament\Resources;
use Filament\Resources\Resource;
use Filament\Resources\Forms\Form;
use Humaidem\FilamentMapPicker\Fields\OSMMap;
...
class FilamentResource extends Resource
{
    ...
    public static function form(Form $form)
    {
        return $form->schema([
            OSMMap::make('location')
                ->label('Location')
                ->showMarker()
                ->draggable()
                ->extraControl([
                    'zoomDelta'           => 1,
                    'zoomSnap'            => 0.25,
                    'wheelPxPerZoomLevel' => 60
                ])
                // tiles url (refer to https://www.spatialbias.com/2018/02/qgis-3.0-xyz-tile-layers/)
                ->tilesUrl('https://server.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer/tile/{z}/{y}/{x}')
           ]);
    }
    ...
}

操作数据

我们将使用grimzy/laravel-mysql-spatial:^4.0作为示例,您可以使用任何其他包。

在状态加载后

一旦从数据库中加载数据,您需要将其转换为正确的格式,因为Livewire不接受基于类的格式。

...
OSMMap::make('location')
    ->afterStateHydrated(function ($state, callable $set) {
            if ($state instanceof Point) {
                /** @var Point $state */
                $set('location', ['lat' => $state->getLat(), 'lng' => $state->getLng()]);
            }
        });
...

修改脱水状态

在存储数据之前,将数组转换为Point类。

...
OSMMap::make('location')
   ->mutateDehydratedStateUsing(function ($state) {
                if (!($state instanceof Point))
                    return new Point($state['lat'], $state['lng']);

                return $state;
            });
...

在状态更新后

确保在每次更新后都将数据转换为数组。

...
OSMMap::make('location')
    ->afterStateUpdated(function ($state, callable $set) use ($name) {
            if ($state instanceof Point) {
                /** @var Point $state */
                $set($name, ['lat' => $state->getLat(), 'lng' => $state->getLng()]);
            }
        });
...

选项

许可证

MIT © Humaid Al Mansoori

感谢使用

希望这个包对您有用。