Проблема GeoTools Maven - путаница с импортом - PullRequest
1 голос
/ 24 июня 2019

Я следую решению, опубликованному здесь , которое использует Java для преобразования квадратных градусов в квадратные метры.У меня проблема с импортом Maven.

В частности, после быстрого запуска GeoTools Maven здесь я все еще получаю Cannot resolve method ошибок как для org.geotools.measure.Measure.valueOf(), так и org.opengis.geometry.coordinate.Polygon.getCentroid().Как ни странно, для первого я нашел некоторый исходный код , который говорит, что он использует javax.measure.Measure, но мне не повезло с , который также импортирует .

IDE Просмотр:

enter image description here

Вот мои файлы:

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>

Java

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

enter image description here

1 Ответ

0 голосов
/ 26 июня 2019

Вы просматриваете код для более старой версии 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 заменить импорт si.uom.NonSI

Поиск javax.measure.unit.SI заменить импорт si.uom.SI

Поиск SI.METER заменяет SI.METRE

Поиск javax.measure.converter.UnitConverter заменяет javax.measure.UnitConverter

Поиск javax.measure.unit.UnitFormat заменяет импорт javax.measure.format.UnitFormat

Search Unit.ONE заменяет AbstractUnit.ONE

Поиск безразмерных.UNIT заменяет AbstractUnit.ONE

Поиск Unit.valueOf (unitString) заменяет Units.parseUnit (unitString)

А для использования Quanaties:

Использование единиц измерения

Если ранее вы использовали единицы в своем коде, чтобы помочь с преобразование единиц или просто чтобы сохранить единицы прямо. Ты можешь иметь код как:

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

Вы найдете, что он больше не компилируется. Он должен быть преобразован для использования Количество классов.

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