专栏首页Python与算法之美魔都上海4日旅游攻略?Python动态图告诉你!

魔都上海4日旅游攻略?Python动态图告诉你!

开场段子 ?

【野人献曝】战国时期,宋国有一个没有见过世面的农夫,由于家贫,终日穿一件粗麻衣,勉强过冬。第二年春天,天气晴朗,他就脱光衣服在太阳下曝晒,觉得十分舒服。由于没有见过漂亮的皮衣和高大的房子,就对妻子说将把这取暖的办法进献给国王。? 【成语释义】比喻贡献的不是什么珍贵的东西,常用于向人建议时候的客套话。

魔都魔在哪里

人们通常戏称上海为魔都。那么上海魔在哪里呢?这里的魔主要有两层含义。第一是魔力,第二是魔幻。

先说魔力。上海是我国的金融中心,是我国经济总量第一的城市,是我国人均收入最高的城市,是我国进出口贸易第一的城市,也是我国最开放的城市之一。拼多多、B站、携程、饿了么等知名互联网公司的总部都在上海,腾讯、阿里、美团、头条等在上海都有办公部门。加之上海相比北京宽松的户籍政策,每年吸引着无数打工人来上海追寻梦想。浪奔,浪流,万里滔滔江水永不休。

再说魔幻。上海是一座奇迹之城,从1843年作为通商口岸开放到如今不过170余年,上海从一个名不见经传的小村落一跃成为中国第一亚洲第二大城市,发展速度可谓奇迹。上海也是一座混沌之城,这里有见证800年暮鼓晨钟的静安寺,近600年历史的城隍庙,历经450余年风雨的豫园,也有外滩的“万国建筑群”,“十里洋场”盛况空前,东方明珠夺目璀璨,亚洲第一高楼高达632米的上海中心大厦。可谓亦中亦西,亦今亦古。

上海旅游攻略

上海知名度最高的旅游景点,应该是上海外滩,东方明珠电视塔,以及迪士尼乐园。

此外,豫园、南京路、人民广场、静安寺、新天地、陆家嘴、崇明岛、朱家角、滴水湖、淀山湖、枫泾古镇 等景点也是值得一去的好地方。

这么多的景点?该如何规划呢?下面这份上海4日旅游攻略,或许可以帮助到你。?

先上数据

Day1 上海城隍庙旅游区(2小时) → 豫园(1小时) → 南京路步行街(3小时) → 外滩(1小时) Day2 中华艺术宫(4小时) → 田子坊(2小时) → 上海新天地(2小时) Day3 上海迪士尼度假区(1天) Day4 上海杜莎夫人蜡像馆(3小时) → 陆家嘴(2小时) → 东方明珠广播电视塔(2小时)

再上视频

最后上代码

import numpy as np 
import pandas as pd 
import geopandas as gpd 
import shapely 
from shapely import geometry as geo 
from shapely import wkt 
import geopandas as gpd 
import matplotlib.pyplot as plt 
import matplotlib.animation as  animation 
import contextily as ctx

import imageio
import os 
from PIL import Image

plt.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.rcParams['animation.writer'] = 'html'
plt.rcParams['animation.embed_limit'] = 100

def rgba_to_rgb(img_rgba):
    img_rgb = Image.new("RGB", img_rgba.size, (255, 255, 255))
    img_rgb.paste(img_rgba, mask=img_rgba.split()[3]) 
    return img_rgb 

def html_to_gif(html_file, gif_file, duration=0.5):
    path = html_file.replace(".html","_frames")
    images = [os.path.join(path,x) for x in sorted(os.listdir(path))]
    frames = [imageio.imread(x) for x in images]
    if frames[0].shape[-1]==4:
        frames = [np.array(rgba_to_rgb(Image.fromarray(x))) for x in frames]
    imageio.mimsave(gif_file, frames, 'gif', duration=duration)
    return gif_file

cmap = [
'#2E91E5',
'#1CA71C',
'#DA16FF',
'#B68100',
'#EB663B',
'#00A08B',
'#FC0080',
'#6C7C32',
'#862A16',
'#620042',
'#DA60CA',
'#0D2A63']*100


def trace_map_dance(df,title = "上海经典4日旅行路线",
                     filename = None,
                     figsize = (8,6),dpi = 144,
                     duration = 0.5,
                     anotate_points = ["外滩","上海迪士尼度假区","陆家嘴"]):

    fig, ax =plt.subplots(figsize=figsize,dpi=dpi)

    def plot_frame(i):

            ax.clear()
            ax.axis("off")
            
            k = i//3+1
            m = i%3

            dfdata = df.iloc[:k,:].copy()
            dftmp = df.iloc[:k-1,:].copy()
            text = dfdata["day"].tolist()[-1]
            
            #============================================================
            #绘制背景
            #============================================================
            
            #设置绘图范围
            bounds = dfcity.total_bounds # k==1   
            if 1<k<len(df)+1:
                bounds = dfplace.query("day=='{}'".format(text)).total_bounds
            if k>=len(df)+1:
                bounds = dfplace.total_bounds
                
            (xmin,ymin,xmax,ymax) = bounds
            cx = (xmin+xmax)/2.0
            cy = (ymin+ymax)/2.0
            dx = max(xmax-xmin,100)
            dy = max(ymax-ymin,100)

            if dx/dy<8/6.0:
                dx = dy*8/6.0
            else:
                dy = dx*6.0/8
            bounds = np.array([min(cx-8000,cx-dx/2.0),min(cy-6000,cy-dy/2.0),
               max(cx+8000,cx+dx/2.0),max(cy+6000,cy+dy/2.0)])
                
            ax.set_xlim(bounds[0]-(bounds[2]-bounds[0])/3, bounds[2]+(bounds[2]-bounds[0])/3)    
            ax.set_ylim(bounds[1]-(bounds[3]-bounds[1])/3, bounds[3]+(bounds[3]-bounds[1])/3)
                
            gaode = 'http://wprd01.is.autonavi.com/appmaptile?x={x}&y={y}&z={z}&lang=zh_cn&size=1&scl=1&style=7'
            openstreet = "https://{s}.tile-cyclosm.openstreetmap.fr/cyclosm/{z}/{x}/{y}.png"
            ctx.add_basemap(ax,source=gaode,alpha=0.5)
            
            #============================================================
            #绘制散点
            #============================================================

            # 绘制散点图像
            if len(dftmp)>0:
                ax.scatter(dftmp["x"],dftmp["y"],s = 100*dftmp["z"]/df["z"].mean(),
                       c = (cmap*100)[0:len(dftmp)],alpha = 0.5,zorder = 3)

                # 添加注释文字
                for j,p in enumerate(dftmp.index):
                    px,py,pz = dftmp.loc[p,["x","y","z"]].tolist() 
                    if p in anotate_points:
                        ax.annotate(p,xy = (px,py),  xycoords = "data",xytext = (-20,15),
                        fontsize = 10,fontweight = "bold",color = cmap[j], textcoords = "offset points")
                        
            #绘制轨迹线
            lines = [dfdata[["x","y"]].values[i:i+2] for i in range(len(dfdata)-1)] 
            for ln in lines[:-1]:
                x, y = np.transpose(ln)
                line = plt.Line2D(x,y,color="gray",linestyle="-",linewidth= 2.5)
                ax.add_artist(line)
            
            # 添加标题和排名序号
            ax.set_title(title,color = "black",fontsize = 12)
            ax.text(0.13, 0.9, text, va="center", ha="center", 
                         alpha=0.5, size = 50,transform = ax.transAxes)
            
            # 结尾呈现全局轨迹无动画
            if i>=3*len(df):
                for ln in lines[-1:]:
                    x, y = np.transpose(ln)
                    line = plt.Line2D(x,y,color="gray",linestyle="-",linewidth= 2.5)
                    ax.add_artist(line)
                return 0

            # 添加注意力动画
            if m==0:
                px,py,pz = dfdata["x"][[-1]],dfdata["y"][[-1]],dfdata["z"][-1]
                p = dfdata.index[-1]+":"+str(pz)+"Hours"
                ax.scatter(px,py,s = 800*pz/df["z"].mean(),
                   c = cmap[len(dfdata)-1:len(dfdata)],alpha = 0.5,zorder = 4)
                ax.annotate(p,xy = (px,py),  xycoords = "data",
                        xytext = (-20,15),fontsize = 20,fontweight = "bold",
                        color = cmap[k-1], textcoords = "offset points",zorder = 5)
                
                for ln in lines[-1:]:
                    x, y = np.transpose(ln)
                    line = plt.Line2D(x,y,color="gray",linestyle=":",linewidth= 4.5)
                    ax.add_artist(line)
            
            if m==1:
                px,py,pz = dfdata["x"][[-1]],dfdata["y"][[-1]],dfdata["z"][-1]
                p = dfdata.index[-1]+":"+str(pz)+"Hours"
                ax.scatter(px,py,s = 400*pz/df["z"].mean(),
                   c = cmap[len(dfdata)-1:len(dfdata)],alpha = 0.5,zorder = 4)
                ax.annotate(p,xy = (px,py),  xycoords = "data",
                        xytext = (-20,15),fontsize = 15,fontweight = "bold",
                        color = cmap[k-1], textcoords = "offset points",zorder = 5)
                
                for ln in lines[-1:]:
                    x, y = np.transpose(ln)
                    line = plt.Line2D(x,y,color="gray",linestyle="--",linewidth= 3.5)
                    ax.add_artist(line)
                
            if m==2:
                px,py,pz = dfdata["x"][[-1]],dfdata["y"][[-1]],dfdata["z"][-1]
                p = dfdata.index[-1]+":"+str(pz)+"Hours"
                ax.scatter(px,py,s = 100*pz/df["z"].mean(),
                   c = cmap[len(dfdata)-1:len(dfdata)],alpha = 0.5,zorder = 4)
                ax.annotate(p,xy = (px,py),  xycoords = "data",
                        xytext = (-20,15),fontsize = 10,fontweight = "bold",
                        color = cmap[k-1], textcoords = "offset points",zorder = 5)
                
                for ln in lines[-1:]:
                    x, y = np.transpose(ln)
                    line = plt.Line2D(x,y,color="gray",linestyle="-",linewidth= 2.5)
                    ax.add_artist(line)
            return 0
                
    my_animation = animation.FuncAnimation(fig,plot_frame,
                            frames = range(0,3*len(df)+5),interval = int(duration*1000))
    
    if filename is None:
        try:
            from IPython.display import HTML
            HTML(my_animation.to_jshtml())
            return HTML(my_animation.to_jshtml())
        except ImportError:
            pass
    else:
        my_animation.save(filename)
        return filename

html_file = "上海经典4日旅行路线.html"
trace_map_dance(df,filename=html_file)


收工 。?

本文分享自微信公众号 - Python与算法之美(Python_Ai_Road),作者:梁云1991

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 还没想好五一去哪玩?这 4 款小程序,给你一场完美旅行

    小程序体验师:朱德厚 五一假期终于来了,但很多人之前都在努力工作,没有时间做好旅游的准备。

    知晓君
  • ZatGo 承云——打造区块链大出行生态圈,颠覆OTA巨头

    互联网给21世纪带来了一场产业革命,也给人们的旅游、出行方式带来了转变。在“万物在线”的时代,OTA在线旅游近年来迅速地占据了旅游市场,成为大多数人旅游出行的第...

    区块链领域
  • 携程全球化的野心与绊脚石

    近期,携程与百度地图“官宣”上线境外打车服务。携程表示:携程境外打车一站式整合了Grab等境外主流打车的平台,为海外用户提供境外租车、接送机、包车、打车约车四大...

    金融外参
  • 专属| 分析神器曝严重漏洞

    安全实验室报告称,7500台 MikroTik 路由器被植入挖矿代码并将用户流量转发给攻击者指定的 IP 地址。黑客工具 Chimay Red 涉及到 2 个 ...

    漏斗社区
  • 【投票启动】2019中国千山·金峰奖之最佳文旅科技创新示范奖

    ? 中国文旅产业“金峰奖”评选致力于促进产业升级发展、构建优质文旅资源联合体、打造文旅产业年度风向标。 自2016年起,已连续评选3届,共200余个地区及机构...

    腾讯文旅
  • 阮成发:云南义无反顾开展“旅游革命” 推动旅游业涅槃重生

    ? 阮成发回答中外记者提问时表示——云南义无反顾开展“旅游革命” 推动旅游业涅槃重生。 ? ? ? 3月7日上午,省长阮成发在云南省代表团媒体开放日回答中外记...

    腾讯文旅
  • 两会聚焦 | “一机游”如何成为数字文旅时代的“香饽饽”

    ? 据不完全统计,截止2019年2月底,全国已经有11个地方和政府明确发文规划或已经启动了“一机游”项目。 去北京爬长城,去云南游丽江,去西藏看布达拉宫,去黑...

    腾讯文旅
  • 一百行python代码告诉你国庆哪些景点爆满

    举国欢庆的国庆节马上就要到来了,你想好去哪里看人山人海了吗?还是窝在家里充电学习呢?说起国庆,塞车与爆满这两个词必不可少,去年国庆我在想要是我能提前知道哪些景点...

    龙哥
  • 腾讯将与南京市建邺区共同打造智慧产业孵化平台 | 数字文旅周报06期(1.30-2.17)

    ? 腾讯将与南京市建邺区 共同打造智慧产业孵化平台 1月30日,南京市建邺区与腾讯公司在深圳签署战略合作协议,腾讯云启基地落户江心洲。 ? 双方将以人工智能、...

    腾讯文旅
  • 解读 | “一部手机游云南”平台4个“全国之最”

    ? 近日,云南省省长阮成发在答两会记者问时讲到,“一部手机游云南”平台自2018年10月1日正式上线,在直播、景区地理信息、导游导览、投诉方面,已经做到4个“...

    腾讯文旅
  • 「呱儿子」总是不回家?来看看杜蕾斯、知乎、百度们是怎么带蛙的

    最近,一款佛系手游火遍朋友圈,一只爱旅行的小青蛙,一夜之间硬生生地把多少妙龄少男少女变成了操劳不已的老父老母。

    知晓君
  • 国庆高质量出行,可视化开启智慧旅游

    可是,出门游玩,走哪里都是人。很多人感叹:这哪是去看景,分明是看人!这些年关于国庆出行人流拥挤的各种报道也是屡见不鲜。但作为工薪一族,要能凑出全家都能出行的日子...

    用户8763535
  • 一部手机智游海南,海南智慧旅游新格局正在形成

    ? 打开“智游海南”APP,从查询旅游攻略、经典线路、热门美食到购买景区门票可一站式解决;进入景区不用再排长队,扫码或者刷脸就可进入,有些游玩项目还可在手机上...

    腾讯文旅
  • App之“文字”的设计技巧

    题外话:最近在忙着app上线,太忙了,没顾得上写文章,后面空了会继续更新~ ? 随着互联网技术的高速发展、传播媒体的国际化、信息资讯的大量膨胀,以及人们多元化需...

    mixlab
  • 火遍老母亲微信群这些小游戏,「五一假期」陪爸妈必会

    知晓君
  • 大数据带你看透“国庆节”大家都爱去哪玩儿

    假期很长,秋色正好,世界那么大,来一场说走就走的旅行是再容易不过的事情了,但想要在人山人海的旅行热中玩得轻松愉悦,却不是你想象中那么容易的事情哦~

    腾讯位置服务
  • 1亿元!腾讯云中标福建平潭全域智慧旅游工程 ​| 数字文旅周报43期

    ? ? 1亿元! 腾讯云中标福建平潭全域智慧旅游工程 近日,腾讯云以1亿元中标福建省平潭岛全域智慧旅游项目一期工程,双方将联手打造全国首个科技+文旅融合智...

    腾讯文旅
  • 逛一次北京环球影城,得花多少钱

    原本计划找个周末去北京环球影城观摩观摩的,但看到群里有朋友发了里面卖的矿泉水,就直接被劝退了。

    程序猿石头
  • 【精选】十日大数据精选

    1.灵感·大数据× 大数据在各行各业的应用、以及最新分析报告。 2.内参·大数据产业 大数据行业的【人才、资本、战略】最新动向 3.利器 算法、模型、学科 --...

    数说君

扫码关注云+社区

领取腾讯云代金券