2010-03-03 2 views
3

지도에 lon-lat 원점이있는 (x, y) 점을 넣으려고합니다. 내 원점을 중심으로 사용자 정의 가로 메카 토르 투영법을 설정하고이를 사용하여 내 포인트를 경도로 투영하고 싶습니다.사용자 지정 가로 메르카토르와 WGS84 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; 
    } 
} 

감사합니다,

답변

0

그것은 예외가 GeoToolkit와 GWT (구글 웹 툴킷 (Google Web Toolkit)) "DEVMODE"사이에 이상한 상호 작용에 의해 발생되는 것으로 나타났다 (좌표 변환은 GWT/Java 웹 응용 프로그램의 백엔드에서 발생합니다). 기록의 경우 이것은 예외입니다 :

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 플러그인을 사용하고 있습니다. 예외를 던지거나 전쟁을 구축하거나 웹 앱을 Tomcat이나 Jetty에 배포하지 않습니다. 모두 매우 이상하지만, 지금은 그것을 무시하게되어 기쁩니다.

관련 문제