2010-03-03 47 views
3

我正在嘗試在地圖上放置一堆(x,y)點,該座標原點爲lon-lat。我想設置一個自定義的橫軸墨卡託投影,集中在我的原點,並用它來將我的點投影到lon-lat。轉換自定義橫軸墨卡託投影和WGS84座標之間的座標

這看起來像是GeoToolkit(或GeoTools)應該能夠做的事情,但我很難確定使用引用庫的最佳方式。

我已經設法編寫了一些有時會起作用的代碼,但其他時候我得到了一個ClassCast異常,因爲GeoToolkit試圖加載MathTransformFactory。任何幫助將非常感激。這裏是我的代碼:

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

感謝,

回答

0

事實證明,異常是由GeoToolkit和GWT(谷歌Web工具包)「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插件。這不會拋出異常,也不會構建戰爭並將Web應用程序部署到Tomcat或Jetty。都很奇怪,但我現在很樂意忽略它。