Вот что происходит, когда вы слепо копируете код из stackexchange questions не читая вопрос, на котором он был основан, что объясняет почему.
Все время, когда я отвечал на этот вопрос (и отправлял подобный код), спрашивающий пытался использовать координаты широты и долготы в градусах для измерения короткого расстояния в метрах. Трюк, показанный в вашем вопросе, создает автоматическую проекцию UTM с центром в позиции, указанной после бита «AUTO: 42001» (в вашем случае 52N 13E) — это должен быть центр интересующей вас области, поэтому в вашем случай, когда эти значения, вероятно, неверны в любом случае.
Но вас не интересует небольшой регион от Мумбаи до Дурбана, это значительный путь вокруг Земли, поэтому вам нужно учитывать кривизну земной поверхности. Также вы не пытаетесь сделать что-то сложное, для которого JTS является единственным источником процесса (например, буферизация). В этом случае вы должны использовать GeodeticCalculator
, который учитывает форму Земли, используя библиотеку CFF Karney, Algorithms for geodesics, J. Geodesy 87, 43–55 (2013).
В любом случае достаточно объяснения, которое никто не будет читать в будущем, вот код:
public static void main(String[] args) {
DefaultGeographicCRS crs = DefaultGeographicCRS.WGS84;
if (args.length != 4) {
System.err.println("Need 4 numbers lat_1 lon_1 lat_2 lon_2");
return;
}
GeometryFactory geomFactory = new GeometryFactory();
Point[] points = new Point[2];
for (int i = 0, k = 0; i < 2; i++, k += 2) {
double x = Double.valueOf(args[k]);
double y = Double.valueOf(args[k + 1]);
if (CRS.getAxisOrder(crs).equals(AxisOrder.NORTH_EAST)) {
System.out.println("working with a lat/lon crs");
points[i] = geomFactory.createPoint(new Coordinate(x, y));
} else {
System.out.println("working with a lon/lat crs");
points[i] = geomFactory.createPoint(new Coordinate(y, x));
}
}
double distance = 0.0;
GeodeticCalculator calc = new GeodeticCalculator(crs);
calc.setStartingGeographicPoint(points[0].getX(), points[0].getY());
calc.setDestinationGeographicPoint(points[1].getX(), points[1].getY());
distance = calc.getOrthodromicDistance();
double bearing = calc.getAzimuth();
Quantity<Length> dist = Quantities.getQuantity(distance, SI.METRE);
System.out.println(dist.to(MetricPrefix.KILO(SI.METRE)).getValue() + " Km");
System.out.println(dist.to(USCustomary.MILE).getValue() + " miles");
System.out.println("Bearing " + bearing + " degrees");
}
Предоставление:
working with a lon/lat crs
POINT (72.8777 19.076)
POINT (31.049999 -29.883333)
7032.866960793305 Km
4370.020928274692 miles
Bearing -139.53428618565218 degrees
person
Ian Turton
schedule
20.02.2020