Hello Greg

On 2018/08/28 15:25:42, Greg Albiston <greg_albis...@hotmail.com> wrote:

> It's not clear to me whether JTS can be used with Apache SIS for point
> 3 and perhaps Martin can help?
>
It let users choose between JTS, ESRI API (under Apache 2 license) or
Java2D as a fallback. If using JTS, the version is 1.15+
(org.locationtech.jts-core). It may require SIS 1.0 however (not yet
released), I did not checked if the change from JTS 1.14 to 1.15 was
effective at SIS 0.8 release time.


> The functionality provided by GeoTools seems to be covered by Apache
> SIS. However, the relevant sections of the Developer Guide
> (http://sis.apache.org/book/en/developer-guide.html#GetCRS) are marked
> as TODO. The main requirements fulfilled by GeoTools are:
>
> 1) Look up CRS from authority by URI.
>
Yes, it supports EPSG codes, URI and URL including the "crs-compound"
form (used for letting users assemble their own horizontal + vertical
systems). Examples are provided here:

    
http://sis.apache.org/apidocs/org/apache/sis/referencing/CRS.html#forCode-java.lang.String-

Note: GeoTools has a flag for forcing the (longitude, latitude) axis
order. This flag has been removed in Apache SIS because such alterations
result in CRS that are not compliant with the authoritative definitions.
If (longitude, latitude) order is really wanted, the CRS can be changed
after construction as below:

    crs = 
AbstractCRS.castOrCopy(crs).forConvention(AxesConvention.RIGHT_HANDED);


> 2) Look up math transformation between source and target CRS.
>
Yes, in a better way than GeoTools:

    
http://sis.apache.org/apidocs/org/apache/sis/referencing/CRS.html#findOperation-org.opengis.referencing.crs.CoordinateReferenceSystem-org.opengis.referencing.crs.CoordinateReferenceSystem-org.opengis.metadata.extent.GeographicBoundingBox-

A first difference compared to GeoTools is that Apache SIS method also
take an optional GeographicBounding box in argument. Specifying the
source and target CRS are not sufficient; in USA there is about 80
transformations from NAD27 to WGS84. To pick-up the right transform, we
need to specify if we want to transform coordinates in Texas, or in
Alaska, or in Canada, etc. A GeoTools bug a few years ago was to select
the most accurate transformation regardless its domain of validity,
which happen to be a transformation for Cuba because it covers a small
surface. Consequently users were applying to USA a transformation
designed for Cuba. Another bug was to select the transformation valid in
the widest area, which happen to be a transformation for Canada.
Consequently users were applying to USA a transformation designed for
Canada.

A second difference is that Apache SIS does not return the MathTransfom
directly, but the ISO 19111 CoordinateOperation instead. The coordinate
operation contains additional metadata, in particular the domain of
validity and the transformation accuracy. Those metadata give a way to
avoid the errors cited in previous paragraph (applying in a country a
transformation designed for another country). It also reduce the risk
that users miss the fact that MathTransform are not accurate up to
rounding errors. For example transforming from NAD27 to WGS84 in Canada
has a 30 meters errors (when not using datum shift grid) for reasons
unrelated to computer accuracy. The CoordinateOperation returned by
Apache SIS tries to make those facts more visible.

Getting the MathTransform from a CoordinateOperation is one method call
(operation.getMathTransform()). An additional feature that Apache SIS
MathTransform has compared to GeoTools is the capability to compute
Jacobian matrices.


> 3) Apply the math transformation to a source Geometry to produce a
> target Geometry (i.e. JTS Geometry).
>
Not directly in Apache SIS, but we have this code in another project and
could easily port it to SIS. It is an easy functionality to code anyway.


> 4) Provide unit of measures (GeoTools uses javax.measure.unit) support
> derived from the CRS to allow conversions of distances (SI and non-SI
> units).
>
Actually the javax.measure.unit package come from JSR-275, which has
been rejected by the JCP. The replacement is JSR-363, which has been
approved by the JCP and uses the javax.measure package. Apache SIS
implements JSR-363:

    http://sis.apache.org/apidocs/org/apache/sis/measure/Units.html

SIS provides SI and non-SI units together with their EPSG codes. It
supports arithmetic operations - for example it detects by itself that
the result of NEWTON.multiply(METRE).divide(SECOND) is Watt - can parse
many of the units used by the World Meteorological Organisation (K*m
s-1, μg m-3, etc.). The CRS definitions contain the unit of measurements
in their axes, and unit conversions are taken in account when
transforming from a source CRS to a target CRS.

    Martin


Reply via email to