Я пытаюсь обработать маркеры на карте как можно более естественным образом, используя пространственные типы данных MySQL.Я не хочу прибегать к дополнительным столбцам для lat
и lng,
, так как со временем я хочу иметь возможность кодировать линии и многоугольники (и другие геометрии).Таблица имеет тип столбца point
:
Schema::create('maps', function (Blueprint $table) {
$table->increments('id');
$table->point('map_center')->nullable();
$table->timestamps();
});
Со стороны Eloquent выглядит немного глупее, чем я себе представлял, учитывая встроенную поддержку создания этих пространственных типов в базе данных.,Если я get()
модель, map_center
отображает необработанную закодированную геометрию.
>>> $map=Map::first()
=> App\Map {#2935
id: 1,
map_center: b"\0\0\0\0\x01\x01\0\0\0ºõš\x1E\x14\x7FRÀb0\x7F…Ì_D@",
created_at: null,
updated_at: null,
}
Я написал метод center()
, который возвращает объект, содержащий символы lat и long:
public function center()
{
if ($this->map_center)
{
$result = DB::select('
select ST_Y(map_center) as lat, ST_X(map_center) as lng
from maps
where id = :id
',
['id' => $this->id]);
$center['lat'] = $result[0]->lat;
$center['lng'] = $result[0]->lng;
return (object) $center;
}
else
{
dd($this);
}
}
Вывод:
>>> $map->center()->lat
=> 40.748429
Это достойный обходной путь, но немного некрасиво.Вместо этого я хочу, чтобы Eloquent извлек это, чтобы модель возвращала читаемую человеком координату, что-то вроде:
>>> $map=Map::first()
=> App\Map {#2935
id: 1,
map_center: {
lat: 40.748429, // or X: and Y:
lng: -73.985603,
}
created_at: null,
updated_at: null,
}
Учитывая, что это тип point
(с двумя компонентами), возможно ли автоматически получитьданные, использующие ST_AsText(p)
или объект, содержащий ST_X(p)
и ST_Y(p)
?
Возможно ли это?