カスタム横メルカトル図法とWGS84経度・緯度間の座標変換
-
24-09-2019 - |
質問
私はLON-緯度起源を持つマップ上の点(x、y)、の束を入れしようとしています。私は、カスタム横メルカトル図法を設定し、私の原点を中心とLON-LATに私のポイントを投影することを利用したいと思います。
このはGeoToolkit(またはGeoTools)を行うことができるはずというものの一種のように思えるが、私は参照ライブラリを使用するための最良の方法を決定する上で大きな困難を抱えている。
私は時々働くいくつかのコードを記述するために管理しているが、他の回は、私がMathTransformFactoryをロードするGeoToolkitの試みとして、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;
}
}
おかげで、
ダン
解決
それは例外がGeoToolkitとGWT(Googleウェブツールキット)「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プラグインを使用することです。それは例外をスローしないし、戦争を構築し、TomcatやJettyのいずれかにウェブアプリを導入ありません。すべての非常に奇妙な、しかし、私は今のところそれを無視してうれしいです。
所属していません StackOverflow