惊艳世界的骗局:原来地铁线路图这样欺骗你的双眼
文章来源: 世界华人周刊 于
- 新闻取自各大新闻媒体,新闻内容并不代表本网立场!
原标题:一场惊艳全世界的骗局:原来你每天坐的地铁线路图这样欺骗你的双眼!
一场全世界惊艳的视觉骗局将为你展现,地铁路线图是如何欺骗你的双眼,扭曲你对地理信息的认知。
全文1034字,读完大约2分钟
每天坐着地铁上下班,
或许你从未意识到:
地铁线路图是一个典型的数据可视化案例,
它能将复杂的线网图和站点信息
清晰有效地传达给乘客。
但是,它并不是真实的。
你看到的那些横平竖直的线条,
一定程度上是在欺骗你的眼睛。
它们并没那么符合实际真实的地理信息,
而是一幅扭曲了的地图。
▲ 香港地铁线路图与真实地图对比
世界上最早的地铁诞生于1863年的伦敦,
不过,
现在世界各地的地铁线路图
却是衍生自1931年的伦敦地铁图。
因为最早的地铁线路图设计要求
地图和实际地理位置要准确对应,
后来人们才绝望地认识到,如此下去必将惨不忍睹。
1926年一位叫Fred Stingemore的制图师
将各个站点之间的距离处理得更有秩序,
线路也稍微与实际有点偏差,
结果立刻见效,
线路图变得简洁多了。
▲ 1926年之前的伦敦地铁线路图
▲ 1926年Fred Stingemore绘制的伦敦地铁线路图
随后,
制图师Harry Beck进一步摆脱真实地理的局限,
让地铁线路呈水平、垂直或对角线延伸,
才诞生了1931年完成初稿。
1933年正式印刷使用的经典版本,
被奉为地铁线路图设计的金科玉律一直被借鉴至今。
▲ 1931年Harry Beck绘制的伦敦地铁线路图
▲ 1933年伦敦地铁线路图
▲ 2017年伦敦地铁线路图
地铁建造在地下,
乘客们最关心的信息是有哪些线路、以及站点的分布顺序等,
所以地铁线路图一般更偏向于可读性和设计感。
这同时也就带来了缺点:
线路图上的直线对应的实际轨道并不是直线的,
站点的相对位置、距离也不符合实际情况。
但是如果按照真实地理信息来绘制地铁线路图
又会发现,线路或密集或稀疏,
各个站之间的距离也大相庭径,
画出来的图可读性非常差。
伦敦 | 英国
如何在真实性和可读性之间取得平衡,
是绘制地铁线路图的千古难题呐。
我们知道两者之间相差很大,
可是,这个差距究竟有多大我们却没什么概念。
Data Is Beautiful 在Reddit上收集了一系列Gif动图,
将许多城市地铁的官方线路图与他们在地图上的实际地理位置进行对比。
这些动图都是Reddit上的地图爱好者们自发制作的,
目前已经聚集了世界上二十几个城市的地铁线路图了。
广州 | 中国
香港 | 中国
纽约 | 美国
马德里 | 西班牙
巴黎 | 法国
费城 | 美国
东京 | 日本
巴塞罗那 | 西班牙
柏林 | 德国
法兰克福 | 德国
华盛顿 | 美国
亚特兰大 | 美国
波士顿 | 美国
安特卫普 | 比利时
布鲁塞尔 | 比利时
奥斯陆 | 挪威
圣保罗 | 巴西
鹿特丹 | 荷兰
维也纳 | 奥地利
多伦多 | 加拿大
温哥华 | 加拿大
普纳 | 印度
遗憾的是,Reddit上并没有我帝都北京的地铁动图,
八成原因是画图的人实在是没挤上去…
╮(╯﹏╰)╭
-->
`,
"script":[{"type":"text/javascript","src":"//widgets.outbrain.com/outbrain.js","async":"async"}]
}
, "gg_rightside": {
"html":`
`,
"script":[{"type":"text/javascript","src":"//widgets.outbrain.com/outbrain.js","async":"async"}]
}
, "gg_duturandom": {
"html":`
`,
"script":[]
}
, "gg_square": {
"html":`
`,
"script":[]
}
, "gg_topbanner": {
"html":`
`,
"script":[]
}
, "gg_middlesquare": {
"html":`
`,
"script":[]
}
, "gg_dutu": {
"html":`
`,
"script":[]
}
, "gg_botline": {
"html":``,
"script":[]
}
, "gg_dututop": {
"html":`
`,
"script":[]
}
, "gg_shipintop": {
"html":`
`,
"script":[]
}
, "gg_inContent": {
"html":`
`,
"script":[]
}
, "gg_shipinrandom": {
"html":``,
"script":[]
}
, "gg_sideSticky": {
"html":`
`,
"script":[]
}
, "gg_bottombanner": {
"html":`
`,
"script":[{"type":"text/javascript","src":"//widgets.outbrain.com/outbrain.js","async":"async"}]
}
, "gg_marquee": {
"html":`
`,
"script":[]
}
}
const adEnv={
"gg_header": {
"html":``,
"script":[{"type":"text/javascript","exec":` var googletag = googletag || {}; googletag.cmd = googletag.cmd || []; var pbjs = pbjs || {}; pbjs.que = pbjs.que || []; `},{"type":"text/javascript","src":"https://adncdnend.azureedge.net/adn-hb/adn.wnx2.js","async":""},{"type":"text/javascript","src":"https://adncdnend.azureedge.net/adn-video/WenxuecityPlayer.js","async":"async"}]
}
}
const wxcEnv = {
"base":{
"exe":[],
"src":[
{"src": "/news/js/recommendednews.js","defer":"true"},
{"src":"/js/wxcFunc.js","defer":"true"}
]
},
"func":{
"exe":[
//展示评论
'function showMoreComments(){let n = 0;for(let i=0;i
2){dom.hide();}}$("#showallcomment").show();$("#showlesscomment").hide();};',
],
"src":[
//图片,搜索,QR code
{"src": "/news/js/view.js?v=05132024"},
//计数器
{"src":"//count.wenxuecity.com/service/count/script/do.php?type=news&id=6348617&n=0&out=jsval","defer":"true"},
]
}
}
function wxcCode(){
wxcEnv.base.exe.forEach(x=>{
let tag = buildAdcode(x);
document.head.append(tag);
})
wxcEnv.base.src.forEach(src => {
let tag = buildSrc(src)
document.head.append(tag);
});
wxcEnv.func.exe.forEach(x=>{
let tag = buildAdcode(x);
document.body.append(tag);
})
wxcEnv.func.src.forEach(src => {
let tag = buildSrc(src)
document.body.append(tag);
});
}
function adcode(){
let adkey = Object.keys(ads);
adkey.forEach(x=>{
let code = ads[x].html;
let div = document.getElementById(x);
if(div)div.innerHTML = code;
ads[x].script.forEach(s=>{
if(Object.keys(s).indexOf('src')===-1){
let tag = buildAdcode(s.exec);
document.body.append(tag);
}else{
let tag = buildSrc(s);
document.body.append(tag);
}
})
})
}
function baseCode(){
let baseKeys = Object.keys(adEnv);
baseKeys.forEach(x=>{
adEnv[x].script.forEach(s=>{
if(Object.keys(s).indexOf('src')===-1){
let tag = buildAdcode(s.exec);
document.head.append(tag);
}else{
let tag = buildSrc(s);
document.head.append(tag);
}
})
})
}
function buildAdcode(script){
let tag = document.createElement('script');
tag.innerHTML = script;
return tag;
}
function buildSrc(obj){
let keys = Object.keys(obj);
let tag = document.createElement("script");
keys.forEach(key=>{
tag.setAttribute(key, obj[key]);
})
return tag ;
}