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 <QUrl>
|
||||||
#include <QUrlQuery>
|
#include <QUrlQuery>
|
||||||
|
|
||||||
|
#include <limits>
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
@ -457,7 +459,29 @@ void RiaOsduConnector::parseWellbores( QNetworkReply* reply, const QString& well
|
|||||||
QString id = resultObj["id"].toString();
|
QString id = resultObj["id"].toString();
|
||||||
QString kind = resultObj["kind"].toString();
|
QString kind = resultObj["kind"].toString();
|
||||||
QString name = resultObj["data"].toObject()["FacilityName"].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 kind;
|
||||||
QString name;
|
QString name;
|
||||||
QString wellId;
|
QString wellId;
|
||||||
|
double datumElevation;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct OsduWellboreTrajectory
|
struct OsduWellboreTrajectory
|
||||||
|
@ -90,7 +90,7 @@ void RicWellPathsImportOsduFeature::onActionTriggered( bool isChecked )
|
|||||||
auto task = progress.task( QString( "Importing well: %1" ).arg( w.name ) );
|
auto task = progress.task( QString( "Importing well: %1" ).arg( w.name ) );
|
||||||
|
|
||||||
auto [wellPathGeometry, errorMessage] =
|
auto [wellPathGeometry, errorMessage] =
|
||||||
RimWellPathCollection::loadWellPathGeometryFromOsdu( osduConnector, w.wellboreTrajectoryId );
|
RimWellPathCollection::loadWellPathGeometryFromOsdu( osduConnector, w.wellboreTrajectoryId, w.datumElevation );
|
||||||
if ( wellPathGeometry.notNull() )
|
if ( wellPathGeometry.notNull() )
|
||||||
{
|
{
|
||||||
auto wellPath = new RimOsduWellPath;
|
auto wellPath = new RimOsduWellPath;
|
||||||
@ -98,6 +98,7 @@ void RicWellPathsImportOsduFeature::onActionTriggered( bool isChecked )
|
|||||||
wellPath->setWellId( w.wellId );
|
wellPath->setWellId( w.wellId );
|
||||||
wellPath->setWellboreId( w.wellboreId );
|
wellPath->setWellboreId( w.wellboreId );
|
||||||
wellPath->setWellboreTrajectoryId( w.wellboreTrajectoryId );
|
wellPath->setWellboreTrajectoryId( w.wellboreTrajectoryId );
|
||||||
|
wellPath->setDatumElevationFromOsdu( w.datumElevation );
|
||||||
|
|
||||||
oilField->wellPathCollection->addWellPath( wellPath );
|
oilField->wellPathCollection->addWellPath( wellPath );
|
||||||
|
|
||||||
|
@ -579,7 +579,8 @@ void WellSummaryPage::wellboreTrajectoryFinished( const QString& wellboreId, int
|
|||||||
wiz->addWellInfo( { .name = wellbore.value().name,
|
wiz->addWellInfo( { .name = wellbore.value().name,
|
||||||
.wellId = well.value().id,
|
.wellId = well.value().id,
|
||||||
.wellboreId = w.wellboreId,
|
.wellboreId = w.wellboreId,
|
||||||
.wellboreTrajectoryId = wellboreTrajectoryId } );
|
.wellboreTrajectoryId = wellboreTrajectoryId,
|
||||||
|
.datumElevation = wellbore.value().datumElevation } );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -370,6 +370,7 @@ public:
|
|||||||
QString wellId;
|
QString wellId;
|
||||||
QString wellboreId;
|
QString wellboreId;
|
||||||
QString wellboreTrajectoryId;
|
QString wellboreTrajectoryId;
|
||||||
|
double datumElevation;
|
||||||
};
|
};
|
||||||
|
|
||||||
RiuWellImportWizard( const QString& downloadFolder,
|
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();
|
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++ )
|
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];
|
double md = readValues[MD][i];
|
||||||
|
|
||||||
wellPathPoints.push_back( point );
|
wellPathPoints.push_back( point );
|
||||||
measuredDepths.push_back( md );
|
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, "" };
|
return { nullptr, "" };
|
||||||
|
@ -32,5 +32,5 @@ class RifOsduWellPathReader
|
|||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static std::pair<cvf::ref<RigWellPath>, QString> parseCsv( const QString& content );
|
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 "RimOsduWellPath.h"
|
||||||
|
|
||||||
|
#include "cafPdmObject.h"
|
||||||
#include "cafPdmObjectScriptingCapability.h"
|
#include "cafPdmObjectScriptingCapability.h"
|
||||||
|
|
||||||
CAF_PDM_SOURCE_INIT( RimOsduWellPath, "OsduWellPath" );
|
CAF_PDM_SOURCE_INIT( RimOsduWellPath, "OsduWellPath" );
|
||||||
@ -20,6 +21,9 @@ RimOsduWellPath::RimOsduWellPath()
|
|||||||
CAF_PDM_InitFieldNoDefault( &m_wellboreTrajectoryId, "WellboreTrajectoryId", "Wellbore Trajectory Id" );
|
CAF_PDM_InitFieldNoDefault( &m_wellboreTrajectoryId, "WellboreTrajectoryId", "Wellbore Trajectory Id" );
|
||||||
m_wellboreTrajectoryId.uiCapability()->setUiReadOnly( true );
|
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()
|
// Required, as these settings are set in RimWellPath()
|
||||||
m_name.uiCapability()->setUiReadOnly( false );
|
m_name.uiCapability()->setUiReadOnly( false );
|
||||||
m_name.uiCapability()->setUiHidden( false );
|
m_name.uiCapability()->setUiHidden( false );
|
||||||
@ -82,6 +86,22 @@ QString RimOsduWellPath::wellboreTrajectoryId() const
|
|||||||
return m_wellboreTrajectoryId;
|
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_wellId );
|
||||||
osduGroup->add( &m_wellboreId );
|
osduGroup->add( &m_wellboreId );
|
||||||
osduGroup->add( &m_wellboreTrajectoryId );
|
osduGroup->add( &m_wellboreTrajectoryId );
|
||||||
|
osduGroup->add( &m_datumElevationFromOsdu );
|
||||||
|
|
||||||
RimWellPath::defineUiOrdering( uiConfigName, uiOrdering );
|
RimWellPath::defineUiOrdering( uiConfigName, uiOrdering );
|
||||||
}
|
}
|
||||||
|
@ -36,6 +36,9 @@ public:
|
|||||||
void setWellboreTrajectoryId( const QString& wellboreTrajectoryId );
|
void setWellboreTrajectoryId( const QString& wellboreTrajectoryId );
|
||||||
QString wellboreTrajectoryId() const;
|
QString wellboreTrajectoryId() const;
|
||||||
|
|
||||||
|
void setDatumElevationFromOsdu( double datumElevationFromOsdu );
|
||||||
|
double datumElevationFromOsdu() const;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
void defineUiOrdering( QString uiConfigName, caf::PdmUiOrdering& uiOrdering ) override;
|
||||||
|
|
||||||
@ -43,4 +46,5 @@ private:
|
|||||||
caf::PdmField<QString> m_wellId;
|
caf::PdmField<QString> m_wellId;
|
||||||
caf::PdmField<QString> m_wellboreId;
|
caf::PdmField<QString> m_wellboreId;
|
||||||
caf::PdmField<QString> m_wellboreTrajectoryId;
|
caf::PdmField<QString> m_wellboreTrajectoryId;
|
||||||
|
caf::PdmField<double> m_datumElevationFromOsdu;
|
||||||
};
|
};
|
||||||
|
@ -178,8 +178,9 @@ void RimWellPathCollection::loadDataAndUpdate()
|
|||||||
}
|
}
|
||||||
else if ( oWPath )
|
else if ( oWPath )
|
||||||
{
|
{
|
||||||
RiaOsduConnector* osduConnector = app->makeOsduConnector();
|
RiaOsduConnector* osduConnector = app->makeOsduConnector();
|
||||||
auto [wellPathGeometry, errorMessage] = loadWellPathGeometryFromOsdu( osduConnector, oWPath->wellboreTrajectoryId() );
|
auto [wellPathGeometry, errorMessage] =
|
||||||
|
loadWellPathGeometryFromOsdu( osduConnector, oWPath->wellboreTrajectoryId(), oWPath->datumElevationFromOsdu() );
|
||||||
if ( wellPathGeometry.notNull() )
|
if ( wellPathGeometry.notNull() )
|
||||||
{
|
{
|
||||||
oWPath->setWellPathGeometry( wellPathGeometry.p() );
|
oWPath->setWellPathGeometry( wellPathGeometry.p() );
|
||||||
@ -1052,7 +1053,8 @@ void RimWellPathCollection::onChildAdded( caf::PdmFieldHandle* containerForNewOb
|
|||||||
///
|
///
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
std::pair<cvf::ref<RigWellPath>, QString> RimWellPathCollection::loadWellPathGeometryFromOsdu( RiaOsduConnector* osduConnector,
|
std::pair<cvf::ref<RigWellPath>, QString> RimWellPathCollection::loadWellPathGeometryFromOsdu( RiaOsduConnector* osduConnector,
|
||||||
const QString& wellboreTrajectoryId )
|
const QString& wellboreTrajectoryId,
|
||||||
|
double datumElevation )
|
||||||
{
|
{
|
||||||
auto [fileContents, errorMessage] = osduConnector->requestWellboreTrajectoryParquetDataById( wellboreTrajectoryId );
|
auto [fileContents, errorMessage] = osduConnector->requestWellboreTrajectoryParquetDataById( wellboreTrajectoryId );
|
||||||
if ( !errorMessage.isEmpty() )
|
if ( !errorMessage.isEmpty() )
|
||||||
@ -1060,7 +1062,7 @@ std::pair<cvf::ref<RigWellPath>, QString> RimWellPathCollection::loadWellPathGeo
|
|||||||
return { nullptr, errorMessage };
|
return { nullptr, errorMessage };
|
||||||
}
|
}
|
||||||
|
|
||||||
return RifOsduWellPathReader::readWellPathData( fileContents );
|
return RifOsduWellPathReader::readWellPathData( fileContents, datumElevation );
|
||||||
}
|
}
|
||||||
|
|
||||||
//--------------------------------------------------------------------------------------------------
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
@ -135,7 +135,8 @@ public:
|
|||||||
|
|
||||||
void onChildAdded( caf::PdmFieldHandle* containerForNewObject ) override;
|
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 );
|
static std::pair<cvf::ref<RigOsduWellLogData>, QString> loadWellLogFromOsdu( RiaOsduConnector* osduConnector, const QString& wellLogId );
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user