代码之家  ›  专栏  ›  技术社区  ›  Ian Turton

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

  •  1
  • Ian Turton  · 技术社区  · 7 年前

    javax.measure 图书馆

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

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

    a.doubleValue(NonSI.HECTARE);
    

    但唯一的另一个 Area Are

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

    2 回复  |  直到 7 年前
        1
  •  1
  •   Werner Keil    7 年前

    像这样的代码片段 NonSI.MILE.divide(8.0).times...

    JSR 363 ?

    SimpleUnitFormat.getInstance().label(acre, "acre"); )在JSR 363中工作得非常好。与275不同,还有一个用于SI系统和其他单位系统的扩展模块的庞大基础设施。一些主要的开源项目已经使用了新标准。试试看。

        2
  •  0
  •   Ian Turton    6 年前

    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

    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");
    

    master