Kriging插值计算

 

参考论文:      http://people.ku.edu/~gbohling/cpe940

 

# -*- coding: utf-8 -*-
# ---------------------------------------------------------------------------
# Kriging.py
# Created on: 2014-06-12 10:14:21.00000
#   (generated by ArcGIS/ModelBuilder)
# Description: 
# ---------------------------------------------------------------------------

# Import arcpy module
import os
import math
import sys

from pylab import *
import numpy as np
from pandas import DataFrame, Series
from scipy.spatial.distance import pdist, squareform


# 计算距离

# dataXYV = [{"x":12100,"y":8300,"v":14.6515},{"x":5300,"y":8700,"v":14.5093},{"x":3500,"y":13900,"v":14.0639},{"x":5100,"y":1900,"v":15.1084},{"x":9900,"y":13700,"v":13.919},{"x":2900,"y":900,"v":13.1304},{"x":7900,"y":6700,"v":14.5724},{"x":16900,"y":4900,"v":15.0814},{"x":18700,"y":1500,"v":13.91},{"x":2700,"y":2100,"v":13.4024},{"x":10700,"y":5100,"v":14.9395},{"x":7500,"y":12900,"v":15.2159},{"x":5500,"y":11100,"v":14.5777},{"x":9500,"y":9100,"v":14.2483},{"x":15300,"y":3100,"v":14.4281},{"x":4700,"y":9700,"v":15.2606},{"x":16700,"y":15700,"v":16.1859},{"x":19500,"y":9700,"v":14.2079},{"x":16900,"y":13100,"v":16.9583},{"x":900,"y":3700,"v":13.8354},{"x":500,"y":11900,"v":14.1859},{"x":9100,"y":1300,"v":14.0381},{"x":9100,"y":13700,"v":14.3685},{"x":9900,"y":12900,"v":13.4018},{"x":6300,"y":100,"v":15.8953},{"x":3700,"y":5100,"v":12.8667},{"x":16300,"y":900,"v":15.1039},{"x":18300,"y":13500,"v":15.7736},{"x":9500,"y":6900,"v":14.1333},{"x":17900,"y":3100,"v":13.3369},{"x":9900,"y":15500,"v":15.1362},{"x":7100,"y":8900,"v":15.0847},{"x":19300,"y":7100,"v":14.2498},{"x":2300,"y":5700,"v":12.6811},{"x":7300,"y":8900,"v":14.9384},{"x":13900,"y":3700,"v":15.6005},{"x":8500,"y":10100,"v":13.7796},{"x":8100,"y":8700,"v":15.2907},{"x":14700,"y":11900,"v":15.6881},{"x":6300,"y":2300,"v":15.3677},{"x":11900,"y":12900,"v":14.3283},{"x":18100,"y":7100,"v":14.7374},{"x":11300,"y":7100,"v":15.0547},{"x":12500,"y":3100,"v":14.8889},{"x":2700,"y":12700,"v":14.436},{"x":2700,"y":4300,"v":12.1491},{"x":8500,"y":11300,"v":13.624},{"x":1500,"y":900,"v":14.188},{"x":7300,"y":1300,"v":14.9072},{"x":10700,"y":4100,"v":15.2029},{"x":7100,"y":1900,"v":15.3468},{"x":3900,"y":8500,"v":15.939},{"x":17100,"y":6100,"v":15.7269},{"x":14100,"y":10100,"v":15.3238},{"x":11500,"y":4900,"v":14.0445},{"x":13300,"y":15700,"v":14.4032},{"x":1900,"y":12100,"v":14.3586},{"x":15100,"y":2900,"v":14.6007},{"x":6500,"y":900,"v":16.1458},{"x":8900,"y":6100,"v":15.7727},{"x":4500,"y":2300,"v":13.6234},{"x":12900,"y":10300,"v":15.1024},{"x":10900,"y":5700,"v":15.3546},{"x":3500,"y":700,"v":13.8431},{"x":16300,"y":3700,"v":14.9427},{"x":900,"y":5100,"v":14.4139},{"x":12900,"y":12900,"v":13.6177},{"x":15300,"y":9300,"v":16.3787},{"x":7300,"y":6900,"v":14.258},{"x":16300,"y":12500,"v":15.7772},{"x":100,"y":8900,"v":14.6553},{"x":1700,"y":11700,"v":14.3627},{"x":17500,"y":11100,"v":15.9659},{"x":14900,"y":8300,"v":16.0095},{"x":8300,"y":10900,"v":13.9639},{"x":4100,"y":14500,"v":14.2649},{"x":11100,"y":15300,"v":15.7684},{"x":500,"y":4900,"v":14.591},{"x":13100,"y":1500,"v":15.1377},{"x":18900,"y":1700,"v":14.095},{"x":3500,"y":7500,"v":15.1486},{"x":3700,"y":6900,"v":13.9584},{"x":14500,"y":13300,"v":14.7381},{"x":4900,"y":9100,"v":15.0689},{"x":9700,"y":5700,"v":15.8042}]
dataXYV = [{"x":12100.00,"y":8300.00,"v":14.6515},
{"x":5300.00,"y":8700.00,"v":14.5093},
{"x":3500.00,"y":13900.00,"v":14.0639},
{"x":5100.00,"y":1900.00,"v":15.1084},
{"x":9900.00,"y":13700.00,"v":13.919},
{"x":2900.00,"y":900.00,"v":13.1304},
{"x":7900.00,"y":6700.00,"v":14.5724},
{"x":16900.00,"y":4900.00,"v":15.0814},
{"x":18700.00,"y":1500.00,"v":13.91},
{"x":2700.00,"y":2100.00,"v":13.4024},
{"x":10700.00,"y":5100.00,"v":14.9395},
{"x":7500.00,"y":12900.00,"v":15.2159},
{"x":5500.00,"y":11100.00,"v":14.5777},
{"x":9500.00,"y":9100.00,"v":14.2483},
{"x":15300.00,"y":3100.00,"v":14.4281},
{"x":4700.00,"y":9700.00,"v":15.2606},
{"x":16700.00,"y":15700.00,"v":16.1859},
{"x":19500.00,"y":9700.00,"v":14.2079},
{"x":16900.00,"y":13100.00,"v":16.9583},
{"x":900.00,"y":3700.00,"v":13.8354},
{"x":500.00,"y":11900.00,"v":14.1859},
{"x":9100.00,"y":1300.00,"v":14.0381},
{"x":9100.00,"y":13700.00,"v":14.3685},
{"x":9900.00,"y":12900.00,"v":13.4018},
{"x":6300.00,"y":100.00,"v":15.8953},
{"x":3700.00,"y":5100.00,"v":12.8667},
{"x":16300.00,"y":900.00,"v":15.1039},
{"x":18300.00,"y":13500.00,"v":15.7736},
{"x":9500.00,"y":6900.00,"v":14.1333},
{"x":17900.00,"y":3100.00,"v":13.3369},
{"x":9900.00,"y":15500.00,"v":15.1362},
{"x":7100.00,"y":8900.00,"v":15.0847},
{"x":19300.00,"y":7100.00,"v":14.2498},
{"x":2300.00,"y":5700.00,"v":12.6811},
{"x":7300.00,"y":8900.00,"v":14.9384},
{"x":13900.00,"y":3700.00,"v":15.6005},
{"x":8500.00,"y":10100.00,"v":13.7796},
{"x":8100.00,"y":8700.00,"v":15.2907},
{"x":14700.00,"y":11900.00,"v":15.6881},
{"x":6300.00,"y":2300.00,"v":15.3677},
{"x":11900.00,"y":12900.00,"v":14.3283},
{"x":18100.00,"y":7100.00,"v":14.7374},
{"x":11300.00,"y":7100.00,"v":15.0547},
{"x":12500.00,"y":3100.00,"v":14.8889},
{"x":2700.00,"y":12700.00,"v":14.436},
{"x":2700.00,"y":4300.00,"v":12.1491},
{"x":8500.00,"y":11300.00,"v":13.624},
{"x":1500.00,"y":900.00,"v":14.188},
{"x":7300.00,"y":1300.00,"v":14.9072},
{"x":10700.00,"y":4100.00,"v":15.2029},
{"x":7100.00,"y":1900.00,"v":15.3468},
{"x":3900.00,"y":8500.00,"v":15.939},
{"x":17100.00,"y":6100.00,"v":15.7269},
{"x":14100.00,"y":10100.00,"v":15.3238},
{"x":11500.00,"y":4900.00,"v":14.0445},
{"x":13300.00,"y":15700.00,"v":14.4032},
{"x":1900.00,"y":12100.00,"v":14.3586},
{"x":15100.00,"y":2900.00,"v":14.6007},
{"x":6500.00,"y":900.00,"v":16.1458},
{"x":8900.00,"y":6100.00,"v":15.7727},
{"x":4500.00,"y":2300.00,"v":13.6234},
{"x":12900.00,"y":10300.00,"v":15.1024},
{"x":10900.00,"y":5700.00,"v":15.3546},
{"x":3500.00,"y":700.00,"v":13.8431},
{"x":16300.00,"y":3700.00,"v":14.9427},
{"x":900.00,"y":5100.00,"v":14.4139},
{"x":12900.00,"y":12900.00,"v":13.6177},
{"x":15300.00,"y":9300.00,"v":16.3787},
{"x":7300.00,"y":6900.00,"v":14.258},
{"x":16300.00,"y":12500.00,"v":15.7772},
{"x":100.00,"y":8900.00,"v":14.6553},
{"x":1700.00,"y":11700.00,"v":14.3627},
{"x":17500.00,"y":11100.00,"v":15.9659},
{"x":14900.00,"y":8300.00,"v":16.0095},
{"x":8300.00,"y":10900.00,"v":13.9639},
{"x":4100.00,"y":14500.00,"v":14.2649},
{"x":11100.00,"y":15300.00,"v":15.7684},
{"x":500.00,"y":4900.00,"v":14.591},
{"x":13100.00,"y":1500.00,"v":15.1377},
{"x":18900.00,"y":1700.00,"v":14.095},
{"x":3500.00,"y":7500.00,"v":15.1486},
{"x":3700.00,"y":6900.00,"v":13.9584},
{"x":14500.00,"y":13300.00,"v":14.7381},
{"x":4900.00,"y":9100.00,"v":15.0689},
{"x":9700.00,"y":5700.00,"v":15.8042}]

length = len(dataXYV)
distanceMatrix = [[] for i in range(length)]
index = 0
distTotal = 0;
distMin = 1.0e15
distMax = -1.0e15
distAver = 0
for x in dataXYV:    
    for y in dataXYV:
        z = math.sqrt((x['x']-y['x'])*(x['x']-y['x'])+(x['y']-y['y'])*(x['y']-y['y']))
        distTotal += z
        if z > distMax:
            distMax = z
        if z < distMin and x != y:
            distMin = z
        distanceMatrix[index].append(z)
    index += 1
distAver =  distTotal / (length * length - length)
dataInfo = {'count':(length * length - length),  'distAver':distAver,  'distMin':distMin,  'distMax':distMax}
#print dataInfo

'''
for i in range(0, length):
    for j in range(0, length):
        print(int(lists[i][j])),
    print(';')
'''

'''
查找点对
'''
def findPairs(dataXYV, distanceMatrix, minValue, maxValue):
    totalDistance = 0;
    count = 0;
    minDistance = 1.0e15
    maxDistance = -1.0e15
    averageDistance = 0
    pairs = []
    for i in range(0, length):
        for j in range(i+1, length):
            if distanceMatrix[i][j]>minValue and distanceMatrix[i][j]<=maxValue:
            #if math.fabs(dataXYV[i]['x']-dataXYV[j]['x'])>minValue and math.fabs(dataXYV[i]['y']-dataXYV[j]['y'])>minValue and math.fabs(dataXYV[i]['x']-dataXYV[j]['x'])<=maxValue and math.fabs(dataXYV[i]['y']-dataXYV[j]['y'])<=maxValue:
                # print(int(lists[i][j])),
                totalDistance += distanceMatrix[i][j]
                count += 1
                if distanceMatrix[i][j] >= maxDistance:
                    maxDistance = distanceMatrix[i][j]
                if distanceMatrix[i][j] <= minDistance:
                    minDistance = distanceMatrix[i][j]
                pair = {'i':i,'j':j,'iv':dataXYV[i]['v'],'jv':dataXYV[j]['v'],'dist':distanceMatrix[i][j]}
                pairs.append(pair)
    #print(count)
    averageDistance = totalDistance / count
    info = {'count':count,  'distAver':averageDistance,  'distMin':minDistance,  'distMax':maxDistance}
    #print info
    #print pairs
    return pairs


'''
计算统计信息: 协方差、相关系数、半方变异
'''
def computeStatisticInfo(pairs):
    pairCount = len(pairs)
    distanceTotal = 0
    distanceAverage = 0
    #
    v1v2Total=0
    v1Total=0
    v2Total=0
    #
    v1v1Total=0
    v2v2Total=0
    #
    v1_v2Total=0
    #
    for x in pairs: 
        val1 = x['iv']
        val2 = x['jv']
        distanceTotal =  distanceTotal + x['dist']
        v1v2Total = v1v2Total + val1 * val2
        v1Total = v1Total + val1
        v2Total = v2Total + val2
        #
        v1v1Total = v1v1Total + val1 * val1
        v2v2Total = v2v2Total + val2 * val2
        #
        v1_v2Total = v1_v2Total + math.pow(val1 - val2, 2)
        #    
    distanceAverage =  distanceTotal / pairCount    
    v1v2Covariance = v1v2Total / pairCount - v1Total * v2Total / (pairCount  * pairCount)
    v1v2Corelation = (v1v2Total*pairCount - v1Total * v2Total) / math.sqrt(v1v1Total * pairCount - v1Total * v1Total) / math.sqrt(v2v2Total * pairCount - v2Total * v2Total)
    v1v2Semivariance = v1_v2Total / (pairCount * 2)
    statisticInfo = {'covariance':v1v2Covariance, 'corelation':v1v2Corelation, 'semivariance':v1v2Semivariance, 'count':pairCount, 'distAver':distanceAverage}  # 
    # print statisticInfo
    return statisticInfo

'''
计算各种lagSize下的统计信息: 协方差、相关系数、半方变异
'''
def staticInfoAll(dataXYV, distanceMatrix, lagCellSize, lagCount):
    semiLagCellSize = lagCellSize / 2
    pairsStaticInfos = []
    for i in range(0, lagCount-1):        
        
        lagSize = lagCellSize * i
        lagMin = lagSize - semiLagCellSize
        if lagMin < 0:
            lagMin = 0
        lagMax = lagSize + semiLagCellSize
        #print(lagMin, lagMax,  lagSize)
          
        '''
        lagMin = lagCellSize * i
        lagMax = lagCellSize * (i + 1)
        lagSize = (lagCellSize * i + lagCellSize * (i + 1))/2
        #print lagMin,  lagMax,  lagSize
        '''
        pairs = findPairs(dataXYV, distanceMatrix, lagMin, lagMax)
        statisticInfo = computeStatisticInfo(pairs)
        statisticInfo['lagSize'] = lagSize
        print(lagMin, lagMax, statisticInfo['lagSize'], statisticInfo['count'], statisticInfo['distAver'], statisticInfo['covariance'], statisticInfo['corelation'], statisticInfo['semivariance'])
        pairsStaticInfos.append(statisticInfo)
    return pairsStaticInfos
'''
def computeC0(dataXYV):
    valueTotal = 0;
    valueAver = 0;
    variance = 0;
    for x in dataXYV:
        valueTotal += x['v']
    valueAver = valueTotal / length
    print valueAver
    for x in dataXYV:
        variance += math.pow((x['v'] - valueAver),2)
    variance = variance / length
    # variance = math.sqrt(variance)
    print variance

computeC0(dataXYV)
'''



def optimization(pairsStaticInfos):    
    aMin = 0
    cMin = 0
    varianceTotalMin = 1.0e45
    hSize = len(pairsStaticInfos)
    for aValue in range( 3500, 4500):
        for c1Value in range(60, 99):
            cValue = c1Value / 100.0
            #cValue = 0.78
            #print(aValue, cValue)
            #print(aValue, cValue)
            varianceTotal = 0
            for x in pairsStaticInfos:
                y = spherical( x['distAver'], aValue, cValue )  #  distAver  lagSize
                #print y, x['semivariance']
                varianceTotal = varianceTotal + ((y - x['semivariance'])**2.0) * x['count']
            varianceTotal = varianceTotal / hSize
            #print varianceTotal
            if varianceTotal <= varianceTotalMin:
                varianceTotalMin = varianceTotal
                aMin = aValue
                cMin = cValue
                #print(aMin, cMin, varianceTotalMin)
    
    para = {"a":aMin, "c0":cMin}
    print(para)
    return para

def spherical( h, a, C0):
    if h <= a:
        return (C0*( 1.5*h/a - 0.5*(h/a)**3.0 ))
    else:
        return C0

pairsStaticInfos = staticInfoAll(dataXYV, distanceMatrix, 1000, 12) # 500, 25

para = optimization(pairsStaticInfos)


lagSize = []
semivariance = []
modelY = []
modelYY = []
#
lagSize.append(0)
semivariance.append(0)
modelY.append(0)
for x in pairsStaticInfos:
    y = spherical( x['distAver'], para['a'], para['c0'] )
    #yy= spherical( x['distAver'], 4141, para['c0'] )
    lagSize.append(x['distAver'])
    semivariance.append(x['semivariance'])
    modelY.append(y)
    modelYY.append(yy)

plot( lagSize, semivariance, 'o' )
plot( lagSize, modelY, '.-'  ) ;
title('Spherical Model')
ylabel('Semivariance')
xlabel('Lag [m]')

转载于:https://www.cnblogs.com/gispathfinder/p/5779366.html

### 回答1: Cesium Kriging是一种基于克里金插值法的三维地球表面数据插值方法,主要用于地球科学、地质勘探和空间数据分析等领域。克里金插值法是一种基于统计学原理的空间插值方法,通过分析和建立输入数据点之间的空间相关性,来预测未知地点的数值。 Cesium Kriging的主要思想是根据已知数据点之间的距离和数值变化来构建半方差函数模型,从而确定权重。然后使用这些权重对未知位置的数值进行预测与插值。在Cesium Kriging中,会分析已知数据点之间的距离和数值差异,并根据这些数据点之间的空间相关性来调整权值。 Cesium Kriging与其他插值方法相比具有以下优点: 1. 适用范围广:Cesium Kriging适用于不规则数据的插值,可以处理稀疏、非连续和不均匀分布的数据点。 2. 高精度:Cesium Kriging能够通过对空间相关性的精确建模来提供高精度的数据插值结果。 3. 不引入人为偏差:Cesium Kriging基于统计学原理,不会引入主观因素,避免了人为偏差的影响。 4. 提供插值误差估计:Cesium Kriging能够提供插值结果的误差估计,使用户能够对插值结果进行评估。 总之,Cesium Kriging是一种基于克里金插值法的三维地球表面数据插值方法,通过分析已知数据点之间的空间相关性来预测未知位置的数据,并提供高精度和误差估计的插值结果。 ### 回答2: Cesium Kriging插值是一种基于地质统计学方法的空间数据插值技术。这种技术可以通过对已知数据点进行分析和插值,来创建一个连续的表面模型。 Cesium Kriging插值方法以克里格 (Kriging) 方法为基础,克里格方法是一种通过对空间变量进行插值来推测未知地点数值的方法。Cesium Kriging插值通过对已知数据点进行拟合并创建空间模型来推测未知位置的数值。 Cesium Kriging插值方法首先建立数据之间的空间关系,通过计算已知数据点之间的空间距离和变异性,确定了不同位置之间的相关性。然后,使用这个相关性函数来估计未知位置的数值。 Cesium Kriging插值方法的优势在于它不仅可以插值数据点,还可以对未知位置进行预测,并对预测结果进行精确的空间化量化。而且,Cesium Kriging插值方法可以根据不同数据点的权重,考虑其距离和变异性,更准确地估计未知位置的数值。 Cesium Kriging插值方法在地质学、环境科学、农业和其他领域的地学研究中得到了广泛的应用。它可以用于生成高质量的地学地,评估地下水资源,预测环境变量的分布等。 综上所述,Cesium Kriging插值是一种利用地质统计学方法进行空间数据插值的技术。它通过建立数据之间的空间关系,并使用克里格方法来估计未知位置的数值。其优势在于可以预测未知位置的数值并提供空间化量化。这种方法在地质学和其他地学研究中具有广泛应用。 ### 回答3: Cesium Kriging插值是一种在地质和地球科学领域常用的一种空间插值方法。它基于克里格(Kriging)算法和Cesium地球可视化引擎,用于在地球表面上点之间进行离散数据的插值。 Cesium Kriging插值的基本原理是根据采样点之间的空间位置和变量值的相关性来预测未采样点的值。它使用了变异函数和半方差模型来描述采样点之间的空间相关性。变异函数定义了变量值随着空间距离的变化规律,半方差模型则用于拟合这个变异函数。通过预测未采样点的值,Cesium Kriging插值可以在空间上生成连续的表面。 Cesium Kriging插值方法的优点是可以充分利用采样点之间的空间关系,能够更准确地预测未采样点的值。同时,Cesium地球可视化引擎的应用使得插值结果可以以更直观的方式展示在地球表面上。这种方法在地质勘探、地质灾害评估和自然资源管理等领域有着广泛的应用。 然而,Cesium Kriging插值也有一些限制。首先,它要求采样点之间存在一定的空间相关性,在采样密度较低的地区效果可能不理想。其次,插值结果可能会受到离群值的影响,需要进行一定的预处理或者异常值检测。最后,Cesium Kriging插值方法对于大规模数据集的处理可能会比较耗时,需要考虑计算效率的问题。 综上所述,Cesium Kriging插值是一种常用的空间插值方法,可以用于预测未采样点的值,并以直观的方式展示在地球表面上。它在地质和地球科学的研究中具有广泛的应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值