Вы, вероятно, не должны пытаться делать подобные математические операции на сфере (хотя это можно заставить работать, это сложно и медленно).
Предполагая, что length
имеет порядок 10 с -100 километров, вы должны перенести вашу проблему на «плоскую» поверхность с центром в начальной точке и использовать евклидову математику на плоскости.
К счастью, GeoTools предоставляет удобные автоматы c проекции только для этой проблемы. Здесь x
& y
- это координаты начальной точки (lon == x, lat == y):
String code = "AUTO:42001," + y + "," + x;
// System.out.println(code);
CoordinateReferenceSystem auto = CRS.decode(code);
// System.out.println(auto);
MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84,
auto);
MathTransform rTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);
Затем вы можете использовать объект transform
для преобразования ваших точек в новая проекция:
Geometry g3 = JTS.transform(g1, transform);
делайте все, что вам нужно, и затем переводите обратно в лат, используя rTransform
Итак, чтобы приспособить это к вашей проблеме.
Coordinate start = new Coordinate(1.0, 51.0);
Coordinate end = new Coordinate(2.0, 52.0);
double length = 10000;
GeometryFactory gf = new GeometryFactory();
double x = start.getX();
double y = start.getY();
String code;
if(CRS.getAxisOrder(DefaultGeographicCRS.WGS84).equals(AxisOrder.EAST_NORTH)) {
code = "AUTO:42001," + x + "," + y;
} else {
code = "AUTO:42001," + y + "," + x;
}
CoordinateReferenceSystem auto = CRS.decode(code);
MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
MathTransform rTransform = CRS.findMathTransform(auto, DefaultGeographicCRS.WGS84);
Point pStart = gf.createPoint(start);
Point pEnd = gf.createPoint(end);
Point ptStart = (Point) JTS.transform(pStart, transform);
Point ptEnd = (Point) JTS.transform(pEnd, transform);
Coordinate p1 = pPoint(ptStart.getCoordinate(), ptEnd.getCoordinate(), length);
Point tPoint = gf.createPoint(p1);
Point p = (Point) JTS.transform(tPoint, rTransform);
System.out.println(p);
, что дает мне POINT (1.2643 47.6531)
, что выглядит неправильно для меня! Возможно, вам придется проверить математику в методе pPoint
.