fix: 瓦片类型仅由搜索结果坐标+蓝点推算,去掉其他判断逻辑

This commit is contained in:
xweiba
2026-08-05 23:15:06 +08:00
parent 3260af748b
commit 794cf9d004
3 changed files with 25 additions and 20 deletions
+12 -1
View File
@@ -795,7 +795,18 @@ struct MapHomeView: View {
searchError = error.localizedDescription
return
}
searchResults = (response?.mapItems ?? []).prefix(6).map { item in
let items = (response?.mapItems ?? []).prefix(6)
// 用首个搜索结果坐标推算瓦片类型
if let first = items.first {
let c = first.placemark.coordinate
if let newType = CoordinateConverter.detectTile(
resultCoord: (c.latitude, c.longitude),
userLocation: mapState.realtimeLocation
) {
CoordinateConverter.currentTileType = newType
}
}
searchResults = items.map { item in
let r = SearchLocationResult(
name: item.name ?? "未命名",
subtitle: [item.placemark.locality, item.placemark.subLocality, item.placemark.thoroughfare]
+1 -19
View File
@@ -260,25 +260,7 @@ struct MapViewRepresentable: UIViewRepresentable {
parent.onViewportChanged(distance)
zoomLabel?.text = MapZoomMath.viewportScaleLabel(distanceMeters: distance)
updatePinPosition(on: mapView)
// 推算瓦片类型:比较地图中心与蓝点的偏移
// 蓝点是 WGS-84,地图中心在 GCJ-02 瓦片上会有 ~596m 偏移
let mc = mapView.centerCoordinate
if let bl = mapView.userLocation.location?.coordinate {
let wgs = CoordinateConverter.gcj02ToWgs84(lat: mc.latitude, lon: mc.longitude)
let dGCJ = CoordinateConverter.distance(lat1: wgs.lat, lon1: wgs.lon, lat2: bl.latitude, lon2: bl.longitude)
let dRaw = CoordinateConverter.distance(lat1: mc.latitude, lon1: mc.longitude, lat2: bl.latitude, lon2: bl.longitude)
// GCJ→WGS 后更接近蓝点 = 地图是 GCJ-02;原始更接近 = 地图是 WGS-84
let type: CoordinateConverter.CoordType = dGCJ < dRaw ? .gcj02 : .wgs84
if type != CoordinateConverter.currentTileType {
CoordinateConverter.currentTileType = type
RuntimeLogger.info("APP", "坐标转换", "推算瓦片 → \(type.rawValue)", details: [
"dGCJ": String(format: "%.0fm", dGCJ), "dRaw": String(format: "%.0fm", dRaw)
])
}
} else {
// 无蓝点,用坐标地理边界兜底
CoordinateConverter.updateTileType(lat: mc.latitude, lon: mc.longitude)
}
// 同步蓝点坐标
// 同步蓝点坐标(避免 delegate 更新不及时导致 mapState.realtimeLocation 为 nil)
if let ul = mapView.userLocation.location,
CLLocationCoordinate2DIsValid(ul.coordinate), ul.horizontalAccuracy >= 0 {