Вам необходимо использовать библиотеку, которая может обрабатывать перепроецирование от сферических степеней в локально плоскую систему отсчета, чтобы вы могли использовать JTS для выполнения расчетов.
Этот вопрос на gis.stackexchange.com дает более общий общий пример того, как это сделать с помощью библиотеки GeoTools .
Поскольку вы ограничиваете свой вопрос для континентальной части США, у вас есть более простая проблема, и вы можете использовать фиксированную проекцию, например, равную площадь Национального атласа США ( EPSG: 2163 ), поэтому такой метод:
private Measure<Double, Area> calcArea(Polygon p) {
try {
String code = "EPSG:2163";
CoordinateReferenceSystem auto = CRS.decode(code);
MathTransform transform = CRS.findMathTransform(DefaultGeographicCRS.WGS84, auto);
Polygon projed = (Polygon) JTS.transform(p, transform);
return Measure.valueOf(projed.getArea(), SI.SQUARE_METRE);
} catch (MismatchedDimensionException | TransformException | FactoryException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return Measure.valueOf(0.0, SI.SQUARE_METRE);
}
Затем вы можете назвать это как-то так, где polygon - это JTS Polygon в широте / долготе:
Unit<Area> sq_mile = USCustomary.MILE.multiply(USCustomary.MILE).asType(Area.class);
Unit<Area> sq_km = MetricPrefix.KILO(SI.METRE).multiply(MetricPrefix.KILO(SI.METRE)).asType(Area.class);
javax.measure.Quantity<Area> a = me.calcArea(polygon);
System.out.println(a);
System.out.println(a.to(sq_km));
System.out.println(a.to(sq_mile));