# Style Primitives

- `MGLFeature`

  The `MGLFeature` protocol is used to provide details about geographic features contained in an `MGLShapeSource` or `MGLVectorTileSource` 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.

  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 `MGLVectorTileSource` objects. You also reuse these feature objects as overlay annotations.

  While it is possible to add `MGLFeature`-conforming objects to the map as annotations using `-[MGLMapView addAnnotations:]` and related methods, doing so has trade-offs:

  - Features added as annotations will not have `identifier` or `attributes` properties when used with feature querying.

  - Features added as annotations become interactive. Taps and selection can be handled in `-[MGLMapViewDelegate mapView:didSelectAnnotation:]`.

  See more

  #### Declaration

  Objective-C

      @protocol MGLFeature <MGLAnnotation>

  Swift

      protocol MGLFeature : MGLAnnotation

  View Source on GitHub
- `MGLPointFeature`

  An `MGLPointFeature` object associates a point shape with an optional identifier and attributes.

  #### Related examples

  See the Dynamically style interactive points example to learn how to initialize `MGLPointFeature` objects and add them to your map.

  #### Declaration

  Objective-C

      @interface MGLPointFeature : MGLPointAnnotation <MGLFeature>

  Swift

      class MGLPointFeature : MGLPointAnnotation, MGLFeature

  View Source on GitHub
- `MGLPointFeatureCluster`

  An `MGLPointFeatureCluster` object associates a point shape (with an optional identifier and attributes) and represents a point cluster.

  See

  `MGLCluster`

  #### Related examples

  See the Clustering point data example to learn how to initialize clusters and add them to your map.

  #### Declaration

  Objective-C

      @interface MGLPointFeatureCluster : MGLPointFeature <MGLCluster>

  Swift

      class MGLPointFeatureCluster : MGLPointFeature, MGLCluster

  View Source on GitHub
- `MGLPolygonFeature`

  An `MGLPolygonFeature` object associates a polygon shape with an optional identifier and attributes.

  #### Declaration

  Objective-C

      @interface MGLPolygonFeature : MGLPolygon <MGLFeature>

  Swift

      class MGLPolygonFeature : MGLPolygon, MGLFeature

  View Source on GitHub
- `MGLPolylineFeature`

  An `MGLPolylineFeature` object associates a polyline shape with an optional identifier and attributes.

  A polyline feature is known as a LineString feature in GeoJSON.

  #### Related examples

  See the Add a line annotation from GeoJSON example to learn how to initialize an `MGLPolylineFeature` and add it to an `MGLMapView` object.

  #### Declaration

  Objective-C

      @interface MGLPolylineFeature : MGLPolyline <MGLFeature>

  Swift

      class MGLPolylineFeature : MGLPolyline, MGLFeature

  View Source on GitHub
- `MGLMultiPolygonFeature`

  An `MGLMultiPolygonFeature` object associates a multipolygon shape with an optional identifier and attributes.

  #### Declaration

  Objective-C

      @interface MGLMultiPolygonFeature : MGLMultiPolygon <MGLFeature>

  Swift

      class MGLMultiPolygonFeature : MGLMultiPolygon, MGLFeature

  View Source on GitHub
- `MGLMultiPolylineFeature`

  An `MGLMultiPolylineFeature` object associates a multipolyline shape with an optional identifier and attributes.

  A multipolyline feature is known as a MultiLineString feature in GeoJSON.

  #### Declaration

  Objective-C

      @interface MGLMultiPolylineFeature : MGLMultiPolyline <MGLFeature>

  Swift

      class MGLMultiPolylineFeature : MGLMultiPolyline, MGLFeature

  View Source on GitHub
- `MGLPointCollectionFeature`

  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.

  #### Declaration

  Objective-C

      @interface MGLPointCollectionFeature : MGLPointCollection <MGLFeature>

  Swift

      class MGLPointCollectionFeature : MGLPointCollection, MGLFeature

  View Source on GitHub
- `MGLShapeCollectionFeature`

  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.

  #### Related examples

  See the Add multiple shapes from a single shape source example to learn how to add shape data to your map using an `MGLShapeCollectionFeature` object.

  #### Declaration

  Objective-C

      @interface MGLShapeCollectionFeature : MGLShapeCollection <MGLFeature>

  Swift

      class MGLShapeCollectionFeature : MGLShapeCollection, MGLFeature

  View Source on GitHub
- `MGLEmptyFeature`

  An `MGLEmptyFeature` object associates an empty shape with an optional identifier and attributes.

  #### Declaration

  Objective-C

      @interface MGLEmptyFeature : MGLShape <MGLFeature>

  Swift

      class MGLEmptyFeature : MGLShape, MGLFeature

  View Source on GitHub