问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

GIS空间数据探索性分析:标准差椭圆、空间权重矩阵与莫兰指数

创作时间:
作者:
@小白创作中心

GIS空间数据探索性分析:标准差椭圆、空间权重矩阵与莫兰指数

引用
CSDN
1.
https://blog.csdn.net/m0_68160088/article/details/140724987

GIS空间数据探索性分析是地理信息系统(GIS)领域的重要研究内容,通过分析空间数据的分布特征、空间关联性和空间自相关性,可以帮助我们更好地理解地理现象和规律。本文将介绍三种常用的空间数据分析方法:标准差椭圆、空间权重矩阵和莫兰指数,并通过具体案例和代码实现,帮助读者深入理解这些方法的应用。

标准差椭圆

标准差椭圆可用于理解空间数据的分布特征和不确定性,反映空间现象的内在规律。例如在曼哈顿区MIN17区,2015年至2018年共发生交通事故18414 起,平均每平方公里发生6565起,可以利用平均中心和标准差椭圆进行交通事故空间分布。

平均中心

通过计算数据的平均中心位置,可以直观地发现事故的聚集情况,挖掘出事故随时间变化的偏移趋势。

标准差椭圆

一组数据点在空间上的聚集性和方向性可以用标准差椭圆。椭圆的长半轴方向代表事件点在空间上的延伸方向,短半轴的长度则体现了事件点的聚集程度,短半轴越短,说明事件点在空间上越聚集。椭圆的扁率越大,即长短半轴的值之比越大,说明事件点越具有明显的方向性;反之,如果椭圆扁率越小,说明事件点越不具有方向性,当椭圆扁率为1时,说明事件点在空间上的分布不具有方向性。

以所有事件点的平均中心为基准,计算所有事件点𝑥坐标和𝑦坐标的标准差,然后由标准差的大小来确定椭圆的长半轴和短半轴,此时作出的椭圆就是事件点的标准差椭圆。

实现过程如下:

public Result CalEll(List<Data> data)
{
    int n = data.Count;
    double X_ave = data.Average(o => o.x);
    double Y_ave = data.Average(o => o.y); ;
    for (int i = 0; i < data.Count; i++)
    {
        data[i].a = data[i].x - X_ave;
        data[i].b = data[i].y - Y_ave;
    }
    double sum_a2 = data.Sum(o => (o.a * o.a));
    double sum_b2 = data.Sum(o => (o.b * o.b));
    double sum_ab = data.Sum(o => (o.a * o.b));
    double s_up = sum_a2 - sum_b2 + Math.Pow(Math.Pow(sum_a2 - sum_b2, 2) + 4 * Math.Pow(sum_ab, 2), 0.5);
    double sita = Math.Atan(s_up / (2 * sum_ab));
    double up1 = 0, up2 = 0;
    for (int i = 0; i < data.Count; i++)
    {
        up1 += Math.Pow(data[i].a * Math.Cos(sita) + data[i].b * Math.Sin(sita), 2);
        up2 += Math.Pow(data[i].a * Math.Sin(sita) - data[i].b * Math.Cos(sita), 2);
    }
    double SDEx = Math.Sqrt(2 * up1 / n);
    double SDEy = Math.Sqrt(2 * up2 / n);
    double sin_sita = Math.Sin(sita);
    double cos_sita = Math.Cos(sita);
    Result re = new Result(X_ave, Y_ave, SDEx, SDEy, sin_sita, cos_sita);
    return re;
}

空间权重矩阵

空间权重矩阵(Spatial Weight Matrix)是一个用于量化地理单元之间相互影响的矩阵。矩阵中的每个元素表示两个地理单元之间的空间联系强度。

地理学第一定律表明“任何事物都是与其他事物相关的,只不过相近的事物关联更紧密”。这一定律强调了空间中的关联性和依赖性。空间权重矩阵则是对这种空间关联性的量化表达。

空间权重矩阵应用广泛:在城市规划中,可助分析商业中心对周边区域经济带动,合理布局商业区;房地产研究中,能反映地段房价相互影响,预测价格变化;流行病学里,有助于了解疾病传播模式,判断周边地区受影响程度;交通规划中,明确交通节点关联强度,评估新建站点对流量的改变;环境研究时,分析污染扩散范围和影响程度。它是解决空间相关问题的有力工具。

空间权重矩阵的构建方法主要分为以下两类:

  • 基于邻接关系:包含一阶邻接矩阵、二阶邻接矩阵以及高阶邻接矩阵。
  • 基于距离关系:涵盖质心距离、经济距离、时间距离等。在多边形地理单元中,其相互之间的距离往往依据各区域质心之间的欧式距离予以确定

基于邻接关系构建空间权重矩阵,常见方法有rook、Bishop、queen 邻接矩阵等。rook 认为有共同边即相邻;Bishop认为存在共同顶点则相邻,queen 则存在边或顶点相接即视为相邻。矩阵元素用 0 和 1 标记相邻与否。

基于距离关系构建空间权重矩阵,常见方法有:

  • 反距离权重矩阵,认为距离近影响大权重高,实际应用中可调整参数。
  • 半径距离权重矩阵,预先设半径阈值,单元间距离小于等于阈值则权重为 1,否则为 0,只考虑一定半径内单元相关性。
  • K 个邻近权重矩阵,确定每个单元的 K 个近邻,若为近邻则权重为 1/K,否则为 0,每个单元邻居固定为 K 个。

空间权重矩阵常要标准化,主要有行标准化和全局标准化。行标准化让每行元素总和是 1 。全局标准化则对整个矩阵元素调整。标准化能让不同矩阵可比,保证分析合理稳定,消除量纲影响。

实现过程如下:

public double[,] CalMatrix(List<Data> data)
{
    int n = data.Count;
    double[,] matrix = new double[n, n];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < n; j++)
        {
            if (i == j)
            {
                matrix[i, j] = 0;
            }
            else
            {
                matrix[i, j] = GetDisW(data[i], data[j]);
            }
        }
    }
    //行标准化
    for (int i = 0; i < n; i++)
    {
        double sum = 0;
        for (int j = 0; j < n; j++)
        {
            sum += matrix[i, j];
        }
        for (int j = 0; j < n; j++)
        {
            matrix[i, j] = matrix[i, j] / sum;
        }
    }
    return matrix;
}
public double GetDisW(Data d1, Data d2)
{
    double d = Math.Sqrt(Math.Pow(d2.x - d1.x, 2) + Math.Pow(d2.y - d1.y, 2) + Math.Pow(d2.z - d1.z, 2));
    double w = 1 / (d * d);
    return w;
}

莫兰指数

莫兰指数的核心思想:评估一个区域内的观测值与其相邻区域观测值之间的相似程度。取值范围在-1到1之间。正数表示相似属性值聚集在一起;负数则表示离散形式;接近0则表示随机分布。

全局莫兰指数:表明总体空间相关性是正相关、负相关还是随机分布。

局部莫兰指数:揭示局部区域内的空间相关性模式,例如高值聚集(HH)、低值聚集(LL)、高值被低值包围(HL)或低值被高值包围(LH)等。

Z 值(Z-score)用于衡量观测值偏离其期望值的程度;P 值(P-value)则是用于检验原假设(通常是假设不存在空间自相关)的概率。

public void CalMoran(List<Data> data, double[,] w, Result re)
{
    //计算全局莫兰指数
    int n = w.GetLength(0);
    double v_ave = data.Average(o => o.Value);
    double up = 0, down = 0, S0 = 0;
    for (int i = 0; i < n; i++)
    {
        down += Math.Pow(data[i].Value - v_ave, 2);
        for (int j = 0; j < n; j++)
        {
            up += w[i, j] * (data[i].Value - v_ave) * (data[j].Value - v_ave);
            S0 += w[i, j];
        }
    }
    double I = n / S0 * up / down;
    re.I = I;
    //计算局部莫兰指数
    for (int i = 0; i < n; i++)
    {
        double up2 = 0, S2 = 0;
        for (int j = 0; j < n; j++)
        {
            if (j != i)
            {
                up2 += w[i, j] * (data[j].Value - v_ave);
                S2 += Math.Pow((data[j].Value - v_ave), 2);
            }
        }
        S2 = S2 / (n - 1);
        double l_up = data[i].Value - v_ave;
        data[i].I = l_up / S2 * up2;
    }
    //z-score
    double z_down = data.Sum(o => Math.Pow(o.Value - v_ave, 2));
    for (int i = 0; i < n; i++)
    {
        double z_up = data[i].Value - v_ave;
        data[i].Z_score = z_up / Math.Sqrt(z_down / n);
    }
}

最终计算结果如图:

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号