mirror of
https://github.com/xweiba/location-spoofer.git
synced 2026-09-21 22:30:46 +08:00
fix: 瓦片类型仅由搜索结果坐标+蓝点推算,去掉其他判断逻辑
This commit is contained in:
+12
-1
@@ -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]
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import Foundation
|
||||
import CoreLocation
|
||||
|
||||
/// GCJ-02 (火星坐标) ↔ WGS-84 坐标转换。
|
||||
///
|
||||
@@ -95,6 +96,17 @@ enum CoordinateConverter {
|
||||
return .wgs84
|
||||
}
|
||||
|
||||
/// 通过搜索结果坐标 + 蓝点推算瓦片类型(搜索结果在当期瓦片坐标系,蓝点是 WGS-84)
|
||||
static func detectTile(resultCoord: (lat: Double, lon: Double), userLocation: CLLocation?) -> CoordType? {
|
||||
guard let bl = userLocation,
|
||||
CLLocationCoordinate2DIsValid(bl.coordinate),
|
||||
bl.horizontalAccuracy >= 0 else { return nil }
|
||||
let wgs = gcj02ToWgs84(lat: resultCoord.lat, lon: resultCoord.lon)
|
||||
let dGCJ = distance(lat1: wgs.lat, lon1: wgs.lon, lat2: bl.coordinate.latitude, lon2: bl.coordinate.longitude)
|
||||
let dRaw = distance(lat1: resultCoord.lat, lon1: resultCoord.lon, lat2: bl.coordinate.latitude, lon2: bl.coordinate.longitude)
|
||||
return dGCJ < dRaw ? .gcj02 : .wgs84
|
||||
}
|
||||
|
||||
// MARK: - 核心转换
|
||||
|
||||
/// GCJ-02 → WGS-84(迭代法,精度优于 0.5 米)
|
||||
|
||||
Reference in New Issue
Block a user