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

isr3a4wc  于 2023-11-16  发布在  Mysql
关注(0)|答案(2)|浏览(112)

我试图在MySQL数据库中存储Google Map Circle数据。我选择text数据类型存储中心坐标,int存储中心半径。现在我使用下面的代码从这些列中获取数据。

$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数据?

polhcujo

polhcujo1#

从显示的错误中可以很清楚地看到,要存储和检索此类数据,您应该使用MySQL的空间数据类型和函数。
“(只是为了修改)想象一下,你有一张Map,上面有一些圆圈,就像谷歌Map上的圆圈一样,每个圆圈都有一个中心(中点)和一个半径(它有多大)。

  • 当你想把这些信息保存到电脑里时,你不能仅仅用普通的数字,你需要一种特殊的方式,比如用一种特殊的代码来表示这些圆圈,在电脑语言里,这被称为“空间数据”。
  • 在这个表中,你告诉计算机一列是圆心,另一列是半径。
    有一个使用空间数据类型的表
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);

fwzugrvs

fwzugrvs2#

如果您使用此包,请确保将cycle_coordinates表中的circle_coordinates列定义为Model中的空间数据类型
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数据”错误。如果问题仍然存在,您可能需要检查数据库中的实际数据,以确保空间数据中没有异常或不一致。

相关问题