diff options
Diffstat (limited to 'platform/ios/demo/Examples/ObjectiveC/RuntimeAddLineExample.m')
-rw-r--r-- | platform/ios/demo/Examples/ObjectiveC/RuntimeAddLineExample.m | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/platform/ios/demo/Examples/ObjectiveC/RuntimeAddLineExample.m b/platform/ios/demo/Examples/ObjectiveC/RuntimeAddLineExample.m new file mode 100644 index 0000000000..6cc80b002e --- /dev/null +++ b/platform/ios/demo/Examples/ObjectiveC/RuntimeAddLineExample.m @@ -0,0 +1,94 @@ +#import "RuntimeAddLineExample.h" +@import Mapbox; + +NSString *const MBXExampleRuntimeAddLine = @"RuntimeAddLineExample"; + +@interface RuntimeAddLineExample () <MGLMapViewDelegate> +@property (nonatomic) MGLMapView *mapView; +@end + +@implementation RuntimeAddLineExample + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.mapView = [[MGLMapView alloc] initWithFrame:self.view.bounds]; + self.mapView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; + + [self.mapView setCenterCoordinate:CLLocationCoordinate2DMake(45.5076, -122.6736) + zoomLevel:11 + animated:NO]; + + [self.view addSubview:self.mapView]; + + self.mapView.delegate = self; +} + +// Wait until the map is loaded before adding to the map. +- (void)mapView:(MGLMapView *)mapView didFinishLoadingStyle:(MGLStyle *)style { + [self loadGeoJSON]; +} + +- (void)loadGeoJSON { + dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ + NSString *path = [[NSBundle mainBundle] pathForResource:@"example" ofType:@"geojson"]; + NSData *jsonData = [NSData dataWithContentsOfFile:path]; + dispatch_async(dispatch_get_main_queue(), ^{ + [self drawPolyline:jsonData]; + }); + }); +} + +- (void)drawPolyline:(NSData *)geoJson { + // Add our GeoJSON data to the map as an MGLShapeSource. + // We can then reference this data from an MGLStyleLayer. + MGLShape *shape = [MGLShape shapeWithData:geoJson encoding:NSUTF8StringEncoding error:nil]; + MGLSource *source = [[MGLShapeSource alloc] initWithIdentifier:@"polyline" shape:shape options:nil]; + [self.mapView.style addSource:source]; + + // Create new layer for the line + MGLLineStyleLayer *layer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"polyline" source:source]; + layer.lineJoin = [MGLStyleValue valueWithRawValue:[NSValue valueWithMGLLineJoin:MGLLineJoinRound]]; + layer.lineCap = [MGLStyleValue valueWithRawValue:[NSValue valueWithMGLLineCap:MGLLineCapRound]]; + layer.lineColor = [MGLStyleValue valueWithRawValue:[UIColor colorWithRed:59/255.0 green:178/255.0 blue:208/255.0 alpha:1]]; + // Use a style function to smoothly adjust the line width from 2pt to 20pt between zoom levels 14 and 18. The `interpolationBase` parameter allows the values to interpolate along an exponential curve. + layer.lineWidth = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeExponential + cameraStops:@{ + @14: [MGLStyleValue valueWithRawValue:@2], + @18: [MGLStyleValue valueWithRawValue:@20] + } + options:@{MGLStyleFunctionOptionDefaultValue:@1.5}]; + + // We can also add a second layer that will draw a stroke around the original line. + MGLLineStyleLayer *casingLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"polyline-case" source:source]; + // Copy these attributes from the main line layer. + casingLayer.lineJoin = layer.lineJoin; + casingLayer.lineCap = layer.lineCap; + // Line gap width represents the space before the outline begins, so should match the main line’s line width exactly. + casingLayer.lineGapWidth = layer.lineWidth; + // Stroke color slightly darker than the line color. + casingLayer.lineColor = [MGLStyleValue valueWithRawValue:[UIColor colorWithRed:41/255.0 green:145/255.0 blue:171/255.0 alpha:1]]; + // Use a style function to gradually increase the stroke width between zoom levels 14 and 18. + casingLayer.lineWidth = [MGLStyleValue valueWithInterpolationMode:MGLInterpolationModeExponential + cameraStops:@{ + @14: [MGLStyleValue valueWithRawValue:@1], + @18: [MGLStyleValue valueWithRawValue:@4] + } + options:@{MGLStyleFunctionOptionDefaultValue:@1.5}]; + + // Just for fun, let’s add another copy of the line with a dash pattern. + MGLLineStyleLayer *dashedLayer = [[MGLLineStyleLayer alloc] initWithIdentifier:@"polyline-dash" source:source]; + dashedLayer.lineJoin = layer.lineJoin; + dashedLayer.lineCap = layer.lineCap; + dashedLayer.lineWidth = layer.lineWidth; + dashedLayer.lineColor = [MGLStyleValue valueWithRawValue:[UIColor whiteColor]]; + dashedLayer.lineOpacity = [MGLStyleValue valueWithRawValue:@0.5]; + // Dash pattern in the format [dash, gap, dash, gap, ...]. You’ll want to adjust these values based on the line cap style. + dashedLayer.lineDashPattern = [MGLStyleValue valueWithRawValue:@[@0, @1.5]]; + + [self.mapView.style addLayer:layer]; + [self.mapView.style addLayer:dashedLayer]; + [self.mapView.style insertLayer:casingLayer belowLayer:layer]; +} + +@end |