diff options
author | Ivo van Dongen <info@ivovandongen.nl> | 2017-03-05 14:12:37 -0800 |
---|---|---|
committer | Ivo van Dongen <ivovandongen@users.noreply.github.com> | 2017-03-09 13:11:23 -0800 |
commit | 12568f21a39dfec7788ebee2815c4c0b2ee964d8 (patch) | |
tree | 6184a8e741c3658c6ef672866f882b1a72c9c51b /platform/darwin/src | |
parent | 0d10d2df1c6d246004e7291511f3aab7a8781d59 (diff) | |
download | qtlocation-mapboxgl-12568f21a39dfec7788ebee2815c4c0b2ee964d8.tar.gz |
[macos, ios] query source features
Diffstat (limited to 'platform/darwin/src')
-rw-r--r-- | platform/darwin/src/MGLShapeSource.h | 16 | ||||
-rw-r--r-- | platform/darwin/src/MGLShapeSource.mm | 12 | ||||
-rw-r--r-- | platform/darwin/src/MGLVectorSource.h | 26 | ||||
-rw-r--r-- | platform/darwin/src/MGLVectorSource.mm | 23 |
4 files changed, 77 insertions, 0 deletions
diff --git a/platform/darwin/src/MGLShapeSource.h b/platform/darwin/src/MGLShapeSource.h index 24cdf82bea..07045490bd 100644 --- a/platform/darwin/src/MGLShapeSource.h +++ b/platform/darwin/src/MGLShapeSource.h @@ -210,6 +210,22 @@ MGL_EXPORT */ @property (nonatomic, copy, nullable) NSURL *URL; +/** + Returns an array of map features for this source, filtered by the given predicate. + + Each object in the returned array represents a feature for the current style + and provides access to attributes specified by the source + + Features come from tiled GeoJSON data that is converted to tiles internally, + so feature geometries are clipped at tile boundaries and features + may appear duplicated across tiles. + + @param predicate A predicate to filter the returned features. + @return An array of objects conforming to the `MGLFeature` protocol that + represent features in the sources used by the current style. + */ +- (NS_ARRAY_OF(id <MGLFeature>) *)featuresMatchingPredicate:(nullable NSPredicate *)predicate; + @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLShapeSource.mm b/platform/darwin/src/MGLShapeSource.mm index b37b01663f..7de2d69af3 100644 --- a/platform/darwin/src/MGLShapeSource.mm +++ b/platform/darwin/src/MGLShapeSource.mm @@ -5,6 +5,7 @@ #import "MGLFeature_Private.h" #import "MGLShape_Private.h" +#import "NSPredicate+MGLAdditions.h" #import "NSURL+MGLAdditions.h" #include <mbgl/map/map.hpp> @@ -135,6 +136,17 @@ const MGLShapeSourceOption MGLShapeSourceOptionSimplificationTolerance = @"MGLSh NSStringFromClass([self class]), (void *)self, self.identifier, self.URL, self.shape]; } +- (NS_ARRAY_OF(id <MGLFeature>) *)featuresMatchingPredicate:(nullable NSPredicate *)predicate { + + mbgl::optional<mbgl::style::Filter> optionalFilter; + if (predicate) { + optionalFilter = predicate.mgl_filter; + } + + std::vector<mbgl::Feature> features = self.rawSource->querySourceFeatures({ {}, optionalFilter }); + return MGLFeaturesFromMBGLFeatures(features); +} + @end mbgl::style::GeoJSONOptions MGLGeoJSONOptionsFromDictionary(NS_DICTIONARY_OF(MGLShapeSourceOption, id) *options) { diff --git a/platform/darwin/src/MGLVectorSource.h b/platform/darwin/src/MGLVectorSource.h index 2322c62f29..8634316809 100644 --- a/platform/darwin/src/MGLVectorSource.h +++ b/platform/darwin/src/MGLVectorSource.h @@ -1,3 +1,4 @@ +#import "MGLFeature.h" #import "MGLFoundation.h" #import "MGLTileSource.h" @@ -42,10 +43,35 @@ NS_ASSUME_NONNULL_BEGIN MGL_EXPORT @interface MGLVectorSource : MGLTileSource +#pragma mark Initializing a Source + - (instancetype)initWithIdentifier:(NSString *)identifier configurationURL:(NSURL *)configurationURL NS_DESIGNATED_INITIALIZER; - (instancetype)initWithIdentifier:(NSString *)identifier tileURLTemplates:(NS_ARRAY_OF(NSString *) *)tileURLTemplates options:(nullable NS_DICTIONARY_OF(MGLTileSourceOption, id) *)options NS_DESIGNATED_INITIALIZER; +#pragma mark Accessing a Source’s Content + +/** + Returns an array of map features loaded by this source, restricted to the + given source layers and filtered by the given predicate. + + Each object in the returned array represents a feature for the + current style and provides access to attributes specified by the + <a href="https://www.mapbox.com/mapbox-gl-style-spec/#sources">source</a>. + + Features come from tiled vector data that is converted to tiles internally, + so feature geometries are clipped at tile boundaries and features + may appear duplicated across tiles. + + @param sourceLayerIdentifiers The source layers to include in the query. Only the + features contained in these source layers are included in the returned array. At + least one source layer is required. + @param predicate A predicate to filter the returned features. + @return An array of objects conforming to the `MGLFeature` protocol that + represent features in the sources used by the current style. + */ +- (NS_ARRAY_OF(id <MGLFeature>) *)featuresInSourceLayersWithIdentifiers:(NS_SET_OF(NSString *) *)sourceLayerIdentifiers predicate:(nullable NSPredicate *)predicate NS_SWIFT_NAME(features(sourceLayerIdentifiers:predicate:)); + @end NS_ASSUME_NONNULL_END diff --git a/platform/darwin/src/MGLVectorSource.mm b/platform/darwin/src/MGLVectorSource.mm index 94511900c1..aeec2e40ac 100644 --- a/platform/darwin/src/MGLVectorSource.mm +++ b/platform/darwin/src/MGLVectorSource.mm @@ -1,8 +1,10 @@ #import "MGLVectorSource_Private.h" #import "MGLMapView_Private.h" +#import "MGLFeature_Private.h" #import "MGLSource_Private.h" #import "MGLTileSource_Private.h" +#import "NSPredicate+MGLAdditions.h" #import "NSURL+MGLAdditions.h" #include <mbgl/map/map.hpp> @@ -91,4 +93,25 @@ return attribution ? @(attribution->c_str()) : nil; } +- (NS_ARRAY_OF(id <MGLFeature>) *)featuresInSourceLayersWithIdentifiers:(NS_SET_OF(NSString *) *)sourceLayerIdentifiers predicate:(nullable NSPredicate *)predicate { + + mbgl::optional<std::vector<std::string>> optionalSourceLayerIDs; + if (sourceLayerIdentifiers) { + __block std::vector<std::string> layerIDs; + layerIDs.reserve(sourceLayerIdentifiers.count); + [sourceLayerIdentifiers enumerateObjectsUsingBlock:^(NSString * _Nonnull identifier, BOOL * _Nonnull stop) { + layerIDs.push_back(identifier.UTF8String); + }]; + optionalSourceLayerIDs = layerIDs; + } + + mbgl::optional<mbgl::style::Filter> optionalFilter; + if (predicate) { + optionalFilter = predicate.mgl_filter; + } + + std::vector<mbgl::Feature> features = self.rawSource->querySourceFeatures({ optionalSourceLayerIDs, optionalFilter }); + return MGLFeaturesFromMBGLFeatures(features); +} + @end |