You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Google Maps iOS SDK/Capacitor插件标记异常与渲染性能问题

iOS端Capacitor Google Maps标记渲染异常与性能问题

近期将应用迁移至Capacitor框架,使用@capacitor/google-maps插件对接Google Maps SDK时,仅iOS端出现标记异常问题(Android端运行正常):标记加载时偶现错误图标,在每秒更新位置的调试过程中,标记会随机切换图标、出现渲染伪影。

异常表现

  • 每次更新时标记随机切换图标
  • 地图上出现部分渲染的标记伪影
  • 标记数量较多(不足100个)时触发该问题,移除至20个以内则恢复正常,重新添加后问题重现

相关Swift代码(含自定义逻辑)

// 更新标记位置的方法
func updateMarkerPosition(id: String, position: LatLng) throws {
    if let marker = self.markers[id] {
        DispatchQueue.main.sync {
            marker.position = CLLocationCoordinate2D(latitude: position.lat, longitude: position.lng)
        }
    } else {
        throw GoogleMapErrors.markerNotFound
    }
}
private func decodeBase64ToUIImage(base64String: String) -> UIImage? {
    guard let data = Data(base64Encoded: base64String, options: .ignoreUnknownCharacters) else {
        return nil
    }
    return UIImage(data: data)
}

// 将Base64图片设置为标记图标的方法
private func buildMarker(marker: Marker) -> GMSMarker {
    let newMarker = GMSMarker()
    newMarker.position = CLLocationCoordinate2D(latitude: marker.coordinate.lat, longitude: marker.coordinate.lng)
    newMarker.title = marker.title
    newMarker.snippet = marker.snippet
    newMarker.isFlat = marker.isFlat ?? false
    newMarker.opacity = marker.opacity ?? 1
    newMarker.isDraggable = marker.draggable ?? false
    newMarker.zIndex = marker.zIndex
    if let iconAnchor = marker.iconAnchor {
        newMarker.groundAnchor = iconAnchor
    }

    if let iconUrl = marker.iconUrl {
        if iconUrl.starts(with: "data:image") {
            let base64String = iconUrl.components(separatedBy: ",").last ?? ""
            if let base64Image = decodeBase64ToUIImage(base64String: base64String) {
                print("Adding new icon for marker: \(marker.uniqueID)")
                newMarker.icon = getResizedIcon(base64Image, marker)
            }
        }
    }
}
// 在地图上添加标记的方法
func addMarker(marker: Marker) throws -> String {
    var markerHash = "nil"
        DispatchQueue.main.sync {
            let newMarker = self.buildMarker(marker: marker)
            newMarker.map = self.mapViewController.GMapView
            self.markers[marker.uniqueID] = newMarker
            markerHash = marker.uniqueID
        }
    return markerHash
}

修复更新与新问题

采用以下方式设置图标后,原标记异常问题已修复:

let markerView = UIImageView(image: newMarker.icon)
newMarker.iconView = markerView
newMarker.tracksViewChanges = true // 此代码解决了原问题

但现在出现新问题:当标记数量较多时(仍不足100个),地图渲染性能显著下降。

内容的提问来源于stack exchange,提问作者Alex Predescu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 06:12:28