I am using the Java based libraries of OpenGIS and JTS to convert coordinates from EPSG:3857 to EPSG:4326 to proceed to compute the distance using the Haversine formula. The distance features in a constraint on whether to zoom in further on a map or not.
We are using a tangible user interface and depend on the reactivity of the system. Unfortunately, the conversion is quite slow which induces even more delay than loading the map from a server. Would there be a less costly way to proceed with the conversion using local resources?
CoordinateReferenceSystem targetCRS = CRS.decode("EPSG:4326");
CoordinateReferenceSystem sourceCRS = CRS.decode("EPSG:3857");
MathTransform transform = CRS.findMathTransform(sourceCRS, targetCRS, false);
GeometryFactory geometryFactory = new GeometryFactory(new PrecisionModel(), 3857);
Point minPoint = geometryFactory.createPoint(new Coordinate(xMin, yMin));
Point minTargetPoint = (Point) JTS.transform(minPoint, transform);
Point maxPoint = geometryFactory.createPoint(new Coordinate(xMax, yMax));
PointmaxTargetPoint = (Point) JTS.transform(maxPoint, transform);
Answer
You can use the GeodeticCalculator which should be faster. Something like:
package com.envitia.spike;
import org.geotools.geometry.DirectPosition2D;
import org.geotools.referencing.CRS;
import org.geotools.referencing.GeodeticCalculator;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.NoSuchAuthorityCodeException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.TransformException;
public class ZoomChecker {
CoordinateReferenceSystem sourceCRS;
GeodeticCalculator calc;
public ZoomChecker() throws NoSuchAuthorityCodeException, FactoryException {
this("EPSG:3857");
}
public ZoomChecker(String code) throws NoSuchAuthorityCodeException, FactoryException {
sourceCRS = CRS.decode(code);
calc = new GeodeticCalculator(sourceCRS);
}
public double check(final double minX, final double minY, double maxX, double maxY)
throws TransformException {
calc.setStartingPosition(new DirectPosition2D(minX, minY));
calc.setDestinationPosition(new DirectPosition2D(maxX, maxY));
return calc.getOrthodromicDistance();
}
public static void main(String[] args) throws NoSuchAuthorityCodeException, FactoryException,
TransformException {
ZoomChecker checker = new ZoomChecker("EPSG:27700");
double d = checker.check(0.0, 0.0, 0.0, 10000.0);
System.out.println(d);
d = checker.check(0.0, 0.0, 10000.0, 0.0);
System.out.println(d);
}
}
This gives a reasonable distance calculation of 9984m over the 10km in the test.
No comments:
Post a Comment