ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

用ArcGIS制作全球疫情地图:从数据下载到出图全流程

用ArcGIS制作全球疫情地图:从数据下载到出图全流程 最近一段时间不断有朋友问我类似的问题想做一张反映全球疫情分布的地图数据该去哪里下载从网上下载的表格为什么在ArcGIS里打不开坐标点描出来一片乱飞怎么办其实这些问题都指向同一件事用ArcGIS做全球新冠肺炎地图难点不在软件操作本身而在于“数据下载和处理”这一整套流程。这篇内容就是针对这个痛点写的。我会从数据源选择、CSV下载、坐标点生成、字段清洗、地图配图到常见坑位排查完整走一遍力求让你照着操作就能做出一张可用的全球疫情分布图。适合GIS初学者、公共卫生数据分析和需要应急作业的从业者参考。1. 疫情数据源选型公开数据集对比与选择1.1 三大免费数据源JHU、OWID、WHO做全球疫情地图首先就要搞明白官方发布的数据散落在不同机构格式五花八门更新节奏也不同。最常用、最稳定的是下面三个公开数据源。约翰霍普金斯大学JHUCSSE仓库。这是全球疫情可视化领域使用最多的一份数据托管在GitHub上每天更新。核心路径是csse_covid_19_data/csse_covid_19_time_series/里面有time_series_covid19_confirmed_global.csv和time_series_covid19_deaths_global.csv两个关键文件。格式是每个国家或地区一行后面跟着从2020年1月22日开始逐日新增的累计数据列同时附带纬度和经度字段特别适合做“点状全球分布图”。Our World in Data简称OWID。这个数据我后期用得最多。它在GitHub上的仓库地址是owid/covid-19-data主文件是public/data/owid-covid-data.csv。它最大的优势是字段结构优秀每行包含“国家-日期-累计确诊-新增确诊-累计死亡-新增死亡-人口-每百万人确诊”等数据尤其适合做按时间的面数据地图和归一化分析。世界卫生组织WHO官方数据页面。下载的是WHO-COVID-19-global-data.csv格式规整包含国家、日期、新增确诊、累计确诊等字段。数据权威性最高但字段较少适合快速出图或者做权威性校验。数据源更新频率数据形态适合场景JHU CSSE每日宽表时间序列列全球点图、时间序列分析OWID每日长表国家日期行面数据Join、归一化分析、时间动画WHO每日长表国家日期行权威快照、嵌套分析1.2 按需求选数据时间序列和截面数据不能混用很多朋友下载数据后一脸懵就是因为没区分“时间序列”和“截面数据”这两个概念。JHU的time_series文件是典型的时间序列宽表每个日期占一列每行是一个国家适合做“某一天全球累计感染地图”。但如果你要做“3月1日各国新增感染对比”就需要从这类宽表中截取某一列或者直接使用OWID这样的长表数据通过日期筛选即可。还有个容易忽略的细节JHU的宽表里中国数据拆分到了省级行政区而其他多数国家只有国家整体。所以用JHU做“全球国家面数据”时要格外小心最好先做聚合把省份数据汇总到国家层面否则后面做行政边界关联会多出很多麻烦。我的建议是如果是做全球整体趋势直接用OWID如果是做国内省级分布可以继续用JHU的省粒度数据再配中国省级边界矢量图。2. 下载到导入ArcGIS从CSV到地图点的全流程2.1 数据下载操作细节别把数据存成Excel下载JHU或OWID数据时大多数人会顺手点开CSV系统用Excel打开后另存为xlsx。这样做在处理小文件时没太大问题但ArcGIS读取Excel表格远没有读取CSV灵活而且xlsx会丢失一些字段类型信息。我建议直接用浏览器打开原始文件的Raw地址右键“另存为CSV”保留原始编码和分隔符。如果你用Python或R也可以用几行代码直接读取并保存import pandas as pd df pd.read_csv(https://raw.githubusercontent.com/CSSEGISandData/COVID-19/master/csse_covid_19_data/csse_covid_19_time_series/time_series_covid19_confirmed_global.csv) df.to_csv(confirmed_global.csv, indexFalse, encodingutf-8-sig)这里的utf-8-sig编码很关键后面讲中文乱码的时候会专门展开。下载完成后用文本编辑器打开检查一下确认首行是字段名分隔符是逗号数据没有缺行少列。2.2 在ArcGIS中添加XY坐标点数据拿到CSV后的第一步是把有经纬度的表格转换成地图上的点。这里有两种常见操作路径。一种是在ArcMap菜单栏选择“文件 添加数据 添加XY数据”在弹出的对话框中指定X字段为经度LongY字段为纬度Lat坐标系选择GCS_WGS_1984然后点击确定。此时表格会以临时图层形式显示在地图上。这里要特别提醒临时事件图层只是“看起来像点”如果不导出关闭工程后坐标信息会丢失。应该右键图层选择“数据 导出数据”保存为Shapefile或要素类。另一种更推荐的做法是使用工具箱里的“XY表转点”工具路径数据管理工具 要素 XY表转点。它能把CSV直接生成永久点要素参数同样需要选择X字段、Y字段和空间参考。工具的好处是批量处理时更稳定而且直接生成要素类省去导出步骤。2.3 坐标字段选择X对应经度Y对应纬度这个坑我踩过不止一次。ArcGIS的“添加XY数据”对话框里X字段应该填经度Y字段应该填纬度。很多新手把两个字段填反了导致生成的点跑到非洲西海岸或者整个图形呈“镜像”分布。为什么填反了不容易一眼发现因为全球疫情地图本身散点密集错位反而不明显等叠加行政边界时才看出问题。所以操作前先确认字段名JHU数据里明确写着Lat和LongOWID里虽然没有直接经纬度字段但可以通过国家名称关联边界数据来获得空间位置。如果从其他数据源下载的文件里经纬度字段是文本型比如“35.67”被识别成字符串那么“添加XY数据”可能会报错或者生成不了。解决办法是用字段计算器新建一个双精度字段把文本转数值float(!Lat!)3. 数据清洗与字段处理让乱数据变成可用数据3.1 日期字段与数值字段的类型修正下载下来的疫情数据日期字段通常有以下几种类型JHU宽表里日期直接做成了列名比如“1/22/20”默认是文本类型OWID长表里的date字段也是字符串。如果你要做时间序列或时间动画就需要把它转成日期类型。在ArcGIS Pro中可以用“转换时间字段”工具把文本型日期解析成日期型在ArcMap中更快的做法是新建一个“日期”类型字段然后使用字段计算器或者Python脚本赋值。给个小示例假设原始文本字段叫date_str格式是2020-03-01import datetime datetime.datetime.strptime(!date_str!, %Y-%m-%d)数值字段同样有类型问题。很多CSV文件里的确诊数会被识别成文本因为原始数据里有千位分隔符或引号。字段计算器里用float()或int()转换即可。如果原始字符串带有逗号比如1,234,567需要先做清洗float(!total_cases!.replace(,, ))3.2 空值与脏数据的处理策略疫情数据因为是手工汇总和机器抓取混合生成空值几乎不可避免。常见的空值有几种一是确诊数字对应位置为空比如某国家某天没有上报数据二是经纬度为空个别记录缺少坐标三是国家名称拼写不一致导致后面关联失败。处理空值前先弄清楚它的业务含义。累计确诊为空值一般可以直接补0或者用前一天数据填充新增确诊为空值则要看情况如果前后都有值可能是当天遗漏可以用线性插值或者直接置0。对于经纬度为空的行如果只是个别几条可以直接删除如果是某个国家的所有记录都没有经纬度就要按国家名称匹配一个中心点坐标补上。最稳妥的做法是在字段计算器里用Python函数统一处理def safe_num(v): if v is None or v : return 0 return float(v)有一点必须强调在处理死亡率和患病率相关计算时分母为0会导致除零错误这类情况不能盲目补0应先过滤再计算。我的习惯是先统计一下空值分布再决定是删除、补0还是补默认值不同业务场景的处理策略不能一概而论。3.3 按行政区汇总与行政边界关联如果只做散点地图处理到这一步就够了。但如果想做出“国家填色图”就需要把点数据关联到面数据上。全世界国家边界矢量文件之一可以从Natural Earth官网下载1:50m的世界国家数据ne_50m_admin_0_countries是常用的选择。国内也可以用ArcGIS Hub里的“World Countries”图层。关键操作是Join。要在OWID数据和边界数据之间建立连接通常使用国家代码。OWID数据里有iso_code三位字母代码Natural Earth数据里有ISO_A3字段两者格式基本一致。实际操作时先检查两边字段的内容是否完全匹配比如“USA”和“US”或者“Korea, South”和“KOR”这类写法差异都会导致关联失败。遇到这种情况可以用字段计算器建立映射表或者手动编辑字段值。关联完成后数据表里就会出现人口、累计确诊等属性这时可以继续做第4章的配图处理也可以进一步使用“联合”工具把属性合并到边界要素类中得到一份自带疫情属性的面图层这样后面做分析、出图、制作动画都会方便很多。4. 地图配图与可视化让数据说话4.1 分级设置自然断点还是分位数疫情数据一个显著特点就是高度偏态。全球几十个国家的累计确诊数从几个到几百万不等最大值和最小值之间相差六个数量级。如果直接使用默认的自然间断点分级会出现一个尴尬的情况绝大多数国家被分到最低档少数疫情严重国家霸占最高档地图配色严重失衡。我一般优先尝试分位数分级Quantile。分位数会把数据从小到大排序后均分成几个区间确保每个区间包含大致相同数量的国家视觉上更均衡。缺点是两个相邻国家数值差异不大但可能被分到不同颜色。如果不想用分位数可以手动设置断点比如0-100、100-1000、1000-10000、10000-100000、100000以上。手动断点的优势是阈值含义明确便于汇报解读缺点是要根据当日数据不断调整。在ArcGIS中右键图层打开“符号系统”选择“数量 分级色彩”然后在分类选项里选择“分位数”或“手动”。需要注意分级字段必须选择双精度数值字段否则会变成唯一值渲染。4.2 归一化别让单纯累计值骗了你累计确诊绝对数能反映体量却不能反映严重程度。100万人口里确诊1万人和1亿人口里确诊1万人风险水平完全不同。所以在做国家之间的对比时必须做归一化。最常用的指标是“每百万人口累计确诊数”total_cases_per_million total_cases / population * 1000000如果用的是OWID数据它已经自带了total_cases_per_million字段可以直接用于制图。如果是JHU数据没有人口字段可以Join One World in Data的人口数据或者用World Bank的人口估计值补进去。归一化之后的地图才有决策参考价值。我看到过很多媒体发布的“全球确诊地图”颜色深度只体现病例总数完全看不出各国风险差异这就是数据处理环节出了问题。做疫情地图归一化不是可选项而是必选项。4.3 配合在线底图与导出成图疫情数据图层配好之后底图选择也影响可读性。ArcGIS软件自带多套在线底图在内容列表中点击“添加底图”可以选深灰色画布、浅灰色画布、国家地理底图等。我个人比较推荐深灰色底图因为疫情数据中的高亮颜色在深色底图上对比更强。还有一个高频热搜词叫“ArcGIS如何导入在线地图”其实就是这个操作不需要额外下载影像数据。如果你想用影像底图也可以添加卫星影像图层但要注意疫情点图层颜色透明度设置否则点被底图吞掉。一般把疫情图层透明度设为30%到50%既能看清底图又能突出重点。导出成图时切到布局视图添加标题、图例、比例尺和指北针然后选择“文件 导出地图”。导出格式优先选择PNG或PDF分辨率设置300DPI以上避免印刷模糊。这里特别提醒导出前先检查图例里的分级标签是否显示完整之前我做过一次图图例里最大值显示成“1e06”影响使用手工把标签改成“1000000”才解决。5. 项目实操中的踩坑实录常见问题与排查技巧5.1 中文乱码与编码问题UTF-8和GBK的恩怨CSV里如果有中文字段导入ArcGIS后很容易变成乱码。这个问题背后的原理是一个同样常见的热搜词“为什么在UTF-8编码中中文字符通常占用的字节数比英文字符多”UTF-8是一种变长编码英文字符沿用ASCII规则占1个字节而中文字符在Unicode码位中落在U0800到UFFFF区间需要用3个字节编码。如果文件是UTF-8编码而ArcGIS在Windows系统上按ANSI即GBK方式读取就会把3字节的中文字符拆解成乱码。解决办法有两个。一是把CSV另存为带BOM的UTF-8编码utf-8-sigArcGIS读取时能通过BOM识别出UTF-8。如果手头有Notepad或VS Code重新保存并选择UTF-8-BOM即可。二是直接把CSV另存为ANSIGBK编码Windows平台上ArcMap读取最稳定。我通常会用Python导出时带上encodingutf-8-sig一步到位。5.2 坐标变成“飞点”或者点跑到海上了生成了点图层却发现一部分点跑到海面上或显示在非洲西海岸附近这是典型的坐标异常问题。最常见的元凶是空坐标或0坐标经纬度都是0时在地图上会定位到几内亚湾附近坐标字段存在文本型空值也会导致类似结果。排查时打开属性表按Lat 0 OR Long 0或用“为空”筛选把异常记录挑出来单独处理。如果是某些国家的坐标确实缺失可以用查找工具查一下该国首都坐标补进去。如果异常记录数量很大来源是原始CSV那就要回到数据下载源确认文件是否完整下载或者换成其他数据源再试一次。5.3 投影坐标系选错地图变形严重经纬度是地理坐标系ArcGIS默认空间参考是GCS_WGS_1984。如果你只是做显示问题不大但一旦要做面积计算、距离测量或叠加其他投影数据就必须关注投影。很多新手把“定义投影”和“投影”两个工具搞混了。定义投影是给数据“贴标签”声明它当前是什么坐标系投影才是“换坐标系”把数据从一个坐标系转换到另一个坐标系。如果做全球分布专题图我建议用“World Robinson”投影视觉均衡如果做面积占比计算可以用“World Eckert IV”或者等积投影如果只是Web地图发布直接保留WGS 1984 Web MercatorEPSG: 3857即可。做全球疫情图时因为叠加的底图通常是Web Mercator为了不出现错位图层最好也保持同样的坐标系。5.4 数据量过大导致卡顿全球疫情数据集如果包含每个国家每一天的记录几十万行数据很常见。ArcMap在处理几十万行点数据时经常转圈尤其在开启动态标注或时间滑块后。我的经验是分三步缓解第一步用“属性查询”按日期过滤只保留需要展示的日期记录第二步如果只需要国家层面数据先执行“融合”或“汇总统计数据”把点数据聚合到国家级别第三步关闭不必要的显示字段。ArcMap每个要素类的属性字段都会占用内存保留经纬度和数值字段即可其余可以删除或隐藏。如果一定要做时间序列动画建议改用ArcGIS Pro它的时间滑块性能和属性表筛选效率比ArcMap高不少。实际上近两年新版本的ArcGIS Pro对CSV大文件的读取体验已经非常流畅如果你经常处理这类数据值得专门迁移过去。表格做个速查常见问题可能原因解决办法CSV字段乱码UTF-8和系统GBK不匹配另存为UTF-8 BOM或ANSI编码点跑到海上坐标字段为0或空值筛选出异常值并修正或删除地图严重变形地理坐标和投影坐标混淆正确定义坐标系并按用途投影处理卡顿数据量过大且字段冗余过滤日期、聚合国家、清理字段国家关联失败国家名称或代码不一致通过国家代码映射表匹配以上这些坑基本覆盖了从数据下载到成图发布的大多数问题。如果在实际操作中还遇到其他报错最有效的排查方式是先看原始CSV文件再回看ArcGIS的“地理处理 结果”提示大多数报错都能从那两步里找到答案。我个人最后的体会是ArcGIS做全球疫情地图真正的价值不在“地图本身”而在“数据处理流程是否规范”。数据源可靠、字段清晰、坐标系正确、归一化做透后面每一步都顺数据源没选好或者清洗不干净后面再怎么调图都是白费。如果你按照上面的流程走一遍做出第一张全球疫情图之后后续再做区域分析、时间动画、风险分级就会轻松很多。
返回列表