How to draw GeoJSON in Apple Maps as overlay using Swift 3
In the first dictionary of features
your coordinates
key having 2D array, so you need to also add one more if let
condition in your geometryObject.values
for loop.
for obj in geometryObject.values {
print(obj)
if let type = obj as? String {
typeData = type
}
if let coordObj = obj as? [Double] {
coord = Coordinates(latitude: coordObj[0], longitude: coordObj[1])
coordData?.append(coord)
}
//Add one more if let condition
if let coordObj = obj as? [[Double]] {
for coordinate in coordObj {
let coord = Coordinates(latitude: coordinate[0], longitude: coordinate[1])
coordData?.append(coord)
}
}
geometries = Geometry(type: typeData, coordinates: coordData!)
}
let feature = Feature(type: type, properties: properties!, geometry: geometries!)
features.append(feature)
Draw GeoJson in Apple Maps as overlay
I've found a solution in case someone wants help too.
@interface HHLViewController
+ (NSArray *)countriesOverlays;
@end
@implementation HHLViewController
- (void)viewDidLoad {
[super viewDidLoad];
NSArray *overlays = [HHLViewController countriesOverlays];
[self.stateMapView addOverlays:overlays];
}
+ (NSArray *)countriesOverlays {
NSString *fileName = [[NSBundle mainBundle] pathForResource:@"countries" ofType:@"json"];
NSData *overlayData = [NSData dataWithContentsOfFile:fileName];
NSArray *countries = [[NSJSONSerialization JSONObjectWithData:overlayData options:NSJSONReadingAllowFragments error:nil] objectForKey:@"features"];
NSMutableArray *overlays = [NSMutableArray array];
for (NSDictionary *country in countries) {
NSDictionary *geometry = country[@"geometry"];
if ([geometry[@"type"] isEqualToString:@"Polygon"]) {
MKPolygon *polygon = [HHLViewController overlaysFromPolygons:geometry[@"coordinates"] id:country[@"properties"][@"name"]];
if (polygon) {
[overlays addObject:polygon];
}
} else if ([geometry[@"type"] isEqualToString:@"MultiPolygon"]){
for (NSArray *polygonData in geometry[@"coordinates"]) {
MKPolygon *polygon = [HHLViewController overlaysFromPolygons:polygonData id:country[@"properties"][@"name"]];
if (polygon) {
[overlays addObject:polygon];
}
}
} else {
NSLog(@"Unsupported type: %@", geometry[@"type"]);
}
}
return overlays;
}
+ (MKPolygon *)overlaysFromPolygons:(NSArray *)polygons id:(NSString *)title
{
NSMutableArray *interiorPolygons = [NSMutableArray arrayWithCapacity:[polygons count] - 1];
for (int i = 1; i < [polygons count]; i++) {
[interiorPolygons addObject:[HHLViewController polygonFromPoints:polygons[i] interiorPolygons:nil]];
}
MKPolygon *overlayPolygon = [HHLViewController polygonFromPoints:polygons[0] interiorPolygons:interiorPolygons];
overlayPolygon.title = title;
return overlayPolygon;
}
+ (MKPolygon *)polygonFromPoints:(NSArray *)points interiorPolygons:(NSArray *)polygons
{
NSInteger numberOfCoordinates = [points count];
CLLocationCoordinate2D *polygonPoints = malloc(numberOfCoordinates * sizeof(CLLocationCoordinate2D));
NSInteger index = 0;
for (NSArray *pointArray in points) {
polygonPoints[index] = CLLocationCoordinate2DMake([pointArray[1] floatValue], [pointArray[0] floatValue]);
index++;
}
MKPolygon *polygon;
if (polygons) {
polygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates interiorPolygons:polygons];
} else {
polygon = [MKPolygon polygonWithCoordinates:polygonPoints count:numberOfCoordinates];
}
free(polygonPoints);
return polygon;
}
@end
Related Topics
Rotate a Imageview Around a Pivot Point in iOS
Add Gps Metadata Dictionary to Image Taken with Avfoundation in Swift
Timer Label Not Updated After Switching Views (Swift)
Why Doesn't iOS System Sound Play in Simulator
How to Create Gmsmarker with Combined Images in Swift
Swift 3 - How to Improve Image Quality for Tesseract
How to Get Multiple Buttons from a Single Tableviewcell
How to Implement a Payment App with Braintree in iOS
Swift Tableview Cell Radio Button Implementation
Apple Watch Table - First 4 Rows Not Appearing
Alpha for Background Color Not Working in iOS
Add Progress to File Uploading Using Alamofire
How to Get the Correct Current Time in iOS
Do I Need to Wrap My Alamofire Calls Inside Dispatch_Async