0

MySQL 空間データ型を使用して、マップ マーカーの位置をできるだけネイティブに処理しようとしています。追加の列に頼りたくないのでlatlng,最終的には、線とポリゴン (およびその他のジオメトリ) もエンコードできるようにしたいと考えています。テーブルには次の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()緯度と経度を含むオブジェクトを返すメソッドを作成しました。

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,
   }

それがタイプ(2つのコンポーネントを持つ)であることを考えると、またはを含むオブジェクトを使用pointしてデータを自動的に取得することは可能ですか?ST_AsText(p)ST_X(p)ST_Y(p)

これは可能ですか?

4

1 に答える 1