#11514 OSDU: parse and add datum elevation to well paths.

This commit is contained in:
Kristian Bendiksen 2024-06-18 14:25:14 +02:00
parent 4365b0dfb9
commit d0a870bb38
11 changed files with 70 additions and 12 deletions

View File

@ -19,6 +19,8 @@
#include <QUrl>
#include <QUrlQuery>
#include <limits>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -457,7 +459,29 @@ void RiaOsduConnector::parseWellbores( QNetworkReply* reply, const QString& well
QString id = resultObj["id"].toString();
QString kind = resultObj["kind"].toString();
QString name = resultObj["data"].toObject()["FacilityName"].toString();
m_wellbores[wellId].push_back( OsduWellbore{ id, kind, name, wellId } );
// Extract datum elevation. The DefaultVerticalMeasurementID is probably the datum elevation needed.
// Default to 0.0 if nothing is found, but finding nothing is suspicious.
double datumElevation = std::numeric_limits<double>::infinity();
QString defaultVerticalMeasurementId = resultObj["data"].toObject()["DefaultVerticalMeasurementID"].toString();
QJsonArray verticalMeasurementsArray = resultObj["data"].toObject()["VerticalMeasurements"].toArray();
for ( const QJsonValue& vma : verticalMeasurementsArray )
{
QString verticalMeasurementId = vma["VerticalMeasurementID"].toString();
if ( verticalMeasurementId == defaultVerticalMeasurementId )
{
double verticalMeasurement = vma["VerticalMeasurement"].toDouble( 0.0 );
datumElevation = verticalMeasurement;
}
}
if ( std::isinf( datumElevation ) )
{
RiaLogging::warning( QString( "Missing datum elevation for well bore '%1'. Id: %2" ).arg( name ).arg( id ) );
datumElevation = 0.0;
}
m_wellbores[wellId].push_back( OsduWellbore{ id, kind, name, wellId, datumElevation } );
}
}

View File

@ -27,6 +27,7 @@ struct OsduWellbore
QString kind;
QString name;
QString wellId;
double datumElevation;
};
struct OsduWellboreTrajectory

View File

@ -90,7 +90,7 @@ void RicWellPathsImportOsduFeature::onActionTriggered( bool isChecked )
auto task = progress.task( QString( "Importing well: %1" ).arg( w.name ) );
auto [wellPathGeometry, errorMessage] =
RimWellPathCollection::loadWellPathGeometryFromOsdu( osduConnector, w.wellboreTrajectoryId );
RimWellPathCollection::loadWellPathGeometryFromOsdu( osduConnector, w.wellboreTrajectoryId, w.datumElevation );
if ( wellPathGeometry.notNull() )
{
auto wellPath = new RimOsduWellPath;
@ -98,6 +98,7 @@ void RicWellPathsImportOsduFeature::onActionTriggered( bool isChecked )
wellPath->setWellId( w.wellId );
wellPath->setWellboreId( w.wellboreId );
wellPath->setWellboreTrajectoryId( w.wellboreTrajectoryId );
wellPath->setDatumElevationFromOsdu( w.datumElevation );
oilField->wellPathCollection->addWellPath( wellPath );

View File

@ -579,7 +579,8 @@ void WellSummaryPage::wellboreTrajectoryFinished( const QString& wellboreId, int
wiz->addWellInfo( { .name = wellbore.value().name,
.wellId = well.value().id,
.wellboreId = w.wellboreId,
.wellboreTrajectoryId = wellboreTrajectoryId } );
.wellboreTrajectoryId = wellboreTrajectoryId,
.datumElevation = wellbore.value().datumElevation } );
}
}

View File

@ -370,6 +370,7 @@ public:
QString wellId;
QString wellboreId;
QString wellboreTrajectoryId;
double datumElevation;
};
RiuWellImportWizard( const QString& downloadFolder,

View File

@ -106,7 +106,7 @@ std::pair<cvf::ref<RigWellPath>, QString> RifOsduWellPathReader::parseCsv( const
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
std::pair<cvf::ref<RigWellPath>, QString> RifOsduWellPathReader::readWellPathData( const QByteArray& content )
std::pair<cvf::ref<RigWellPath>, QString> RifOsduWellPathReader::readWellPathData( const QByteArray& content, double datumElevation )
{
arrow::MemoryPool* pool = arrow::default_memory_pool();
@ -155,14 +155,16 @@ std::pair<cvf::ref<RigWellPath>, QString> RifOsduWellPathReader::readWellPathDat
for ( size_t i = 0; i < firstSize; i++ )
{
cvf::Vec3d point( readValues[X][i], readValues[Y][i], -readValues[TVD][i] );
cvf::Vec3d point( readValues[X][i], readValues[Y][i], -readValues[TVD][i] + datumElevation );
double md = readValues[MD][i];
wellPathPoints.push_back( point );
measuredDepths.push_back( md );
}
return { cvf::make_ref<RigWellPath>( wellPathPoints, measuredDepths ), "" };
auto wellPath = cvf::make_ref<RigWellPath>( wellPathPoints, measuredDepths );
wellPath->setDatumElevation( datumElevation );
return { wellPath, "" };
}
return { nullptr, "" };

View File

@ -32,5 +32,5 @@ class RifOsduWellPathReader
{
public:
static std::pair<cvf::ref<RigWellPath>, QString> parseCsv( const QString& content );
static std::pair<cvf::ref<RigWellPath>, QString> readWellPathData( const QByteArray& content );
static std::pair<cvf::ref<RigWellPath>, QString> readWellPathData( const QByteArray& content, double datumElevation );
};

View File

@ -1,5 +1,6 @@
#include "RimOsduWellPath.h"
#include "cafPdmObject.h"
#include "cafPdmObjectScriptingCapability.h"
CAF_PDM_SOURCE_INIT( RimOsduWellPath, "OsduWellPath" );
@ -20,6 +21,9 @@ RimOsduWellPath::RimOsduWellPath()
CAF_PDM_InitFieldNoDefault( &m_wellboreTrajectoryId, "WellboreTrajectoryId", "Wellbore Trajectory Id" );
m_wellboreTrajectoryId.uiCapability()->setUiReadOnly( true );
CAF_PDM_InitField( &m_datumElevationFromOsdu, "DatumElevationFromOsdu", 0.0, "Datum Elevation From OSDU" );
m_datumElevationFromOsdu.uiCapability()->setUiReadOnly( true );
// Required, as these settings are set in RimWellPath()
m_name.uiCapability()->setUiReadOnly( false );
m_name.uiCapability()->setUiHidden( false );
@ -82,6 +86,22 @@ QString RimOsduWellPath::wellboreTrajectoryId() const
return m_wellboreTrajectoryId;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
void RimOsduWellPath::setDatumElevationFromOsdu( double datumElevation )
{
m_datumElevationFromOsdu = datumElevation;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
double RimOsduWellPath::datumElevationFromOsdu() const
{
return m_datumElevationFromOsdu;
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
@ -91,6 +111,7 @@ void RimOsduWellPath::defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering
osduGroup->add( &m_wellId );
osduGroup->add( &m_wellboreId );
osduGroup->add( &m_wellboreTrajectoryId );
osduGroup->add( &m_datumElevationFromOsdu );
RimWellPath::defineUiOrdering( uiConfigName, uiOrdering );
}

View File

@ -36,6 +36,9 @@ public:
void setWellboreTrajectoryId( const QString& wellboreTrajectoryId );
QString wellboreTrajectoryId() const;
void setDatumElevationFromOsdu( double datumElevationFromOsdu );
double datumElevationFromOsdu() const;
protected:
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
@ -43,4 +46,5 @@ private:
caf::PdmField<QString> m_wellId;
caf::PdmField<QString> m_wellboreId;
caf::PdmField<QString> m_wellboreTrajectoryId;
caf::PdmField<double> m_datumElevationFromOsdu;
};

View File

@ -179,7 +179,8 @@ void RimWellPathCollection::loadDataAndUpdate()
else if ( oWPath )
{
RiaOsduConnector* osduConnector = app->makeOsduConnector();
auto [wellPathGeometry, errorMessage] = loadWellPathGeometryFromOsdu( osduConnector, oWPath->wellboreTrajectoryId() );
auto [wellPathGeometry, errorMessage] =
loadWellPathGeometryFromOsdu( osduConnector, oWPath->wellboreTrajectoryId(), oWPath->datumElevationFromOsdu() );
if ( wellPathGeometry.notNull() )
{
oWPath->setWellPathGeometry( wellPathGeometry.p() );
@ -1052,7 +1053,8 @@ void RimWellPathCollection::onChildAdded( caf::PdmFieldHandle* containerForNewOb
///
//--------------------------------------------------------------------------------------------------
std::pair<cvf::ref<RigWellPath>, QString> RimWellPathCollection::loadWellPathGeometryFromOsdu( RiaOsduConnector* osduConnector,
const QString& wellboreTrajectoryId )
const QString& wellboreTrajectoryId,
double datumElevation )
{
auto [fileContents, errorMessage] = osduConnector->requestWellboreTrajectoryParquetDataById( wellboreTrajectoryId );
if ( !errorMessage.isEmpty() )
@ -1060,7 +1062,7 @@ std::pair<cvf::ref<RigWellPath>, QString> RimWellPathCollection::loadWellPathGeo
return { nullptr, errorMessage };
}
return RifOsduWellPathReader::readWellPathData( fileContents );
return RifOsduWellPathReader::readWellPathData( fileContents, datumElevation );
}
//--------------------------------------------------------------------------------------------------

View File

@ -135,7 +135,8 @@ public:
void onChildAdded( caf::PdmFieldHandle* containerForNewObject ) override;
static std::pair<cvf::ref<RigWellPath>, QString> loadWellPathGeometryFromOsdu( RiaOsduConnector* osduConnector, const QString& fileId );
static std::pair<cvf::ref<RigWellPath>, QString>
loadWellPathGeometryFromOsdu( RiaOsduConnector* osduConnector, const QString& wellTrajectoryId, double datumElevation );
static std::pair<cvf::ref<RigOsduWellLogData>, QString> loadWellLogFromOsdu( RiaOsduConnector* osduConnector, const QString& wellLogId );