GeoToolkit:从GPS转换为Lambert Conformal Conic

时间:2012-05-14 10:39:35

标签: java geolocation gis coordinate-transformation

我必须将GPS坐标(纬度和经度)转换为Lambert Conformal Conic投影。该地图指的是意大利。 由于我不是这个主题的专家,我发现(谷歌搜索)最好的Java库是GeoToolkit。不幸的是,我没有找到任何示例或文档(只有Javadoc)。 这里的投影参数(proj = Lcc Lat_2 = 45 Lat_1 = 40 Lat_0 = 42.5 Lon_0 = 9.2 x_0 = 600000 y_0 = 2200000):

PARAM_MT["Lambert_Conformal_Conic_2SP", 
PARAMETER["semi_major", 6378137.0], 
PARAMETER["semi_minor", 6356752.314], 
PARAMETER["central_meridian", 9.2], 
PARAMETER["latitude_of_origin", 42.5], 
PARAMETER["false_easting", 600000.0], 
PARAMETER["false_northing", 2200000.0], 
PARAMETER["standard_parallel_2", 45.0], 
PARAMETER["standard_parallel_1", 40.0]]

有谁知道比GeoToolkit更好的库?

我编写了以下代码来转换coords:

// 1. Get the MathTransform Factory
MathTransformFactory factory;

FactoryRegistry registry = new FactoryRegistry(
        MathTransformFactory.class);

factory = registry.getServiceProvider(MathTransformFactory.class, null,
        null, Hints.MATH_TRANSFORM_FACTORY);

// 2. Define source and target coord reference systems
GeographicCRS sourceCRS = DefaultGeographicCRS.WGS84;

ParameterValueGroup parameters = factory
        .getDefaultParameters("Lambert_Conformal_Conic_2SP");
parameters.parameter("semi_major").setValue(WGS84_AXIS_MAJOR);
parameters.parameter("semi_minor").setValue(WGS84_AXIS_MINOR);
parameters.parameter("central_meridian").setValue(9.2);
parameters.parameter("latitude_of_origin").setValue(42.5);
parameters.parameter("standard_parallel_1").setValue(40.0);
parameters.parameter("standard_parallel_2").setValue(45.0);
parameters.parameter("false_easting").setValue(600000);
parameters.parameter("false_northing").setValue(2200000);

// 3. Create the MathTransform with the given parameters
Conversion conversion = new DefiningConversion("GPS to Lambert",
        parameters);

CRSFactory crsFactory = FactoryFinder.getCRSFactory(null);
Map<String, ?> properties = Collections.singletonMap(
        ProjectedCRS.NAME_KEY, "LatLon2Lambert");
ProjectedCRS targetCRS = crsFactory.createProjectedCRS(properties,
        sourceCRS, conversion, DefaultCartesianCS.GENERIC_2D);

MathTransform tr = CRS.findMathTransform(sourceCRS, targetCRS);

DirectPosition sourcePt = new DefaultDirectPosition(DefaultGeographicCRS.WGS84);
sourcePt.setOrdinate(0, 45.0);
sourcePt.setOrdinate(1, 8.0);

DirectPosition targetPt = tr.transform(p.getValue(), null);

然而,它不起作用。 我哪里错了? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

提供的代码是正确的。 唯一的问题是输入:GeoToolkit使用位置表示法来识别纬度和经度。并且它要求第一个参数是经度。 例如,在上面代码的末尾,您可以执行转换。

以下是一个例子:

DirectPosition sourcePt = new GeneralDirectPosition(DefaultGeographicCRS.WGS84);
sourcePt.setOrdinate(0, Double.parseDouble(8.751426)); // longitude
sourcePt.setOrdinate(1, Double.parseDouble(45.12478)); // latitude

DirectPosition targetPt = tr.transform(p.getValue(), null);

在targetPt变量中,您在Lambert中拥有正确的坐标。