GIS空间数据探索性分析

内容转自小红书-武汉大学李英冰
标准差椭圆

标准差椭圆可用于理解空间数据的分布特征和不确定性,反映空间现象的内在规律。例如在曼哈顿区MIN17区,2015年至2018年共发生交通事故18414 起,平均每平方公里发生6565起,可以利用平均中心和标准差椭圆进行交通事故空间分布。
1.平均中心
通过计算数据的平均中心位置,可以直观地发现事故的聚集情况,挖掘出事故随时间变化的偏移趋势。
2. 标准差椭圆
一组数据点在空间上的聚集性和方向性可以用标准差椭圆。椭圆的长半轴方向代表事件点在空间上的延伸方向,短半轴的长度则体现了事件点的聚集程度,短半轴越短,说明事件点在空间上越聚集。椭圆的扁率越大,即长短半轴的值之比越大,说明事件点越具有明显的方向性;反之,如果椭圆扁率越小,说明事件点越不具有方向性,当椭圆扁率为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);
            }
        }

最终计算结果如图

  • 30
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

湫秋刀鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值