Commit Graph
9 Commits
Author SHA1 Message Date
周瑞哲 377efbffa8 feat(map): 初始视野对到点位聚类中心,并在已授权时开屏静默定位
AI Code Review / review (pull_request) Successful in 7m5s
初始视野
- 新增 computeClusterViewport:把全部点位当一个聚类,中心取算术中心
  (跟点位密度走,不像外接矩形中心那样被个别远点拽偏),scale 由聚类跨度
  反推出「一眼看全」的档位。当前 30 个点位算出 (113.92754, 22.76105)
  scale 12 —— 原来的 scale 11 会把光明区缩成一小块,留一圈空白。
- 视野改成运行时实时算,不再读数据集里手写的 defaultViewport:增删点位之后
  手写值会过期,算出来的不会。手写值降级为点位为空时的兜底。
- 「回到全域」用同一个聚类视野。
- loadDataset 里判断「视野还没被用户动过」原来是硬编码 113.935/22.748/11
  三个字面量,跟 DEFAULT_GUANGMING_VIEWPORT 重复;改成直接跟常量比。

开屏定位
- 新增 restoreLocationOnLaunch:仅当 scope.userLocation 已授权时静默定位并
  居中,蓝点直接出现在用户位置上。未决定/已拒绝一律不碰,避免小程序第一帧
  就弹微信授权框、拒绝后再连弹一个引导框;那两种状态留给定位按钮。
- 静默定位只在用户确实在光明区包络内才居中,否则把地图甩到没有任何点位的
  地方比停在聚类视野更糟。
- 静默失败不弹提示,但仍写入终态,否则 status 卡在 locating、定位按钮
  永远显示「定位中…」。
- 新增 isWithinGuangmingArea,与数据校验共用同一个包络定义。

需要说明:地图漂到几内亚湾不是「开屏没请求定位」造成的,而是没有 fix 时
(0, 0) 被写进 viewport。堵住它的是 isTrustworthyCoordinate(7ef4094),
开屏定位是叠在守卫之上的体验改进,不是替代 —— 用户拒权、模拟器没设位置、
室内超时都还是拿不到 fix。
2026-08-03 12:14:46 +08:00
周瑞哲 7ef4094788 fix(map): 收敛 regionchange 回写回路,修复选中标点后地图抽动
AI Code Review / review (pull_request) Successful in 2m11s
选中标点后地图在左右/上下反复抽动,根因是视口回写形成了自激回路:
map 的 longitude/latitude/scale 绑定到 store,而 regionchange 又无条件把
地图当前中心点写回 store —— 写 store 触发地图移动,移动结束回传一个
「差一点点」的中心点,再写回,再移动。上一个提交把中心点改成从
detail.centerLocation 同步读取后,回路里原本靠 getCenterLocation 异步跳变
掩盖住的这一点噪声就直接闭合了。

两道闸:
- 只接受手势造成的变化。causedBy 为 update(我们自己改绑定值或调
  includePoints 触发)时 store 已是权威值,不回写。老基础库拿不到
  causedBy 时退化到下一道闸。
- 所有回写走 commitViewport,经 isSignificantViewportChange 过滤掉小于
  1e-4 度 / 0.01 级的变化。远小于任何一次真实拖动,足以吸收量化噪声。

顺带修一个 H5 构建回归(1bcdd40 引入):uni 的 H5 路由生成器按路径推导
组件标识,pages/poi/detail 与 pages-poi/detail 都归一成 PagesPoiDetail,
重复声明导致 build:h5 失败。兼容跳板必须留在旧路径上,所以改名分包路由
pages-poi/detail -> pages-poi/poi-detail。
2026-08-03 11:08:39 +08:00
周瑞哲 1bcdd40729 fix(map): 修正定位落到零坐标、旧详情页路由白屏与跳转期间地图可拖动
三个问题,前两个各有独立根因。

1) 首次打开定位到几内亚湾、底图变成 HERE

   regionchange 处理里读的是 `event.detail.longitude`,但微信的 regionchange
   载荷没有这个字段,`Number(undefined)` 恒为 NaN,于是每次都落到异步的
   getCenterLocation。冷启动时地图 SDK 还没拿到有效中心点,它会回传 (0, 0),
   而两个 store 的坐标校验只查 Number.isFinite,(0, 0) 直接通过。

   (0, 0) 落在几内亚湾(Null Island),微信 <map> 一到境外坐标就切 HERE 底图。
   全程不需要用户点过定位按钮。

   数据集校验器本来就在拒绝零坐标,只是运行时 store 没套用同一条规则。现把它
   提成共享守卫 isTrustworthyCoordinate,validateCoordinates 改为复用,并铺到
   map store、location store 和打卡定位服务。regionchange 一侧改为优先读微信
   真正给的 detail.centerLocation,回落路径校验后才写入,且 mapReady 为 false
   时不接受任何回写。

2) 冷启动白屏、左上角只剩回首页的小房子

   f8ad5e1 把详情页从 pages/poi/detail 移进 pages-poi 分包,源码调用点都改了,
   但旧路由本身从 app.json 消失。任何还攥着旧路径的入口 —— 开发者工具模拟器上次
   停留的路由、预览启动页、已发出的分享卡片或二维码 —— 冷启动会落到微信解析不出
   的路由,渲染成白屏;因为不是 tabBar 页且栈深为 1,左上角只剩小房子。

   旧路径补一个只做重定向的跳板页,带 poiId 就 redirectTo 新路径,不带就 reLaunch
   回地图。用 redirectTo 是为了让跳板不留在页面栈里。主包 +1 KB。等所有入口都刷新
   过可以删掉。

3) 跳转详情页时地图仍可拖动几毫秒

   <map> 是渲染在 webview 之上的原生组件,销毁是异步的,页面转场开始了它还在。
   navigating 之前只用于防重复点击,没接到地图上。现在接上 enable-scroll /
   enable-zoom,并给 selectMarker、openCheckInRecords 补同一个守卫(后者原先完全
   没有防护),regionchange 在跳转期间也不再回写 viewport。onShow 里直接复位
   navigating,返回时立刻恢复交互,不等 500ms 兜底定时器。

   原生组件的异步销毁消不掉,但那几毫秒里地图不再响应拖动和缩放。

验证:测试 100 passed(map store 新增零坐标、越界、resetViewport 兜底用例),
type-check 干净。build 主包 1187 KB / 分包 1841 KB,dev 1527 KB / 1847 KB,
均过 verify:mp-weixin。
2026-08-03 10:45:28 +08:00
admin b1e0cae07a Merge pull request 'Update planner, check-in records, location service and tests' (#10) from zhouruizhe into main
Reviewed-on: #10
2026-08-01 22:01:35 +08:00
zuozhou d01525fd51 feat: 30个景点替换为真实照片,添加图片批处理脚本
AI Code Review / review (pull_request) Successful in 2m58s
2026-07-31 18:11:38 +08:00
周瑞哲 c0ed0048aa Update planner, check-in records, location service and tests
AI Code Review / review (pull_request) Successful in 6m54s
2026-07-31 15:12:21 +08:00
周瑞哲 3ef7266591 Add check-in feature and update travel planner UI 2026-07-31 12:50:14 +08:00
周瑞哲 ac4179086c Update AI planner integration, docs, and config
AI Code Review / review (pull_request) Successful in 11m45s
2026-07-30 16:33:39 +08:00
周瑞哲 ebcae02d35 Initial commit: gmTouringMiniApp project 2026-07-30 16:04:34 +08:00