☰
地图投影与数据降维:两个投影的数学本质与工程实践
2026/9/29 5:09:56 网站建设 项目流程

1. 两个“投影”,一个讲位置的换算,一个讲特征的压缩

刚看到“投影与降维”这个题目,我第一反应是这范围可太宽了。投影这词在不同的圈子里完全是两个物种:搞GIS的人一听到投影,想到的是坐标系、中央经线、变形、ArcGIS Pro里那一堆带数字的EPSG代码;搞机器学习和数据分析的人一听到投影,想到的是PCA、t-SNE、把一个高维矩阵压到二维坐标里画散点图。但有意思的是,两个领域不约而同地用了同一个词——投影,而且在数学本质上有非常相通的地方。

这篇文章打算把这两条线一起聊透。先讲地图投影里实际干活时最常碰到的几件事:怎么判断一个图层有没有投影信息,怎么给数据定义和转换坐标系,UTM投影的分带计算是怎么回事,为什么ArcGIS Pro删除投影信息之后还能再补回来;再讲数据降维里最常用的PCA、t-SNE和UMAP,它们各自的适用场景、背后的几何直觉,以及我在实际项目中总结的降维避坑经验。最后把这两个“投影”放在一起看,你会发现思路惊人地一致:都是把一个复杂的东西,映射到一个我们能够理解和操作的坐标系里。

适合谁看?如果你是GIS从业者,刚接触坐标系和投影转换,今天的内容可以直接照着操作;如果你是做数据分析和机器学习的,想搞清楚降维算法到底在干什么、怎么选、怎么调参,后面几节能省下不少试错时间。如果你两个方向都沾,那这篇文章正好帮你把这两套知识串起来。

2. 地图投影实操:坐标系、UTM分带和ArcGIS里的转换

地图投影的本质,就是把地球表面那个不规则的椭球体,按照某种数学规则展开到平面上。“投影”这两个字在GIS里从来不只是一个按钮,它决定了面积、距离、方向哪些能保真,哪些必须牺牲。实际项目里,我见过太多因为投影没搞对而导致的“差之千里”——坐标偏移几万米、重叠分析完全对不上、面积算出来离谱,最后排查半天,问题往往就出在一个图层是WGS84地理坐标,另一个图层的投影参数被随手赋错了。

2.1 先分清“地理坐标系”和“投影坐标系”,别把两者混为一谈

这是新手最容易踩的坑。地理坐标系(Geographic Coordinate System)是用经纬度来表示位置的,单位是度,比如WGS84、CGCS2000,它们描述的是球面上的位置。投影坐标系(Projected Coordinate System)是在地理坐标系的基础上,通过投影算法把球面上的位置换算到平面上的X、Y坐标,单位是米。同一个数据,从地理坐标系变成投影坐标系,本质上是做了一次数学变换,不会改变数据本身的内容,但会改变坐标值。

举个例子:北京的经纬度大约是东经116.4度、北纬39.9度。这是WGS84地理坐标。当你把它投影到Web Mercator(EPSG:3857)上,坐标会变成X约12958175、Y约4853352这样的数值。如果你拿到一份数据,打开属性表,发现X坐标是一串8位左右的数字,Y坐标是7位左右,那大概率是有投影的;如果X是116.4、Y是39.9这种带小数度的数值,那说明它是地理坐标。

判断一个数据到底有没有投影、是什么投影,在ArcGIS Pro里最快的方式是双击图层,切到“Source”选项卡,看“Coordinate System”这一栏。如果是“GCS_WGS_1984”,说明只有地理坐标系;如果是“WGS_1984_UTM_Zone_50N”这种名字,说明带了投影坐标系。线上还有一个常见问题:打开矢量数据时系统弹“未知的空间参考”,这种数据通常是没有写投影信息的——在ArcGIS Pro里右键图层属性,你会发现Coordinate System显示为“Unknown”。这种时候需要先弄清楚数据的原始来源和实际位置范围,再手动赋值,而不是随便选一个坐标系去定义。

2.2 UTM投影计算公式与分带选择:怎么判断一个点在哪个带

UTM(通用横轴墨卡托)投影是目前使用最广泛的投影方式之一。它的做法是把地球从西经180度起,按经度每6度划分一个带,总共60个带,带号从1到60。中国横跨的带号大致在43~54之间。UTM的横轴墨卡托投影在每带中央经线上长度比设为0.9996,这样做的目的是让整个带内的变形更均匀。

这里说一下UTM分带计算公式:带号 = 取整((经度 + 180) / 6) + 1。比如北京经度116.4度,(116.4 + 180) / 6 = 49.4,取整后是49,加1得到50,所以北京所在的UTM带号是50N。注意北半球用N,南半球用S。

关于UTM坐标还有几个必须记住的约定:为了避免负坐标,UTM在东坐标(Easting)上加了500000米的假东偏移,也就是说中央经线的X坐标不是0,而是500000;南半球还会在Y坐标上加10000000米假北偏移。实际计算中,如果你要手动验算坐标,会用到底下这些参数序列:

k0 = 0.9996 a = 6378137.0 // WGS84长半轴 f = 1 / 298.257223563 // 扁率 e2 = f * (2 - f) // 第一偏心率平方 ep2 = e2 / (1 - e2) // 第二偏心率平方

然后通过一系列展开公式计算经纬度对应的UTM平面坐标。实际上你不需要手动实现完整公式,ArcGIS Pro、GDAL、pyproj都已经封装好了。但理解这个原理有好处,比如当你看到某个坐标的X值是600000、Y值是4400000时,能判断出这个点应该在中央经线以东100公里的位置,且在北纬40度附近——这对于检查数据范围、排查坐标是否张冠李戴非常有用。

在GIS软件里做投影转换,最终要落地到单位上。这里补充一个常见的概念:ArcMap和ArcGIS Pro都可以直接右键图层、选择属性、切到坐标系选项卡,点“新建”来创建自定义投影;但在做数据转换时更推荐用工具箱里的“Project”工具,它会根据数据本身的坐标系和参数进行严格的变换计算,而不是简单修改元数据。

2.3 高热词盘点的三个操作:删除投影信息、投影文件转化、立方体投影

最近网上关于投影的高热问题里,有一个很有代表性:ArcGIS Pro里怎么删除投影信息。有些人从第三方拿到数据,或者自己复制数据时不小心带上了错误的坐标系定义,想清除掉重新定义。方法是在目录面板里右键数据,选择“Properties”,在“Source”选项卡里找到“Spatial Reference”,然后点击右下角的“Clear”按钮,也就是清除坐标系定义。清完之后数据的坐标值不会被改动,只是元数据里没有坐标系了,下一次打开时会提示未知坐标系。这个操作要特别谨慎:如果数据本身是有正确坐标的,只是少了定义,清除之后会更麻烦,等于把唯一能识别坐标系的信息也删了。正确做法应该是在确认数据坐标值正确的前提下,用“定义投影”而不是“投影”工具,把正确坐标系写回去。

另一个高频操作是投影文件转化。这个指的是常见矢量或栅格数据在不同投影坐标系之间互相转换,或者把带投影的数据转换成不带投影的数据,再或者把shapefile的.prj文件去掉、单独导出坐标信息。ArcGIS Pro里对应的是工具箱里的“Project”和“Define Projection”两组工具。前者是真转换,会重算每个点的经纬度并重新投影;后者只是给数据挂一个坐标系标签,不改变坐标值。实际工作中,很多人把Define Projection当成万能工具来修坐标错位,结果越修越偏——因为Define Projection不下发几何变换,它只写元数据。投影文件转化还有一个常见场景就是跨平台:在ArcGIS里定义好的.prj投影文件,用QGIS打开时有时会提示无法识别,这通常是因为.prj文件里用的WKT版本不一致,QGIS更支持标准WKT2格式,可以通过重新导出或在线投影库匹配来解决。

立方体投影这个热搜词稍微冷门一些,它指的是将三维的立方体表面展开到二维平面上的一种投影方法。在ArcMap的视频纹理映射、三维场景展示里偶尔会用到。实际项目中,这类需求主要存在于将三维建筑物模型、球面全景影像投影成平面纹理,以便统一处理。操作上ArcMap场景视图里并没有一键生成立方体投影的工具,更多是借助CityEngine、Blender等三维软件来烘焙。如果你只是做普通GIS分析,立方体投影用途有限,知道有这么回事即可。

2.4 Windows“投影到此电脑”安装无线显示器失败:和GIS无关,但值得一并解决

搜索词里出现了一个很特殊的:Windows“投影到此电脑”安装无线显示器失败。这其实跟地图投影没有关系,是Windows系统的无线投屏功能“Project to this PC”在启用时提示安装无线显示器失败。这类问题我处理过几回,最常见的原因是无线网卡驱动或显示驱动程序过旧,系统无法启用Miracast功能。

简单说一下排查思路:先按Win+R输入dxdiag,打开DirectX诊断工具,在“显示”选项卡里检查“Miracast”是否显示“Available”,如果显示“Not Available”,说明当前网卡或显卡驱动不支持无线投屏或驱动有问题,去设备管理器更新网卡和显卡驱动;如果驱动正常但还是装不上,检查系统的“无线显示器”可选功能是否被精简掉了,Win10/11可以在“设置→系统→可选功能→添加可选功能”里手动添加“无线显示器”。如果是DNS问题导致驱动下载失败,可以尝试更换网络环境。以上方案只说系统层面,不含任何第三方网络工具,大家放心操作。如果所有方法都试过仍然失败,还有一个偏方:直接在控制面板的“程序和功能”里把“远程桌面服务”相关组件启用起来,很多时候顺手就解决了组件缺失的问题。

3. 数据降维不是“压缩一下”那么简单:三种主流方法的几何直觉

降维这件事,在机器学习流程里属于数据预处理的一环。它的目标不是让数据变小、变快,而是把高维空间中的数据降到低维空间,同时尽量保留原始数据中最重要的结构和信息。为什么需要降维?最直接的原因就是“维度灾难”——当特征维度高到一定程度,样本会变得极其稀疏,距离度量几乎失去意义,模型也容易过拟合。另一个原因是可视化,人类能理解的最高维度就是三维,绝大多数图只能画二维,你想看一眼数据长什么样,就必须降维。

3.1 PCA:降维的“标准答案”,假设是线性世界

主成分分析是理解降维的起点。它的数学目标很清晰:找到一组新的正交坐标轴,使得数据在这些轴上的方差依次最大。第一主成分捕捉最大的方差方向,第二主成分在与第一主成分正交的约束下捕捉剩余最大方差,以此类推。因为方差最大意味着信息损失最小,所以PCA做的就是你输入高维数据,输出按信息量排序的几个主成分。

从实现上看,PCA的核心是对协方差矩阵做特征值分解,或者对数据矩阵做SVD。用Python里的scikit-learn,几行代码就能跑完:

import numpy as np from sklearn.decomposition import PCA import matplotlib.pyplot as plt X = np.random.randn(200, 50) # 200个样本,50维特征 pca = PCA(n_components=2) X_2d = pca.fit_transform(X) plt.scatter(X_2d[:, 0], X_2d[:, 1], s=5) plt.xlabel('PC1 (%.1f%%)' % (pca.explained_variance_ratio_[0] * 100)) plt.ylabel('PC2 (%.1f%%)' % (pca.explained_variance_ratio_[1] * 100)) plt.show()

这里我要强调两个实操细节。第一个是PCA对特征尺度很敏感,如果你跑之前不做标准化,量纲大的特征会主导主成分方向,结果很容易失真。所以建议PCA之前先做Z-score标准化,或者至少做MinMaxScaler。第二个是n_components怎么定,一般看累计解释方差比,比如要保留85%以上的信息量,就取累计解释方差比达到85%的最少维度数。常用做法是画出碎石图,看特征值从哪个位置开始断崖下降。

PCA的优点很明显:计算快、有全局最优解、结果可解释性强(可以看每个主成分的特征载荷),适合作为降维的第一步尝试。但它的局限在于假设数据整体呈线性相关结构,如果数据在各方向上呈非线性流形,PCA的投影结果就像把一张卷起来的纸强行压平整,会将本来在流形上相邻的点撕开得很远。

3.2 t-SNE:可视化专用的“非线性熨斗”

t-SNE(t-Distributed Stochastic Neighbor Embedding)是目前最流行的可视化降维算法。它解决的是PCA处理非线性结构的不足。t-SNE的思路和PCA完全不同:在原始高维空间中,任意两个样本之间根据欧氏距离的相似度,被转换成一个条件概率;在低维空间中,它也计算样本对之间的相似度;然后优化低维空间中的概率分布,让它尽可能逼近高维空间的概率分布,衡量标准是KL散度最小化。

t-SNE最核心的超参数是困惑度(perplexity),你可以把它理解为算法在计算每个点的相似度时考虑的“邻居”数量。困惑度太小,降维结果会呈碎块状,每个点只跟极少数点抱团;困惑度太大,全局结构会变得模糊,小类簇丢失。我在实际项目中一般先用困惑度30做一次,再尝试5、20、50,比较不同结果的稳定性和可读性。t-SNE还有一个特点必须提醒:每次运行结果都可能不同,因为优化过程引入了随机初始化。想复现结果要固定random_state。

t-SNE的代价在大数据集上尤为明显。它的优化复杂度是O(n²),样本量超过10万会跑得让人怀疑人生。我处理过20万个节点的业务数据,用t-SNE跑了将近半小时,内存占用一度冲到接近极限。后来解决方案是先用PCA降到50维,再用t-SNE可视化,效果稳定很多。

实际调用代码比较简单,但要注意参数别乱调:

from sklearn.manifold import TSNE tsne = TSNE(n_components=2, perplexity=30, learning_rate='auto', init='pca', random_state=42, n_iter=1000) X_tsne = tsne.fit_transform(X_pca) # X_pca建议是先PCA降维后的结果

t-SNE适合做探索性数据分析,帮你在图上发现类别是否有分群结构,但它不是聚类算法,降维后坐标的绝对距离没有意义,只有相对远近和团簇分布值得参考。有一个非常经典的陷阱:用t-SNE去判断两类数据是否可分,其实很多时候很小的困惑度差异就能让结果从“两类分得很开”变成“混成一团”,所以不要拿t-SNE的图去做严格定性结论。

3.3 UMAP:流形降维的当代实践,速度和结构兼得

UMAP(Uniform Manifold Approximation and Projection)是比t-SNE更新的非线性降维算法,它的理论基础建立在流形学习和拓扑学上,原理上通过构建数据的模糊拓扑表示,再在低维空间中寻找能保持该拓扑结构的低维表示。听起来很学术,但效果确实能打:运行速度比t-SNE快一个量级,同时对全局结构的保留更好,不会像t-SNE那样在不同的随机初始化下产生明显的“拼图”变化。

UMAP有两个最主要的超参数:n_neighbors和min_dist。n_neighbors控制局部邻域大小,值越大越关注全局结构;min_dist控制降维后点的最小间距,值越小点越紧凑。实际操作经验是,如果把两类数据希望分得比较开,加大n_neighbors、减小min_dist;如果想保留连续流形结构,减小n_neighbors、增大min_dist。UMAP也建议先做标准化,再跑降维。

import umap reducer = umap.UMAP(n_neighbors=15, min_dist=0.1, n_components=2, random_state=42) X_umap = reducer.fit_transform(X_scaled)

用了UMAP之后我再回头用t-SNE,明显的感觉是:UMAP的联合聚团效率更高,而且可以做有监督降维(传入标签参与构造图结构),这对分类任务的探索非常有用。当然UMAP也有自己的坑:它对n_neighbors非常敏感,在同一份数据上从5调到50,结果能像换了一份数据一样,所以调参时不要只报一个固定数值,要结合项目场景多跑几遍。

4. 数据预处理之数据降维:完整实操链路与调参心得

这一节把上面提到的算法串成一套可以照着走的数据预处理流程。这套流程我在多个真实数据集上跑过,从网络流量特征、业务画像到高维文本向量,都反复验证过。

4.1 第一步:特征标准化——降维前最容易被忽略的环节

降维对特征的尺度极其敏感。PCA中方差最大化的目标本质上是协方差矩阵的特征分解,如果特征A的范围是0~1000,特征B的范围是0~1,特征A的方差天然就比特征B大,PCA会不自觉地放大特征A的权重,这对真实结构的刻画是偏离的。t-SNE和UMAP虽然用的是距离度量,同样躲不开量纲问题。

标准做法是先分离特征与标签,再对特征列做StandardScaler,让每一列均值为0、标准差为1。这里有一个容易出错的地方:如果特征中存在缺失值,标准化前要先处理缺失,否则sklearn的StandardScaler直接报错或填充异常值。我的建议是拆分训练集和测试集后再做标准化,避免用全量数据计算均值和方差造成数据泄露。当然,在做探索性可视化时,可以用全量数据先跑一版,但在正式的建模流程里,数据泄露是大忌。

4.2 第二步:pipeline整合——把降维单独封装成一步

高效的做法是用sklearn的Pipeline把标准化的降维过程打包,方便复用和调参。例如你要在PCA降维后接一个聚类或分类器,Pipeline能让整个流程参数统一管理。

from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA from sklearn.cluster import KMeans pipe = Pipeline([ ('scaling', StandardScaler()), ('pca', PCA(n_components=0.85)), ('kmeans', KMeans(n_clusters=5, random_state=42)) ]) pipe.fit(X_train)

这里特别说明一下n_components=0.85的用法:PCA允许直接传入保留方差比,scikit-learn会帮你选择需要多少维才能解释85%的方差。这比硬性指定维度数更科学,因为它根据数据本身的方差分布来确定降维程度,不需要人工试错。

4.3 第三步:高维情形下的加速技巧和内存管理

当特征维度很高(例如文本TF-IDF矩阵,维度轻松上万),直接用PCA会非常慢,因为它默认对稠密矩阵做SVD。这时候推荐使用TruncatedSVD,它专门处理稀疏矩阵,是PCA在大规模稀疏数据上的高效版本。

from sklearn.decomposition import TruncatedSVD svd = TruncatedSVD(n_components=100, random_state=42) X_reduced = svd.fit_transform(X_sparse) print(svd.explained_variance_ratio_.sum())

我处理过一份20万条文本数据,特征维度12万,直接用PCA内存大概率不够,换成TruncatedSVD之后几十秒就跑完前100维。另外一个内存经验:能不用DataFrame存高维数组就不要用,numpy数组或scipy稀疏矩阵的内存占用能少三到五倍。UMAP在大数据上的处理办法也一样,可以先TruncatedSVD降维到50维,再进UMAP。很多人的UMAP在几十万数据上卡到崩溃,其实不是UMAP不行,是绕过SVD这步直接硬算高维图结构了。

4.4 第四步:降维结果的可视化检查与业务解读

降维完成之后,别急着一股脑画散点图。先检查三件事:是否保留了我们业务上关心的分组信息,比如用已知标签对降维结果着色时,同一类的点是否聚拢、不同类是否分离;降维坐标是否出现极端离群值,比如有一两个点飞到极远处,这时候要去原始特征里排查是真实异常值还是噪声;降维坐标的尺度是否适合下游模型,有的模型对输入尺度敏感,必要时对降维后的特征再做一次标准化。

可视化时我常用不同颜色区分业务分组。这里有一个容易被忽略的操作:t-SNE和UMAP的散点图中,点的坐标本身没有绝对意义,只有相对距离和团簇分布有参考价值。因此不要把t-SNE的X轴坐标当作“分数”去建模,这种迁移很危险。基于我自己的经验,降维结果的泛化也有限:在一批数据上做出来的UMAP结构,放到新数据上结果不会自动对齐,需要训练统一的embedding模型才可复现。

5. 把两个“投影”放在一起看:技术共通点与跨界感悟

写到这里,我越发觉得“投影与降维”这个题目的妙处在于,它把两个看似无关的领域摆在一起时,反思的空间特别大。地图投影是把三维旋转椭球体上的经纬度坐标,通过数学变换映射到二维平面坐标,这个过程必然伴随面积、角度、距离等某种属性的取舍;数据降维是把高维特征向量映射到低维空间,本质上也是一种“投影”,同样要做信息取舍。

5.1 地图投影和PCA的数学底层惊人相似

地图投影的每次转换,本质上是在定义一个从椭球面(或球面)到平面的映射函数,它保持某种几何性质(等角、等面积、等距离)。而PCA是在寻找一个从高维空间到低维子空间的线性映射,目标是“保持方差最大化”。两者都是在做“降维投影”,区别只不过是把三维降到二维,还是把N维降到M维。用线性代数的语言说,都是在寻找一组合适的基向量,把数据在这个新基下的表示简化出来。

举个直观例子:地球表面上一个城市的经纬度,投影到UTM坐标系,得到(X, Y)坐标,这个过程保留了局部角度与形状,但牺牲了全球面积一致性;一个50维的客户特征向量,降维到2维散点图,保留了样本间在高维空间中的相对邻近关系,但丢失了原始各特征的具体数值含义。放大到思路上,都属于“挑我们认为重要的方向,舍弃我们不在乎的细节”。

5.2 GIS投影误区与降维误区的同构性

我在GIS项目里见过有人给全国数据用一个错误的投影参数,结果东北跟西南的数据叠在一起完全错位;我也在机器学习项目里见过有人把三类不均衡样本用t-SNE降维,结果因为困惑度没调好,三类点完全混在一起,于是得出“数据不可分”的错误结论。两者有一个共同的病根:对“投影”本身的约束条件理解不透。

GIS里常说的一句话是“没有正确的投影,只有合适的投影”,根据分析尺度、区域位置、分析目标(面积、距离、方向)选择不同投影;降维领域其实也类似,没有哪个降维算法永远最优,只有根据数据量、结构复杂度、可解释性要求来选择PCA、t-SNE还是UMAP。很多人的困惑不是算法本身不会用,而是没有先弄清楚“我要保留什么、可以舍弃什么”。这一条想清楚了,无论地图投影还是特征降维都游刃有余。

5.3 实际项目中的通用建议

基于上面的分析,我在项目管理里逐渐形成了一套思维套路。第一,有明确业务目标再定投影方式。做面积统计就选等积投影,做方向导航就选等角投影,做降维也一样,要做分类可视化就选UMAP/t-SNE,要做解释性特征提取就选PCA。第二,做任何降维或投影前,先做数据质量检查。GIS数据要检查有没有定义坐标系、坐标单位是否正确;特征数据要检查缺失值、异常值、量纲差异、类别特征是否需要编码。第三,投影完成后的验证不能省。GIS里转换完成后在地图上叠加一个已知位置的参考图层来验证偏差;降维后要关联已知标签做散点图,或者用重构误差、解释方差比来量化信息保留程度。

这两条线的“投影”做久了会发现,真正靠谱的从业者不是工具背得多熟,而是心里有一套观念:不管在哪个领域,投影本质上都是带约束的映射,关键在于想清楚约束条件和代价函数。想明白这一点,你在GIS里选投影、在机器学习里选降维,就不再是死记参数,而是有清晰的决策路径。

最后分享一个小经验:如果你在项目中被要求“把数据和另一个数据对齐”,无论对方说的是坐标对齐还是特征对齐,第一步永远不是跑工具,而是先问对方“对齐的定义是什么、保准哪个属性不丢”。这个习惯帮我避免过至少三次返工,也建议你下次遇到类似需求时先停一下,想清楚这两个问题再动手。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询