Frage

Ich versuche, eine Reihe von (x, y) Punkten auf einer Karte zu setzen, die einen lon-lat Ursprung haben. Ich möchte eine benutzerdefinierte Transversale Mercator-Projektion einzurichten, zentriert auf meine Herkunft und Verwendung, dass meine Punkte in lon-lat zu projizieren.

Dies scheint, wie die Art der Sache, dass GeoToolkit (oder GeoTools) soll tun können, aber ich habe große Schwierigkeiten, die beste Art und Weise der Bestimmung die Referenzierung Bibliothek zu verwenden.

Ich habe es geschafft, einige Code zu schreiben, manchmal funktioniert, aber manchmal ich eine ClassCast Ausnahme erhalten, wie GeoToolkit Versuche, die MathTransformFactory zu laden. Jede Hilfe wäre sehr geschätzt. Hier ist mein Code:

 public class LonLatConverter {

    private static final double WGS84_AXIS_MINOR = 6356752.314;
    private static final double WGS84_AXIS_MAJOR = 6378137.000;
    private GeoLocation origin;

    private static MathTransformFactory factory;

    public LonLatConverter(GeoLocation origin) {
        this.origin = origin;
    }

    public GeoLocation toLonLat(Vector2D location) {
        double lon = 0;
        double lat = 0;
        try {
            MathTransformFactory factory = getMathTransformFactory();

            MathTransform tr = getMathTransform(factory);

            DirectPosition sourcePt = new GeneralDirectPosition(
                    location.getX(), location.getY());
            DirectPosition targetPt = tr.transform(sourcePt, null);

            lon = targetPt.getOrdinate(0);
            lat = targetPt.getOrdinate(1);

        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return new GeoLocation(lon, lat);
    }

    private MathTransform getMathTransform(MathTransformFactory factory)
            throws NoninvertibleTransformException, FactoryException {
        ParameterValueGroup p = factory
                .getDefaultParameters("Transverse_Mercator");
        p.parameter("semi_major").setValue(WGS84_AXIS_MAJOR);
        p.parameter("semi_minor").setValue(WGS84_AXIS_MINOR);
        p.parameter("central_meridian").setValue(origin.getLongitude());
        p.parameter("latitude_of_origin").setValue(origin.getLatitude());
        MathTransform tr = factory.createParameterizedTransform(p).inverse();
        return tr;
    }

    private MathTransformFactory getMathTransformFactory() {

        if (factory == null) {
            FactoryRegistry registry = new FactoryRegistry(
                    MathTransformFactory.class);

            factory = registry.getServiceProvider(MathTransformFactory.class,
                    null, null, Hints.MATH_TRANSFORM_FACTORY);
        }

        return factory;
    }
}

Danke,

dan

War es hilfreich?

Lösung

Es stellt sich heraus, dass die Ausnahme durch eine seltsame Wechselwirkung zwischen GeoToolkit verursacht wird und die GWT (Google Web Toolkit) „devmode“ (die Koordinatenumwandlung in dem Back-End eines GWT / Java-Web-App geschieht). Für das Protokoll, das ist die Ausnahme:

Caused by: java.lang.RuntimeException: java.lang.ClassCastException: class org.geotoolkit.referencing.operation.DefaultMathTransformFactory
     at com.example.LonLatConverter.toLonLat(LonLatConverter.java:47)
...

Caused by: java.lang.ClassCastException: class org.geotoolkit.referencing.operation.DefaultMathTransformFactory
     at java.lang.Class.asSubclass(Class.java:3018)
     at org.geotoolkit.factory.FactoryRegistry.register(FactoryRegistry.java:921)
    at org.geotoolkit.factory.FactoryRegistry.scanForPlugins(FactoryRegistry.java:793)
    at org.geotoolkit.factory.FactoryRegistry.scanForPluginsIfNeeded(FactoryRegistry.java:843)
    at org.geotoolkit.factory.FactoryRegistry.getServiceProviders(FactoryRegistry.java:236)
    at com.example.LonLatConverter.getMathTransformFactory(LonLatConverter.java:71)
    at com.example.LonLatConverter.toLonLat(LonLatConverter.java:35)
...

Mein aktuellen Work-around ist die GWT Eclipse-Plug-in zu verwenden. Dass werfen nicht die Ausnahme, auch nicht den Aufbau, den Krieg und die Bereitstellung der Web-App entweder Tomcat oder Jetty. Alles sehr seltsam, aber ich bin froh, dass es jetzt zu ignorieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top