diff options
Diffstat (limited to 'platform/darwin/src/MGLPolygon.mm')
-rw-r--r-- | platform/darwin/src/MGLPolygon.mm | 240 |
1 files changed, 0 insertions, 240 deletions
diff --git a/platform/darwin/src/MGLPolygon.mm b/platform/darwin/src/MGLPolygon.mm deleted file mode 100644 index 52bff01b20..0000000000 --- a/platform/darwin/src/MGLPolygon.mm +++ /dev/null @@ -1,240 +0,0 @@ -#import "MGLPolygon_Private.h" - -#import "MGLMultiPoint_Private.h" -#import "MGLGeometry_Private.h" -#import "MGLLoggingConfiguration_Private.h" - -#import "MGLFeature.h" - -#import <mbgl/util/geojson.hpp> -#import <mapbox/polylabel.hpp> - -@implementation MGLPolygon - -@dynamic overlayBounds; - -+ (instancetype)polygonWithCoordinates:(const CLLocationCoordinate2D *)coords count:(NSUInteger)count { - return [self polygonWithCoordinates:coords count:count interiorPolygons:nil]; -} - -+ (instancetype)polygonWithCoordinates:(const CLLocationCoordinate2D *)coords count:(NSUInteger)count interiorPolygons:(NSArray<MGLPolygon *> *)interiorPolygons { - return [[self alloc] initWithCoordinates:coords count:count interiorPolygons:interiorPolygons]; -} - -- (instancetype)initWithCoordinates:(const CLLocationCoordinate2D *)coords count:(NSUInteger)count interiorPolygons:(NSArray<MGLPolygon *> *)interiorPolygons { - MGLLogDebug(@"Initializing with %lu coordinates and %lu interiorPolygons.", (unsigned long)count, (unsigned long)interiorPolygons); - if (self = [super initWithCoordinates:coords count:count]) { - if (interiorPolygons.count) { - _interiorPolygons = interiorPolygons; - } - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - MGLLogInfo(@"Initializng with coder."); - self = [super initWithCoder:decoder]; - if (self) { - _interiorPolygons = [decoder decodeObjectOfClass:[NSArray class] forKey:@"interiorPolygons"]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)coder { - [super encodeWithCoder:coder]; - [coder encodeObject:self.interiorPolygons forKey:@"interiorPolygons"]; -} - -- (BOOL)isEqual:(id)other { - if (self == other) return YES; - if (![other isKindOfClass:[MGLPolygon class]]) return NO; - - MGLPolygon *otherPolygon = (MGLPolygon *)other; - return ([super isEqual:otherPolygon] && - [[self geoJSONDictionary] isEqualToDictionary:[otherPolygon geoJSONDictionary]]); -} - -- (NSUInteger)hash { - return [super hash] + [[self geoJSONDictionary] hash]; -} - -- (CLLocationCoordinate2D)coordinate { - // pole of inaccessibility - auto poi = mapbox::polylabel([self polygon]); - - return MGLLocationCoordinate2DFromPoint(poi); -} - -- (mbgl::LinearRing<double>)ring { - NSUInteger count = self.pointCount; - CLLocationCoordinate2D *coordinates = self.coordinates; - - mbgl::LinearRing<double> result; - result.reserve(self.pointCount); - for (NSUInteger i = 0; i < count; i++) { - result.push_back(mbgl::Point<double>(coordinates[i].longitude, coordinates[i].latitude)); - } - return result; -} - -- (mbgl::Polygon<double>)polygon { - mbgl::Polygon<double> geometry; - geometry.push_back(self.ring); - for (MGLPolygon *polygon in self.interiorPolygons) { - geometry.push_back(polygon.ring); - } - return geometry; -} - -- (mbgl::Geometry<double>)geometryObject { - return [self polygon]; -} - -- (mbgl::Annotation)annotationObjectWithDelegate:(id <MGLMultiPointDelegate>)delegate { - - mbgl::FillAnnotation annotation { [self polygon] }; - annotation.opacity = { static_cast<float>([delegate alphaForShapeAnnotation:self]) }; - annotation.outlineColor = { [delegate strokeColorForShapeAnnotation:self] }; - annotation.color = { [delegate fillColorForPolygonAnnotation:self] }; - - return annotation; -} - -- (NSDictionary *)geoJSONDictionary { - return @{@"type": @"Polygon", - @"coordinates": self.mgl_coordinates}; -} - -- (NSArray<id> *)mgl_coordinates { - NSMutableArray *coordinates = [NSMutableArray array]; - - NSMutableArray *exteriorRing = [NSMutableArray array]; - for (NSUInteger index = 0; index < self.pointCount; index++) { - CLLocationCoordinate2D coordinate = self.coordinates[index]; - [exteriorRing addObject:@[@(coordinate.longitude), @(coordinate.latitude)]]; - } - [coordinates addObject:exteriorRing]; - - for (MGLPolygon *interiorPolygon in self.interiorPolygons) { - NSMutableArray *interiorRing = [NSMutableArray array]; - for (NSUInteger index = 0; index < interiorPolygon.pointCount; index++) { - CLLocationCoordinate2D coordinate = interiorPolygon.coordinates[index]; - [interiorRing addObject:@[@(coordinate.longitude), @(coordinate.latitude)]]; - } - [coordinates addObject:interiorRing]; - } - - return [coordinates copy]; -} - -@end - -@interface MGLMultiPolygon () - -@property (nonatomic, copy, readwrite) NSArray<MGLPolygon *> *polygons; - -@end - -@implementation MGLMultiPolygon { - MGLCoordinateBounds _overlayBounds; -} - -@synthesize overlayBounds = _overlayBounds; - -+ (instancetype)multiPolygonWithPolygons:(NSArray<MGLPolygon *> *)polygons { - return [[self alloc] initWithPolygons:polygons]; -} - -- (instancetype)initWithPolygons:(NSArray<MGLPolygon *> *)polygons { - MGLLogDebug(@"Initializing with %lu polygons.", (unsigned long)polygons.count); - if (self = [super init]) { - _polygons = polygons; - - mbgl::LatLngBounds bounds = mbgl::LatLngBounds::empty(); - - for (MGLPolygon *polygon in _polygons) { - bounds.extend(MGLLatLngBoundsFromCoordinateBounds(polygon.overlayBounds)); - } - _overlayBounds = MGLCoordinateBoundsFromLatLngBounds(bounds); - } - return self; -} - -- (instancetype)initWithCoder:(NSCoder *)decoder { - MGLLogInfo(@"Initializing with coder."); - if (self = [super initWithCoder:decoder]) { - _polygons = [decoder decodeObjectOfClass:[NSArray class] forKey:@"polygons"]; - } - return self; -} - -- (void)encodeWithCoder:(NSCoder *)coder { - [super encodeWithCoder:coder]; - [coder encodeObject:_polygons forKey:@"polygons"]; -} - -- (BOOL)isEqual:(id)other { - if (self == other) return YES; - if (![other isKindOfClass:[MGLMultiPolygon class]]) return NO; - - MGLMultiPolygon *otherMultiPolygon = other; - return [super isEqual:other] - && [self.polygons isEqualToArray:otherMultiPolygon.polygons]; -} - -- (NSUInteger)hash { - NSUInteger hash = [super hash]; - for (MGLPolygon *polygon in self.polygons) { - hash += [polygon hash]; - } - return hash; -} - -- (CLLocationCoordinate2D)coordinate { - MGLPolygon *firstPolygon = self.polygons.firstObject; - - return firstPolygon.coordinate; -} - -- (BOOL)intersectsOverlayBounds:(MGLCoordinateBounds)overlayBounds { - return MGLCoordinateBoundsIntersectsCoordinateBounds(_overlayBounds, overlayBounds); -} - -- (mbgl::MultiPolygon<double>)multiPolygon { - mbgl::MultiPolygon<double> multiPolygon; - multiPolygon.reserve(self.polygons.count); - for (MGLPolygon *polygon in self.polygons) { - mbgl::Polygon<double> geometry; - geometry.push_back(polygon.ring); - for (MGLPolygon *interiorPolygon in polygon.interiorPolygons) { - geometry.push_back(interiorPolygon.ring); - } - multiPolygon.push_back(geometry); - } - return multiPolygon; -} - -- (mbgl::Geometry<double>)geometryObject { - return [self multiPolygon]; -} - -- (NSDictionary *)geoJSONDictionary { - NSMutableArray *coordinates = [[NSMutableArray alloc] initWithCapacity:self.polygons.count]; - for (MGLPolygonFeature *feature in self.polygons) { - [coordinates addObject: feature.mgl_coordinates]; - } - return @{@"type": @"MultiPolygon", - @"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.polygons.count, - MGLStringFromCoordinateBounds(self.overlayBounds)]; -} - -@end |