提问人:abu abu 提问时间:11/1/2023 更新时间:11/1/2023 访问量:43
如何在MySql数据库中存储Google Map Circle数据
How to store Google Map Circle data in MySql Database
问:
我正在尝试将 Google Map Circle 数据存储在 MySql 数据库中。我选择数据类型来存储中心坐标和存储中心的半径。现在,我正在使用以下代码从这些列中获取数据。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 数据?
答:
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_coordinates 和 radius 列,并且为 $point 变量传递了有效的 Point 对象,则应该能够使用 ST_Distance而不会遇到“无效的 GIS 数据”错误。如果问题仍然存在,您可能需要检查数据库中的实际数据,以确保空间数据中没有异常或不一致。
评论