• 栅格区域人口分布数据获取及坐标系转换


    前言

    需要获取的是目标栅格区域内的人口分布(密度)数据。本文从数据获取,到处理方式上一步步详细进行阐述,借助工具有:arcgis10.7,python3.7,matlabR2018b。

    一、人口分布数据下载和格式转换

    资源环境科学与数据中心,网址: https://www.resdc.cn/Default.aspx
    依次选择左侧的数据集(库)目录----->>社会经济数据----->>中国人口空间分布公里网格数据集,如下图:
    在这里插入图片描述
    下载数据需要注册和登录,拉到网页最下端,有如下下载列表,选择2019年数据进行下载。
    在这里插入图片描述
    下载下来的数据是.adf格式数据,需要转tif,shp,或netcdf格式数据的同学,请参照https://blog.csdn.net/rqjabc/article/details/124771567
    该数据为栅格数据类型,每个栅格代表该网格范围(1平方公里)内的人口数,单位为人/平方公里,数据格式为gird,数据以Krassovsky椭球为基准,投影方式为Albers投影。

    二、坐标系统转换

    所需要的是基于经纬度的地理坐标系,然而,现在拿到的数据是投影坐标系,具体是krasovsky_1940_Albers到GCS_WGS_1984 关于地理坐标系统和投影坐标系统想了解的可以查看https://blog.csdn.net/weixin_43465015/article/details/110875759,说白了,投影坐标系=地理坐标系+投影方法,两种坐标系统的转换使用arcgis工具来实现。

    • 首先,需要定义投影(如果投影坐标系和要转换的地理坐标系是同一个地理坐标系,则直接调至下一步),打开arcgis,系统工具箱------->>数据管理工具------->>投影和变换------->>创建自定义地理(坐标)变换。如下图:
      在这里插入图片描述
      地理(坐标)变换名称自己起,方便识别就行,输入地理坐标系和输出地理坐标系在右侧的小手图标打开,可通过搜索选择。

    • 其次,栅格投影,系统工具箱------->>数据管理工具------->>投影和变换------->>栅格------->>投影栅格,如下图:
      在这里插入图片描述
      输入栅格为需要转换的数据,输出数据集我这里选择的默认地址,输出坐标系和上面一样,此时地理坐标变换会自动识别出上面我们定义的投影,确定后即可完成转换。

    三、数据解析和插值

    我这里转换为tif格式数据,以下为该格式数据解析的python代码,需要gdal包的加持。

    from osgeo import gdal
    import numpy as np
    
    def read_data(data_path):
        dataset = gdal.Open(data_path)  # 打开tif
        projection = dataset.GetProjection()  # 地理/投影坐标系
    
        im_geotrans = dataset.GetGeoTransform()  # 获取仿射矩阵,含有 6 个元素的元组
        # [左上角的x坐标, 像素宽度, 行旋转(通常为零), 左上角的y坐标, 列旋转(通常为零), 像素高度(北半球上图像为负值)]。
    
        im_width = dataset.RasterXSize  # 获取宽度,数组第二维,左右方向元素长度,代表经度范围
        im_height = dataset.RasterYSize  # 获取高度,数组第一维,上下方向元素长度,代表纬度范围
        band = dataset.RasterCount  # 波段数
        im_data = dataset.GetRasterBand(1).ReadAsArray(xoff=0, yoff=0, win_xsize=im_width, win_ysize=im_height)  # 数据
    
        im_lon = [im_geotrans[0] + i * im_geotrans[1] for i in range(im_width)]  # 经度列表
        im_lat = [im_geotrans[3] + i * im_geotrans[5] for i in range(im_height)]  # 纬度列表
    
        return np.array(im_lon), np.array(im_lat), im_data
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    由于想要更精细的数据,因此需要对数据进行插值处理,这里应用的是matlab中的interp2函数进行二维插值,matlab代码如下:

    [lon_data1, lat_data1] = meshgrid(lon_data, lat_data);
    [lon_u1, lat_u1] = meshgrid(lon_u, lat_u);
    inter_data= interp2(lon_data1, lat_data1, double(origin_data), lon_u1, lat_u1, 'spline'); %三次样条插值
    % 'linear' :双线性插值算法(缺省算法);
    % 'nearest' :最临近插值;
    % 'spline' :三次样条插值;
    % 'cubic' :双三次插值。
    save('C:\Users\ADMIN\PycharmProjects\pythonProject\inter_data.mat', 'inter_data');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    END
    参考资料
  • 相关阅读:
    前端面试的话术集锦第 17 篇博文——高频考点(TCP知识点)
    Unity 在子线程中调用主线程的方法
    8 张图 | 剖析 Eureka 的首次同步注册表
    GPT最佳实践:五分钟打造你自己的GPT
    港联证券:三季报亮相 盈利拐点来了?
    Linux 内存管理 pt.3
    2023云数据库技术沙龙MySQL x ClickHouse专场成功举办
    【PyTorch][chapter 20][李宏毅深度学习]【无监督学习][ GAN]【实战】
    Docker 部署 nacos 服务
    数据结构--时间复杂度和空间复杂
  • 原文地址:https://blog.csdn.net/weixin_40356612/article/details/127570668