使用javax.measure将平方米转换为平方公里

问题描述 投票:2回答:2

我有一个程序,以米为单位计算多边形的面积,我想使用javax.measure库将其转换为其他单位(如用户所需)。

Measure<Double, Area> a = Measure.valueOf(area, SI.SQUARE_METRE);

所以,如果我需要公顷,我可以使用:

a.doubleValue(NonSI.HECTARE);

但唯一的其他Area数量是Are

虽然我可以轻松划分1000 * 1000来获得KM平方,但当我尝试获得Acres或Sq Miles或其他常见的区域单位时,它会变得更加混乱。

java units-of-measurement
2个回答
1
投票

NonSI.MILE.divide(8.0).times...这样的代码片段告诉您在解决方案中使用旧的,未完成的JSR 275和JScience 4等实现。

任何理由更喜欢这个官方,完成javax.measure JSR 363

以上所有内容都有一些变化(例如,UnitFormat现在是一个API接口,JSR 363中的代码将是SimpleUnitFormat.getInstance().label(acre, "acre");)在JSR 363中运行得非常好。与275不同,SI系统和其他单元的扩展模块也有很多基础设施。系统。一些主要的开源项目已经使用了新标准。试试看。


0
投票

经过一些调查和实验,我可以生成平方英里和平方公里,如下所示:

Unit<Area> sq_km = (Unit<Area>) SI.KILOMETER.times(SI.KILOMETER);
System.out.println(a.to(sq_km));
Unit<Area> sq_mile = (Unit<Area>) NonSI.MILE.times(NonSI.MILE);
System.out.println(a.to(sq_mile));
System.out.println(a.to(NonSI.HECTARE));

这给了我输出:

4.872007325925411E11 m²
487200.7325925411 km²
188109.25449744106 mi²
4.8720073259254105E7 ha

但是,根据Wikipedia的说法,亩地正在逃离我,一英亩的土地面积是66英尺。我试过:

Unit<Area> acre = (Unit<Area>) NonSI.MILE.divide(8.0).times(NonSI.FOOT).times(66.0);
System.out.println(a.to(acre));

给出了正确的答案,但给了我一个m²*4046.8564224的单位。

编辑

所以进一步的实验给了我:

Unit<Area> acre = (Unit<Area>) NonSI.MILE.divide(8.0).times(NonSI.FOOT).times(66.0);
UnitFormat.getInstance().label(acre, "acre");

和输出(对于不同的多边形):

2.6529660563942477E7 acre

进一步更新

GeoTools现在使用JSR-363单位,因此以上变为:

Unit<Area> sq_km = (Unit<Area>) MetricPrefix.KILO(SI.METRE).multiply(MetricPrefix.KILO(SI.METRE));
System.out.println(a.to(sq_km));
System.out.println(pop.divide(a.to(sq_km)));

Unit<Area> sq_mile = (Unit<Area>) USCustomary.MILE.multiply(USCustomary.MILE);
System.out.println(a.to(sq_mile));
System.out.println(a.to(NonSI.HECTARE));

System.out.println(a.to(USCustomary.ACRE).getValue() + " acres");

所以Acres在,但由于某种原因没有在java8 jar中定义的单元(但在master中)。

© www.soinside.com 2019 - 2024. All rights reserved.