Регулировка шага MKMapCamera не работает в некоторых местах
В своем приложении я использую спутниковые снимки в MapKit. Я использую спутниковую 2D-карту большую часть времени, используя MKMapCamera с шагом 0. Пользователь может переключиться на 3D-карту с шагом 80 и гораздо меньшим значением расстояния, так как мне не нужно видеть слишком далеко в 3D. .
Это прекрасно работает здесь, в столичном районе Чикаго, но совсем не в более сельских районах, где я пробовал это (Алабама, Западный Техас и немного за пределами Нэшвилла и Атланты). В этих областях кажется, что изменение высоты тона на карте крайне ограничено, поэтому конечным результатом является то, что камера просто погружается прямо в землю по мере уменьшения расстояния, а не движется вниз и панорамируется для ожидаемого красивого 3D-изображения. Как я уже сказал, это прекрасно работает в районе Чикаго и его окрестностях.
Я подозреваю, что это связано с тем, что информация, используемая для более экстремальных (80 градусов) 3D-видов, ограничена во многих областях (возможно, доступна только для тех областей, где есть эстакада, как на https://www.apple.com/ios/feature-availability ). /#карты-флайовер ?).
Есть ли способ программно проверить, доступен ли этот тип 3D-просмотра в данном месте?
Я хотел бы иметь возможность отключать элементы управления 3D в местах, где 3D-просмотр недоступен. Свойство «isPitchEnabled» просто проверяет, включена ли регулировка высоты тона, а НЕ работает ли запрошенное изменение высоты тона в определенном месте.
Вот фрагменты кода, который я использую, который прекрасно работает в некоторых местах:
Настройка MKMapCamera -
var mapCamera: MKMapCamera {
// MARK: This sets the camera perspective and position. It may be generally a 2D view showing the map from directly above or it may be a 3D view looking down the line
return MKMapCamera(
lookingAtCenter: cameraCenter(),
fromDistance: cameraDistanceUsed * locations.cameraZoom,
pitch: locations.cameraAngle,
heading: locations.bearing()
)
}
func cameraCenter() -> CLLocationCoordinate2D {
// MARK: This sets the center of the map
if locations.cameraZoom == CameraZoom.birdsEye.rawValue {
// In the 2D (birds-eye) view, set the camera center to be the midpoint of the scene so that the entire scene is visible.
return locations.midpoint.scene
} else {
// In the 3D view, set the camera center to be the midpoint between the user and the target so that the map is aligned with the direction of the user
return locations.midpoint.target
}
}
Создание MapView -
func makeUIView(context: Context) -> MKMapView {
// MARK: This creates the satellite map
let mapView = MKMapView()
// Sets the map type to Satellite view
mapView.preferredConfiguration = MKImageryMapConfiguration(elevationStyle: .realistic)
// Shows the user's location on the map
mapView.showsUserLocation = true
// Sets the map camera and the coordinator
mapView.delegate = context.coordinator
mapView.camera = mapCamera
mapView.isPitchEnabled = true
//
DispatchQueue.main.async {
self.courseMap = mapView
}
return mapView
}
Перечисления для изменения значений 2D/3D -
enum CameraAngle: Double {
// MARK: This sets the value for the camera angle on the map.
// Degrees of "0" means the camera is directly above the map, in a 2D "birds-eye" view. Increasing the degrees of results in a more 3D view looking down the target line.
case birdsEye = 0
case threeD = 80
}
enum CameraZoom: Double {
// MARK: This sets the value for the camera zoom on the map.
// Zoom factor of "2.2" is used for the 2D "birds-eye" view. A lower zoom factor is used for 3D view looking down the target line since you don't need to see too far in the distance.
case birdsEye = 2.2
case threeD = 0.5
}
Переключение между 2D и 3D -
Button {
// Change the camera angle and distance from the ground to create the 3D view where available
locations.cameraAngle = CameraAngle.threeD.rawValue
locations.cameraZoom = CameraZoom.threeD.rawValue
} label: {
Image(systemName: "chevron.up")
.font(.title)
}
Button {
// Raise the camera and set the angle to 0º to create the 2D "bird's eye" view of the map
locations.cameraAngle = CameraAngle.birdsEye.rawValue
locations.cameraZoom = CameraZoom.birdsEye.rawValue
} label: {
Image(systemName: "chevron.down")
.font(.title)
}
Любые идеи о том, как я могу проверить доступность 3D, чтобы я мог отключить кнопки в местах, где это необходимо?
1 ответ
В сеансе вопросов и ответов AskApple на Картах я подтвердил, что 3D-спутник доступен только для некоторых регионов. Это совершенно понятно, поэтому я хотел бы программно отключить функцию 3D в местах, где 3D-виды не поддерживаются. К сожалению, вопросы и ответы AskApple также показали, что в настоящее время нет способа определить, доступен ли 3D-спутник в определенном месте. Я отправил предложение по улучшению в Apple, но на данный момент нет возможности программно отключить 3D.