mapkit-ios-demo
mapkit-ios-demo copied to clipboard
Проекция координат на экране
Пытаюсь вручную вычислить позицию камеры и зума при котором будет видна некоторая прямоугольная область, зная, что в SDK есть метод map.camera(for: bounds)
:
// на вход передаем visibleCoordinateBounds: YMKBoundingBox
let visibleBoundsInPoints = (
northEast: mapView.mapWindow.worldToScreen(withWorldPoint: visibleCoordinateBounds.northEast)!,
southWest: mapView.mapWindow.worldToScreen(withWorldPoint: visibleCoordinateBounds.southWest)!
)
let visibleBoundsRect = CGRect(
origin: CGPoint(
x: visibleBoundsInPoints.southWest.x,
y: visibleBoundsInPoints.northEast.y
),
size: CGSize(
width: abs(visibleBoundsInPoints.northEast.x - visibleBoundsInPoints.southWest.x),
height: abs(visibleBoundsInPoints.southWest.y - visibleBoundsInPoints.northEast.y)
)
)
let scale = paw(2, map.cameraPosition.zoom)
let zoomToFit = min(
log2(mapWindow.width() / visibleBoundsRect.width * scale),
log2(mapWindow.height() / visibleBoundsRect.height * scale)
)
let centerCoordinate = mapView.mapWindow.screenToWorld(with: YMKPoint(
x: visibleBoundsRect.midX,
y: visibleBoundsRect.midY
))
return (centerCoordinate, zoomToFit)
И при сравнении с результатами при расчете через map.camera(for: bounds)
все сходится, но только до определенного момента:
Как только текущий zoom карты становится 12>
, zoomToFit не совпадает с тем, что отдает map.camera(for: bounds)
. zoomToFit
получается немного больше, и при попытке узнать visibleRegion
при таком зуме, границы действительно меньше, чем visibleCoordinateBounds
под который этот зум вычислялся.
Начиная с zoom 12 и выше, разница между ожидаемым и вычисленным зумом составляет около 1 (единицы)
Что тут упускается?
Проверил этот алгоритм в GoogleMaps и там таких траблов нет 🤔