gpt4 book ai didi

ios - 如何使用 carto-mobile SDK 验证 map 位置是否在 map 边界内

转载 作者:行者123 更新时间:2023-11-29 11:39:21 24 4
gpt4 key购买 nike

我想要实现的是,当 userMarker 在可见范围内完成一些操作时,这就是我的代码。

let screenWidth: Float = Float((map.frame.size.width))
let screenHeight: Float = Float((map.frame.size.height))
let minScreenPos: NTScreenPos = NTScreenPos(x: 0.0, y: 0.0)
let maxScreenPos: NTScreenPos = NTScreenPos(x: screenWidth, y:screenHeight)

let minPosWGS = projection.fromWgs84(map.screen(toMap: minScreenPos))!
let maxPosWGS = projection.fromWgs84(map.screen(toMap: maxScreenPos))!

let mapBounds = NTMapBounds(min: minPosWGS, max: maxPosWGS)
let markerCenter = projection.fromWgs84(userMarker.getBounds().getCenter())
let markerBounds = userMarker.getBounds()

let containPos = mapBounds!.contains(markerCenter)
let containBounds = mapBounds!.contains(markerBounds)

print(containPos)
print(containBounds)

但总是输出错误,我做错了什么,请帮忙。

最佳答案

好吧,这里有几件事......

首先,您什么时候进行screenToMap 计算?当您的 mapView 尚未完全呈现时(即使您的 mapView 已经有框架),它将返回 0。

所以你绝对不能在我们的 viewDidLoadviewWillAppear 中这样做,但是,目前,在 layoutSubviews 之后也不行。您需要在 map 呈现后计算它,这可以使用 mapRendereronMapRendered 事件来实现。

此处提供示例:https://github.com/CartoDB/mobile-ios-samples/blob/master/AdvancedMap.Objective-C/AdvancedMap/CaptureController.mm

我们创建了一个与此相关的问题:https://github.com/CartoDB/mobile-sdk/issues/162

其次,如果您从 CartoMobileSDK 的方法中请求坐标,坐标已经在我们的内部坐标系统中返回,这意味着您不需要进行任何额外的转换。请求边界和位置的正确方法是:

let minPosWGS = map.screen(toMap: minScreenPos)!
let maxPosWGS = map.screen(toMap: maxScreenPos)!

和:

let markerCenter = userMarker!.getBounds().getCenter()

第三X 在您的屏幕和 map 上从左到右增加,但是,Y 在屏幕上从上到下增加,但在 map 上从下到上增加,因此您必须这样初始化最小值和最大值:

let screenWidth = Float(map.frame.size.width)
let screenHeight = Float(map.frame.size.height)
let minScreenPos = NTScreenPos(x: 0.0, y: screenHeight)
let maxScreenPos = NTScreenPos(x: screenWidth, y: 0)

请注意,此计算还取决于您的 View 方向和 map 旋转。目前我们假设您的旋转度为 0,并且您的 View 处于纵向模式。

最后,iOS 使用缩放坐标,但 Carto 的移动 SDK 需要真实坐标。因此,您需要按比例乘以您的值:

let screenWidth = Float(map.frame.size.width *  UIScreen.main.scale)
let screenHeight = Float(map.frame.size.height * UIScreen.main.scale)

关于ios - 如何使用 carto-mobile SDK 验证 map 位置是否在 map 边界内,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47476145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com