Skip to content
This repository has been archived by the owner on Aug 8, 2023. It is now read-only.

Commit

Permalink
[ios] Use NSDictionary for geojson source options.
Browse files Browse the repository at this point in the history
This removes a previous implementation of geojson options that used
a new type to transfer the data around. Added in its place is
an options API that takes an NSDictionary that works similarly to
NSAttributedString and many other cocoa APIs that take options.

The implementation of MGLGeoJSONSource checks that values are or the
correct type before attempting to use them
  • Loading branch information
boundsj committed Sep 1, 2016
1 parent 20d6f55 commit 2495143
Show file tree
Hide file tree
Showing 7 changed files with 233 additions and 65 deletions.
13 changes: 0 additions & 13 deletions platform/darwin/src/MGLGeoJSONOptions.h

This file was deleted.

19 changes: 0 additions & 19 deletions platform/darwin/src/MGLGeoJSONOptions.m

This file was deleted.

65 changes: 61 additions & 4 deletions platform/darwin/src/MGLGeoJSONSource.h
Original file line number Diff line number Diff line change
@@ -1,12 +1,54 @@
#import "MGLSource.h"

#import "MGLTypes.h"
#import "MGLGeoJSONOptions.h"

NS_ASSUME_NONNULL_BEGIN

@protocol MGLFeature;

/**
The value of this option is an `NSNumber` object containing a boolean. If the data
is a collection of point features, setting this to true clusters the points by
radius into groups. The default value is false.
*/
extern NSString * const MGLGeoJSONClusterOptionName;

/**
The value of this option is an `NSNumber` object containing an integer. It controls
the radius of each cluster when clustering points, measured in 1/512ths of a tile.
The default value is 50.
*/
extern NSString * const MGLGeoJSONClusterRadiusOptionName;

/**
The value of this option is an `NSNumber` object containing an integer. It controls
the maximum zoom to cluster points on. Defaults to one zoom less than the value
of `MGLGeoJSONMaxZoomLevelOptionName` (so that last zoom features are not clustered).
*/
extern NSString * const MGLGeoJSONClusterMaximumZoomLevelOptionName;

/**
The value of this option is an `NSNumber` object containing an integer. It controls
the maximum zoom level at which to create vector tiles (higher means greater detail
at high zoom levels). The default value is 18.
*/
extern NSString * const MGLGeoJSONMaxZoomLevelOptionName;

/**
The value of this option is an `NSNumber` object containing an integer. It controls
the tile buffer size on each side (measured in 1/512ths of a tile; higher means
fewer rendering artifacts near tile edges but slower performance).
The default value is 128.
*/
extern NSString * const MGLGeoJSONBufferOptionName;

/**
The value of this option is an `NSNumber` object containing a double. It controls
the Douglas-Peucker simplification tolerance (higher means simpler geometries and
faster performance). The default value is 0.375.
*/
extern NSString * const MGLGeoJSONToleranceOptionName;

@interface MGLGeoJSONSource : MGLSource

/**
Expand Down Expand Up @@ -39,8 +81,6 @@ NS_ASSUME_NONNULL_BEGIN
*/
@property (nonatomic, readonly, nullable) NSURL *URL;

@property (nonatomic, readonly, nullable) MGLGeoJSONOptions *geoJSONOptions;

/**
Initializes a source with the given identifier and GeoJSON data.
Expand All @@ -49,7 +89,14 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data NS_DESIGNATED_INITIALIZER;

- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data options:(MGLGeoJSONOptions *)options NS_DESIGNATED_INITIALIZER;
/**
Initializes a source with the given identifier, GeoJSON data, and a dictionary of options for the source.
@param sourceIdentifier A string that uniquely identifies the source.
@param geoJSONData An NSData object representing GeoJSON source code.
@param options An NSDictionary attributes for this source specified by the <a href="https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson">the style specification</a>.
*/
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data options:(NS_DICTIONARY_OF(NSString *, id) *)options NS_DESIGNATED_INITIALIZER;

/**
Initializes a source with the given identifier and URL.
Expand All @@ -60,6 +107,16 @@ NS_ASSUME_NONNULL_BEGIN
*/
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url NS_DESIGNATED_INITIALIZER;

/**
Initializes a source with the given identifier, a URL, and a dictionary of options for the source.
@param sourceIdentifier A string that uniquely identifies the source.
@param URL An HTTP(S) URL, absolute file URL, or local file URL relative to the
current application’s resource bundle.
@param options An NSDictionary attributes for this source specified by the <a href="https://www.mapbox.com/mapbox-gl-style-spec/#sources-geojson">the style specification</a>.
*/
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url options:(NS_DICTIONARY_OF(NSString *, id) *)options NS_DESIGNATED_INITIALIZER;

@end

NS_ASSUME_NONNULL_END
97 changes: 81 additions & 16 deletions platform/darwin/src/MGLGeoJSONSource.mm
Original file line number Diff line number Diff line change
Expand Up @@ -7,48 +7,113 @@

#include <mbgl/style/sources/geojson_source.hpp>

NSString * const MGLGeoJSONClusterOptionName = @"MGLGeoJSONClusterOptionName";
NSString * const MGLGeoJSONClusterRadiusOptionName = @"MGLGeoJSONClusterRadiusOptionName";
NSString * const MGLGeoJSONClusterMaximumZoomLevelOptionName = @"MGLGeoJSONClusterMaximumZoomLevelOptionName";
NSString * const MGLGeoJSONMaxZoomLevelOptionName = @"MGLGeoJSONMaxZoomLevelOptionName";
NSString * const MGLGeoJSONBufferOptionName = @"MGLGeoJSONBufferOptionName";
NSString * const MGLGeoJSONToleranceOptionName = @"MGLGeoJSONOptionsClusterTolerance";

@interface MGLGeoJSONSource ()

@property (nonatomic, readwrite) NSDictionary *options;

@end

@implementation MGLGeoJSONSource

- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data {
if (self = [super initWithSourceIdentifier:sourceIdentifier]) {
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data
{
if (self = [super initWithSourceIdentifier:sourceIdentifier])
{
_geoJSONData = data;
}
return self;
}

- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data options:(MGLGeoJSONOptions *)options
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier geoJSONData:(NSData *)data options:(NS_DICTIONARY_OF(NSString *, id) *)options
{
if (self = [super initWithSourceIdentifier:sourceIdentifier]) {
if (self = [super initWithSourceIdentifier:sourceIdentifier])
{
_geoJSONData = data;
_geoJSONOptions = options;
_options = options;
}
return self;
}

- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url
{
if (self = [super initWithSourceIdentifier:sourceIdentifier])
{
_URL = url;
}
return self;
}

- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url {
if (self = [super initWithSourceIdentifier:sourceIdentifier]) {
- (instancetype)initWithSourceIdentifier:(NSString *)sourceIdentifier URL:(NSURL *)url options:(NS_DICTIONARY_OF(NSString *, id) *)options
{
if (self = [super initWithSourceIdentifier:sourceIdentifier])
{
_URL = url;
_options = options;
}
return self;
}

- (mbgl::style::GeoJSONOptions)mbgl_geoJSONOptions
{
auto options = mbgl::style::GeoJSONOptions();
options.maxzoom = self.geoJSONOptions.maximumZoom;
options.buffer = self.geoJSONOptions.buffer;
options.tolerance = self.geoJSONOptions.tolerance;
options.cluster = self.geoJSONOptions.cluster;
options.clusterRadius = self.geoJSONOptions.clusterRadius;
options.clusterMaxZoom = self.geoJSONOptions.clusterMaximumZoom;

setOptionForKeyWithValue(MGLGeoJSONMaxZoomLevelOptionName, &options.maxzoom, self.options);
setOptionForKeyWithValue(MGLGeoJSONBufferOptionName, &options.buffer, self.options);
setOptionForKeyWithValue(MGLGeoJSONToleranceOptionName, &options.tolerance, self.options);
setOptionForKeyWithValue(MGLGeoJSONClusterRadiusOptionName, &options.clusterRadius, self.options);
setOptionForKeyWithValue(MGLGeoJSONClusterMaximumZoomLevelOptionName, &options.clusterMaxZoom, self.options);

if ([self.options objectForKey:MGLGeoJSONClusterOptionName])
{
BOOL isKindOfNumber = [[self.options objectForKey:MGLGeoJSONClusterOptionName] isKindOfClass:[NSNumber class]];
if (isKindOfNumber)
{
BOOL representsBoolean = strcmp([(NSNumber *)[self.options objectForKey:MGLGeoJSONClusterOptionName] objCType], @encode(char)) == 0;
if (representsBoolean)
{
options.cluster = [self.options[MGLGeoJSONClusterOptionName] boolValue];
}
}
}

return options;
}

template<typename T>
void setOptionForKeyWithValue(NSString *key, T *value, NSDictionary *options)
{
if (! [options objectForKey:key]) return;

id keyValue = [options objectForKey:key];
BOOL isKindOfNumber = [keyValue isKindOfClass:[NSNumber class]];

// if we are dealing with an NSNumber then determine the selector to extract
// its value based on its type and then call that selector, assigning the value
// to the passed in mbgl options value
if (isKindOfNumber)
{
SEL sel;
if (strcmp([keyValue objCType], @encode(int)) == 0) {
sel = @selector(integerValue);
} else {
sel = @selector(doubleValue);
}
IMP imp = [options[key] methodForSelector:sel];
T (*func)(id, SEL) = (T (*)(id, SEL))imp;
*value = func(options[key], sel);
}
}

- (std::unique_ptr<mbgl::style::Source>)mbgl_source
{
auto source = self.geoJSONOptions
? std::make_unique<mbgl::style::GeoJSONSource>(self.sourceIdentifier.UTF8String, [self mbgl_geoJSONOptions])
: std::make_unique<mbgl::style::GeoJSONSource>(self.sourceIdentifier.UTF8String);
auto source = std::make_unique<mbgl::style::GeoJSONSource>(self.sourceIdentifier.UTF8String, [self mbgl_geoJSONOptions]);

if (self.URL) {
NSURL *url = self.URL.mgl_URLByStandardizingScheme;
Expand Down
24 changes: 12 additions & 12 deletions platform/ios/ios.xcodeproj/project.pbxproj
Original file line number Diff line number Diff line change
Expand Up @@ -131,10 +131,6 @@
35E0CFE61D3E501500188327 /* MGLStyle_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E0CFE51D3E501500188327 /* MGLStyle_Private.h */; };
35E0CFE71D3E501500188327 /* MGLStyle_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E0CFE51D3E501500188327 /* MGLStyle_Private.h */; };
35E208A71D24210F00EC9A46 /* MGLNSDataAdditionsTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E208A61D24210F00EC9A46 /* MGLNSDataAdditionsTests.m */; };
35E751DC1D76BE9800DFF553 /* MGLGeoJSONOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E751DA1D76BE9800DFF553 /* MGLGeoJSONOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
35E751DD1D76BE9800DFF553 /* MGLGeoJSONOptions.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E751DA1D76BE9800DFF553 /* MGLGeoJSONOptions.h */; settings = {ATTRIBUTES = (Public, ); }; };
35E751DE1D76BE9800DFF553 /* MGLGeoJSONOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E751DB1D76BE9800DFF553 /* MGLGeoJSONOptions.m */; };
35E751DF1D76BE9800DFF553 /* MGLGeoJSONOptions.m in Sources */ = {isa = PBXBuildFile; fileRef = 35E751DB1D76BE9800DFF553 /* MGLGeoJSONOptions.m */; };
35E79F201D41266300957B9E /* MGLStyleLayer_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E79F1F1D41266300957B9E /* MGLStyleLayer_Private.h */; };
35E79F211D41266300957B9E /* MGLStyleLayer_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E79F1F1D41266300957B9E /* MGLStyleLayer_Private.h */; };
36F1153D1D46080700878E1A /* libmbgl-core.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 36F1153B1D46080700878E1A /* libmbgl-core.a */; };
Expand All @@ -144,6 +140,7 @@
4018B1CA1CDC288E00F666AF /* MGLAnnotationView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4018B1C51CDC277F00F666AF /* MGLAnnotationView.h */; settings = {ATTRIBUTES = (Public, ); }; };
4018B1CB1CDC288E00F666AF /* MGLAnnotationView.h in Headers */ = {isa = PBXBuildFile; fileRef = 4018B1C51CDC277F00F666AF /* MGLAnnotationView.h */; settings = {ATTRIBUTES = (Public, ); }; };
404326891D5B9B27007111BD /* MGLAnnotationContainerView_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 404326881D5B9B1A007111BD /* MGLAnnotationContainerView_Private.h */; };
40CFA6511D7875BB008103BD /* MGLGeoJSONSourceTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 40CFA6501D787579008103BD /* MGLGeoJSONSourceTests.mm */; };
40EDA1C01CFE0E0200D9EA68 /* MGLAnnotationContainerView.h in Headers */ = {isa = PBXBuildFile; fileRef = 40EDA1BD1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.h */; };
40EDA1C11CFE0E0500D9EA68 /* MGLAnnotationContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 40EDA1BE1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.m */; };
40EDA1C21CFE0E0500D9EA68 /* MGLAnnotationContainerView.m in Sources */ = {isa = PBXBuildFile; fileRef = 40EDA1BE1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.m */; };
Expand Down Expand Up @@ -533,8 +530,6 @@
35D13AC21D3D19DD00AFB4E0 /* MGLFillStyleLayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLFillStyleLayer.mm; sourceTree = "<group>"; };
35E0CFE51D3E501500188327 /* MGLStyle_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLStyle_Private.h; sourceTree = "<group>"; };
35E208A61D24210F00EC9A46 /* MGLNSDataAdditionsTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLNSDataAdditionsTests.m; sourceTree = "<group>"; };
35E751DA1D76BE9800DFF553 /* MGLGeoJSONOptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLGeoJSONOptions.h; sourceTree = "<group>"; };
35E751DB1D76BE9800DFF553 /* MGLGeoJSONOptions.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLGeoJSONOptions.m; sourceTree = "<group>"; };
35E79F1F1D41266300957B9E /* MGLStyleLayer_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLStyleLayer_Private.h; sourceTree = "<group>"; };
36F1153B1D46080700878E1A /* libmbgl-core.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmbgl-core.a"; path = "build/Debug-iphoneos/libmbgl-core.a"; sourceTree = "<group>"; };
36F1153C1D46080700878E1A /* libmbgl-platform-ios.a */ = {isa = PBXFileReference; lastKnownFileType = archive.ar; name = "libmbgl-platform-ios.a"; path = "build/Debug-iphoneos/libmbgl-platform-ios.a"; sourceTree = "<group>"; };
Expand All @@ -543,6 +538,7 @@
4018B1C51CDC277F00F666AF /* MGLAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLAnnotationView.h; sourceTree = "<group>"; };
402E9DE01CD2C76200FD4519 /* Mapbox.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = Mapbox.playground; sourceTree = "<group>"; };
404326881D5B9B1A007111BD /* MGLAnnotationContainerView_Private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLAnnotationContainerView_Private.h; sourceTree = "<group>"; };
40CFA6501D787579008103BD /* MGLGeoJSONSourceTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLGeoJSONSourceTests.mm; sourceTree = "<group>"; };
40EDA1BD1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLAnnotationContainerView.h; sourceTree = "<group>"; };
40EDA1BE1CFE0D4A00D9EA68 /* MGLAnnotationContainerView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MGLAnnotationContainerView.m; sourceTree = "<group>"; };
40FDA7691CCAAA6800442548 /* MBXAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBXAnnotationView.h; sourceTree = "<group>"; };
Expand Down Expand Up @@ -784,8 +780,6 @@
3566C7651D4A77BA008152BC /* MGLGeoJSONSource.mm */,
3566C76A1D4A8DFA008152BC /* MGLRasterSource.h */,
3566C76B1D4A8DFA008152BC /* MGLRasterSource.mm */,
35E751DA1D76BE9800DFF553 /* MGLGeoJSONOptions.h */,
35E751DB1D76BE9800DFF553 /* MGLGeoJSONOptions.m */,
);
name = Sources;
sourceTree = "<group>";
Expand Down Expand Up @@ -858,6 +852,7 @@
isa = PBXGroup;
children = (
3575798F1D513EF1000B822E /* Layers */,
40CFA64E1D78754A008103BD /* Sources */,
);
name = Styling;
sourceTree = "<group>";
Expand Down Expand Up @@ -896,6 +891,14 @@
name = Playground;
sourceTree = "<group>";
};
40CFA64E1D78754A008103BD /* Sources */ = {
isa = PBXGroup;
children = (
40CFA6501D787579008103BD /* MGLGeoJSONSourceTests.mm */,
);
name = Sources;
sourceTree = "<group>";
};
DA1DC9411CB6C1C2006E619F = {
isa = PBXGroup;
children = (
Expand Down Expand Up @@ -1337,7 +1340,6 @@
354D42DC1D4919F900F400A1 /* NSValue+MGLStyleAttributeAdditions_Private.h in Headers */,
DA88488E1CBB047F00AB86E3 /* reachability.h in Headers */,
350098DC1D484E60004B2AF0 /* NSValue+MGLStyleAttributeAdditions.h in Headers */,
35E751DC1D76BE9800DFF553 /* MGLGeoJSONOptions.h in Headers */,
DA8848231CBAFA6200AB86E3 /* MGLOfflineStorage_Private.h in Headers */,
404326891D5B9B27007111BD /* MGLAnnotationContainerView_Private.h in Headers */,
DA88483B1CBAFB8500AB86E3 /* MGLCalloutView.h in Headers */,
Expand Down Expand Up @@ -1447,7 +1449,6 @@
3566C7721D4A9198008152BC /* MGLSource_Private.h in Headers */,
353933FF1D3FB7DD003F57D7 /* MGLSymbolStyleLayer.h in Headers */,
DABFB8661CBE99E500D62B32 /* MGLPointAnnotation.h in Headers */,
35E751DD1D76BE9800DFF553 /* MGLGeoJSONOptions.h in Headers */,
35599DF11D46F3A60048254D /* MGLStyleAttributeValue.h in Headers */,
DABFB8621CBE99E500D62B32 /* MGLOfflinePack.h in Headers */,
DAD1656D1CF41981001FF4B9 /* MGLFeature.h in Headers */,
Expand Down Expand Up @@ -1807,6 +1808,7 @@
357579851D502AF5000B822E /* MGLSymbolStyleLayerTests.m in Sources */,
357579871D502AFE000B822E /* MGLLineStyleLayerTests.m in Sources */,
357579891D502B06000B822E /* MGLCircleStyleLayerTests.m in Sources */,
40CFA6511D7875BB008103BD /* MGLGeoJSONSourceTests.mm in Sources */,
DA35A2C51CCA9F8300E826B2 /* MGLClockDirectionFormatterTests.m in Sources */,
3575798B1D502B0C000B822E /* MGLBackgroundStyleLayerTests.m in Sources */,
DA2E88621CC0382C00F24E7B /* MGLOfflinePackTests.m in Sources */,
Expand Down Expand Up @@ -1865,7 +1867,6 @@
DA88481F1CBAFA6200AB86E3 /* MGLMultiPoint.mm in Sources */,
DA88482B1CBAFA6200AB86E3 /* MGLTypes.m in Sources */,
4018B1C71CDC287F00F666AF /* MGLAnnotationView.mm in Sources */,
35E751DE1D76BE9800DFF553 /* MGLGeoJSONOptions.m in Sources */,
DA88481D1CBAFA6200AB86E3 /* MGLMapCamera.mm in Sources */,
DA8848261CBAFA6200AB86E3 /* MGLPolygon.mm in Sources */,
DA8848521CBAFB9800AB86E3 /* MGLAPIClient.m in Sources */,
Expand Down Expand Up @@ -1930,7 +1931,6 @@
DAA4E4301CBB730400178DFB /* MGLLocationManager.m in Sources */,
DAA4E4321CBB730400178DFB /* MGLMapView.mm in Sources */,
DAA4E41E1CBB730400178DFB /* MGLMapCamera.mm in Sources */,
35E751DF1D76BE9800DFF553 /* MGLGeoJSONOptions.m in Sources */,
4018B1C81CDC287F00F666AF /* MGLAnnotationView.mm in Sources */,
DAA4E4341CBB730400178DFB /* MGLFaux3DUserLocationAnnotationView.m in Sources */,
DAA4E4311CBB730400178DFB /* MGLMapboxEvents.m in Sources */,
Expand Down
1 change: 0 additions & 1 deletion platform/ios/src/Mapbox.h
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,6 @@ FOUNDATION_EXPORT const unsigned char MapboxVersionString[];
#import "MGLSource.h"
#import "MGLVectorSource.h"
#import "MGLGeoJSONSource.h"
#import "MGLGeoJSONOptions.h"
#import "MGLRasterSource.h"
#import "MGLTilePyramidOfflineRegion.h"
#import "MGLTypes.h"
Expand Down
Loading

0 comments on commit 2495143

Please sign in to comment.