1

我正在关注此处发布的解决方案,该解决方案使用 Java 将平方度转换为平方米。我在使用 Maven 导入时遇到问题。

具体来说,按照此处的 GeoTools Maven 快速入门,我仍然遇到 和Cannot resolve method的错误。奇怪的是,对于前者,我找到了一些说它使用的源代码,但我对那个导入也没有运气。org.geotools.measure.Measure.valueOf()org.opengis.geometry.coordinate.Polygon.getCentroid()javax.measure.Measure

IDE视图:

在此处输入图像描述

这是我的文件:

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.myapp.me</groupId>
    <artifactId>my-app</artifactId>
    <packaging>war</packaging>
    <version>1.0.0</version>
    <name>my app code</name>

    <parent>
        <groupId>com.myapp.me</groupId>
        <artifactId>my-app-root</artifactId>
        <version>1.0.0</version>
    </parent>

    <prerequisites>
        <maven>3</maven>
    </prerequisites>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <geotools.version>21.0</geotools.version>
    </properties>

    <organization>
        <name>my-org</name>
        <url>myurl</url>
    </organization>

    <repositories>
        <repository>
            <id>maven2-repository.dev.java.net</id>
            <name>Java.net repository</name>
            <url>http://download.java.net/maven/2</url>
        </repository>
        <repository>
            <id>osgeo</id>
            <name>Open Source Geospatial Foundation Repository</name>
            <url>http://download.osgeo.org/webdav/geotools/</url>
        </repository>
        <repository>
            <snapshots>
                <enabled>true</enabled>
            </snapshots>
            <id>boundless</id>
            <name>Boundless Maven Repository</name>
            <url>http://repo.boundlessgeo.com/main</url>
        </repository>
    </repositories>

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.11</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-shapefile</artifactId>
            <version>${geotools.version}</version>
        </dependency>
        <dependency>
            <groupId>org.geotools</groupId>
            <artifactId>gt-swing</artifactId>
            <version>${geotools.version}</version>
        </dependency>
    </dependencies>
</project>

爪哇

import si.uom.SI;
import org.geotools.geometry.jts.JTS;
import org.geotools.referencing.CRS;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.opengis.feature.Feature;
import org.opengis.feature.simple.SimpleFeature;
import org.opengis.geometry.Geometry;
import org.opengis.geometry.MismatchedDimensionException;
import org.opengis.geometry.coordinate.Polygon;
import org.opengis.geometry.primitive.Point;
import org.opengis.referencing.FactoryException;
import org.opengis.referencing.crs.CoordinateReferenceSystem;
import org.opengis.referencing.operation.MathTransform;
import org.opengis.referencing.operation.TransformException;
import org.geotools.measure.Measure; 

public class Mapper {

    private Measure<Double, Area> calcArea(SimpleFeature feature) {
        Polygon p = (Polygon) feature.getDefaultGeometry();
        Point centroid = p.getCentroid();
        try {
            String code = "AUTO:42001," + centroid.getX() + "," + centroid.getY();
            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);
    }
}

我究竟做错了什么?

编辑:

响应 RealSkeptic 的建议尝试最新的 Javax 导入。

请注意右侧的导入,但左侧没有使用它的选项。就好像找不到一样。然而,它可以找到import javax.measure.quantity.Area

在此处输入图像描述

4

1 回答 1

0

您正在查看适用于旧版本 GeoTools 的代码,您可以随时查看GeoTools 升级说明,了解使用新版本库需要进行哪些更改。

你需要这个依赖:

<dependency>
   <groupId>systems.uom</groupId>
   <artifactId>systems-common-java8</artifactId>
   <version>0.7.2</version>
</dependency>

软件包名称已更改,导致升级时出现一些常见的搜索和替换:

搜索 javax.measure.unit.Unit 替换 javax.measure.Unit

搜索 ConversionException 替换 IncommensurableException

这是一个检查异常,在 GeoTools 库中发现它的区域中,我们现在返回一个 IllegalArgument 异常。

搜索转换器 == UnitConverter.IDENTITY 替换 converter.isIdentity()

搜索 javax.measure.unit.NonSI 替换 import si.uom.NonSI

搜索 javax.measure.unit.SI 替换 import si.uom.SI

搜索 SI.METER 替换 SI.METRE

搜索 javax.measure.converter.UnitConverter 替换 javax.measure.UnitConverter

搜索 javax.measure.unit.UnitFormat 替换 import javax.measure.format.UnitFormat

搜索 Unit.ONE 替换 AbstractUnit.ONE

搜索 Dimensionless.UNIT 替换 AbstractUnit.ONE

搜索 Unit.valueOf(unitString) 替换 Units.parseUnit(unitString)

并使用 Quanties:

使用单位

如果以前您在代码中使用了单位,以帮助进行单位转换或只是保持单位直截了当。您可能有如下代码:

Measure<Double, Length> dist = Measure.valueOf(distance, SI.METER);
System.out.println(dist.doubleValue(SI.KILOMETER) + " Km");
System.out.println(dist.doubleValue(NonSI.MILE) + " miles");

你会发现它不再编译。它应该被转换为使用 Quantity 类。

import javax.measure.Quantity;
import javax.measure.quantity.Length;
import si.uom.SI;
import systems.uom.common.USCustomary;

import tec.uom.se.quantity.Quantities;
import tec.uom.se.unit.MetricPrefix;

Quantity<Length> dist = Quantities.getQuantity(distance, SI.METRE);
System.out.println(dist.to(MetricPrefix.KILO(SI.METRE)).getValue() + " Km");
System.out.println(dist.to(USCustomary.MILE) + " miles");
于 2019-06-26T08:21:08.643 回答