我有一个计算多边形面积的程序,以米为单位,我希望使用javax.measure
库将其转换为其他单位(如用户所需)。
Measure<Double, Area> a = Measure.valueOf(area, SI.SQUARE_METRE);
所以,如果我想要公顷,我可以使用:
a.doubleValue(NonSI.HECTARE);
但唯一的其他Area
数量为Are
。
虽然我可以轻松划分1000 * 1000来获得KM平方,但当我尝试获得Acres或Sq Miles或其他常见的区域单位时,它会变得更加混乱。
答案 0 :(得分: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系统和其他单位系统。一些主要的开源项目已经使用了新标准。试一试。
答案 1 :(得分: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据说英亩是1英尺长的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中)。