[ios, macos] Support getLeaves (and related) clustering methods (#12952) following feature extension API (#13382)

This commit is contained in:
Julian Rex
2019-01-14 15:17:13 -05:00
committed by GitHub
parent 2342b8ee93
commit c8c664fbf3
21 changed files with 470 additions and 36 deletions

View File

@@ -120,7 +120,7 @@ dictionary contains the `floorCount` key, then the key path `floorCount` refers
to the value of the `floorCount` attribute when evaluating that particular
polygon.
The following special attribute is also available on features that are produced
The following special attributes are also available on features that are produced
as a result of clustering multiple point features together in a shape source:
<table>
@@ -128,6 +128,16 @@ as a result of clustering multiple point features together in a shape source:
<tr><th>Attribute</th><th>Type</th><th>Meaning</th></tr>
</thead>
<tbody>
<tr>
<td><code>cluster</code></td>
<td>Bool</td>
<td>True if the feature is a point cluster. If the attribute is false (or not present) then the feature should not be considered a cluster.</td>
</tr>
<tr>
<td><code>cluster_id</code></td>
<td>Number</td>
<td>Identifier for the point cluster.</td>
</tr>
<tr>
<td><code>point_count</code></td>
<td>Number</td>

View File

@@ -0,0 +1,53 @@
#import "MGLFoundation.h"
@protocol MGLFeature;
NS_ASSUME_NONNULL_BEGIN
/**
An `NSUInteger` constant used to indicate an invalid cluster identifier.
This indicates a missing cluster feature.
*/
FOUNDATION_EXTERN MGL_EXPORT const NSUInteger MGLClusterIdentifierInvalid;
/**
A protocol that feature subclasses (i.e. those already conforming to
the `MGLFeature` protocol) conform to if they represent clusters.
Currently the only class that conforms to `MGLCluster` is
`MGLPointFeatureCluster` (a subclass of `MGLPointFeature`).
To check if a feature is a cluster, check conformity to `MGLCluster`, for
example:
```swift
let shape = try! MGLShape(data: clusterShapeData, encoding: String.Encoding.utf8.rawValue)
guard let pointFeature = shape as? MGLPointFeature else {
throw ExampleError.unexpectedFeatureType
}
// Check for cluster conformance
guard let cluster = pointFeature as? MGLCluster else {
throw ExampleError.featureIsNotACluster
}
// Currently the only supported class that conforms to `MGLCluster` is
// `MGLPointFeatureCluster`
guard cluster is MGLPointFeatureCluster else {
throw ExampleError.unexpectedFeatureType
}
```
*/
MGL_EXPORT
@protocol MGLCluster <MGLFeature>
/** The identifier for the cluster. */
@property (nonatomic, readonly) NSUInteger clusterIdentifier;
/** The number of points within this cluster */
@property (nonatomic, readonly) NSUInteger clusterPointCount;
@end
NS_ASSUME_NONNULL_END

View File

@@ -6,6 +6,7 @@
#import "MGLPointAnnotation.h"
#import "MGLPointCollection.h"
#import "MGLShapeCollection.h"
#import "MGLCluster.h"
NS_ASSUME_NONNULL_BEGIN
@@ -186,12 +187,27 @@ MGL_EXPORT
#### Related examples
See the <a href="https://www.mapbox.com/ios-sdk/maps/examples/runtime-multiple-annotations/">
Dynamically style interactive points</a> example to learn how to initialize
`MGLPointFeature` objects and add it them your map.
`MGLPointFeature` objects and add them to your map.
*/
MGL_EXPORT
@interface MGLPointFeature : MGLPointAnnotation <MGLFeature>
@end
/**
An `MGLPointFeatureCluster` object associates a point shape (with an optional
identifier and attributes) and represents a point cluster.
@see `MGLCluster`
#### Related examples
See the <a href="https://www.mapbox.com/ios-sdk/maps/examples/clustering/">
Clustering point data</a> example to learn how to initialize
clusters and add them to your map.
*/
MGL_EXPORT
@interface MGLPointFeatureCluster : MGLPointFeature <MGLCluster>
@end
/**
An `MGLPolylineFeature` object associates a polyline shape with an optional
identifier and attributes.

View File

@@ -1,4 +1,6 @@
#import "MGLFoundation_Private.h"
#import "MGLFeature_Private.h"
#import "MGLCluster.h"
#import "MGLPointAnnotation.h"
#import "MGLPolyline.h"
@@ -19,6 +21,11 @@
#import <mbgl/style/conversion/geojson.hpp>
#import <mapbox/feature.hpp>
// Cluster constants
static NSString * const MGLClusterIdentifierKey = @"cluster_id";
static NSString * const MGLClusterCountKey = @"point_count";
const NSUInteger MGLClusterIdentifierInvalid = NSUIntegerMax;
@interface MGLEmptyFeature ()
@end
@@ -92,6 +99,31 @@ MGL_DEFINE_FEATURE_ATTRIBUTES_GETTER();
@end
@implementation MGLPointFeatureCluster
- (NSUInteger)clusterIdentifier {
NSNumber *clusterNumber = MGL_OBJC_DYNAMIC_CAST([self attributeForKey:MGLClusterIdentifierKey], NSNumber);
MGLAssert(clusterNumber, @"Clusters should have a cluster_id");
if (!clusterNumber) {
return MGLClusterIdentifierInvalid;
}
NSUInteger clusterIdentifier = [clusterNumber unsignedIntegerValue];
MGLAssert(clusterIdentifier <= UINT32_MAX, @"Cluster identifiers are 32bit");
return clusterIdentifier;
}
- (NSUInteger)clusterPointCount {
NSNumber *count = MGL_OBJC_DYNAMIC_CAST([self attributeForKey:MGLClusterCountKey], NSNumber);
MGLAssert(count, @"Clusters should have a point_count");
return [count unsignedIntegerValue];
}
@end
@interface MGLPolylineFeature ()
@end
@@ -318,14 +350,38 @@ MGL_DEFINE_FEATURE_ATTRIBUTES_GETTER();
*/
template <typename T>
class GeometryEvaluator {
private:
const mbgl::PropertyMap *shared_properties;
public:
GeometryEvaluator(const mbgl::PropertyMap *properties = nullptr):
shared_properties(properties)
{}
MGLShape <MGLFeature> * operator()(const mbgl::EmptyGeometry &) const {
MGLEmptyFeature *feature = [[MGLEmptyFeature alloc] init];
return feature;
}
MGLShape <MGLFeature> * operator()(const mbgl::Point<T> &geometry) const {
MGLPointFeature *feature = [[MGLPointFeature alloc] init];
Class pointFeatureClass = [MGLPointFeature class];
// If we're dealing with a cluster, we should change the class type.
// This could be generic and build the subclass at runtime if it turns
// out we need to support more than point clusters.
if (shared_properties) {
auto clusterIt = shared_properties->find("cluster");
if (clusterIt != shared_properties->end()) {
auto clusterValue = clusterIt->second;
if (clusterValue.template is<bool>()) {
if (clusterValue.template get<bool>()) {
pointFeatureClass = [MGLPointFeatureCluster class];
}
}
}
}
MGLPointFeature *feature = [[pointFeatureClass alloc] init];
feature.coordinate = toLocationCoordinate2D(geometry);
return feature;
}
@@ -443,7 +499,7 @@ id <MGLFeature> MGLFeatureFromMBGLFeature(const mbgl::Feature &feature) {
ValueEvaluator evaluator;
attributes[@(pair.first.c_str())] = mbgl::Value::visit(value, evaluator);
}
GeometryEvaluator<double> evaluator;
GeometryEvaluator<double> evaluator(&feature.properties);
MGLShape <MGLFeature> *shape = mapbox::geometry::geometry<double>::visit(feature.geometry, evaluator);
if (!feature.id.is<mapbox::feature::null_value_t>()) {
shape.identifier = mbgl::FeatureIdentifier::visit(feature.id, ValueEvaluator());

View File

@@ -18,6 +18,7 @@ NSArray<MGLShape <MGLFeature> *> *MGLFeaturesFromMBGLFeatures(const std::vector<
/**
Returns an `MGLFeature` object converted from the given mbgl::Feature
*/
MGL_EXPORT
id <MGLFeature> MGLFeatureFromMBGLFeature(const mbgl::Feature &feature);
/**

View File

@@ -11,3 +11,9 @@ void MGLInitializeRunLoop();
(type *)([temp##__LINE__ isKindOfClass:[type class]] ? temp##__LINE__ : nil); \
})
#define MGL_OBJC_DYNAMIC_CAST_AS_PROTOCOL(object, proto) \
({ \
__typeof__( object ) temp##__LINE__ = (object); \
(id< proto >)([temp##__LINE__ conformsToProtocol:@protocol( proto )] ? temp##__LINE__ : nil); \
})

View File

@@ -5,6 +5,8 @@
NS_ASSUME_NONNULL_BEGIN
@protocol MGLFeature;
@class MGLPointFeature;
@class MGLPointFeatureCluster;
@class MGLShape;
/**
@@ -321,6 +323,46 @@ MGL_EXPORT
*/
- (NSArray<id <MGLFeature>> *)featuresMatchingPredicate:(nullable NSPredicate *)predicate;
/**
Returns an array of map features that are the leaves of the specified cluster.
("Leaves" are the original points that belong to the cluster.)
This method supports pagination; you supply an offset (number of features to skip)
and a maximum number of features to return.
@param cluster An object of type `MGLPointFeatureCluster` (that conforms to the `MGLCluster` protocol).
@param offset Number of features to skip.
@param limit The maximum number of features to return
@return An array of objects that conform to the `MGLFeature` protocol.
*/
- (NSArray<id <MGLFeature>> *)leavesOfCluster:(MGLPointFeatureCluster *)cluster offset:(NSUInteger)offset limit:(NSUInteger)limit;
/**
Returns an array of map features that are the immediate children of the specified
cluster *on the next zoom level*. The may include features that also conform to
the `MGLCluster` protocol (currently only objects of type `MGLPointFeatureCluster`).
@param cluster An object of type `MGLPointFeatureCluster` (that conforms to the `MGLCluster` protocol).
@return An array of objects that conform to the `MGLFeature` protocol.
@note The returned array may contain the `cluster` that was passed in, if the next
zoom level doesn't match the zoom level for expanding that cluster. See
`-[MGLShapeSource zoomLevelForExpandingCluster:]`.
*/
- (NSArray<id<MGLFeature>> *)childrenOfCluster:(MGLPointFeatureCluster *)cluster;
/**
Returns the zoom level at which the given cluster expands.
@param cluster An object of type `MGLPointFeatureCluster` (that conforms to the `MGLCluster` protocol).
@return Zoom level. This should be >= 0; any negative return value should be
considered an error.
*/
- (double)zoomLevelForExpandingCluster:(MGLPointFeatureCluster *)cluster;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,10 +1,13 @@
#import "MGLFoundation_Private.h"
#import "MGLShapeSource_Private.h"
#import "MGLLoggingConfiguration_Private.h"
#import "MGLStyle_Private.h"
#import "MGLMapView_Private.h"
#import "MGLSource_Private.h"
#import "MGLFeature_Private.h"
#import "MGLShape_Private.h"
#import "MGLCluster.h"
#import "NSPredicate+MGLPrivateAdditions.h"
#import "NSURL+MGLAdditions.h"
@@ -184,4 +187,106 @@ mbgl::style::GeoJSONOptions MGLGeoJSONOptionsFromDictionary(NSDictionary<MGLShap
return MGLFeaturesFromMBGLFeatures(features);
}
#pragma mark - MGLCluster management
- (mbgl::optional<mbgl::FeatureExtensionValue>)featureExtensionValueOfCluster:(MGLShape<MGLCluster> *)cluster extension:(std::string)extension options:(const std::map<std::string, mbgl::Value>)options {
mbgl::optional<mbgl::FeatureExtensionValue> extensionValue;
// Check parameters
if (!self.rawSource || !self.mapView || !cluster) {
return extensionValue;
}
auto geoJSON = [cluster geoJSONObject];
if (!geoJSON.is<mbgl::Feature>()) {
MGLAssert(0, @"cluster geoJSON object is not a feature.");
return extensionValue;
}
auto clusterFeature = geoJSON.get<mbgl::Feature>();
extensionValue = self.mapView.renderer->queryFeatureExtensions(self.rawSource->getID(),
clusterFeature,
"supercluster",
extension,
options);
return extensionValue;
}
- (NSArray<id <MGLFeature>> *)leavesOfCluster:(MGLPointFeatureCluster *)cluster offset:(NSUInteger)offset limit:(NSUInteger)limit {
const std::map<std::string, mbgl::Value> options = {
{ "limit", static_cast<uint64_t>(limit) },
{ "offset", static_cast<uint64_t>(offset) }
};
auto featureExtension = [self featureExtensionValueOfCluster:cluster extension:"leaves" options:options];
if (!featureExtension) {
return @[];
}
if (!featureExtension->is<mbgl::FeatureCollection>()) {
return @[];
}
std::vector<mbgl::Feature> leaves = featureExtension->get<mbgl::FeatureCollection>();
return MGLFeaturesFromMBGLFeatures(leaves);
}
- (NSArray<id <MGLFeature>> *)childrenOfCluster:(MGLPointFeatureCluster *)cluster {
auto featureExtension = [self featureExtensionValueOfCluster:cluster extension:"children" options:{}];
if (!featureExtension) {
return @[];
}
if (!featureExtension->is<mbgl::FeatureCollection>()) {
return @[];
}
std::vector<mbgl::Feature> leaves = featureExtension->get<mbgl::FeatureCollection>();
return MGLFeaturesFromMBGLFeatures(leaves);
}
- (double)zoomLevelForExpandingCluster:(MGLPointFeatureCluster *)cluster {
auto featureExtension = [self featureExtensionValueOfCluster:cluster extension:"expansion-zoom" options:{}];
if (!featureExtension) {
return -1.0;
}
if (!featureExtension->is<mbgl::Value>()) {
return -1.0;
}
auto value = featureExtension->get<mbgl::Value>();
if (value.is<uint64_t>()) {
auto zoom = value.get<uint64_t>();
return static_cast<double>(zoom);
}
return -1.0;
}
- (void)debugRecursiveLogForFeature:(id <MGLFeature>)feature indent:(NSUInteger)indent {
NSString *description = feature.description;
// Want our recursive log on a single line
NSString *log = [description stringByReplacingOccurrencesOfString:@"\\s+"
withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, description.length)];
printf("%*s%s\n", (int)indent, "", log.UTF8String);
MGLPointFeatureCluster *cluster = MGL_OBJC_DYNAMIC_CAST(feature, MGLPointFeatureCluster);
if (cluster) {
for (id <MGLFeature> child in [self childrenOfCluster:cluster]) {
[self debugRecursiveLogForFeature:child indent:indent + 4];
}
}
}
@end

View File

@@ -12,4 +12,20 @@ namespace mbgl {
MGL_EXPORT
mbgl::style::GeoJSONOptions MGLGeoJSONOptionsFromDictionary(NSDictionary<MGLShapeSourceOption, id> *options);
@interface MGLShapeSource (Private)
/**
:nodoc:
Debug log showing structure of an `MGLFeature`. This method recurses in the case
that the feature conforms to `MGLCluster`. This method is used for testing and
should be considered experimental, likely to be removed or changed in future
releases.
@param feature An object that conforms to the `MGLFeature` protocol.
@param indent Used during recursion. Specify 0.
*/
- (void)debugRecursiveLogForFeature:(id<MGLFeature>)feature indent:(NSUInteger)indent;
@end
NS_ASSUME_NONNULL_END

View File

@@ -1,6 +1,9 @@
#import <Mapbox/Mapbox.h>
#import <XCTest/XCTest.h>
#import "MGLFoundation_Private.h"
#import "MGLCluster.h"
#if TARGET_OS_IPHONE
#import "MGLUserLocation_Private.h"
#endif
@@ -41,6 +44,36 @@
XCTAssertEqualObjects(pointFeature, unarchivedPointFeature);
}
- (void)testPointFeatureCluster {
MGLPointFeature *pointFeature = [[MGLPointFeatureCluster alloc] init];
pointFeature.title = @"title";
pointFeature.subtitle = @"subtitle";
pointFeature.identifier = @(123);
pointFeature.attributes = @{
@"cluster" : @(YES),
@"cluster_id" : @(456),
@"point_count" : @(2),
};
XCTAssert([pointFeature isKindOfClass:[MGLPointFeature class]], @"");
NSString *filePath = [self temporaryFilePathForClass:MGLPointFeature.class];
[NSKeyedArchiver archiveRootObject:pointFeature toFile:filePath];
MGLPointFeature *unarchivedPointFeature = [NSKeyedUnarchiver unarchiveObjectWithFile:filePath];
XCTAssertEqualObjects(pointFeature, unarchivedPointFeature);
// Unarchive process should ensure we still have a cluster
XCTAssert([unarchivedPointFeature isMemberOfClass:[MGLPointFeatureCluster class]]);
id<MGLCluster> cluster = MGL_OBJC_DYNAMIC_CAST_AS_PROTOCOL(unarchivedPointFeature, MGLCluster);
XCTAssert(cluster);
XCTAssert(cluster.clusterIdentifier == 456);
XCTAssert(cluster.clusterPointCount == 2);
}
- (void)testPolyline {
CLLocationCoordinate2D coordinates[] = {
CLLocationCoordinate2DMake(0.129631234123, 1.7812739312551),

View File

@@ -374,7 +374,7 @@ class MGLDocumentationExampleTests: XCTestCase, MGLMapViewDelegate {
return MGLDocumentationExampleTests.styleURL
}
}
//#-example-code
let camera = MGLMapCamera(lookingAtCenter: CLLocationCoordinate2D(latitude: 37.7184, longitude: -122.4365), altitude: 100, pitch: 20, heading: 0)
@@ -394,6 +394,61 @@ class MGLDocumentationExampleTests: XCTestCase, MGLMapViewDelegate {
wait(for: [expectation], timeout: 5)
}
func testMGLCluster() {
enum ExampleError: Error {
case unexpectedFeatureType
case featureIsNotACluster
}
let geoJSON: [String: Any] = [
"type" : "Feature",
"geometry" : [
"coordinates" : [
-77.00896639534831,
38.87031006108791,
0.0
],
"type" : "Point"
],
"properties" : [
"cluster" : true,
"cluster_id" : 123,
"point_count" : 4567,
]
]
let clusterShapeData = try! JSONSerialization.data(withJSONObject: geoJSON, options: [])
do {
//#-example-code
let shape = try! MGLShape(data: clusterShapeData, encoding: String.Encoding.utf8.rawValue)
guard let pointFeature = shape as? MGLPointFeature else {
throw ExampleError.unexpectedFeatureType
}
// Check for cluster conformance
guard let cluster = pointFeature as? MGLCluster else {
throw ExampleError.featureIsNotACluster
}
// Currently the only supported class that conforms to `MGLCluster` is
// `MGLPointFeatureCluster`
guard cluster is MGLPointFeatureCluster else {
throw ExampleError.unexpectedFeatureType
}
//#-end-example-code
XCTAssert(cluster.clusterIdentifier == 123)
XCTAssert(cluster.clusterPointCount == 4567)
}
catch let error {
XCTFail("Example failed with thrown error: \(error)")
}
}
// For testMGLMapView().
func myCustomFunction() {}
}

View File

@@ -2,6 +2,7 @@
#import <XCTest/XCTest.h>
#import <mbgl/util/geometry.hpp>
#import "MGLFoundation_Private.h"
#import "../../darwin/src/MGLFeature_Private.h"
@interface MGLFeatureTests : XCTestCase
@@ -85,6 +86,26 @@
[NSValue valueWithMGLCoordinate:CLLocationCoordinate2DMake(3, 2)]);
}
- (void)testClusterGeometryConversion {
mbgl::Point<double> point = { -90.066667, 29.95 };
mbgl::Feature pointFeature { point };
pointFeature.id = { UINT64_MAX };
pointFeature.properties["cluster"] = true;
pointFeature.properties["cluster_id"] = 1ULL;
pointFeature.properties["point_count"] = 5ULL;
id<MGLFeature> feature = MGLFeatureFromMBGLFeature(pointFeature);
XCTAssert([feature conformsToProtocol:@protocol(MGLFeature)]);
id<MGLCluster> cluster = MGL_OBJC_DYNAMIC_CAST_AS_PROTOCOL(feature, MGLCluster);
XCTAssert(cluster);
XCTAssert(cluster.clusterIdentifier == 1);
XCTAssert(cluster.clusterPointCount == 5);
XCTAssert([cluster isMemberOfClass:[MGLPointFeatureCluster class]]);
}
- (void)testPropertyConversion {
std::vector<mbgl::Feature> features;

View File

@@ -8,6 +8,8 @@ Mapbox welcomes participation and contributions from everyone. Please read [CONT
* Fixed a crash when casting large numbers in `NSExpression`. ([#13580](https://github.com/mapbox/mapbox-gl-native/pull/13580))
* Fixed a bug where the `animated` parameter to `-[MGLMapView selectAnnotation:animated:]` was being ignored. ([#13689](https://github.com/mapbox/mapbox-gl-native/pull/13689))
* Reinstates version 11 as the default Mapbox Streets style (as introduced in 4.7.0). ([#13690](https://github.com/mapbox/mapbox-gl-native/pull/13690))
* Added the `-[MGLShapeSource leavesOfCluster:offset:limit:]`, `-[MGLShapeSource childrenOfCluster:]`, `-[MGLShapeSource zoomLevelForExpandingCluster:]` methods for inspecting a cluster in an `MGLShapeSource`s created with the `MGLShapeSourceOptionClustered` option. Feature querying now returns clusters represented by `MGLPointFeatureCluster` objects (that conform to the `MGLCluster` protocol). ([#12952](https://github.com/mapbox/mapbox-gl-native/pull/12952)
## 4.7.1 - December 21, 2018

View File

@@ -170,7 +170,7 @@
35D13AC61D3D19DD00AFB4E0 /* MGLFillStyleLayer.mm in Sources */ = {isa = PBXBuildFile; fileRef = 35D13AC21D3D19DD00AFB4E0 /* MGLFillStyleLayer.mm */; };
35D3A1E61E9BE7EB002B38EE /* MGLScaleBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 355ADFFB1E9281DA00F3939D /* MGLScaleBar.h */; };
35D3A1E71E9BE7EC002B38EE /* MGLScaleBar.h in Headers */ = {isa = PBXBuildFile; fileRef = 355ADFFB1E9281DA00F3939D /* MGLScaleBar.h */; };
35D9DDE21DA25EEC00DAAD69 /* MGLCodingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.m */; };
35D9DDE21DA25EEC00DAAD69 /* MGLCodingTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.mm */; };
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 */; };
35E1A4D81D74336F007AA97F /* MGLValueEvaluator.h in Headers */ = {isa = PBXBuildFile; fileRef = 35E1A4D71D74336F007AA97F /* MGLValueEvaluator.h */; };
@@ -477,6 +477,8 @@
CA4EB8C720863487006AB465 /* MGLStyleLayerIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA4EB8C620863487006AB465 /* MGLStyleLayerIntegrationTests.m */; };
CA55CD41202C16AA00CE7095 /* MGLCameraChangeReason.h in Headers */ = {isa = PBXBuildFile; fileRef = CA55CD3E202C16AA00CE7095 /* MGLCameraChangeReason.h */; settings = {ATTRIBUTES = (Public, ); }; };
CA55CD42202C16AA00CE7095 /* MGLCameraChangeReason.h in Headers */ = {isa = PBXBuildFile; fileRef = CA55CD3E202C16AA00CE7095 /* MGLCameraChangeReason.h */; settings = {ATTRIBUTES = (Public, ); }; };
CA65C4F821E9BB080068B0D4 /* MGLCluster.h in Headers */ = {isa = PBXBuildFile; fileRef = CA65C4F721E9BB080068B0D4 /* MGLCluster.h */; settings = {ATTRIBUTES = (Public, ); }; };
CA65C4F921E9BB080068B0D4 /* MGLCluster.h in Headers */ = {isa = PBXBuildFile; fileRef = CA65C4F721E9BB080068B0D4 /* MGLCluster.h */; settings = {ATTRIBUTES = (Public, ); }; };
CA6914B520E67F50002DB0EE /* MGLAnnotationViewIntegrationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA6914B420E67F50002DB0EE /* MGLAnnotationViewIntegrationTests.m */; };
CA88DC3021C85D900059ED5A /* MGLStyleURLIntegrationTest.m in Sources */ = {isa = PBXBuildFile; fileRef = CA88DC2F21C85D900059ED5A /* MGLStyleURLIntegrationTest.m */; };
CA8FBC0921A47BB100D1203C /* MGLRendererConfigurationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA8FBC0821A47BB100D1203C /* MGLRendererConfigurationTests.mm */; };
@@ -935,7 +937,7 @@
35D13AB61D3D15E300AFB4E0 /* MGLStyleLayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLStyleLayer.mm; sourceTree = "<group>"; };
35D13AC11D3D19DD00AFB4E0 /* MGLFillStyleLayer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLFillStyleLayer.h; sourceTree = "<group>"; };
35D13AC21D3D19DD00AFB4E0 /* MGLFillStyleLayer.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLFillStyleLayer.mm; sourceTree = "<group>"; };
35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLCodingTests.m; path = ../../darwin/test/MGLCodingTests.m; sourceTree = "<group>"; };
35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLCodingTests.mm; path = ../../darwin/test/MGLCodingTests.mm; sourceTree = "<group>"; };
35DE35531EB7CBA8004917C5 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.stringsdict; name = sv; path = sv.lproj/Localizable.stringsdict; sourceTree = "<group>"; };
35E0CFE51D3E501500188327 /* MGLStyle_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLStyle_Private.h; sourceTree = "<group>"; };
35E1A4D71D74336F007AA97F /* MGLValueEvaluator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLValueEvaluator.h; sourceTree = "<group>"; };
@@ -1049,7 +1051,7 @@
40FDA7691CCAAA6800442548 /* MBXAnnotationView.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MBXAnnotationView.h; sourceTree = "<group>"; };
40FDA76A1CCAAA6800442548 /* MBXAnnotationView.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = MBXAnnotationView.m; sourceTree = "<group>"; };
554180411D2E97DE00012372 /* OpenGLES.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGLES.framework; path = System/Library/Frameworks/OpenGLES.framework; sourceTree = SDKROOT; };
556660C91E1BF3A900E2C41B /* MGLFoundation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLFoundation.h; sourceTree = "<group>"; };
556660C91E1BF3A900E2C41B /* MGLFoundation.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = MGLFoundation.h; sourceTree = "<group>"; wrapsLines = 0; };
556660D71E1D085500E2C41B /* MGLVersionNumber.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MGLVersionNumber.m; path = ../../darwin/test/MGLVersionNumber.m; sourceTree = "<group>"; };
558DE79E1E5615E400C7916D /* MGLFoundation_Private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLFoundation_Private.h; sourceTree = "<group>"; };
558DE79F1E5615E400C7916D /* MGLFoundation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLFoundation.mm; sourceTree = "<group>"; };
@@ -1143,6 +1145,7 @@
CA4EB8C620863487006AB465 /* MGLStyleLayerIntegrationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLStyleLayerIntegrationTests.m; sourceTree = "<group>"; };
CA55CD3E202C16AA00CE7095 /* MGLCameraChangeReason.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLCameraChangeReason.h; sourceTree = "<group>"; };
CA5E5042209BDC5F001A8A81 /* MGLTestUtility.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = MGLTestUtility.h; path = ../../darwin/test/MGLTestUtility.h; sourceTree = "<group>"; };
CA65C4F721E9BB080068B0D4 /* MGLCluster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLCluster.h; sourceTree = "<group>"; };
CA6914B420E67F50002DB0EE /* MGLAnnotationViewIntegrationTests.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; name = MGLAnnotationViewIntegrationTests.m; path = "Annotation Tests/MGLAnnotationViewIntegrationTests.m"; sourceTree = "<group>"; };
CA88DC2F21C85D900059ED5A /* MGLStyleURLIntegrationTest.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = MGLStyleURLIntegrationTest.m; sourceTree = "<group>"; };
CA8FBC0821A47BB100D1203C /* MGLRendererConfigurationTests.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLRendererConfigurationTests.mm; path = ../../darwin/test/MGLRendererConfigurationTests.mm; sourceTree = "<group>"; };
@@ -1982,7 +1985,7 @@
353D23951D0B0DFE002BE09D /* MGLAnnotationViewTests.m */,
DAEDC4331D603417000224FF /* MGLAttributionInfoTests.m */,
DA35A2C31CCA9F8300E826B2 /* MGLClockDirectionFormatterTests.m */,
35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.m */,
35D9DDE11DA25EEC00DAAD69 /* MGLCodingTests.mm */,
DA35A2C41CCA9F8300E826B2 /* MGLCompassDirectionFormatterTests.m */,
DA35A2A91CCA058D00E826B2 /* MGLCoordinateFormatterTests.m */,
3598544C1E1D38AA00B29F84 /* MGLDistanceFormatterTests.m */,
@@ -2207,30 +2210,31 @@
DAD165811CF4CFC4001FF4B9 /* Geometry */ = {
isa = PBXGroup;
children = (
CA65C4F721E9BB080068B0D4 /* MGLCluster.h */,
DA8847E01CBAFA5100AB86E3 /* MGLAnnotation.h */,
DAD165691CF41981001FF4B9 /* MGLFeature.h */,
DAD1656A1CF41981001FF4B9 /* MGLFeature_Private.h */,
DAD165691CF41981001FF4B9 /* MGLFeature.h */,
DAD1656B1CF41981001FF4B9 /* MGLFeature.mm */,
DA8847E11CBAFA5100AB86E3 /* MGLGeometry.h */,
DA8848011CBAFA6200AB86E3 /* MGLGeometry_Private.h */,
DA8847E11CBAFA5100AB86E3 /* MGLGeometry.h */,
DA8848021CBAFA6200AB86E3 /* MGLGeometry.mm */,
DA8847E31CBAFA5100AB86E3 /* MGLMultiPoint.h */,
DA8848041CBAFA6200AB86E3 /* MGLMultiPoint_Private.h */,
DA8847E31CBAFA5100AB86E3 /* MGLMultiPoint.h */,
DA8848051CBAFA6200AB86E3 /* MGLMultiPoint.mm */,
DA8847E71CBAFA5100AB86E3 /* MGLOverlay.h */,
DA8847E81CBAFA5100AB86E3 /* MGLPointAnnotation.h */,
DA88480B1CBAFA6200AB86E3 /* MGLPointAnnotation.mm */,
4049C29B1DB6CD6C00B3F799 /* MGLPointCollection.h */,
4049C2AB1DB6E05500B3F799 /* MGLPointCollection_Private.h */,
4049C29B1DB6CD6C00B3F799 /* MGLPointCollection.h */,
4049C29C1DB6CD6C00B3F799 /* MGLPointCollection.mm */,
DA8847E91CBAFA5100AB86E3 /* MGLPolygon.h */,
9654C1271FFC1CC000DB6A19 /* MGLPolygon_Private.h */,
DA8847E91CBAFA5100AB86E3 /* MGLPolygon.h */,
DA88480C1CBAFA6200AB86E3 /* MGLPolygon.mm */,
DA8847EA1CBAFA5100AB86E3 /* MGLPolyline.h */,
9654C1251FFC1AB900DB6A19 /* MGLPolyline_Private.h */,
DA8847EA1CBAFA5100AB86E3 /* MGLPolyline.h */,
DA88480D1CBAFA6200AB86E3 /* MGLPolyline.mm */,
DA8847EB1CBAFA5100AB86E3 /* MGLShape.h */,
40CF6DBA1DAC3C1800A4D18B /* MGLShape_Private.h */,
DA8847EB1CBAFA5100AB86E3 /* MGLShape.h */,
DA88480E1CBAFA6200AB86E3 /* MGLShape.mm */,
DAD165761CF4CDFF001FF4B9 /* MGLShapeCollection.h */,
DAD165771CF4CDFF001FF4B9 /* MGLShapeCollection.mm */,
@@ -2351,6 +2355,7 @@
DA88483A1CBAFB8500AB86E3 /* MGLAnnotationImage.h in Headers */,
74CB5EBD219B280400102936 /* MGLFillStyleLayer_Private.h in Headers */,
DAF2571B201901E200367EF5 /* MGLHillshadeStyleLayer.h in Headers */,
CA65C4F821E9BB080068B0D4 /* MGLCluster.h in Headers */,
DA35A2BB1CCA9A6900E826B2 /* MGLClockDirectionFormatter.h in Headers */,
353933FE1D3FB7DD003F57D7 /* MGLSymbolStyleLayer.h in Headers */,
DA8848201CBAFA6200AB86E3 /* MGLOfflinePack_Private.h in Headers */,
@@ -2571,6 +2576,7 @@
071BBB041EE76147001FB02A /* MGLImageSource.h in Headers */,
74CB5EC0219B280400102936 /* MGLHeatmapStyleLayer_Private.h in Headers */,
74CB5ECB219B285000102936 /* MGLLineStyleLayer_Private.h in Headers */,
CA65C4F921E9BB080068B0D4 /* MGLCluster.h in Headers */,
DABFB8611CBE99E500D62B32 /* MGLMultiPoint.h in Headers */,
74CB5ECD219B285000102936 /* MGLOpenGLStyleLayer_Private.h in Headers */,
74CB5ECF219B285000102936 /* MGLRasterStyleLayer_Private.h in Headers */,
@@ -3080,7 +3086,7 @@
170C437D2029D97900863DF0 /* MGLHeatmapStyleLayerTests.mm in Sources */,
170C437C2029D96F00863DF0 /* MGLHeatmapColorTests.mm in Sources */,
357579801D501E09000B822E /* MGLFillStyleLayerTests.mm in Sources */,
35D9DDE21DA25EEC00DAAD69 /* MGLCodingTests.m in Sources */,
35D9DDE21DA25EEC00DAAD69 /* MGLCodingTests.mm in Sources */,
DA1F8F3D1EBD287B00367E42 /* MGLDocumentationGuideTests.swift in Sources */,
076171C32139C70900668A35 /* MGLMapViewTests.m in Sources */,
3598544D1E1D38AA00B29F84 /* MGLDistanceFormatterTests.m in Sources */,

View File

@@ -69,12 +69,14 @@ custom_categories:
children:
- MGLFeature
- MGLPointFeature
- MGLPointFeatureCluster
- MGLPolygonFeature
- MGLPolylineFeature
- MGLMultiPolygonFeature
- MGLMultiPolylineFeature
- MGLPointCollectionFeature
- MGLShapeCollectionFeature
- MGLEmptyFeature
- name: Style Content
children:
- MGLSource

View File

@@ -136,6 +136,7 @@
"MGLFillStyleLayer.h": "platform/darwin/src/MGLFillStyleLayer.h",
"MGLAnnotationImage.h": "platform/ios/src/MGLAnnotationImage.h",
"MGLHillshadeStyleLayer.h": "platform/darwin/src/MGLHillshadeStyleLayer.h",
"MGLCluster.h": "platform/darwin/src/MGLCluster.h",
"MGLClockDirectionFormatter.h": "platform/darwin/src/MGLClockDirectionFormatter.h",
"MGLSymbolStyleLayer.h": "platform/darwin/src/MGLSymbolStyleLayer.h",
"MGLAttributionInfo.h": "platform/darwin/src/MGLAttributionInfo.h",

View File

@@ -14,6 +14,7 @@ FOUNDATION_EXPORT MGL_EXPORT const unsigned char MapboxVersionString[];
#import "MGLAnnotationImage.h"
#import "MGLCalloutView.h"
#import "MGLClockDirectionFormatter.h"
#import "MGLCluster.h"
#import "MGLCompassDirectionFormatter.h"
#import "MGLCoordinateFormatter.h"
#import "MGLDistanceFormatter.h"

View File

@@ -4,6 +4,8 @@
* Added an `MGLStyle.performsPlacementTransitions` property to control how long it takes for colliding labels to fade out. ([#13565](https://github.com/mapbox/mapbox-gl-native/pull/13565))
* Fixed a crash when casting large numbers in `NSExpression`. ([#13580](https://github.com/mapbox/mapbox-gl-native/pull/13580))
* Added the `-[MGLShapeSource leavesOfCluster:offset:limit:]`, `-[MGLShapeSource childrenOfCluster:]`, `-[MGLShapeSource zoomLevelForExpandingCluster:]` methods for inspecting a cluster in an `MGLShapeSource`s created with the `MGLShapeSourceOptionClustered` option. Feature querying now returns clusters represented by `MGLPointFeatureCluster` objects (that conform to the `MGLCluster` protocol). ([#12952](https://github.com/mapbox/mapbox-gl-native/pull/12952)
## 0.13.0 - December 20, 2018

View File

@@ -31,7 +31,7 @@
1FC481852098F323000D09B4 /* NSPredicate+MGLPrivateAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 1FC481842098F323000D09B4 /* NSPredicate+MGLPrivateAdditions.h */; };
3508EC641D749D39009B0EE4 /* NSExpression+MGLAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = 3508EC621D749D39009B0EE4 /* NSExpression+MGLAdditions.h */; settings = {ATTRIBUTES = (Public, ); }; };
3508EC651D749D39009B0EE4 /* NSExpression+MGLAdditions.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3508EC631D749D39009B0EE4 /* NSExpression+MGLAdditions.mm */; };
3526EABD1DF9B19800006B43 /* MGLCodingTests.m in Sources */ = {isa = PBXBuildFile; fileRef = 3526EABC1DF9B19800006B43 /* MGLCodingTests.m */; };
3526EABD1DF9B19800006B43 /* MGLCodingTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = 3526EABC1DF9B19800006B43 /* MGLCodingTests.mm */; };
352742781D4C220900A1ECE6 /* MGLStyleValue.h in Headers */ = {isa = PBXBuildFile; fileRef = 352742771D4C220900A1ECE6 /* MGLStyleValue.h */; settings = {ATTRIBUTES = (Public, ); }; };
352742811D4C243B00A1ECE6 /* MGLSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 3527427F1D4C243B00A1ECE6 /* MGLSource.h */; settings = {ATTRIBUTES = (Public, ); }; };
352742821D4C243B00A1ECE6 /* MGLSource.mm in Sources */ = {isa = PBXBuildFile; fileRef = 352742801D4C243B00A1ECE6 /* MGLSource.mm */; };
@@ -119,6 +119,7 @@
9654C12B1FFC38E000DB6A19 /* MGLPolyline_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C12A1FFC38E000DB6A19 /* MGLPolyline_Private.h */; };
9654C12D1FFC394700DB6A19 /* MGLPolygon_Private.h in Headers */ = {isa = PBXBuildFile; fileRef = 9654C12C1FFC394700DB6A19 /* MGLPolygon_Private.h */; };
96E027311E57C9A7004B8E66 /* Localizable.strings in Resources */ = {isa = PBXBuildFile; fileRef = 96E027331E57C9A7004B8E66 /* Localizable.strings */; };
CA4045C7216720D700B356E1 /* MGLCluster.h in Headers */ = {isa = PBXBuildFile; fileRef = CA4045C4216720D700B356E1 /* MGLCluster.h */; settings = {ATTRIBUTES = (Public, ); }; };
CA8FBC0D21A4A74300D1203C /* MGLRendererConfigurationTests.mm in Sources */ = {isa = PBXBuildFile; fileRef = CA8FBC0C21A4A74300D1203C /* MGLRendererConfigurationTests.mm */; };
CA9461A620884CCB0015EB12 /* MGLAnnotationTests.m in Sources */ = {isa = PBXBuildFile; fileRef = CA9461A520884CCB0015EB12 /* MGLAnnotationTests.m */; };
DA00FC8A1D5EEAC3009AABC8 /* MGLAttributionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = DA00FC881D5EEAC3009AABC8 /* MGLAttributionInfo.h */; settings = {ATTRIBUTES = (Public, ); }; };
@@ -342,7 +343,7 @@
1FC481842098F323000D09B4 /* NSPredicate+MGLPrivateAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSPredicate+MGLPrivateAdditions.h"; sourceTree = "<group>"; };
3508EC621D749D39009B0EE4 /* NSExpression+MGLAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSExpression+MGLAdditions.h"; sourceTree = "<group>"; };
3508EC631D749D39009B0EE4 /* NSExpression+MGLAdditions.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = "NSExpression+MGLAdditions.mm"; sourceTree = "<group>"; };
3526EABC1DF9B19800006B43 /* MGLCodingTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLCodingTests.m; path = ../../darwin/test/MGLCodingTests.m; sourceTree = "<group>"; };
3526EABC1DF9B19800006B43 /* MGLCodingTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLCodingTests.mm; path = ../../darwin/test/MGLCodingTests.mm; sourceTree = "<group>"; };
352742771D4C220900A1ECE6 /* MGLStyleValue.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLStyleValue.h; sourceTree = "<group>"; };
3527427F1D4C243B00A1ECE6 /* MGLSource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLSource.h; sourceTree = "<group>"; };
352742801D4C243B00A1ECE6 /* MGLSource.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = MGLSource.mm; sourceTree = "<group>"; };
@@ -444,6 +445,7 @@
96E027391E57C9B9004B8E66 /* sv */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = sv; path = sv.lproj/Localizable.strings; sourceTree = "<group>"; };
96E0273A1E57C9BB004B8E66 /* vi */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = vi; path = vi.lproj/Localizable.strings; sourceTree = "<group>"; };
96E0273B1E57C9BC004B8E66 /* pt-BR */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = "pt-BR"; path = "pt-BR.lproj/Localizable.strings"; sourceTree = "<group>"; };
CA4045C4216720D700B356E1 /* MGLCluster.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLCluster.h; sourceTree = "<group>"; };
CA8FBC0C21A4A74300D1203C /* MGLRendererConfigurationTests.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; name = MGLRendererConfigurationTests.mm; path = ../../darwin/test/MGLRendererConfigurationTests.mm; sourceTree = "<group>"; };
CA9461A520884CCB0015EB12 /* MGLAnnotationTests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = MGLAnnotationTests.m; path = test/MGLAnnotationTests.m; sourceTree = SOURCE_ROOT; };
DA00FC881D5EEAC3009AABC8 /* MGLAttributionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MGLAttributionInfo.h; sourceTree = "<group>"; };
@@ -1025,29 +1027,30 @@
isa = PBXGroup;
children = (
DAE6C34B1CC31E0400DB3429 /* MGLAnnotation.h */,
DACC22121CF3D3E200D220D9 /* MGLFeature.h */,
CA4045C4216720D700B356E1 /* MGLCluster.h */,
DACC22171CF3D4F700D220D9 /* MGLFeature_Private.h */,
DACC22121CF3D3E200D220D9 /* MGLFeature.h */,
DACC22131CF3D3E200D220D9 /* MGLFeature.mm */,
DAE6C34C1CC31E0400DB3429 /* MGLGeometry.h */,
DAE6C36C1CC31E2A00DB3429 /* MGLGeometry_Private.h */,
DAE6C34C1CC31E0400DB3429 /* MGLGeometry.h */,
DAE6C36D1CC31E2A00DB3429 /* MGLGeometry.mm */,
DAE6C34E1CC31E0400DB3429 /* MGLMultiPoint.h */,
DAE6C36F1CC31E2A00DB3429 /* MGLMultiPoint_Private.h */,
DAE6C34E1CC31E0400DB3429 /* MGLMultiPoint.h */,
DAE6C3701CC31E2A00DB3429 /* MGLMultiPoint.mm */,
DAE6C3521CC31E0400DB3429 /* MGLOverlay.h */,
DAE6C3531CC31E0400DB3429 /* MGLPointAnnotation.h */,
DAE6C3761CC31E2A00DB3429 /* MGLPointAnnotation.mm */,
4049C2A11DB6CE7800B3F799 /* MGLPointCollection.h */,
DAF0D80D1DFE0E5D00B28378 /* MGLPointCollection_Private.h */,
4049C2A11DB6CE7800B3F799 /* MGLPointCollection.h */,
4049C2A71DB6D09B00B3F799 /* MGLPointCollection.mm */,
DAE6C3541CC31E0400DB3429 /* MGLPolygon.h */,
9654C12C1FFC394700DB6A19 /* MGLPolygon_Private.h */,
DAE6C3541CC31E0400DB3429 /* MGLPolygon.h */,
DAE6C3771CC31E2A00DB3429 /* MGLPolygon.mm */,
DAE6C3551CC31E0400DB3429 /* MGLPolyline.h */,
9654C12A1FFC38E000DB6A19 /* MGLPolyline_Private.h */,
DAE6C3551CC31E0400DB3429 /* MGLPolyline.h */,
DAE6C3781CC31E2A00DB3429 /* MGLPolyline.mm */,
DAE6C3561CC31E0400DB3429 /* MGLShape.h */,
408AA85A1DAEECF100022900 /* MGLShape_Private.h */,
DAE6C3561CC31E0400DB3429 /* MGLShape.h */,
DAE6C3791CC31E2A00DB3429 /* MGLShape.mm */,
DAD165721CF4CD7A001FF4B9 /* MGLShapeCollection.h */,
DAD165731CF4CD7A001FF4B9 /* MGLShapeCollection.mm */,
@@ -1152,7 +1155,7 @@
DAEDC4311D6033F1000224FF /* MGLAttributionInfoTests.m */,
DAEDC4361D606291000224FF /* MGLAttributionButtonTests.m */,
DA35A2C11CCA9F4A00E826B2 /* MGLClockDirectionFormatterTests.m */,
3526EABC1DF9B19800006B43 /* MGLCodingTests.m */,
3526EABC1DF9B19800006B43 /* MGLCodingTests.mm */,
DA35A2B51CCA14D700E826B2 /* MGLCompassDirectionFormatterTests.m */,
DA35A2A71CC9F41600E826B2 /* MGLCoordinateFormatterTests.m */,
DA2987591E1A4290002299F5 /* MGLDocumentationExampleTests.swift */,
@@ -1348,6 +1351,7 @@
DAE6C3A61CC31E9400DB3429 /* MGLMapViewDelegate.h in Headers */,
DAE6C38B1CC31E2A00DB3429 /* MGLOfflinePack_Private.h in Headers */,
558DE7A61E56161C00C7916D /* MGLFoundation_Private.h in Headers */,
CA4045C7216720D700B356E1 /* MGLCluster.h in Headers */,
DACC22141CF3D3E200D220D9 /* MGLFeature.h in Headers */,
3538AA231D542685008EC33D /* MGLStyleLayer.h in Headers */,
DAE6C35C1CC31E0400DB3429 /* MGLGeometry.h in Headers */,
@@ -1712,7 +1716,7 @@
DAE7DEC41E24549F007505A6 /* MGLNSStringAdditionsTests.m in Sources */,
DA87A9981DC9D88400810D09 /* MGLShapeSourceTests.mm in Sources */,
55E2AD111E5B0A6900E8C587 /* MGLOfflineStorageTests.mm in Sources */,
3526EABD1DF9B19800006B43 /* MGLCodingTests.m in Sources */,
3526EABD1DF9B19800006B43 /* MGLCodingTests.mm in Sources */,
DA87A9A21DC9DCF100810D09 /* MGLFillStyleLayerTests.mm in Sources */,
DA57D4B11EBC699800793288 /* MGLDocumentationGuideTests.swift in Sources */,
DAEDC4321D6033F1000224FF /* MGLAttributionInfoTests.m in Sources */,
@@ -2144,10 +2148,10 @@
"$(geometry_cflags)",
"$(geojson_cflags)",
);
OTHER_LDFLAGS = (
"$(mbgl_core_LINK_LIBRARIES)",
"$(mbgl_filesource_LINK_LIBRARIES)",
);
OTHER_LDFLAGS = (
"$(mbgl_core_LINK_LIBRARIES)",
"$(mbgl_filesource_LINK_LIBRARIES)",
);
OTHER_SWIFT_FLAGS = "-warnings-as-errors";
PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.test;
PRODUCT_NAME = "$(TARGET_NAME)";
@@ -2176,10 +2180,10 @@
"$(geometry_cflags)",
"$(geojson_cflags)",
);
OTHER_LDFLAGS = (
"$(mbgl_core_LINK_LIBRARIES)",
"$(mbgl_filesource_LINK_LIBRARIES)",
);
OTHER_LDFLAGS = (
"$(mbgl_core_LINK_LIBRARIES)",
"$(mbgl_filesource_LINK_LIBRARIES)",
);
OTHER_SWIFT_FLAGS = "-warnings-as-errors";
PRODUCT_BUNDLE_IDENTIFIER = com.mapbox.test;
PRODUCT_NAME = "$(TARGET_NAME)";

View File

@@ -118,6 +118,7 @@
"MGLTilePyramidOfflineRegion.h": "platform/darwin/src/MGLTilePyramidOfflineRegion.h",
"NSValue+MGLAdditions.h": "platform/darwin/src/NSValue+MGLAdditions.h",
"MGLMapViewDelegate.h": "platform/macos/src/MGLMapViewDelegate.h",
"MGLCluster.h": "platform/darwin/src/MGLCluster.h",
"MGLFeature.h": "platform/darwin/src/MGLFeature.h",
"MGLStyleLayer.h": "platform/darwin/src/MGLStyleLayer.h",
"MGLGeometry.h": "platform/darwin/src/MGLGeometry.h",

View File

@@ -12,6 +12,7 @@ FOUNDATION_EXPORT MGL_EXPORT const unsigned char MapboxVersionString[];
#import "MGLAnnotation.h"
#import "MGLAnnotationImage.h"
#import "MGLClockDirectionFormatter.h"
#import "MGLCluster.h"
#import "MGLCompassDirectionFormatter.h"
#import "MGLCoordinateFormatter.h"
#import "MGLDistanceFormatter.h"