专业数据处理--如何根据已有储层数据实现多层数据的快速插值

大家在做储层数据可视化分析与展示过程中,由于人工解释的层位有限,导致显示不那么精细逼真,一般情况下,研究人员主要解释有代表性的目的层,层与层之间的地质情况一般通过专业软件的插值功能或算法来实现,最常见的插值方法有线性插值、邻近插值等,当解释的层位数量达到一定程度后,后续的动态三维可视化显示就相对连续和逼真了。因此工作中就需要通过已知两层或多层数据,通过各种插值算法实现中间地段的快速插值计算来获取数据,有时会插入一层,有时会插入多层,大部分专业软件只能一次插入一层,最终只要满足研究需要,效果达到预期就可以,因此本文通过分片控制(分片数代表插入的层数+1),可以一次性自动插入多层,且都是散点数据。具体实现如下。另外,也参考了Scipy两种三维插值方法,供参考,具体详见interpnData01和gridData02函数。

一、插值程序:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2023/3/15
# @Author  : hhue
# @Site    :
# @File    : contour.py
# @Remark  :利用python解析两层的xyz散点数据,根据两层的散点数据插值形成新层的散点数据。
# @Description:目前实际数据测试通过。

import pandas as pd
import numpy as np
from scipy.interpolate import griddata
from scipy.interpolate import interpn
# 方法1:利用scipy.interpolate的interpn方法
# 要求:原始数据在每个维度的每个水平上均有函数值,即网格类数据。
def interpnData01(xi):
    # 维度2x3x4
    x1 = np.array([0, 1])
    x2 = np.array([0, 10, 20])
    x3 = np.array([0, 10, 20, 40])
    # 形如 (a1, ), …, (an, ) 的numpy浮点数组元组,用来定义n维插值的空间,每个元素相当于一个维度坐标轴上已知数据点的坐标值,比如三维插值,传入元组的三个元素代表已知数据点在x,y,z三个坐标轴上的坐标值
    points = (x1, x2, x3)
    # 类似于数组,形如(a1,…, an) 的已知数据点对应的值,和point在每个维度上一一对应,表示已知数据点的值
    # 维度2x3x4, 对应points中的维度
    values = np.random.random((2, 3, 4))
    # xi = (0.1, 9, 19)
    # methods 'linear', 'nearest', and 'splinef2d'
    result = interpn(points, values, xi,'nearest',False,False)
    print(values)
    return result
# 生成插值数据的方法3,利用scipy.interpolate的griddata方法,二维,获取指定点的第3维数据
def gridData02(x,y,z,x1,y1):
    X, Y = np.meshgrid(x, y)
    X_star = np.hstack((X.flatten()[:, None], Y.flatten()[:, None]))
    # print(X_star)
    M, N = np.meshgrid(x1, y1)
    z_new = griddata(X_star, z, (M, N), method='cubic')
    # print(z_new)
    return z_new
if __name__ == '__main__':
    # 1.读写实际数据生成新层位插值数据,数据格式为x y z
    ## 1.1读取数据
    filenameTop = r'D:\2018_T28_Mer_PS_0Ma.txt'
    filenameBottom = r'D:\2018_T28_Mer_PS_4Ma.txt'
    dataTop = pd.read_csv(filenameTop, sep='\t', header=None, names=['x', 'y', 'z'])
    dataBottom = pd.read_csv(filenameBottom, sep='\t', header=None, names=['x', 'y', 'z'])
    # 去掉无效数据,一般为-99999.0000
    data=dataTop[dataTop['z'] != -99999.0000]
    x1 = data.iloc[:, 0]
    y1 = data.iloc[:, 1]
    z1 = data.iloc[:, 2]
    # 去掉无效数据,一般为-99999.0000,注意:默认z2小,相对于深度浅,对应filenameBottom
    data2 = dataBottom[dataBottom['z'] != -99999.0000]
    x2 = data2.iloc[:, 0]
    y2 = data2.iloc[:, 1]
    z2 = data2.iloc[:, 2]
    # 计算插值的z 目前支持线性插值计算,后续带扩展,待完善
    # 单层输出
    z_inserted = abs(z1.values - z2.values) / 2+z2.values
    print(z_inserted)
    # 多层输出文件:一次性可生成多层插值数据,可以输入分割的份数,比如4份
    pathname = r'D:\\'
    outfilename = pathname + '2018_T28_Mer_PS_Ma-inserted.txt'
    clip=3 # 分片数或分层数
    if(clip>1):# 多层输出
        for i in range(1,clip):
            # 在filenameBottom指定储层的基础上,加上分片的步长值。默认Bottom对应的z值小,Top对应的z值大
            z_inserted = (i*abs(z1.values - z2.values)) / clip + z2.values
            print(z_inserted)
            outfilename = pathname +'grid'+str(i)+'-'+str(clip)+'.txt'
            f2 = open(outfilename, 'w')  # 普通写模式
            for i in range(0, x1.size):
                f2.write("{:.4f}".format(x1.values[i]) + '\t')
                f2.write("{:.4f}".format(y1.values[i]) + '\t')
                f2.write("{:.4f}".format(z_inserted[i]) + '\n')
            f2.close()
    else:
        f2 = open(outfilename, 'w')  # 普通写模式
        for i in range(0,x1.size):
            f2.write("{:.4f}".format(x1.values[i])+'\t')
            f2.write("{:.4f}".format(y1.values[i])+'\t')
            f2.write("{:.4f}".format(z_inserted[i])+'\n')
        f2.close()

    # 插值方法调用示例
    xi = (1, 9, 19)
    print(interpnData01(xi)) # 方法1

    # ======示例 开始===============#
    x = [1, 2, 3]
    y = [1, 2, 3]
    z = [4, 5, 6, 3, 4, 5, 2, 3, 4]
    # 数据实际组织方式
    # 4 3 2
    # 5 4 3
    # 6 5 4

    # 4个点
    # x1 = [1.5, 2.5]
    # y1 = [1.5, 2.5]
    # 1个点
    x1 = [2]
    y1 = [3]
    print(gridData02(x,y,z,x1,y1)) # 方法3
    # ======示例 结束===============#

二、样例数据(文件格式txt):

474545.5938	4335999.5000	2604.2036
475154.4375	4335999.5000	2612.3798
475763.2813	4335999.5000	2639.3759
476372.1250	4335999.5000	2686.9342
476980.9375	4335999.5000	2754.5110

三、插值生成的任意两层数据的三维可视化效果:

你可能感兴趣的:(数据应用,数据处理,地质数据,python,numpy,专业数据解析处理,信息可视化)