经验分享

  • 核心要点

    测绘程序设计比赛由于是比较新的比赛,比赛难度实际不大,主要就是考察文件的读写、把书面公式转为逻辑代码的能力。

    需要把几个部分分开,这样很好分清自己的代码逻辑

    • 算法类,专门实现需要翻译的算法部分(Algo.cs)
    • 实体类,根据题目需求创建对应的实体,并合理管理其方法和属性(Entity.cs)
    • 工具类,存放如文件读写、数学函数、日期函数等辅助方法(Utils.cs)
    • 窗体类,主页面部分,实现页面交互功能(Form.cs)
  • 赛题分析

    2024年的测绘程序设计比赛的题目是空间数据探索性分析,考察计算莫兰指数

  • 代码仓库

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    /// <summary>
    /// 莫兰指数计算
    /// </summary>
    /// <param name="data"></param>
    public static void MoranIndex(List<Point> data)
    {
    int N = 7;
    //研究区域犯罪事件的平均值
    meanX_Moran = (double)data.Count / N;

    double over = 0, under = 0;
    for (int i = 0; i < N; i++)
    {
    under += Math.Pow(counts[i] - meanX_Moran, 2);
    for (int j = 0; j < N; j++)
    {
    S0 += weightMartix[i, j];
    over += weightMartix[i, j] * (counts[i] - meanX_Moran) * (counts[j] - meanX_Moran);
    }
    }
    I = (N / S0) * (over / under);
    }
    /// <summary>
    /// 局部莫兰指数计算
    /// </summary>
    /// <param name="code"></param>
    public static void MoranIndex_(int code)
    {
    //局部莫兰指数的计算
    int N = 7;
    //传入区域号为code 即为i = code-1
    double over2 = 0, right = 0;
    for (int j = 0; j < N; j++)
    {
    //j!=i
    if (j == (code - 1))
    {
    continue;
    }
    else
    {
    over2 += Math.Pow(counts[j] - meanX_Moran, 2);
    right += weightMartix[code - 1, j] * (counts[j] - meanX_Moran);
    }

    }
    Si = over2 / (N - 1);
    Ii[code - 1] = right * (counts[code - 1] - meanX_Moran) / Si / 1000;
    }
    /// <summary>
    /// 计算局部莫兰指数的Z得分
    /// </summary>
    /// <param name="Ii"></param>
    public static void CalculateZScore(double[] I)
    {
    int N = 7;
    double over = 0;
    double over2 = 0;
    foreach(var i in I)
    {
    over += i;
    }
    u = over / N;
    foreach(var i in I)
    {
    over2 += Math.Pow(i - u, 2);
    }
    o = Math.Sqrt(over2 / (N - 1));
    for (int i = 0; i < N; i++)
    {
    Zi[i] = (I[i] - u) / o;
    }
    }