CodeIgniter 4/PHP中处理MySQL Point类型坐标的问题咨询
问题解答
1. 在PHP中处理POINT类型的coord字段获取经纬度
MySQL的POINT类型返回的是二进制格式数据,直接输出会显示无意义内容,你可以用PHP的unpack函数解析这个二进制数据来提取经纬度:
代码示例(CodeIgniter 4 中使用)
假设你通过模型查询得到了结果集,遍历结果时解析coord:
$places = model('PlaceModel')->findAll(); foreach ($places as $place) { // 跳过POINT二进制数据的前4字节(SRID标识,无SRID时为0) $binaryData = substr($place->coord, 4); // 解包出X、Y两个双精度浮点数 $coords = unpack('dX/dY', $binaryData); // 对应你用的ST_X(coord)和ST_Y(coord) $place->lat = $coords['X']; $place->lon = $coords['Y']; }
如果你的POINT字段设置了SRID(比如用ST_SetSRID存储),前4字节就是SRID值,跳过这部分后就能正确解析出坐标值。
2. 让MySQL的SELECT *自动返回lat、lon列
可以给places表添加生成列(Generated Columns),自动基于coord计算经纬度,这样SELECT *时会自动包含这两个列:
执行SQL修改表结构
ALTER TABLE places -- 添加存储型生成列(数据存在磁盘,查询快,更新coord时自动更新) ADD COLUMN lat DOUBLE AS (ST_X(coord)) STORED, ADD COLUMN lon DOUBLE AS (ST_Y(coord)) STORED;
如果不想占用磁盘空间,也可以用VIRTUAL类型(查询时实时计算):
ALTER TABLE places ADD COLUMN lat DOUBLE AS (ST_X(coord)) VIRTUAL, ADD COLUMN lon DOUBLE AS (ST_Y(coord)) VIRTUAL;
注意:生成列需要MySQL 5.7及以上版本支持。修改后,直接执行SELECT * FROM places就能拿到包含lat、lon的完整结果。
内容的提问来源于stack exchange,提问作者user1314836
相关产品推荐
相关产品推荐

