【问题标题】:Converting square metres to Square Kilometres using javax.measure使用 javax.measure 将平方米转换为平方公里
【发布时间】:2018-01-06 18:33:13
【问题描述】:

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

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

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

a.doubleValue(NonSI.HECTARE);

但唯一的其他Area 数量是Are

虽然我可以很容易地除以 1000*1000 来得到 KM 的平方,但当我尝试得到英亩或平方英里或其他常见面积单位时,它会变得更加混乱。

【问题讨论】:

  • 1mi² = 2.59km²(所以 10mi² = 25.9km² 等等),你可以乘以;)
  • 我知道我可以通过乘法来做到这一点,但我希望有一个基于单位的解决方案。

标签: java units-of-measurement


【解决方案1】:

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

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 中定义)。

【讨论】:

【解决方案2】:

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

有什么理由比官方完成的 javax.measure JSR 363 更喜欢它?

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

【讨论】:

  • JSR363 是 JSR 275 的替代品还是我们 (geotools.org) 需要进行大量更改?
  • 我假设您在 GeoTools 上与 Martin 一起工作?包结构略有变化,使 JSR 363 比 275 更模块化,但 UnitDimensionQuantity 等关键元素具有几乎相同的方法和行为.像 Length 这样的内置数量类型更加相似,通常是直接替换。如果您有问题或询问 Martin,请告诉我们。问候,维尔纳
猜你喜欢
  • 2018-11-05
  • 1970-01-01
  • 2015-09-07
  • 1970-01-01
  • 2017-01-03
  • 2015-10-18
  • 1970-01-01
  • 2015-07-17
  • 1970-01-01
相关资源
最近更新 更多