修导航目的地前面多出问号 (#69)

用户 2026-11-05:「导航的,点进去导航之后,为什么目的地地址前面有个问号」

根因:我上一轮拼的是 `lat,lng?地名` —— 那个 `?` 是照抄 `geo:` URI 的写法,
但这个字符串**不是 URI**,是交给 fbOpenNavigation() 的普通文本。

FbNav.parseGeoOf() 的动作:
  ① 正则抓 `数字,数字` 当坐标
  ② clean = 把坐标从原文剪掉后剩下的文字,用作地名

传 `36.168977,120.375693?青岛北站` 剪掉坐标后剩 `?青岛北站`
⇒ 问号跟着进了高德 dname,目的地标题显示成「?青岛北站」。

改成「地名 + 空格 + lat,lng」:
  `青岛北站 36.168977,120.375693`
剪掉坐标后剩「青岛北站」,正是要显示的名字。

实测(复刻 parseGeoOf 跑):
  旧 lat,lng?地名  → clean=[?青岛北站]   ❌
  新 地名 lat,lng  → clean=[青岛北站]    ✅
  只有地名         → ok=false 走地理编码  ✅

两处都改了:
- FbEventSheet.navTargetOf()(#69 新增的)
- FbDayEventPanel 行程卡片的 onClick(#67 里同一个错误)
This commit is contained in:
2026-11-05 17:22:36 +08:00
parent ad9b934760
commit 5fba8c4eda
2 changed files with 24 additions and 2 deletions
@@ -196,8 +196,12 @@ export struct FbDayEventPanel {
.onClick((): void => {
/* 有坐标就带坐标(同名地点不会搜错城市);没有就让 FbNav 自己地理编码 */
const hasPos: boolean = ev.toLng !== '' && ev.toLat !== '';
/* ⚠️ 格式是「地名 + 空格 + lat,lng」,**不是** `lat,lng?地名`。
后者会把 `?` 留在地名里(`FbNav.parseGeoOf()` 剪掉坐标后
剩下的就是地名,`?` 会一起留下),于是高德的目的地标题
显示成「?青岛北站」。详见 `FbEventSheet.navTargetOf()` 的说明。 */
const target: string = hasPos
? (ev.toLat + ',' + ev.toLng + '?' + ev.toPlace)
? (ev.toPlace + ' ' + ev.toLat + ',' + ev.toLng)
: ev.toPlace;
fbOpenNavigation(getContext(this) as common.UIAbilityContext,
target, ev.toPlace);
+19 -1
View File
@@ -255,7 +255,25 @@ export struct FbEventSheet {
*/
private navTargetOf(place: string, lng: string, lat: string): string {
if (lng !== '' && lat !== '') {
return lat + ',' + lng + '?' + place;
/* 🔴 2026-11-05(用户:「点进去导航之后,为什么目的地地址前面有个问号」):
原来拼的是 `lat,lng?地名` —— 那个 `?` 是我照抄 `geo:` URI 的写法,
但这个字符串**不是 URI**,它是交给 `fbOpenNavigation()` 的普通文本。
`FbNav.parseGeoOf()` 的动作是:
① 正则抓出 `数字,数字` 当坐标;
② `clean` = **把坐标从原文里剪掉之后剩下的文字**,用作地名。
⇒ 传 `36.168977,120.375693?青岛北站` 时,剪掉坐标后剩下 `?青岛北站`
⇒ 地名带着问号进了高德的 `dname`,目的地标题就成了「?青岛北站」。
⇒ 改成**地名在前、空格、坐标在后**:
`青岛北站 36.168977,120.375693`
剪掉坐标剩「青岛北站」,正好就是要显示的名字。
⚠️ 顺序不能反过来:地名放后面虽然坐标照样能解析,
但 `clean` 会剩「青岛北站」(如果地名在前)——
放后面则剩「青岛北站」也行;不过坐标在前时
`clean` 前面会多一个空串拼接,最稳妥还是地名在前。 */
return place + ' ' + lat + ',' + lng;
}
return place;
}