Hello,

Some combinations of ObliqueMercator center points and points to be
projected trigger the error in ObliqueMercator.java:541
<https://github.com/geotools/geotools/blob/25.x/modules/library/referencing/src/main/java/org/geotools/referencing/operation/projection/ObliqueMercator.java#L539>,
with the message “v value is infinite”.

I’m choosing the centerpoint and projected points at random (during
testing). Below is one example: projection center point lat=30, lon=-165
with azimuth 0; try to project the point lat=-0.09, lon=-75.15. (This is
random data from testing.) The code calculates an intermediate value U such
that abs(abs(U) - 1.0) ~= 1.91E-7, less than the code’s constant of EPSILON
= 1E-6, which has the comment “Maximum difference allowed when comparing
real numbers”.

What does this mean? Is the implementation unable to project some points
(which are not near the poles) due to finite floating-point precision? If
so, is there a workaround that would give an approximate projection that
will always work (to some precision)?

Full reproduction:

val wkt = s"""PROJCS["Custom Oblique Mercator",
                       |  GEOGCS["WGS 84",
                       |    DATUM["World Geodetic System 1984",
                       |      SPHEROID["WGS 84", 6378137.0, 298.257223563]],
                       |    PRIMEM["Prime", 0.0],
                       |    UNIT["degree", 0.017453292519943295]],
                       |  PROJECTION["Oblique Mercator"],
                       |  PARAMETER["longitude_of_center", -165.0],
                       |  PARAMETER["latitude_of_center", 30.0],
                       |  PARAMETER["azimuth", 0.0],
                       |  PARAMETER["scale_factor", 1.0],
                       |  PARAMETER["false_easting", 0.0],
                       |  PARAMETER["false_northing", 0.0],
                       |  UNIT["m", 1.0]]
                       |""".stripMargin
  val transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84,
CRS.parseWKT(wkt))

  val geometryFactory = JTSFactoryFinder.getGeometryFactory(null)
  val point = geometryFactory.createPoint(new Coordinate(-75.15, -0.09))

  val result = JTS.transform(point, transform).asInstanceOf[Point]
  println(result)

The call to transform throws the error:

Exception in thread "main"
org.geotools.referencing.operation.projection.ProjectionException: v
value is infinite
    at 
org.geotools.referencing.operation.projection.ObliqueMercator.transformNormalized(ObliqueMercator.java:539)
    at 
org.geotools.referencing.operation.projection.MapProjection.transform(MapProjection.java:893)
    at 
org.geotools.referencing.operation.projection.MapProjection.transform(MapProjection.java:939)
    at 
org.geotools.geometry.jts.DefaultCoordinateSequenceTransformer.transform(DefaultCoordinateSequenceTransformer.java:109)
    at 
org.geotools.geometry.jts.GeometryCoordinateSequenceTransformer.projectCoordinateSequence(GeometryCoordinateSequenceTransformer.java:262)
    at 
org.geotools.geometry.jts.GeometryCoordinateSequenceTransformer.transformPoint(GeometryCoordinateSequenceTransformer.java:253)
    at 
org.geotools.geometry.jts.GeometryCoordinateSequenceTransformer.transform(GeometryCoordinateSequenceTransformer.java:128)
    at org.geotools.geometry.jts.JTS.transform(JTS.java:436)

Thank you!
-- 
Daniel Armak
_______________________________________________
GeoTools-GT2-Users mailing list
GeoTools-GT2-Users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/geotools-gt2-users

Reply via email to