Skip to content
GitLab
Menu
Projects
Groups
Snippets
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
Menu
Open sidebar
Main Repositories
otb
Commits
d9c8398f
Commit
d9c8398f
authored
May 06, 2022
by
Julien Osman
Browse files
BUG: Read RPC model when metadata were written by OTB
parent
8b7d22ea
Pipeline
#10595
passed with stages
in 86 minutes and 54 seconds
Changes
2
Pipelines
2
Hide whitespace changes
Inline
Side-by-side
Modules/IO/IOGDAL/include/otbGDALImageIO.h
View file @
d9c8398f
...
...
@@ -247,6 +247,8 @@ protected:
void
KeywordlistToMetadata
(
ImageMetadataBase
::
Keywordlist
,
int
band
=-
1
);
/** Parses a GDAL Metadata string list to fill a Keywordlist*/
void
GDALMetadataToKeywordlist
(
const
char
*
const
*
,
ImageMetadataBase
::
Keywordlist
&
);
/** Parses the RMC from the GDAL Metadata */
void
GDALMetadataReadRPC
();
void
PrintSelf
(
std
::
ostream
&
os
,
itk
::
Indent
indent
)
const
override
;
/** Read all information on the image*/
...
...
Modules/IO/IOGDAL/src/otbGDALImageIO.cxx
View file @
d9c8398f
...
...
@@ -1288,7 +1288,6 @@ void GDALImageIO::WriteImageInformation()
void
GDALImageIO
::
InternalWriteImageInformation
(
const
void
*
buffer
)
{
// char ** papszOptions = NULL;
std
::
string
driverShortName
;
m_NbBands
=
this
->
GetNumberOfComponents
();
...
...
@@ -1916,7 +1915,11 @@ void GDALImageIO::ImportMetadata()
ImageMetadataBase
::
Keywordlist
kwl
;
GDALMetadataToKeywordlist
(
m_Dataset
->
GetDataSet
()
->
GetMetadata
(),
kwl
);
// Decode SAR metadata
// Decode RPC model
if
(
m_Dataset
->
GetDataSet
()
->
GetMetadata
(
"RPC"
))
GDALMetadataReadRPC
();
// Decode SAR model
if
(
kwl
.
find
(
"SAR"
)
!=
kwl
.
end
())
{
try
...
...
@@ -1935,7 +1938,7 @@ void GDALImageIO::ImportMetadata()
}
}
// Decode SAR
meta
data
// Decode SAR
calibration
data
if
(
kwl
.
find
(
"SARCalib"
)
!=
kwl
.
end
())
{
try
...
...
@@ -2006,46 +2009,45 @@ void GDALImageIO::GDALMetadataToKeywordlist(const char* const* metadataList, Ima
if
((
fieldName
.
size
()
>
36
)
&&
(
fieldName
.
substr
(
0
,
36
)
==
"MDGeomNames[MDGeom::SensorGeometry]."
))
{
// Sensor Geometry is imported directly in the ImageMetadata.
// TODO: Keys Starting with: MDGeomNames[MDGeom::SensorGeometry] + '.' should
// be decoded by the (future) SensorModelFactory.
}
else
if
(
fieldName
==
MetaData
::
MDGeomNames
.
left
.
at
(
MDGeom
::
RPC
))
else
{
// RPC Models are imported directly in the ImageMetadata.
Projection
::
RPCParam
rpcStruct
;
rpcStruct
.
LineOffset
=
this
->
GetAs
<
double
>
(
"RPC/LINE_OFF"
);
rpcStruct
.
SampleOffset
=
this
->
GetAs
<
double
>
(
"RPC/SAMP_OFF"
);
rpcStruct
.
LatOffset
=
this
->
GetAs
<
double
>
(
"RPC/LAT_OFF"
);
rpcStruct
.
LonOffset
=
this
->
GetAs
<
double
>
(
"RPC/LONG_OFF"
);
rpcStruct
.
HeightOffset
=
this
->
GetAs
<
double
>
(
"RPC/HEIGHT_OFF"
);
kwl
.
emplace
(
fieldName
,
fieldValue
);
}
}
}
void
GDALImageIO
::
GDALMetadataReadRPC
()
{
// RPC Models are imported directly in the ImageMetadata.
Projection
::
RPCParam
rpcStruct
;
rpcStruct
.
LineOffset
=
this
->
GetAs
<
double
>
(
"RPC/LINE_OFF"
);
rpcStruct
.
SampleOffset
=
this
->
GetAs
<
double
>
(
"RPC/SAMP_OFF"
);
rpcStruct
.
LatOffset
=
this
->
GetAs
<
double
>
(
"RPC/LAT_OFF"
);
rpcStruct
.
LonOffset
=
this
->
GetAs
<
double
>
(
"RPC/LONG_OFF"
);
rpcStruct
.
HeightOffset
=
this
->
GetAs
<
double
>
(
"RPC/HEIGHT_OFF"
);
rpcStruct
.
LineScale
=
this
->
GetAs
<
double
>
(
"RPC/LINE_SCALE"
);
rpcStruct
.
SampleScale
=
this
->
GetAs
<
double
>
(
"RPC/SAMP_SCALE"
);
rpcStruct
.
LatScale
=
this
->
GetAs
<
double
>
(
"RPC/LAT_SCALE"
);
rpcStruct
.
LonScale
=
this
->
GetAs
<
double
>
(
"RPC/LONG_SCALE"
);
rpcStruct
.
HeightScale
=
this
->
GetAs
<
double
>
(
"RPC/HEIGHT_SCALE"
);
rpcStruct
.
LineScale
=
this
->
GetAs
<
double
>
(
"RPC/LINE_SCALE"
);
rpcStruct
.
SampleScale
=
this
->
GetAs
<
double
>
(
"RPC/SAMP_SCALE"
);
rpcStruct
.
LatScale
=
this
->
GetAs
<
double
>
(
"RPC/LAT_SCALE"
);
rpcStruct
.
LonScale
=
this
->
GetAs
<
double
>
(
"RPC/LONG_SCALE"
);
rpcStruct
.
HeightScale
=
this
->
GetAs
<
double
>
(
"RPC/HEIGHT_SCALE"
);
std
::
vector
<
double
>
coeffs
(
20
);
std
::
vector
<
double
>
coeffs
(
20
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/LINE_NUM_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
LineNum
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/LINE_NUM_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
LineNum
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/LINE_DEN_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
LineDen
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/LINE_DEN_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
LineDen
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/SAMP_NUM_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
SampleNum
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/SAMP_NUM_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
SampleNum
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/SAMP_DEN_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
SampleDen
);
coeffs
=
this
->
GetAsVector
<
double
>
(
"RPC/SAMP_DEN_COEFF"
,
' '
,
20
);
std
::
copy
(
coeffs
.
begin
(),
coeffs
.
end
(),
rpcStruct
.
SampleDen
);
m_Imd
.
Add
(
MDGeom
::
RPC
,
rpcStruct
);
}
else
{
kwl
.
emplace
(
fieldName
,
fieldValue
);
}
}
m_Imd
.
Add
(
MDGeom
::
RPC
,
rpcStruct
);
}
...
...
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment