Apache Spatial Information System (SIS)
Copyright 2010-2025 The Apache Software Foundation

This product includes software developed at
The Apache Software Foundation (https://www.apache.org/).

The Javadoc contains documentation from the Open Geospatial Consortium (OGC®)
specifications (https://www.ogc.org/standards/), also known as OpenGIS®.

Apache SIS depends on GeoAPI published by OGC under BSD-style license.
https://www.ogc.org/about-ogc/policies/software-licenses/

Apache SIS depends on JSR-385 (API only) published under BSD license.
https://jcp.org/en/jsr/detail?id=385

Apache SIS depends on JAXB (API only) published under Eclipse Distribution License 1.0.
http://www.eclipse.org/org/documents/edl-v10.php

The `org.apache.sis.referencing.operation.matrix` package contains code
adapted from JAMA Java Matrix Package in public domain.
http://math.nist.gov/javanumerics/jama/

The `org.apache.sis.feature` module can optionally use the Esri Geometry API
developed by ESRI under Apache license 2, or the Java Topology Suite (JTS)
library under Eclipse Distribution License 1.0.
https://github.com/Esri/geometry-api-java/
https://github.com/locationtech/jts

The `org.apache.sis.storage.netcdf` module can optionally use the UCAR netCDF library
developed by Unidata under MIT-style license.
https://www.unidata.ucar.edu/software/netcdf-java/

The `org.apache.sis.cloud.aws` module depends on the Amazon SDK library
developed by Amazon under Apache 2 license.
https://github.com/aws/aws-sdk-java-v2

The test suite uses software developed by the JUnit community
under Eclipse public license version 2.
https://junit.org/junit5/


-------------------------------------------------------------
  Optional modules NOT included unless explicitly requested
-------------------------------------------------------------
The optional `non-free` group of modules contain geodetic data
collected by the International Association of Oil and Gas Producers.
https://epsg.org/terms-of-use.html

The optional `org.apache.sis.gui` module depends on JavaFX
published under GPL 2 with classpath exception.
https://github.com/openjdk/jfx/blob/master/LICENSE

The optional `org.apache.sis.gui` module downloads Font-GIS at build time.
Font-GIS is published under SIL Open Font License (OFL) version 1.1.
