GIS空间数据可视化全流程:从坐标对齐到天地图切片发布
1. 空间数据可视化研究的本质一条从数据到认知的链路先说个现象。我最近扫了一批指标数据发现大家在GIS这个方向搜得最多的不是什么高深的算法而是gis数据对不齐gis中存在尖锐角怎么处理gis怎么新建shp文件gis文件怎么保存发送给别人这类非常基础的实操问题。这其实很能说明问题空间数据可视化这个领域门槛从来不在画图而在于你手里的空间数据本身是否干净、是否在同一套坐标系下、能不能被正确表达成图层。这也是我想围绕基于地理信息系统的空间数据可视化研究这个题目认真聊一聊的原因。空间数据可视化本质上不是把地图画出来而是把空间数据变成可被眼睛理解的认知。它要回答的问题包括数据在哪、数据和数据之间是什么空间关系、哪些区域高哪些区域低、沿着路网或水系会不会有聚集效应。这个链条从原始坐标表格开始经过格式处理、坐标系统一、拓扑修复、符号化表达最后还要落到切片发布和前端加载。每一步拆开看都不算难但串起来之后任何一个环节出问题都会让最终成果变成一张看起来挺好看其实经不起追问的图。1.1 研究的四个层次我把这类项目拆成四个层次方便大家对照自己的进度卡在哪儿。第一个层次是数据层。包括空间数据的获取、格式转换、字段整理、坐标系定义、拓扑检查。这个层次最枯燥但决定成败。热搜词里大量出现坐标对不齐尖锐角处理说明很多人其实就卡在这一层。第二个层次是表达层。也就是符号化、专题图设计、分级设色、三维地形表达。这个层次决定了图好不好看、信息准不准。很多项目第一版图出来领导觉得颜色挺好看但你让他解释图上的颜色梯度代表什么他反而说不清那就是表达层出了问题。第三个层次是交互与分析层。包括查询、筛选、空间统计分析、时态展示、热点识别。这一层是空间数据可视化区别于普通报表的含金量所在。比如一个蔬菜价格预测可视化项目把各省价格做成柱状图你只能看出高低但把价格叠到物流干线上你会立刻发现价格洼地沿着公路网呈带状分布这个结论只有空间叠加才能给出来。第四个层次是工程层。也就是切片包制作、服务发布、前端大屏集成、性能优化。热搜词里gis中创建地图切片包可视化大屏前端大屏可视化都在这一层。很多研究型项目最后没落地问题往往不在算法而在切片没做好、服务撑不住、底图加载不出来。1.2 它和普通数据可视化大屏的本质差异我一直觉得空间数据可视化和市面上的数据大屏是两套逻辑。为了讲清楚我常用一个表格来对比维度普通数据可视化大屏GIS空间数据可视化核心对象指标、趋势、占比点、线、面及它们的空间关系坐标概念没有横纵轴是业务字段必须有地理坐标且坐标基准要统一主要图表柱状图、折线图、饼图、雷达图专题图、热力图、分布图、网络图数据来源业务库、Excel、接口Shp、GeoJSON、天地图、影像、DEM常见陷阱数据口径不一致坐标系混乱、拓扑错误、数据对不齐交付物页面、报表、大屏地图服务、切片包、图层包、WebGIS应用做普通大屏的人很少需要关心我这批数据的坐标系是WGS84还是CGCS2000但在GIS项目里如果这个问题没搞明白数据加载进来之后位置就会差几十米甚至几百公里。普通大屏更关心当前值是多少、涨了还是跌了GIS可视化更关心这个现象在哪发生、和什么邻近、往哪个方向扩散。这就是本质差异也是基于地理信息系统的空间数据可视化研究这个题目真正要研究的内容。2. 数据准备期绕不开的三件事建文件、传文件、清拓扑如果让我给做GIS可视化的新人一句忠告那就是数据准备期花的每一分钟都会在后面十倍赚回来。这一节我集中讲三个搜索热度极高的操作问题因为它们的出错率太高了。2.1 新建Shp文件字段设计跟着用途走gis怎么新建shp文件这个问题看似简单实际上一堆人在第一步就埋了雷。新建Shp文件时软件的对话框里有一堆字段类型选项文本、整型、短整型、双精度、日期、Blob。很多人随手全选文本等做分级统计时才发现数值字段是字符串没法参与运算不得不返工。正确的做法是在新建文件之前先想清楚这个图层将来要被谁用、做什么分析。如果要做人口的按区县统计那行政区划代码就得用文本类型存因为代码本质上不是数字前导零不能丢人口数、GDP这类真正参与计算的量必须用双精度或整型年份和日期用日期类型方便后续做时态可视化。新建要素类时的坐标系选择同样关键。如果你不确定数据最终落在哪套坐标系保险的做法是先用地理坐标系WGS84采集将来再投影。千万不要在数据还没处理时就用一个冷门投影坐标系去新建要素后面所有底图和在线服务都要迁就你这个小众坐标系那就是给自己挖坑。2.2 发文件别只发一个后缀Shp文件组与打包规范热搜里有gis文件怎么保存发送给别人我见过太多人从文件夹里只拖了一个.shp文件发给对方然后对方打不开两个人隔着屏幕互相怀疑。真相是Shapefile不是一个文件而是一个文件组。最少要有.shp几何、.shx索引、.dbf属性表这三个文件才能正常打开。理想情况下还应该有.prj坐标系定义、.cpg字符编码、.sbn/.sbx空间索引。缺了.prj对方打开后坐标系未知叠加其他数据时位置就是错的缺了.cpg中文属性乱码的情况非常常见。所以我的习惯是无论往哪儿发数据永远在文件夹里把整个文件组选中压成一个zip包再发。如果软件支持我更推荐用GeoPackage.gpkg或File Geodatabase.gdb作为交付格式。GeoPackage是单文件坐标系和属性表一体跨软件兼容性好File Geodatabase适合大量图层一起交付但要注意它不能直接用低版本软件打开。另外交付时随手附一个几十字的说明文档写明坐标系、投影方式、字段口径这能帮你省掉无数个对方看不懂你数据的深夜沟通。2.3 尖锐角、狭长面与无效几何拓扑清理要趁早gis中存在尖锐角怎么处理也是高频问题。所谓尖锐角通常是节点转折角度极小、面状要素极度狭长的表现。这类几何问题在自动矢量化或人工勾绘时很容易产生直接后果是后续做空间分析时结果不可靠做裁剪时面被切碎做切片发布时边缘出现异常裂缝。处理思路分三步。第一步是检查。在ArcGIS里用检查几何工具或QGIS里执行Vector geometry的Check validity把问题几何先圈出来。第二步是批量修复。ArcGIS的修复几何能修自相交和空几何QGIS可以用v.clean工具选rmangle参数去锐角、选rmdupl去重复节点。第三类是手动兜底针对个别极端狭长面我通常直接在编辑会话里删掉多余节点或者用消除工具把面积小于阈值的小碎面合并进相邻大面。这里有个经验千万不要惦记着一个美观的边界憧憬而舍不得删节点。空间可视化项目要的是拓扑正确不是边界细节精致。一个带尖锐角的面放在大屏上缩放时那根刺会特别扎眼而且一到切片环节就给你刷出一堆警告那时候再回来源头上改成本翻倍。3. 坐标系乱套十个项目九个栽在这我不止一次说过坐标系问题贡献了GIS项目至少一半的返工。搜索词里gis数据对不齐这么高根子基本都在坐标系上。3.1 地理坐标系和投影坐标系一个管位置一个管丈量这两个概念必须分清楚。地理坐标系用经纬度表示位置单位是度全球统一但不适合量算面积和距离——因为经度长度在不同纬度下不一样。投影坐标系则是把地球表面展平到一个平面上单位是米算距离、算面积、画缓冲区都必须在这种坐标系下进行。打个比方地理坐标系是你说我在人民广场东南方向500米的定位方式而投影坐标系是你在图纸上量出图上一段距离然后换算成实际米数。地图可视化时如果只关心数据落在哪个省用经纬度问题不大但只要涉及两个点之间的距离对比、面积统计、缓冲区分析就必须先投影。3.2 国内项目绕不开的几种坐标系国内做GIS可视化至少要认识这几套坐标坐标系常见EPSG编码用途场景WGS84 经纬度EPSG:4326GPS原始数据、国际交换、GeoJSON默认Web墨卡托EPSG:3857在线地图底图、前端WebGISCGCS2000EPSG:4490地理坐标/ 对应分带投影国家测绘数据、第三次国土调查、天地图西安80 / 北京54历史遗留老测绘成果、部分规划数据GCJ02非公开编码国内互联网地图服务商采用最典型的问题就是手里数据是WGS84底图是Web墨卡托而下载的地类数据是CGCS2000三套坐标混在一起叠加后自然差出几条街。CGCS2000和WGS84在全球范围内差异很小但在做高精度项目时绝不能混用。3.3 数据对不齐时的排查顺序遇到数据对不齐我建议按这个顺序查不要一上来就手动移动图层。先看属性。打开图层的源信息看它的坐标系标注和范围。如果范围是100到120这种量级大概率是经纬度如果是几百万的量级那是投影坐标两者绝对不能直接叠加。再看.prj是否存在很多数据在传输过程中丢了坐标系文件软件会显示未知坐标系这种必须先定义投影而不是直接平移。然后看底图服务。天地图、ArcGIS Online等服务通常用Web墨卡托或CGCS2000。如果你的数据是WGS84地理坐标在Web墨卡托底图下虽然能大致对上位置但会有一点偏移。这里的关键点是用动态投影显示确实能对齐但这只是显示层面的临时适配建议在进入正式分析前还是把数据统一投影到一个目标坐标系再存一份干净的数据。最后再看是不是数据本身采错了比如点位本身就跑偏了几百米那就不是坐标系问题而是源数据质量问题了。3.4 桌面GIS在线地图加载失败的常见原因与排查gis pro在线地图加载不了具体步骤这个热搜词很真实。我处理过很多次这种问题给个排查链路供参考。第一步确认网络本身能用。在线底图服务加载不出来最常见的其实是代理、防火墙和内外网策略问题。先用浏览器直接访问底图的URL模板比如天地图的WMTS地址能打开就说明网络链路没问题问题出在GIS软件上。第二步检查服务URL是否失效。很多在线服务商会定期更新服务地址旧的URL会404。进入图层属性把URL复制到浏览器里试一下如果返回错误或空的XML说明地址已经过期需要到服务商官网重新获取。第三步排查密钥或Token。天地图和很多商业底图都要求带key访问。如果你直接在软件里填了URL但是没带token服务会拒绝响应这时候加载不出来是正常的。正确做法是把key拼进URL模板对应位置。第四步核对坐标系和范围。有些在线服务只覆盖特定范围比如某些市级底图服务只有本地数据你把范围设置成全国它自然显示空白。把这四个环节捋一遍至少能解决九成在线地图加载不了的问题。4. 把属性变成视觉语言专题图、天地图接入与切片发布数据干净了、坐标系统一了接下来才是真正可视化的环节。这一节讲三件我日常用得最多、也在热搜词里反复出现的事情专题图分级、天地图接入、地图切片包。4.1 分级设色方法选择和色带使用专题图里最常见的是分级设色也就是把连续数值分成几个区间用颜色深浅表达。分级方法有好几种很多人打开软件默认用自然间断点然后用到底。自然间断点Jenks的思路是让组内差异最小、组间差异最大适合数据分布有天然聚类的情况。分位数分级则把每个区间放相同数量的要素适合偏态明显的数据。等间距分级适合数据均匀、用户熟悉尺度的场景比如降雨量。实际项目里如果领导要看着舒服我一般用自然间断点如果要对比两个地区的位次分位数更公平。色带选择上往深色方向渐变适合表达从低到高的连续量红蓝或黄紫发散色带适合表达正负偏离定性色板用于分类变量。有一个点容易忽略色盲友好。红绿搭配在色盲人群中完全失效我尽量用蓝橙搭配。另外分级数建议控制在5到7级之间。超过7级图例上色块差异已经很难被眼睛快速区分少于5级信息损失又太大。4.2 天地图底图接入坐标系对不上就是白接gis导入天地图底图这个搜索词说明很多人卡在底图接入这一环。天地图是国家地理信息公共服务平台的在线底图服务国内GIS项目经常要接它作为底图。接入的关键是坐标系。天地图的影像底图和矢量底图通常提供CGCS2000的WMTS服务部分服务也输出Web墨卡托。如果你手里的业务数据是WGS84没有做任何转换就直接叠加到CGCS2000底图上就会出现几十米的偏移。正确做法是先把业务数据从WGS84地理坐标转换到CGCS2000对应分带投影或者至少保证底图服务和数据层处于同一套坐标参考系之中。操作上在ArcGIS Pro里可以通过添加WMTS服务器填入天地图的WMTS URL然后按图层添加需要提前到天地图官网申请key并将密钥拼接在URL中。QGIS里同样有添加WMTS/WMST图层的入口。接完以后先加入一个已知位置的点验证偏移——这一步千万不要省宁可多花两分钟确认也不要等整套大屏都铺好了才发现位置对不上。4.3 地图切片包发布前先把数据变成一级级砖gis中创建地图切片包在大屏项目里经常出现。切片是什么就是把一幅大地图按不同缩放级别切成无数小块像贴瓷砖一样前端只加载当前屏幕范围内的那几张。切片做成之后用户缩放时响应极快这是在线地图性能的关键。创建切片包的大致流程先在ArcGIS Pro里把需要发布的图层按想要的符号效果排好然后用创建地图切片包工具选择切片格式PNG适合普通底图矢量切片适合需要高清缩放的场景设定比例尺级别一般切到城市级别够用不需要一路切到全球。工具跑完会生成一个.tpkx文件这个文件可以打包给其他工程使用也可以发布到服务端。切片前必须确认三件事坐标系已统一、数据范围正确、拓扑干净。如果数据有尖锐角或自相交切片边缘经常会出现细小的黑色裂缝或重叠痕迹这就是前面说拓扑要趁早的另一个理由。数据量大的时候切片包生成的体积可能很大我通常会先在服务端发布让服务器后台按需切片而不是在本地把全量数据都切出来再传输。5. 一个污水监测可视化项目的完整操作链路前面几节讲的都是模块这一节我拿一个实际工作中很常见的项目——污水排放口与水质监测站的空间可视化——把整套流程串起来。这个例子涵盖了坐标转换、数据清洗、符号化、切片发布和前端展示大家做完一遍基本就能把基于地理信息系统的空间数据可视化研究这一套方法应用到自己的数据上。5.1 开局数据几张表格和一堆坐标项目的原始材料通常是这些一张Excel表里面是各个污水排放口的编号、名称、经纬度、排放量另一张表是水质监测站的站点信息和监测结果。除此之外还有一份行政区划的Shp文件用来做空间关联。这类数据最常见的状态是经纬度是WGS84采集的但是采集时用的手机App或者电子地图工具给出的坐标实际带着国内互联网地图的偏移而行政区划Shp是CGCS2000底图是天地图CGCS2000服务。如果不做任何处理点位会和区划边界错开几百米看起来像是点位落到了河对岸甚至别的街道里。5.2 七步从Excel点位表做到可发布图层我把完整处理过程归纳成七步这个流程我反复用过基本能覆盖大多数空间数据可视化项目的开头。第一步把Excel导入GIS软件用显示XY数据或创建点图层把经纬度转成点要素。这里注意要看清经纬度字段的顺序先经度后纬度很多人在这里把X和Y填反结果点位跑到国外。第二步检查坐标基准。如果知道数据是WGS84就先定义成EPSG:4326。如果导出的坐标明显是GCJ02偏移需要先做坐标转换归到WGS84或CGCS2000。这一步不能省否则后面算什么都不对。第三步做范围校验。把点位和行政区划Shp叠加用空间连接统计每个区县内的点数量检查有没有大量点位落在区划边界外。有异常就回去核对原始坐标把采集错误的数据挑出来。第四步统一坐标系。把点位图层用投影工具转换到CGCS2000的投影坐标系确保它和行政区划层、天地图底图处于同一套坐标系下。第五步字段规范化。给排放量做分级比如按日均排放量分为小型、中型、大型新增一个分级字段给监测站的水质类别也规范化成统一的分类编码。这一步是为了后续符号化时不至于在表达式里写一大堆乱七八糟的字段名。第六步符号化。排放口用比例符号或分级符号按排放量大小变化点的大小和颜色监测站用水质类别的定性色板。标注上排放口显示编号监测站显示站点名称两级标注要错开避免互相压盖。第七步制作切片并发布。把处理好的图整理成一张工程地图设置好符号和标注然后创建矢量切片包或地图服务。前端大屏通过服务地址读取天地图作为底图整个WebGIS就串起来了。5.3 大屏、服务、静态图交付形态怎么选最后一个问题做完了往哪放这一步很多项目没有想清楚导致很多成果烂在本地。如果对方需要的是会议汇报材料导出一张高清专题图配好图例、指北针、比例尺往往比任何电子交互系统都管用。如果对方想在业务系统里使用那就发布成地图服务或WMTS服务让他通过接口自行调用。如果要做大屏可视化可以把地图服务嵌入大屏页面旁边配指标卡和图表。这里要提醒一点大屏并不是越炫越好空间数据的价值是靠位置和空间关系呈现的不要让一堆没意义的动效掩盖了信息本身。我在实际项目里的做法是先问清楚对方的使用场景和使用频率。一周看一次的汇报静态图足够了每天要看、还要交互查数据的才考虑服务和大屏。空间可视化项目的成本差异很大把交付形态选对比把图做漂亮更能让项目顺利验收。最后聊一点个人感受。我做了不少这类空间数据可视化项目最大的体会是决定一个项目成不成的往往不是最后那个让人眼前一亮的大屏界面而是项目刚开头那一个小时里你有没有把坐标系、字段类型、拓扑问题想清楚。数据源杂乱、坐标混乱、文件交付不规范这些问题如果不处理后面所有可视化都是空中楼阁。还有一个我坚持了很多年的习惯每次交付数据时都随手写一份说明文档里面写清楚坐标系、投影带、字段口径和数据来源。这份东西在别人眼里可能不起眼但它能帮你省掉无数次你这图上的点在哪个地方的质询。