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;
}
}
感謝,
丹