Additional Index Implementations
================================

GeoMesa supports additional index formats at runtime, using
`Java service providers <https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html>`__. To add a new
index, implement ``org.locationtech.geomesa.index.api.GeoMesaFeatureIndexFactory`` and register your class under
``META-INF/services``, as described in the
`Java documentation <https://docs.oracle.com/javase/8/docs/api/java/util/ServiceLoader.html>`__.

Once an index is registered, it can be enabled through the ``SimpleFeatureType`` user data, as described in
:ref:`customizing_index_creation`.

Some additional indices are provided out-of-the-box:

S2/S3 Index
-----------

The S2 and S3 indices are based on the `S2 library <https://github.com/google/s2geometry>`__:

.. pull-quote::

  The S2 library represents all data on a three-dimensional sphere (similar to a globe). This makes it
  possible to build a worldwide geographic database with no seams or singularities, using a single coordinate
  system, and with low distortion everywhere compared to the true shape of the Earth.

The S2 index is a spatial index, identified by the name ``s2``. The S3 index is a composite spatial and time index,
identified by the name ``s3``. The default time period for the S3 index can be configured through the user data
key ``geomesa.s3.interval`` (see :ref:`customizing_z_index` for reference).
