Apache Spatial Information System (SIS)
Copyright 2010-2024 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 Apache 2.0 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.
