#import #import "MGLFoundation.h" #import "MGLPolyline.h" #import "MGLPolygon.h" #import "MGLPointAnnotation.h" #import "MGLPointCollection.h" #import "MGLShapeCollection.h" NS_ASSUME_NONNULL_BEGIN /** The `MGLFeature` protocol is used to provide details about geographic features contained in an `MGLShapeSource` or `MGLVectorSource` object. Each concrete subclass of `MGLShape` in turn has a subclass that conforms to this protocol. A feature object associates a shape with an optional identifier and attributes. You can add custom data to display on the map by creating feature objects and adding them to an `MGLShapeSource` using the `-[MGLShapeSource initWithIdentifier:shape:options:]` method or `MGLShapeSource.shape` property. Similarly, you can add `MGLPointFeature`, `MGLPolylineFeature`, and `MGLPolygonFeature` objects to the map as annotations using `-[MGLMapView addAnnotations:]` and related methods. In addition to adding data to the map, you can also extract data from the map: `-[MGLMapView visibleFeaturesAtPoint:]` and related methods return feature objects that correspond to features in the source. This enables you to inspect the properties of features in vector tiles loaded by `MGLVectorSource` objects. You also reuse these feature objects as overlay annotations. */ @protocol MGLFeature /** An object that uniquely identifies the feature in its containing content source. You can configure an `MGLVectorStyleLayer` object to include or exclude a specific feature in an `MGLShapeSource` or `MGLVectorSource`. In the `MGLVectorStyleLayer.predicate` property, compare the special `$id` attribute to the feature’s identifier. In vector tiles loaded by `MGLVectorSource` objects, the identifier corresponds to the feature identifier (`id`). If the source does not specify the feature’s identifier, the value of this property is `nil`. If specified, the identifier may be an integer, floating-point number, or string. These data types are mapped to instances of the following Foundation classes:
In the tile sourceThis property
Integer NSNumber (use the unsignedLongLongValue or longLongValue property)
Floating-point number NSNumber (use the doubleValue property)
String NSString
For details about the identifiers used in most Mapbox-provided styles, consult the Mapbox Streets layer reference. The identifier should be set before adding the feature to an `MGLShapeSource` object; setting it afterwards has no effect on the map’s contents. While it is possible to change this value on feature instances obtained from `-[MGLMapView visibleFeaturesAtPoint:]` and related methods, doing so likewise has no effect on the map’s contents. */ @property (nonatomic, copy, nullable) id identifier; /** A dictionary of attributes for this feature. You can configure an `MGLVectorStyleLayer` object to include or exclude a specific feature in an `MGLShapeSource` or `MGLVectorSource`. In the `MGLVectorStyleLayer.predicate` property, compare a key of the attribute dictionary to the value you want to include. For example, if you want an `MGLLineStyleLayer` object to display only important features, you might assign a value above 50 to the important features’ `importance` attribute, then set `MGLVectorStyleLayer.predicate` to an `NSPredicate` with the format `importance > 50`. You can also configure many layout and paint attributes of an `MGLStyleLayer` object to match the value of an attribute in this dictionary whenever it renders this feature. For example, if you display features in an `MGLShapeSource` using an `MGLCircleStyleLayer`, you can assign a `halfway` attribute to each of the source’s features, then set `MGLCircleStyleLayer.circleRadius` to an `MGLStyleValue` object with an interpolation mode of `MGLInterpolationModeIdentity` and an attribute name of `halfway`. The `MGLSymbolStyleLayer.textField` and `MGLSymbolStyleLayer.iconImageName` properties allow you to use attributes yet another way. For example, to label features in an `MGLShapeSource` object by their names, you can assign a `name` attribute to each of the source’s features, then set `MGLSymbolStyleLayer.textField` to an `MGLStyleValue` object containing the raw string value `{name}`. In vector tiles loaded by `MGLVectorSource` objects, the keys and values of each feature’s attribute dictionary are determined by the source. Each attribute name is a string, while each attribute value may be a null value, Boolean value, integer, floating-point number, or string. These data types are mapped to instances of the following Foundation classes:
In the tile sourceIn this dictionary
Null NSNull
Boolean NSNumber (use the boolValue property)
Integer NSNumber (use the unsignedLongLongValue or longLongValue property)
Floating-point number NSNumber (use the doubleValue property)
String NSString
For details about the attribute names and values found in Mapbox-provided vector tile sources, consult the Mapbox Streets and Mapbox Terrain layer references. When adding a feature to an `MGLShapeSource`, use the same Foundation types listed above for each attribute value. In addition to the Foundation types, you may also set an attribute to an `NSColor` (macOS) or `UIColor` (iOS), which will be converted into its CSS string representation when the feature is added to an `MGLShapeSource`. This can be convenient when using the attribute to supply a value for a color-typed layout or paint attribute via the `MGLInterpolationModeIdentity` interpolation mode. Note that while it is possible to change this value on feature instances obtained from `-[MGLMapView visibleFeaturesAtPoint:]` and related methods, there will be no effect on the map. Setting this value can be useful when the feature instance is used to initialize an `MGLShapeSource` and that source is added to the map and styled. */ @property (nonatomic, copy) NS_DICTIONARY_OF(NSString *, id) *attributes; /** Returns the feature attribute for the given attribute name. See the `attributes` property’s documentation for details on keys and values associated with this method. */ - (nullable id)attributeForKey:(NSString *)key; /** Returns a dictionary that can be serialized as a GeoJSON Feature representation of an instance of an `MGLFeature` subclass. The dictionary includes a `geometry` key corresponding to the receiver’s underlying geometry data, a `properties` key corresponding to the receiver’s `attributes` property, and an `id` key corresponding to the receiver’s `identifier` property. */ - (NS_DICTIONARY_OF(NSString *, id) *)geoJSONDictionary; @end /** An `MGLPointFeature` object associates a point shape with an optional identifier and attributes. */ MGL_EXPORT @interface MGLPointFeature : MGLPointAnnotation @end /** An `MGLPolylineFeature` object associates a polyline shape with an optional identifier and attributes. A polyline feature is known as a LineString feature in GeoJSON. */ MGL_EXPORT @interface MGLPolylineFeature : MGLPolyline @end /** An `MGLPolygonFeature` object associates a polygon shape with an optional identifier and attributes. */ MGL_EXPORT @interface MGLPolygonFeature : MGLPolygon @end /** An `MGLPointCollectionFeature` object associates a point collection with an optional identifier and attributes. A point collection feature is known as a MultiPoint feature in GeoJSON. */ MGL_EXPORT @interface MGLPointCollectionFeature : MGLPointCollection @end // https://github.com/mapbox/mapbox-gl-native/issues/7473 @compatibility_alias MGLMultiPointFeature MGLPointCollectionFeature; /** An `MGLMultiPolylineFeature` object associates a multipolyline shape with an optional identifier and attributes. A multipolyline feature is known as a MultiLineString feature in GeoJSON. */ MGL_EXPORT @interface MGLMultiPolylineFeature : MGLMultiPolyline @end /** An `MGLMultiPolygonFeature` object associates a multipolygon shape with an optional identifier and attributes. */ MGL_EXPORT @interface MGLMultiPolygonFeature : MGLMultiPolygon @end /** An `MGLShapeCollectionFeature` object associates a shape collection with an optional identifier and attributes. `MGLShapeCollectionFeature` is most commonly used to add multiple shapes to a single `MGLShapeSource`. Configure the appearance of an `MGLSource`’s shape collection collectively using an `MGLSymbolStyleLayer` object, or use multiple instances of `MGLCircleStyleLayer`, `MGLFillStyleLayer`, and `MGLLineStyleLayer` to configure the appearance of each kind of shape inside the collection. A shape collection feature is known as a feature collection in GeoJSON. */ MGL_EXPORT @interface MGLShapeCollectionFeature : MGLShapeCollection @property (nonatomic, copy, readonly) NS_ARRAY_OF(MGLShape *) *shapes; + (instancetype)shapeCollectionWithShapes:(NS_ARRAY_OF(MGLShape *) *)shapes; @end NS_ASSUME_NONNULL_END