mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#11514 OSDU: parse and add datum elevation to well paths.
This commit is contained in:
parent
4365b0dfb9
commit
d0a870bb38
@ -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 } );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -27,6 +27,7 @@ struct OsduWellbore
|
||||
QString kind;
|
||||
QString name;
|
||||
QString wellId;
|
||||
double datumElevation;
|
||||
};
|
||||
|
||||
struct OsduWellboreTrajectory
|
||||
|
@ -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 );
|
||||
|
||||
|
@ -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 } );
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -370,6 +370,7 @@ public:
|
||||
QString wellId;
|
||||
QString wellboreId;
|
||||
QString wellboreTrajectoryId;
|
||||
double datumElevation;
|
||||
};
|
||||
|
||||
RiuWellImportWizard( const QString& downloadFolder,
|
||||
|
@ -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, "" };
|
||||
|
@ -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 );
|
||||
};
|
||||
|
@ -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 );
|
||||
}
|
||||
|
@ -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;
|
||||
};
|
||||
|
@ -178,8 +178,9 @@ void RimWellPathCollection::loadDataAndUpdate()
|
||||
}
|
||||
else if ( oWPath )
|
||||
{
|
||||
RiaOsduConnector* osduConnector = app->makeOsduConnector();
|
||||
auto [wellPathGeometry, errorMessage] = loadWellPathGeometryFromOsdu( osduConnector, oWPath->wellboreTrajectoryId() );
|
||||
RiaOsduConnector* osduConnector = app->makeOsduConnector();
|
||||
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 );
|
||||
}
|
||||
|
||||
//--------------------------------------------------------------------------------------------------
|
||||
|
@ -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 );
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user