Как преобразовать координаты в локальной EngineeringCRS в WGS84? - PullRequest
0 голосов
/ 18 июня 2019

Я хочу закодировать преобразование координат, заданных в локальной правосторонней трехмерной декартовой системе координат, в трехмерные географические координаты, используя geotools: gt-referencing.

У меня есть местоположение и ориентация датчика в локальной, правой системе координат (мобильной платформы). Я знаю перевод и вращение локальной системы координат относительно WGS84. Математически операция довольно тривиальна, так как она может быть решена с помощью преобразования Гельмерта-Транформации. Я хотел бы использовать 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);

1 Ответ

0 голосов
/ 20 июня 2019

Я не уверен, что могу ответить на этот вопрос полностью, но это может помочь вам в правильном направлении:

Вы можете использовать MathTransformFactory для построения вашего преобразования.Вы также можете запросить у фабрики операции:

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();
}

Но я получаю несоответствие размеров здесь, но если у вас есть лучшее представление о преобразовании, вы можете сделать лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...