
被编码的上海路名:一幅隐藏了160年的城市地图
- Published on
目录:
- 数据挖掘:一幅隐藏了160年的城市地图
- 大海捞针,让沉睡的数据开口说话
- 一套更聪明的匹配法则
- 尘封的备忘录,一张“殖民地图”的诞生
- 更聪明的聚合算法:从“一个点”到“一个社区”
- 数据的洞察力,在这一刻超越了普通人的直觉。
- 历史的回响:从“正名”到“重生”
- 每条路,都是回家的路
- 研究的局限与未来的星辰大海
数据挖掘:一幅隐藏了160年的城市地图
你是否想过,上海其实有两个“世界”?
一个是看得见的,陆家嘴的摩天大楼,武康路的老洋房,南京路步行街的霓虹灯火。这是一个由钢筋水泥和玻璃幕墙构成的现代都会。
另一个,则隐藏在不起眼的路牌里。当你从静安区的“西康路”出发,一路向东,可能会依次经过“成都北路”、“重庆北路”、“黄陂南路”,最终抵达黄浦江边的“福建中路”和“江西中路”。不知不觉间,你已经用脚步完成了一次从中国西南到东南的微缩旅行。
上海的“西康路”得名于中国原西康省,不过在1955年,西康省被撤销,其辖区分别并入四川省和西藏自治区
黄陂南路代表湖北省武汉市黄陂区:“黄陂南路”最初名为“贝勒路”,1943年以**湖北黄陂县(今武汉市黄陂区)**命名为“南黄陂路”,1946年正式定名为“黄陂南路”并沿用至今。
这个有趣的现象,很多人也有所察觉。
比如我刷到小红书上自制的一张图,来自 “62 咸鱼讲啥西”发布了一篇小红书笔记:
为了验证这个趣闻,我决定用代码和地图来验证一下。
大海捞针,让沉睡的数据开口说话
我们的故事,并非从整个现代上海的宏大地图开始,而是缩窄到核心城区。
我首先做了一个决定:将目光锁定在黄浦、徐汇、长宁、静安、普陀、虹口和杨浦七个区域。
虽然对照1939年的地图,远不止这些区域这里。但是我们选择的区域也比较典型了。
摆在我面前的第一个难题,是数据的“破碎感”。原始数据里有超过36万条路段,同一条“南京东路”,在地图上却是由上百个互不相连的细小线段组成的“碎片”。
如果直接分析这些碎片,就像试图通过一堆尘土来研究一件摔碎的古董,毫无意义。
在网络拓扑中,这是从OpenStreetMap等标准来源下载的路网数据,为了保证网络的拓扑关系(即,知道哪条路和哪条路是连通的),在每一个交叉口,路段(LineString)都必须被打断成独立的小段。如果我们为“南京西路”的每一小段都计算一个质心,那么在“南京西路”这条路上就会产生密密麻麻几十个点,这会给聚类分析带来巨大的噪声和权重偏差。也会产生可视化混乱。
要解决这个问题,我们需要在分析流程中增加一个关键的数据预处理步骤——道路合并。
因此,我必须进行一次数字世界的“文物修复” 。我让程序将所有同名的、在空间上首尾相接的碎片,重新“焊接”成一条完整的道路。这个过程是枯燥的,但结果是震撼的:在我的研究范围内,将近五万条道路碎片,被修复成了1320条我们认知中“完整”的道路。数据量骤减97%,但信息的价值却提升了100倍。我们终于从一片数据的废墟中,重建了真实世界里那一条条连贯的街道。”
接着我构建了一个省市区
——省份
的地名词典:
有了完整的路和地名词典,我满怀信心地进行了第一次匹配,结果却给我泼了一盆冷水。我的程序天真地把“金沙江西路”识别为了“江西省”,把“上海东路”匹配给了青海的“海东市”。而且,上海市应该不应该在我的地名词典里面!我自己匹配自己?
一套更聪明的匹配法则
于是我需要思考解决方案:
- “先剃头” :程序自动忽略“路”、“大道”等常见后缀,直击核心词。
- “抓大放小” :在所有可能的匹配项中,永远优先选择最长的那一个。这样,面对“金沙江西路”,它会立刻锁定更长的“金沙江”(如果我们有山川词典的话),而不会再被“江西”迷惑。
- “闪电行动” :这一步不是必要的,但是为了速度更快,我用了经典的
Aho-Corasick
算法,它能像一个超级搜索引擎,一次性在所有路名中高效地查找字典里的所有地名。
尘封的备忘录,一张“殖民地图”的诞生
当我的侦探完成工作,一张惊人的画卷在我面前展开。我将所有与省份相关的道路,用不同的颜色标注在地图上:
上海的市中心,真的藏着一幅中国地图!
- 来自辽宁省的凤城路, 彰武路, 抚顺路, 铁岭路,静静地躺在上海的东北角。
- 代表甘肃省的古浪路, 敦煌路, 景泰路, 永登路, 玉门路,则聚集在城市的西北方。
- 而西南广西的东兰路, 宜州路, 桂平路, 田林路, 田林路辅路, 苍梧路,则在西南部。
这并非巧合,它的源头,甚至要追溯到一个半世纪以前。
1862年,英国领事麦华陀发布了一份《上海马路命名备忘录》。这份看似不起眼的文件,为上海的街道定下了一个影响至今的规则:南北向干道以中国省份命名,东西向则以该省的城市命名。这套规则,既方便了殖民者的行政管理,又在无形中透露出一种“掌控中国版图”的野心。于是,在最初的租界里,“四川路”与“南京路”交汇,第一块“微缩中国”的拼图被悄然放下。
更聪明的聚合算法:从“一个点”到“一个社区”
最初,我将每个省在上海的所有道路视为一个整体,计算出一个“代表点”。这确实绘制出了一幅粗略的“中国地图”,但这种简化也隐藏了太多细节。一个点,无法告诉我们这些来自同一个省的道路,在上海是紧密抱团,还是分散四方。
并且我是用了KMeans聚类算法,无法智能感知内部聚类情况,也无法筛选掉离群点。
为了看到更真实的图景,我决定深入每个省份的内部,去探寻它们的 “社区结构” 。
于是我使用了DBSCAN聚类算法:
我将每条路都“点化”,然后用一种名为DBSCAN的密度聚类算法,去自动发现那些由来自同一个家乡的道路组成的“小团体”。
算法精准地勾勒出了每个省份路名的聚集区域,我们由此得以窥见它们不同的“性格”:有的省份路名紧密抱团,形成单一的核心社区;有的则分散四方,形成多个遥相呼应的“飞地”。这幅地图,因此变得更加立体和丰满。
数据的洞察力,在这一刻超越了普通人的直觉。
翻阅匹配之后的记录,我惊喜地发现:上海的“长宁路”,其命名源头并非脚下的长宁区,而是远在千里之外的四川省长宁县。
又比如:“长乐路”中的“长乐”并非表达“长久快乐”之意,而是直接借用了福建省福州市辖区之一:长乐区。
历史的回响:从“正名”到“重生”
历史的车轮滚滚向前。1943年,汪伪政府为了清除英美殖民痕迹,进行了一次大规模的路名更改,将更多中国地名覆盖了原有的西式路名。而到了1950年代,新生的人民政府在更大规模的城市建设中,将这套命名法以前所未有的系统性和魄力,推向了极致。
至此,这幅隐藏在上海肌理中的“中国地图”,被一块块地完整拼合。它早已超越了殖民者的初衷,变成了一场宣告主权、重塑国人身份认同的伟大宣言。每一块路牌,都成了无声的爱国主义丰碑。
每条路,都是回家的路
上海,用它的路牌告诉我们:无论你来自何方,无论你身处城市的哪个角落,总有一条路,能唤起你对故乡的记忆。
你的家乡是哪一个?欢迎晒出你家乡的路牌。
研究的局限与未来的星辰大海
这次“数据考古”虽然为我们揭示了上海路网背后宏大的叙事,但也有一些缺陷:
1. 词典的边界:被遗忘的山川与历史
- 地理维度的缺失:我们的“地名搜捕网”主要聚焦于当代的行政区划(省、市、县)。但上海的路名宝库远不止于此,还包含了大量的自然地理实体。像“金沙江路”、“大渡河路”、“天目山路”这些以壮丽山川湖海命名的道路,在此次分析中被我们遗憾地“放过”了。将它们纳入分析,无疑会让我们地图上的“中国”更加完整和生动。
- 时间维度的局限:我们使用了现代地名进行匹配,却忽略了历史的尘烟。例如,“姑苏路”对应的是苏州的古称,“武康路”源于浙江湖州市的旧县名“武康”。一个更完美的分析,需要一本包含中国古代地名的词典,那将让我们得以窥见历史在城市街道上留下更深的烙印。
2. 道路的定义:被忽略的“毛细血管”
- 人行道的缺席:本次研究的数据源主要为车行道(Roads and Streets)。但在城市肌理中,还存在大量如“xx弄”、“xx里”这样富有人情味的人行通道和里弄。这些城市的“毛细血管”是否遵循着另一套命名逻辑?它们是延续了主干道的地理叙事,还是反映了更微观的社区历史?这是一个亟待探索的有趣课题。
3. 名称的唯一性:重名的挑战
- “中山”之问:我们的匹配算法有一个潜在的简化,即“一对一”匹配。但“中山”这个地名,在中国既可能指向广东中山市,也可能指向辽宁大连的中山区,或是为了纪念孙中山先生。当前的模型无法智能区分一条“中山路”的真实意图,这需要更复杂的上下文分析甚至历史考证才能解决。
P.S. 如果你对我们这次“城市考古”的技术细节感兴趣,想知道我们是如何一步步驯服数据、让它开口说话的,欢迎访问我的GitHub仓库,那里有此处项目的源代码。