summaryrefslogtreecommitdiff
path: root/platform/darwin/src/MGLPolyline.mm
diff options
context:
space:
mode:
Diffstat (limited to 'platform/darwin/src/MGLPolyline.mm')
-rw-r--r--platform/darwin/src/MGLPolyline.mm228
1 files changed, 0 insertions, 228 deletions
diff --git a/platform/darwin/src/MGLPolyline.mm b/platform/darwin/src/MGLPolyline.mm
deleted file mode 100644
index 25c540b527..0000000000
--- a/platform/darwin/src/MGLPolyline.mm
+++ /dev/null
@@ -1,228 +0,0 @@
-#import "MGLPolyline_Private.h"
-
-#import "MGLMultiPoint_Private.h"
-#import "MGLGeometry_Private.h"
-
-#import "MGLFeature.h"
-#import "MGLLoggingConfiguration_Private.h"
-
-#import <mbgl/util/geojson.hpp>
-#import <mapbox/polylabel.hpp>
-
-@implementation MGLPolyline
-
-@dynamic overlayBounds;
-
-+ (instancetype)polylineWithCoordinates:(const CLLocationCoordinate2D *)coords
- count:(NSUInteger)count
-{
- return [[self alloc] initWithCoordinates:coords count:count];
-}
-
-- (mbgl::LineString<double>)lineString {
- NSUInteger count = self.pointCount;
- CLLocationCoordinate2D *coordinates = self.coordinates;
-
- mbgl::LineString<double> geometry;
- geometry.reserve(self.pointCount);
- for (NSUInteger i = 0; i < count; i++) {
- geometry.push_back(mbgl::Point<double>(coordinates[i].longitude, coordinates[i].latitude));
- }
-
- return geometry;
-}
-
-- (mbgl::Annotation)annotationObjectWithDelegate:(id <MGLMultiPointDelegate>)delegate {
- mbgl::LineAnnotation annotation { [self lineString] };
- annotation.opacity = { static_cast<float>([delegate alphaForShapeAnnotation:self]) };
- annotation.color = { [delegate strokeColorForShapeAnnotation:self] };
- annotation.width = { static_cast<float>([delegate lineWidthForPolylineAnnotation:self]) };
-
- return annotation;
-}
-
-- (mbgl::Geometry<double>)geometryObject {
- return [self lineString];
-}
-
-- (NSDictionary *)geoJSONDictionary {
- return @{@"type": @"LineString",
- @"coordinates": self.mgl_coordinates};
-}
-
-- (NSArray<id> *)mgl_coordinates {
- NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:self.pointCount];
- for (NSUInteger index = 0; index < self.pointCount; index++) {
- CLLocationCoordinate2D coordinate = self.coordinates[index];
- [coordinates addObject:@[@(coordinate.longitude), @(coordinate.latitude)]];
- }
- return [coordinates copy];
-}
-
-- (BOOL)isEqual:(id)other {
- return self == other || ([other isKindOfClass:[MGLPolyline class]] && [super isEqual:other]);
-}
-
-- (CLLocationCoordinate2D)coordinate {
- NSUInteger count = self.pointCount;
- MGLAssert(count > 0, @"Polyline must have coordinates");
-
- CLLocationCoordinate2D *coordinates = self.coordinates;
- CLLocationDistance middle = [self length] / 2.0;
- CLLocationDistance traveled = 0.0;
-
- if (count > 1 || middle > traveled) {
- for (NSUInteger i = 0; i < count; i++) {
-
- // Avoid a heap buffer overflow when there are only two coordinates.
- NSUInteger nextIndex = (i + 1 == count) ? 0 : 1;
-
- MGLRadianCoordinate2D from = MGLRadianCoordinateFromLocationCoordinate(coordinates[i]);
- MGLRadianCoordinate2D to = MGLRadianCoordinateFromLocationCoordinate(coordinates[i + nextIndex]);
-
- if (traveled >= middle) {
- double overshoot = middle - traveled;
- if (overshoot == 0) {
- return coordinates[i];
- }
- to = MGLRadianCoordinateFromLocationCoordinate(coordinates[i - 1]);
- CLLocationDirection direction = [self direction:from to:to] - 180;
- MGLRadianCoordinate2D otherCoordinate = MGLRadianCoordinateAtDistanceFacingDirection(from,
- overshoot/mbgl::util::EARTH_RADIUS_M,
- MGLRadiansFromDegrees(direction));
- return CLLocationCoordinate2DMake(MGLDegreesFromRadians(otherCoordinate.latitude),
- MGLDegreesFromRadians(otherCoordinate.longitude));
- }
-
- traveled += (MGLDistanceBetweenRadianCoordinates(from, to) * mbgl::util::EARTH_RADIUS_M);
- }
- }
-
- return coordinates[count - 1];
-}
-
-- (CLLocationDistance)length
-{
- CLLocationDistance length = 0.0;
-
- NSUInteger count = self.pointCount;
- CLLocationCoordinate2D *coordinates = self.coordinates;
-
- for (NSUInteger i = 0; i < count - 1; i++) {
- length += (MGLDistanceBetweenRadianCoordinates(MGLRadianCoordinateFromLocationCoordinate(coordinates[i]), MGLRadianCoordinateFromLocationCoordinate(coordinates[i + 1])) * mbgl::util::EARTH_RADIUS_M);
- }
-
- return length;
-}
-
-- (CLLocationDirection)direction:(MGLRadianCoordinate2D)from to:(MGLRadianCoordinate2D)to
-{
- return MGLDegreesFromRadians(MGLRadianCoordinatesDirection(from, to));
-}
-
-@end
-
-@interface MGLMultiPolyline ()
-
-@property (nonatomic, copy, readwrite) NSArray<MGLPolyline *> *polylines;
-
-@end
-
-@implementation MGLMultiPolyline {
- MGLCoordinateBounds _overlayBounds;
-}
-
-@synthesize overlayBounds = _overlayBounds;
-
-+ (instancetype)multiPolylineWithPolylines:(NSArray<MGLPolyline *> *)polylines {
- return [[self alloc] initWithPolylines:polylines];
-}
-
-- (instancetype)initWithPolylines:(NSArray<MGLPolyline *> *)polylines {
- MGLLogDebug(@"Initializing with %lu polylines.", (unsigned long)polylines.count);
- if (self = [super init]) {
- _polylines = polylines;
-
- mbgl::LatLngBounds bounds = mbgl::LatLngBounds::empty();
-
- for (MGLPolyline *polyline in _polylines) {
- bounds.extend(MGLLatLngBoundsFromCoordinateBounds(polyline.overlayBounds));
- }
- _overlayBounds = MGLCoordinateBoundsFromLatLngBounds(bounds);
- }
- return self;
-}
-
-- (instancetype)initWithCoder:(NSCoder *)decoder {
- MGLLogInfo(@"Initializing with coder.");
- if (self = [super initWithCoder:decoder]) {
- _polylines = [decoder decodeObjectOfClass:[NSArray class] forKey:@"polylines"];
- }
- return self;
-}
-
-- (void)encodeWithCoder:(NSCoder *)coder {
- [super encodeWithCoder:coder];
- [coder encodeObject:_polylines forKey:@"polylines"];
-}
-
-- (BOOL)isEqual:(id)other
-{
- if (self == other) return YES;
- if (![other isKindOfClass:[MGLMultiPolyline class]]) return NO;
-
- MGLMultiPolyline *otherMultipoline = other;
- return ([super isEqual:otherMultipoline]
- && [self.polylines isEqualToArray:otherMultipoline.polylines]);
-}
-
-- (NSUInteger)hash {
- NSUInteger hash = [super hash];
- for (MGLPolyline *polyline in self.polylines) {
- hash += [polyline hash];
- }
- return hash;
-}
-
-- (CLLocationCoordinate2D)coordinate {
- MGLPolyline *polyline = self.polylines.firstObject;
- CLLocationCoordinate2D *coordinates = polyline.coordinates;
- MGLAssert([polyline pointCount] > 0, @"Polyline must have coordinates");
- CLLocationCoordinate2D firstCoordinate = coordinates[0];
-
- return firstCoordinate;
-}
-
-- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds {
- return MGLCoordinateBoundsIntersectsCoordinateBounds(_overlayBounds, overlayBounds);
-}
-
-- (mbgl::Geometry<double>)geometryObject {
- mbgl::MultiLineString<double> multiLineString;
- multiLineString.reserve(self.polylines.count);
- for (MGLPolyline *polyline in self.polylines) {
- multiLineString.push_back([polyline lineString]);
- }
- return multiLineString;
-}
-
-- (NSDictionary *)geoJSONDictionary {
- NSMutableArray *coordinates = [NSMutableArray array];
- for (MGLPolylineFeature *feature in self.polylines) {
- [coordinates addObject: feature.mgl_coordinates];
- }
- return @{@"type": @"MultiLineString",
- @"coordinates": coordinates};
-}
-
-- (NSString *)description
-{
- return [NSString stringWithFormat:@"<%@: %p; title = %@, subtitle: = %@, count = %lu; bounds = %@>",
- NSStringFromClass([self class]), (void *)self,
- self.title ? [NSString stringWithFormat:@"\"%@\"", self.title] : self.title,
- self.subtitle ? [NSString stringWithFormat:@"\"%@\"", self.subtitle] : self.subtitle,
- (unsigned long)self.polylines.count,
- MGLStringFromCoordinateBounds(self.overlayBounds)];
-}
-
-@end