# Class: VectorSource

This documentation is for OpenLayers v10.9.0. The latest is v.

## ol/source/Vector~VectorSource

    import VectorSource from 'ol/source/Vector.js';

Provides a source of features for vector layers. Vector features provided by this source are suitable for editing. See `VectorTile` for vector data that is optimized for rendering.

#### new VectorSource(options)

source/Vector.js, line 179

  Name | Type | Description
  --- | --- | ---
  `attributions` | AttributionLike | undefined | Attributions.
  `features` | Array.<FeatureType> | Collection<FeatureType> | undefined | Features. If provided as `Collection`, the features in the source and the collection will stay in sync.
  `format` | FeatureFormat<FeatureType> | undefined | The feature format used by the XHR feature loader when `url` is set. Required if `url` is set, otherwise ignored.
  `loader` | FeatureLoader<FeatureType> | undefined | The loader function used to load features, from a remote source for example. If this is not set and `url` is set, the source will create and use an XHR feature loader. The `'featuresloadend'` and `'featuresloaderror'` events will only fire if the `success` and `failure` callbacks are used. Example:
      import Vector from 'ol/source/Vector.js';
      import GeoJSON from 'ol/format/GeoJSON.js';
      import {bbox} from 'ol/loadingstrategy.js';

      const vectorSource = new Vector({
        loader: async (extent, resolution, projection) => {
           const url = 'https://ahocevar.com/geoserver/wfs?service=WFS&' +
               'version=1.1.0&request=GetFeature&typename=osm:water_areas&' +
               'outputFormat=application/json' +
               'bbox=' + extent.join(',') + ',' + projection.getCode();
           const response = await fetch(url);
           if (!response.ok) {
             throw new Error('Network response was not ok');
           }
           const json = await response.json();
           const features = new GeoJSON().readFeatures(json, {
             featureProjection: projection,
           });
           return features;
         },
         strategy: bbox,
       });
  When you want to retry a failed request, use
      vectorSource.removeLoadedExtent(extent);
      vectorSource.changed();
  `overlaps` | boolean (defaults to true) | This source may have overlapping geometries. Setting this to `false` (e.g. for sources with polygons that represent administrative boundaries or TopoJSON sources) allows the renderer to optimise fill and stroke operations.
  `strategy` | LoadingStrategy | undefined | The loading strategy to use. By default an `all` strategy is used, a one-off strategy which loads all features at once.
  `url` | string | FeatureUrlFunction | undefined | Setting this option instructs the source to load features using an XHR loader (see `xhr`). Use a `string` and an `all` for a one-off download of all features from the given URL. Use a `FeatureUrlFunction` to generate the url with other loading strategies. Requires `format` to be set as well. When default XHR feature loader is provided, the features will be transformed from the data projection to the view projection during parsing. If your remote data source does not advertise its projection properly, this transformation will be incorrect. For some formats, the default projection (usually EPSG:4326) can be overridden by setting the dataProjection constructor option on the format. Note that if a source contains non-feature data, such as a GeoJSON geometry or a KML NetworkLink, these will be ignored. Use a custom loader to load these.
  `useSpatialIndex` | boolean (defaults to true) | By default, an RTree is used as spatial index. When features are removed and added frequently, and the total number of features is low, setting this to `false` may improve performance. Note that `getFeaturesInExtent`, `getClosestFeatureToCoordinate` and `getExtent` cannot be used when `useSpatialIndex` is set to `false`, and `forEachFeatureInExtent` will loop through all features. When set to `false`, the features will be maintained in an `Collection`, which can be retrieved through `getFeaturesCollection`.
  `wrapX` | boolean (defaults to true) | Wrap the world horizontally. For vector editing across the -180° and 180° meridians to work properly, this should be set to `false`. The resulting geometry coordinates will then exceed the world bounds.

  ##### Fires:

  - `addfeature` (VectorSourceEvent) - Triggered when a feature is added to the source.
  - `change` (BaseEvent) - Generic change event. Triggered when the revision counter is increased.
  - `changefeature` (VectorSourceEvent) - Triggered when a feature is updated.
  - `clear` (VectorSourceEvent) - Triggered when the clear method is called on the source.
  - `error` (BaseEvent) - Generic error event. Triggered when an error occurs.
  - `featuresloadend` (VectorSourceEvent) - Triggered when features finishes loading.
  - `featuresloaderror` (VectorSourceEvent) - Triggered if feature loading results in an error.
  - `featuresloadstart` (VectorSourceEvent) - Triggered when features starts loading.
  - `propertychange` (ObjectEvent) - Triggered when a property is changed.
  - `removefeature` (VectorSourceEvent) - Triggered when a feature is removed from the source. See `source.clear()` for exceptions.

### Subclasses

- Cluster

### Extends

- Source

### Methods

#### addFeature(feature)

source/Vector.js, line 328

  Add a single feature to the source. If you want to add a batch of features at once, call `#addFeatures()` instead. A feature will not be added to the source if feature with the same id is already there. The reason for this behavior is to avoid feature duplication when using bbox or tile loading strategies. Note: this also applies if a `Collection` is used for features, meaning that if a feature with a duplicate id is added in the collection, it will be removed from it right away.

  Name | Type | Description
  --- | --- | ---
  `feature` | FeatureType | Feature to add.

#### addFeatures(features)

source/Vector.js, line 426

  Add a batch of features to the source.

  Name | Type | Description
  --- | --- | ---
  `features` | Array.<FeatureType> | Features to add.

#### changed() inherited

Observable.js, line 68

  Increases the revision counter and dispatches a 'change' event.

#### clear(fast)

source/Vector.js, line 544

  Remove all features from the source.

  Name | Type | Description
  --- | --- | ---
  `fast` | boolean | undefined | Skip dispatching of `removefeature` events.

#### dispatchEvent(event){boolean | undefined} inherited

events/Target.js, line 85

  Dispatches an event and calls all listeners listening for events of this type. The event parameter can either be a string or an Object with a `type` property.

  Name | Type | Description
  --- | --- | ---
  `event` | BaseEvent | string | Event object.

  ##### Returns:

  `false` if anyone called preventDefault on the event object or if any of the listeners returned false.

#### forEachFeature(callback){T | undefined}

source/Vector.js, line 591

  Iterate through all features on the source, calling the provided callback with each one. If the callback returns any "truthy" value, iteration will stop and the function will return the same value. Note: this function only iterate through the feature that have a defined geometry.

  Name | Type | Description
  --- | --- | ---
  `callback` | function | Called with each feature on the source. Return a truthy value to stop iteration.

  ##### Returns:

  The return value from the last call to the callback.

#### forEachFeatureInExtent(extent, callback){T | undefined}

source/Vector.js, line 648

  Iterate through all features whose bounding box intersects the provided extent (note that the feature's geometry may not intersect the extent), calling the callback with each feature. If the callback returns a "truthy" value, iteration will stop and the function will return the same value.

  If you are interested in features whose geometry intersects an extent, call the `#forEachFeatureIntersectingExtent()` method instead.

  When `useSpatialIndex` is set to false, this method will loop through all features, equivalent to `#forEachFeature()`.

  Name | Type | Description
  --- | --- | ---
  `extent` | Extent | Extent.
  `callback` | function | Called with each feature whose bounding box intersects the provided extent.

  ##### Returns:

  The return value from the last call to the callback.

#### forEachFeatureIntersectingExtent(extent, callback){T | undefined}

source/Vector.js, line 672

  Iterate through all features whose geometry intersects the provided extent, calling the callback with each feature. If the callback returns a "truthy" value, iteration will stop and the function will return the same value.

  If you only want to test for bounding box intersection, call the `#forEachFeatureInExtent()` method instead.

  Name | Type | Description
  --- | --- | ---
  `extent` | Extent | Extent.
  `callback` | function | Called with each feature whose geometry intersects the provided extent.

  ##### Returns:

  The return value from the last call to the callback.

#### get(key){*} inherited

Object.js, line 136

  Gets a value.

  Name | Type | Description
  --- | --- | ---
  `key` | string | Key name.

  ##### Returns:

  Value.

#### getAttributions(){Attribution} inherited

source/Source.js, line 129

  Get the attribution function for the source.

  ##### Returns:

  Attribution function.

#### getAttributionsCollapsible(){boolean} inherited

source/Source.js, line 137

  ##### Returns:

  Attributions are collapsible.

#### getClosestFeatureToCoordinate(coordinate, filter){FeatureType | null}

source/Vector.js, line 786

  Get the closest feature to the provided coordinate.

  This method is not available when the source is configured with `useSpatialIndex` set to `false` and the features in this source are of type `Feature`.

  Name | Type | Description
  --- | --- | ---
  `coordinate` | Coordinate | Coordinate.
  `filter` | function | undefined | Feature filter function. The filter function will receive one argument, the `feature` and it should return a boolean value. By default, no filtering is made.

  ##### Returns:

  Closest feature (or `null` if none found).

#### getExtent(extent){Extent | null}

source/Vector.js, line 842

  Get the extent of the features currently in the source.

  This will return `null` when the source is configured with `useSpatialIndex` set to `false`.

  Name | Type | Description
  --- | --- | ---
  `extent` | Extent | undefined | Destination extent. If provided, no new extent will be created. Instead, that extent's coordinates will be overwritten.

  ##### Returns:

  Extent.

#### getFeatureById(id){FeatureClassOrArrayOfRenderFeatures<FeatureType> | null}

source/Vector.js, line 858

  Get a feature by its identifier (the value returned by feature.getId()). When `RenderFeature`s are used, `getFeatureById()` can return an array of `RenderFeature`s. This allows for handling of `GeometryCollection` geometries, where format readers create one `RenderFeature` per `GeometryCollection` member. Note that the index treats string and numeric identifiers as the same. So `source.getFeatureById(2)` will return a feature with id `'2'` or `2`.

  Name | Type | Description
  --- | --- | ---
  `id` | string | number | Feature identifier.

  ##### Returns:

  The feature (or `null` if not found).

#### getFeatures(){Array.<FeatureType>}

source/Vector.js, line 711

  Get a snapshot of the features currently on the source in random order. The returned array is a copy, the features are references to the features in the source.

  ##### Returns:

  Features.

#### getFeaturesAtCoordinate(coordinate){Array.<FeatureType>}

source/Vector.js, line 730

  Get all features whose geometry intersects the provided coordinate.

  Name | Type | Description
  --- | --- | ---
  `coordinate` | Coordinate | Coordinate.

  ##### Returns:

  Features.

#### getFeaturesCollection(){Collection<FeatureType> | null}

source/Vector.js, line 701

  Get the features collection associated with this source. Will be `null` unless the source was configured with `useSpatialIndex` set to `false`, or with a `Collection` as `features`.

  ##### Returns:

  The collection of features.

#### getFeaturesInExtent(extent, projection){Array.<FeatureType>}

source/Vector.js, line 753

  Get all features whose bounding box intersects the provided extent. Note that this returns an array of all features intersecting the given extent in random order (so it may include features whose geometries do not intersect the extent).

  When `useSpatialIndex` is set to false, this method will return all features.

  Name | Type | Description
  --- | --- | ---
  `extent` | Extent | Extent.
  `projection` | Projection | undefined | Include features where `extent` exceeds the x-axis bounds of `projection` and wraps around the world.

  ##### Returns:

  Features.

#### getFormat(){FeatureFormat<FeatureType> | null}

source/Vector.js, line 884

  Get the format associated with this source.

  ##### Returns:

  } The feature format.

#### getKeys(){Array.<string>} inherited

Object.js, line 149

  Get a list of object property names.

  ##### Returns:

  List of property names.

#### getProjection(){Projection | null} inherited

source/Source.js, line 146

  Get the projection of the source.

  ##### Returns:

  Projection.

#### getProperties(){NoInfer.<Properties>} inherited

Object.js, line 158

  Get an object of all property names and values.

  ##### Returns:

  Object.

#### getRevision(){number} inherited

Observable.js, line 79

  Get the version number for this object. Each time the object is modified, its version number will be incremented.

  ##### Returns:

  Revision.

#### getState(){State} inherited

source/Source.js, line 170

  Get the state of the source, see `State` for possible states.

  ##### Returns:

  State.

#### getUrl(){string | FeatureUrlFunction | undefined}

source/Vector.js, line 901

  Get the url associated with this source.

  ##### Returns:

  The url.

#### hasFeature(feature){boolean}

source/Vector.js, line 956

  Returns true if the feature is contained within the source.

  Name | Type | Description
  --- | --- | ---
  `feature` | FeatureType | Feature.

  ##### Returns:

  Has feature.

#### on(type, listener){EventsKey | Array<EventsKey>} inherited

Observable.js, line 152

  Listen for a certain type of event.

  Name | Type | Description
  --- | --- | ---
  `type` | string | Array.<string> | The event type or array of event types.
  `listener` | function | The listener function.

  ##### Returns:

  Unique key for the listener. If called with an array of event types as the first argument, the return will be an array of keys.

#### once(type, listener){EventsKey | Array<EventsKey>} inherited

Observable.js, line 164

  Listen once for a certain type of event.

  Name | Type | Description
  --- | --- | ---
  `type` | string | Array.<string> | The event type or array of event types.
  `listener` | function | The listener function.

  ##### Returns:

  Unique key for the listener. If called with an array of event types as the first argument, the return will be an array of keys.

#### removeFeature(feature)

source/Vector.js, line 1105

  Remove a single feature from the source. If you want to batch remove features, use the `#removeFeatures()` method instead.

  Name | Type | Description
  --- | --- | ---
  `feature` | FeatureType | Feature to remove.

#### removeFeatures(features)

source/Vector.js, line 1088

  Batch remove features from the source. If you want to remove all features at once, use the `#clear()` method instead.

  Name | Type | Description
  --- | --- | ---
  `features` | Array.<FeatureType> | Features to remove.

#### removeLoadedExtent(extent)

source/Vector.js, line 1069

  Remove an extent from the list of loaded extents.

  Name | Type | Description
  --- | --- | ---
  `extent` | Extent | Extent.

#### set(key, value, silent) inherited

Object.js, line 218

  Sets a value.

  Name | Type | Description
  --- | --- | ---
  `key` | string | Key name.
  `value` | * | Value.
  `silent` | boolean | undefined | Update without triggering an event.

#### setAttributions(attributions) inherited

source/Source.js, line 203

  Set the attributions of the source.

  Name | Type | Description
  --- | --- | ---
  `attributions` | AttributionLike | undefined | Attributions. Can be passed as `string`, `Array<string>`, `Attribution`, or `undefined`.

#### setLoader(loader)

source/Vector.js, line 1182

  Set the new loader of the source. The next render cycle will use the new loader.

  Name | Type | Description
  --- | --- | ---
  `loader` | FeatureLoader | The loader to set.

#### setProperties(values, silent) inherited

Object.js, line 238

  Sets a collection of key-value pairs. Note that this changes any existing properties and adds new ones (it does not remove any existing properties).

  Name | Type | Description
  --- | --- | ---
  `values` | Partial.<NoInfer.<Properties>> | Values.
  `silent` | boolean | undefined | Update without triggering an event.

#### setUrl(url)

source/Vector.js, line 1191

  Points the source to a new url. The next render cycle will use the new url.

  Name | Type | Description
  --- | --- | ---
  `url` | string | FeatureUrlFunction | Url.

#### un(type, listener) inherited

Observable.js, line 173

  Unlisten for a certain type of event.

  Name | Type | Description
  --- | --- | ---
  `type` | string | Array.<string> | The event type or array of event types.
  `listener` | function | The listener function.

#### unset(key, silent) inherited

Object.js, line 262

  Unsets a property.

  Name | Type | Description
  --- | --- | ---
  `key` | string | Key name.
  `silent` | boolean | undefined | Unset without triggering an event.