Java 在自定义横轴墨卡托和WGS84 Lon Lat之间转换坐标

Java 在自定义横轴墨卡托和WGS84 Lon Lat之间转换坐标,java,geolocation,maps,gis,mercator,Java,Geolocation,Maps,Gis,Mercator,我试着在地图上放一堆(x,y)点,它们有一个lon-lat原点。我想建立一个以原点为中心的自定义横向墨卡托投影,并使用它将我的点投影到lon-lat 这似乎是GeoToolkit(或GeoTools)应该能够做的事情,但我很难确定使用引用库的最佳方式 我已经成功地编写了一些代码,这些代码有时可以正常工作,但在GeoToolkit尝试加载MathTransformFactory时,有时会出现ClassCast异常。任何帮助都将不胜感激。这是我的密码: public class LonLatCon

我试着在地图上放一堆(x,y)点,它们有一个lon-lat原点。我想建立一个以原点为中心的自定义横向墨卡托投影,并使用它将我的点投影到lon-lat

这似乎是GeoToolkit(或GeoTools)应该能够做的事情,但我很难确定使用引用库的最佳方式

我已经成功地编写了一些代码,这些代码有时可以正常工作,但在GeoToolkit尝试加载MathTransformFactory时,有时会出现ClassCast异常。任何帮助都将不胜感激。这是我的密码:

 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;
    }
}
谢谢


dan

事实证明,这个异常是由GeoToolkit和GWT(Google Web Toolkit)“devmode”(坐标转换发生在GWT/Java Web应用程序的后端)之间的奇怪交互引起的。作为记录,这是一个例外:

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

我目前的工作是使用GWT Eclipse插件。这不会引发异常,构建war和将web应用部署到Tomcat或Jetty也不会引发异常。这一切都很奇怪,但我很乐意暂时忽略它。

事实证明,这个异常是由GeoToolkit和GWT(Google Web Toolkit)“devmode”(坐标转换发生在GWT/Java Web应用程序的后端)之间的一个奇怪交互引起的。作为记录,这是一个例外:

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)
...
我目前的工作是使用GWT Eclipse插件。这不会引发异常,构建war和将web应用部署到Tomcat或Jetty也不会引发异常。这一切都很奇怪,但我很高兴暂时忽略它