如何在MySql数据库中存储Google Map Circle数据

How to store Google Map Circle data in MySql Database

提问人:abu abu 提问时间:11/1/2023 更新时间:11/1/2023 访问量:43

问:

我正在尝试将 Google Map Circle 数据存储在 MySql 数据库中。我选择数据类型来存储中心坐标和存储中心的半径。现在,我正在使用以下代码从这些列中获取数据。textint

$zone = RestaurantZones::whereRaw( "ST_Distance(circle_coordinates, ?) <= radius", [$point] )->pluck( 'id' );

我收到以下错误。

Illuminate\Database\QueryException: SQLSTATE[22023]: Invalid parameter value: 3037 Invalid GIS data provided to function st_distance. 

如何在 MySql 数据库中存储 Google Map Circle 数据?

MySQL Laravel 几何 坐标 中心

评论


答:

2赞 JoyNa 11/1/2023 #1

从显示的错误中可以清楚地看出,要存储和检索此类数据,您应该使用MySQL的空间数据类型和函数。

“(只是为了修改)想象一下,你有一张地图上有圆圈,就像谷歌地图的圆圈一样。每个圆都有一个中心(中点)和一个半径(它有多大)。

  • 当您想将此信息保存在计算机中时,您不能只使用常规数字。你需要一种特殊的方式,比如为这些圆圈使用特殊的代码。在计算机语言中,这被称为“空间数据”。
  • 在此表中,您告诉计算机一列用于圆心,另一列用于半径。

具有使用空间数据类型的表

CREATE TABLE restaurant_zones (
    id INT AUTO_INCREMENT PRIMARY KEY,
    circle_coordinates POINT, -- for storing the center coordinates
    radius INT,
    SPATIAL INDEX(circle_coordinates) -- create a spatial index for better performance
);
  • 使用 MySQL 的函数从中心坐标创建一个点。ST_GeomFromText
INSERT INTO restaurant_zones (circle_coordinates, radius) VALUES (ST_GeomFromText('POINT(11.1111.111)', 1000);
1赞 Md Mainul Islam 11/1/2023 #2

确保将 RestaurantZones 表中的circle_coordinates列定义为模型中的空间数据类型。 如果您正在使用此软件包

grimzy/laravel-mysql-spatial

那么模型应该看起来像这样。

use Grimzy\LaravelMysqlSpatial\Eloquent\SpatialTrait;

    class RestaurantZones extends Model
    {
        use SpatialTrait;
    
        protected $fillable = ['name', 'coordinates', 'radius'];
    
        protected $spatialFields = [
            'coordinates',
        ];
    }

在迁移字段中,类型应在点中

$table->point('circle_coordinates');

use Grimzy\LaravelMysqlSpatial\Types\Point;

$point = new Point($latitude, $longitude);

如果已确保正确定义了 circle_coordinatesradius 列,并且为 $point 变量传递了有效的 Point 对象,则应该能够使用 ST_Distance而不会遇到“无效的 GIS 数据”错误。如果问题仍然存在,您可能需要检查数据库中的实际数据,以确保空间数据中没有异常或不一致。