java - 如何将本地EngineeringCRS中的坐标转换为WGS84?
问题描述
我想使用 geotools:gt-reference 将本地右手 3D 笛卡尔坐标系中给定的坐标转换为 3D 地理坐标进行编码。
我在(移动平台的)本地右手坐标系中拥有传感器的位置和方向。我知道本地坐标系相对于 WGS84 的平移和旋转。从数学上讲,该操作相当简单,因为它可以通过 Helmert-Transformation 来解决。我想使用 geotools 来完成这项任务。geotools -userguide提到了一个DefaultEngineeringCRS
似乎很适合我的本地坐标系的类。不幸的是,我没有找到任何关于这个类的用法以及如何定义它的原点和方向的示例代码。
我想做这样的事情
CoordinateReferenceSystem worldFrame = DefaultGeographicCRS.WGS84_3D;
CoordinateReferenceSystem bodyFrame = DefaultEngineeringCRS.CARTESIAN_3D;
/* set transformation rules for how to transform coordinates given in bodyFrame to coordinates in worldFrame */
DirectPosition locationOfSensor = DirectPosition3D(bodyFrame, x, y, z);
MathTransform trafo = CRS.findMathTransform(worldFrame, bodyFrame, true);
trafo.transform(locationOfSensor, locationOfSensor);
解决方案
我不确定我能不能完全回答这个问题,但这可能会帮助你朝着正确的方向前进:
您可以使用 aMathTransformFactory
来构建您的转换。也可以查询工厂的操作:
System.out.println("operations");
for (OperationMethod op : mtFactory.getAvailableMethods(Operation.class)) {
System.out.println(op.getName());
}
它给出了一个类似的列表:
operations
Geotools:Logarithmic
Geotools:Exponential
OGC:Affine
EPSG:Longitude rotation
EPSG:Geocentric translations (geog2D domain)
EPSG:Position Vector transformation (geog2D domain)
EPSG:Coordinate Frame Rotation (geog2D domain)
OGC:Ellipsoid_To_Geocentric
OGC:Geocentric_To_Ellipsoid
OGC:Molodenski
OGC:Abridged_Molodenski
OGC:NADCON
EPSG:NTv2
EPSG:Similarity transformation
Geotools:WarpPolynomial
Geotools:Earth gravitational model
OGC:Equidistant_Cylindrical
EPSG:Equidistant Cylindrical (Spherical)
ESRI:Plate_Carree
OGC:Mercator_1SP
OGC:Mercator_2SP
EPSG:Popular Visualisation Pseudo Mercator
OGC:Transverse_Mercator
EPSG:Transverse Mercator (South Orientated)
OGC:Oblique_Mercator
ESRI:Hotine_Oblique_Mercator_Two_Point_Center
OGC:Hotine_Oblique_Mercator
ESRI:Hotine_Oblique_Mercator_Two_Point_Natural_Origin
OGC:Albers_Conic_Equal_Area
OGC:Lambert_Conformal_Conic_1SP
OGC:Lambert_Conformal_Conic_2SP
ESRI:Lambert_Conformal_Conic
OGC:Lambert_Conformal_Conic_2SP_Belgium
OGC:Lambert_Azimuthal_Equal_Area
OGC:Orthographic
ESRI:Stereographic
OGC:Oblique_Stereographic
OGC:Polar_Stereographic
EPSG:Polar Stereographic (variant B)
ESRI:Stereographic_North_Pole
ESRI:Stereographic_South_Pole
OGC:New_Zealand_Map_Grid
OGC:Krovak
OGC:Cassini_Soldner
GeoTIFF:CT_Equidistant_Conic
OGC:Polyconic
Geotools:Robinson
ESRI:Winkel_Tripel
ESRI:Aitoff
Geotools:Eckert_IV
Geotools:Mollweide
Geotools:Wagner_IV
Geotools:Wagner_V
OGC:Gnomonic
OGC:World_Van_der_Grinten_I
Geotools:Sinusoidal
AUTO:General_Oblique
AUTO:MeteosatSG
OGC:GEOS
AUTO:Rotated_Pole
OGC:Azimuthal_Equidistant
Geotools:Cylindrical_Equal_Area
Geotools:Behrmann
Geotools:Lambert Cylindrical Equal Area (Spherical)
Geotools:Equal Earth
或通过Projection
:
System.out.println("projections");
for (OperationMethod op : mtFactory.getAvailableMethods(Projection.class)) {
System.out.println(op.getName());
}
这使
projections
OGC:Equidistant_Cylindrical
EPSG:Equidistant Cylindrical (Spherical)
ESRI:Plate_Carree
OGC:Mercator_1SP
OGC:Mercator_2SP
EPSG:Popular Visualisation Pseudo Mercator
OGC:Transverse_Mercator
EPSG:Transverse Mercator (South Orientated)
OGC:Oblique_Mercator
ESRI:Hotine_Oblique_Mercator_Two_Point_Center
OGC:Hotine_Oblique_Mercator
ESRI:Hotine_Oblique_Mercator_Two_Point_Natural_Origin
OGC:Albers_Conic_Equal_Area
OGC:Lambert_Conformal_Conic_1SP
OGC:Lambert_Conformal_Conic_2SP
ESRI:Lambert_Conformal_Conic
OGC:Lambert_Conformal_Conic_2SP_Belgium
OGC:Lambert_Azimuthal_Equal_Area
OGC:Orthographic
ESRI:Stereographic
OGC:Oblique_Stereographic
OGC:Polar_Stereographic
EPSG:Polar Stereographic (variant B)
ESRI:Stereographic_North_Pole
ESRI:Stereographic_South_Pole
OGC:New_Zealand_Map_Grid
OGC:Krovak
OGC:Cassini_Soldner
GeoTIFF:CT_Equidistant_Conic
OGC:Polyconic
Geotools:Robinson
ESRI:Winkel_Tripel
ESRI:Aitoff
Geotools:Eckert_IV
Geotools:Mollweide
Geotools:Wagner_IV
Geotools:Wagner_V
OGC:Gnomonic
OGC:World_Van_der_Grinten_I
Geotools:Sinusoidal
AUTO:General_Oblique
AUTO:MeteosatSG
OGC:GEOS
AUTO:Rotated_Pole
OGC:Azimuthal_Equidistant
Geotools:Cylindrical_Equal_Area
Geotools:Behrmann
Geotools:Lambert Cylindrical Equal Area (Spherical)
Geotools:Equal Earth
然后,您可以使用以下方法确定操作或投影所需的参数:
mtFactory.getDefaultParameters("EPSG:Coordinate Frame Rotation (geog2D domain)")
这使:
Coordinate Frame Rotation (geog2D domain) : dx = 0.0
dy = 0.0
dz = 0.0
ex = 0.0
ey = 0.0
ez = 0.0
ppm = 0.0
此时您应该能够定义一个新的投影:
try {
ParameterValueGroup parameters = mtFactory.getDefaultParameters("EPSG:Coordinate Frame Rotation (geog2D domain)");
parameters.parameter("dx").setValue(1.0);
parameters.parameter("dy").setValue(-1.0);
parameters.parameter("dz").setValue(0.0);
parameters.parameter("ex").setValue(1.0);
parameters.parameter("ey").setValue(-1.0);
parameters.parameter("ez").setValue(0.0);
Conversion conversion = new DefiningConversion("Frame Rot", parameters);
GeographicCRS worldFrame = org.geotools.referencing.crs.DefaultGeographicCRS.WGS84;
CartesianCS bodyFrame = org.geotools.referencing.cs.DefaultCartesianCS.GENERIC_2D;
Map<String, ?> properties = Collections.singletonMap("name", "My Proj");
projCRS = crsFactory.createProjectedCRS(properties, worldFrame, conversion, bodyFrame);
} catch (FactoryException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
但是我在这里得到了尺寸不匹配,但是如果您对转换有更好的了解,您可能会做得更好。
推荐阅读
- java - 在 Xamarin 中使用字节数组作为键时,ConcurrentHashMap 无法按预期工作
- operating-system - 在 xv6 中,wakeup(void *chan) 是如何工作的?
- php - 使用 PHP 将带引号的字符串插入 Oracle
- javascript - 为什么不显示下划线?
- python - numpy中的汉明距离
- python - 正确使用 Phrases 和 preprocess_string gensim
- java - JTextPane/JTextArea append() 随机工作
- sql - 根据销售数据计算表现最好的两个产品类别
- python - 使用ffmpeg拼接图像形成视频文件时出错
- webpack - 构建期间动态 Webpack 文件导入