tamakyi
1bb35dbbc9
专题显示区改为一组圆(后端与查询层)
把专题的「一个圆」换成「一组圆」(areas jsonb 数组):落在任一圆内即算在
区域内(SQL 里的 OR)。这一批只动后端与查询层,前台渲染与后台地图编辑器
分别跟进;后台表单暂时沿用原来的三个坐标输入框,保存时合成一个圆写进
areas,所以现有交互不受影响。
- topics.areas JSONB + 存量回填:老的单圆搬进去,之后 areas 是唯一权威。
废弃的 center_lat/center_lon/radius_km 保留(写入时镜像第一个圆),
一是回滚旧二进制时还能退化显示成第一个圆,二是回填的输入。
- Topic.AreaList() 归一:Areas 为空时退回老的三列,未回填的老行与直接构造
Topic 的调用方都继续工作。
- topicAreaCond 改成 N 个圆的 OR;每个圆占 3 个占位符,编号纪律照旧
(写错就是「专题内容全变 0」那种难查的事故)。
- fitParams 改用所有圆的并集外接矩形:多圆之后「圆心+半径」表达不了,
统一走 fitBBox;单圆时外接矩形就是这个圆的外接正方形,与原路径等价。
- 坐标系:编辑器提交的圆心若是 WGS-84 底图上点的,存前换算成 GCJ-02
(地点过滤要拿它跟 places 的 GCJ-02 坐标比距离)。
测试:
- 表单解析(两个入口同一套校验)、wgs84 换算、半径为 0/空 = 不限区域、
坏 JSON/越界必须报错、上限 20 个。
- 占位符纪律:本段引用的 $n 必须恰好是 [prefix+1, len(args)] 连续区间,
最大值必须等于参数个数。
- 多圆并集语义(DB 门控):两圆专题的地点集合必须恰好等于两个单圆专题的
并集 —— 定义性不变量,变异验证过(只认第一个圆 ⇒ 两个用例同时红)。
2026-10-12 16:29:46 +08:00
..
2026-10-10 10:41:27 +08:00
2026-10-10 10:41:27 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 13:05:49 +08:00
2026-09-28 19:31:21 +08:00
2026-09-29 10:46:54 +08:00
2026-09-29 13:25:50 +08:00
2026-09-30 16:18:52 +08:00
2026-09-30 19:15:48 +08:00
2026-09-30 19:15:48 +08:00
2026-09-30 16:18:52 +08:00
2026-09-18 17:06:22 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-10-09 17:01:08 +08:00
2026-10-01 01:15:04 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 15:02:45 +08:00
2026-09-30 19:00:18 +08:00
2026-09-24 20:37:16 +08:00
2026-09-29 16:57:29 +08:00
2026-09-24 20:37:16 +08:00
2026-09-29 11:50:06 +08:00
2026-09-29 13:25:50 +08:00
2026-09-30 17:35:59 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:31:01 +08:00
2026-09-19 16:31:01 +08:00
2026-09-20 10:07:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-18 21:52:29 +08:00
2026-09-19 16:04:00 +08:00
2026-09-18 13:05:49 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-10-10 10:41:27 +08:00
2026-09-19 16:31:01 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-10-09 11:06:41 +08:00
2026-10-09 19:09:42 +08:00
2026-09-30 19:00:18 +08:00
2026-09-30 19:45:51 +08:00
2026-10-09 19:09:42 +08:00
2026-10-09 17:01:08 +08:00
2026-10-12 16:29:46 +08:00
2026-09-24 20:37:16 +08:00
2026-09-30 16:18:52 +08:00
2026-10-01 00:11:04 +08:00
2026-10-01 01:15:04 +08:00
2026-09-20 12:22:11 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-09-18 13:05:49 +08:00
2026-09-30 19:45:51 +08:00
2026-09-18 13:05:49 +08:00
2026-10-09 11:06:41 +08:00
2026-10-08 18:27:59 +08:00
2026-09-18 17:06:22 +08:00
2026-09-30 16:18:52 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-19 16:04:00 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:16 +08:00
2026-10-09 11:06:41 +08:00
2026-09-24 20:37:16 +08:00
2026-10-01 01:47:48 +08:00
2026-09-24 20:37:16 +08:00
2026-09-20 12:22:11 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:57 +08:00
2026-10-09 11:06:41 +08:00
2026-10-09 11:06:41 +08:00
2026-09-24 20:37:57 +08:00
2026-09-24 20:37:16 +08:00
2026-09-18 13:05:49 +08:00
2026-10-12 16:29:46 +08:00
2026-10-12 16:29:46 +08:00
2026-09-30 23:31:17 +08:00
2026-10-09 11:06:41 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-09-24 20:37:16 +08:00
2026-10-12 16:29:46 +08:00
2026-09-24 20:37:16 +08:00
2026-10-01 02:15:49 +08:00
2026-09-18 13:05:49 +08:00
2026-09-24 20:37:57 +08:00