Как проверить, что Положение Карты находится внутри Границ Карты, используя carto-mobile SDK
Я пытаюсь добиться этого, когда 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)
Но всегда вывод ложный, что я делаю не так, любую помощь, пожалуйста.
2 ответа
Привет @Nikitah я в конечном итоге с этим решением
я реализую событие onMapMoved из MapEventsListener и там я прошу об этом
if latestLocation != nil {
delegate?.hideLocationButton()
}
Так что в mi метод hideLocationButton я делаю это
let screenWidth: Float = Float(map.frame.width) * 2
let screenHeight: Float = Float(map.frame.height) * 2
let minScreenPos: NTScreenPos = NTScreenPos(x: 0, y: 0)
let maxScreenPos: NTScreenPos = NTScreenPos(x: screenWidth, y: screenHeight)
let screenBounds = NTScreenBounds(min: minScreenPos, max: maxScreenPos)
let contain = screenBounds?.contains(map.map(toScreen: marker.getBounds().getCenter()))
Я понимаю, что лучше спросить позицию, а затем преобразовать этот NTMapPos в NTScreenPos и спросить, находился ли этот экран pos внутри фактических границ экрана.
В последнем предложении вы сказали, что мне нужно умножить на масштаб, так что я полагаю, что, где я умножу screenWidht и screenHeight на два, это будет масштаб экрана?, я сделал это, потому что ширина и высота карты в выходных сигналах консоли составляла половину экран iphone, так что я импровизирую:), будет лучше использовать UIScreen.main.scale
О третьем предложении я попробую и отправлю обратно.
Хорошо, здесь есть несколько вещей....
Во-первых, когда ты делаешь screenToMap
расчет? Он вернет 0, когда ваш mapView
еще не полностью отрисован (даже если у вашего mapView уже есть рамка).
Так что вы определенно не можете сделать это в нашем viewDidLoad
или же viewWillAppear
, но, в настоящее время, также не после layoutSubviews
, Вы должны рассчитать его после рендеринга вашей карты, это можно сделать с помощью mapRenderer
"s onMapRendered
событие.
Пример доступен здесь: 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
увеличивается слева направо на вашем экране, а также на вашей карте, однако, Y
увеличивается сверху вниз на экране, но снизу вверх на карте, поэтому вам придется инициализировать мин и макс как таковые:
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)
Обратите внимание, что этот расчет также зависит от ориентации вашего вида и поворота карты. В настоящее время мы предполагаем, что ваше вращение равно 0, а ваш вид в портретном режиме.
И, наконец, iOS использует масштабированные координаты, но Mobile SDK от Carto ожидает истинные координаты. Так что вам нужно умножить ваши значения по шкале:
let screenWidth = Float(map.frame.size.width * UIScreen.main.scale)
let screenHeight = Float(map.frame.size.height * UIScreen.main.scale)