Plumbed camera options all the way through to MGLMapView. Added a method that lets you specify a direction in addition to center point and zoom level. Added Map::jumpTo() for parity with mapbox-gl-js. Replaced usage of Map::setLatLng() and Map::setLatLngZoom() with Map::jumpTo() or Map::easeTo() within MGLMapView. Replaced MGLMapView.pitch with MGLMapCamera for setting all supported degrees of freedom simultaneously. Simultaneously move and rotate with course. Support customizable timing functions on iOS. iosapp now persists an archived MGLMapCamera instead of separate viewpoint properties and also synchronizes user defaults on termination. This change implements persistence entirely in Objective-C, eliminating the use of the Objective-C++ implementation. Fixes #1643, fixes #1834. Ref #1581.
102 lines
4.0 KiB
Plaintext
102 lines
4.0 KiB
Plaintext
#import "MGLMapCamera.h"
|
|
|
|
#include <mbgl/util/projection.hpp>
|
|
|
|
@implementation MGLMapCamera
|
|
|
|
+ (BOOL)supportsSecureCoding
|
|
{
|
|
return YES;
|
|
}
|
|
|
|
+ (instancetype)camera
|
|
{
|
|
return [[self alloc] init];
|
|
}
|
|
|
|
+ (instancetype)cameraLookingAtCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
|
|
fromEyeCoordinate:(CLLocationCoordinate2D)eyeCoordinate
|
|
eyeAltitude:(CLLocationDistance)eyeAltitude
|
|
{
|
|
mbgl::LatLng centerLatLng = mbgl::LatLng(centerCoordinate.latitude, centerCoordinate.longitude);
|
|
mbgl::LatLng eyeLatLng = mbgl::LatLng(eyeCoordinate.latitude, eyeCoordinate.longitude);
|
|
|
|
mbgl::ProjectedMeters centerMeters = mbgl::Projection::projectedMetersForLatLng(centerLatLng);
|
|
mbgl::ProjectedMeters eyeMeters = mbgl::Projection::projectedMetersForLatLng(eyeLatLng);
|
|
CLLocationDirection heading = std::atan((centerMeters.northing - eyeMeters.northing) /
|
|
(centerMeters.easting - eyeMeters.easting));
|
|
|
|
double groundDistance = std::hypot(centerMeters.northing - eyeMeters.northing,
|
|
centerMeters.easting - eyeMeters.easting);
|
|
CGFloat pitch = std::atan(eyeAltitude / groundDistance);
|
|
|
|
return [[self alloc] initWithCenterCoordinate:centerCoordinate
|
|
altitude:eyeAltitude
|
|
pitch:pitch
|
|
heading:heading];
|
|
}
|
|
|
|
+ (instancetype)cameraLookingAtCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
|
|
fromDistance:(CLLocationDistance)distance
|
|
pitch:(CGFloat)pitch
|
|
heading:(CLLocationDirection)heading
|
|
{
|
|
return [[self alloc] initWithCenterCoordinate:centerCoordinate
|
|
altitude:distance
|
|
pitch:(CGFloat)pitch
|
|
heading:heading];
|
|
}
|
|
|
|
- (instancetype)initWithCenterCoordinate:(CLLocationCoordinate2D)centerCoordinate
|
|
altitude:(CLLocationDistance)altitude
|
|
pitch:(CGFloat)pitch
|
|
heading:(CLLocationDirection)heading
|
|
{
|
|
if (self = [super init])
|
|
{
|
|
_centerCoordinate = centerCoordinate;
|
|
_altitude = altitude;
|
|
_pitch = pitch;
|
|
_heading = heading;
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (nullable instancetype)initWithCoder:(NSCoder *)coder
|
|
{
|
|
if (self = [super init])
|
|
{
|
|
_centerCoordinate = CLLocationCoordinate2DMake([coder decodeDoubleForKey:@"centerLatitude"],
|
|
[coder decodeDoubleForKey:@"centerLongitude"]);
|
|
_altitude = [coder decodeDoubleForKey:@"altitude"];
|
|
_pitch = [coder decodeDoubleForKey:@"pitch"];
|
|
_heading = [coder decodeDoubleForKey:@"heading"];
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (void)encodeWithCoder:(NSCoder *)coder
|
|
{
|
|
[coder encodeDouble:_centerCoordinate.latitude forKey:@"centerLatitude"];
|
|
[coder encodeDouble:_centerCoordinate.longitude forKey:@"centerLongitude"];
|
|
[coder encodeDouble:_altitude forKey:@"altitude"];
|
|
[coder encodeDouble:_pitch forKey:@"pitch"];
|
|
[coder encodeDouble:_heading forKey:@"heading"];
|
|
}
|
|
|
|
- (id)copyWithZone:(nullable NSZone *)zone
|
|
{
|
|
return [[[self class] allocWithZone:zone] initWithCenterCoordinate:_centerCoordinate
|
|
altitude:_altitude
|
|
pitch:_pitch
|
|
heading:_heading];
|
|
}
|
|
|
|
- (NSString *)description
|
|
{
|
|
return [NSString stringWithFormat:@"<MKMapCamera %p centerCoordinate:%f, %f altitude:%.0fm heading:%.0f° pitch:%.0f°>",
|
|
self, _centerCoordinate.latitude, _centerCoordinate.longitude, _altitude, _heading, _pitch];
|
|
}
|
|
|
|
@end
|