手把手教你用Python的basemap标注旅行足迹(含常见安装问题解决)
用Python绘制个性化旅行地图从安装到创意标记全指南每次翻开相册那些泛黄的机票和模糊的景点门票总让我想起走过的路。但有没有更科技感的方式记录旅行足迹今天我们就用Python的basemap工具把你的旅行故事变成一幅交互式世界地图。1. 环境准备与避坑指南在开始绘制之前我们需要搭建好Python环境。虽然Anaconda是最简单的选择但很多用户会遇到依赖问题。这里分享几个实际安装中的经验基础环境配置# 推荐使用Python 3.7版本 conda create -n travel_map python3.8 conda activate travel_mapbasemap的安装经常卡在geos依赖上。我在三台不同配置的电脑上测试后发现这个问题的解决方案其实比想象中简单Windows系统先安装预编译的geos库conda install -c conda-forge geosMacOS系统使用Homebrew解决依赖brew install geos export GEOS_DIR/usr/local/Cellar/geos/3.9.1 # 版本号可能变化Linux系统通过apt直接安装sudo apt-get install libgeos-dev安装basemap时如果conda源速度慢可以尝试清华镜像conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/ conda install -c conda-forge basemap注意basemap已停止维护建议新项目使用Cartopy。但考虑到教程兼容性我们仍使用basemap2. 绘制你的第一张世界地图让我们从一个简单的全球视图开始。这段代码会生成一个以你所在城市为中心的球形地图from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt def create_globe_view(center_lat39.9, center_lon116.4, city_name北京): plt.figure(figsize(10,10)) m Basemap(projectionortho, lat_0center_lat, lon_0center_lon) # 使用NASA的蓝色大理石底图 m.bluemarble(scale0.5) # 标记中心城市 x, y m(center_lon, center_lat) plt.plot(x, y, ro, markersize8) plt.text(x, y, city_name, fontsize12, haright, vabottom, colorwhite) plt.title(f{city_name}视角的世界地图, pad20) plt.show() create_globe_view()参数说明表参数说明推荐值projection地图投影方式ortho(球形)/cyl(平面)lat_0/lon_0中心点经纬度你所在城市坐标resolution地图精度c(粗糙)到f(精细)scale底图缩放0.3-1.03. 个性化旅行足迹标记现在进入最有趣的部分——在地图上标注你去过的地方。我们需要三个核心元素地点坐标、标记样式和连接线。完整的足迹标注示例import pandas as pd from mpl_toolkits.basemap import Basemap import matplotlib.pyplot as plt # 示例旅行数据 travel_data [ {city: 巴黎, lat: 48.8566, lon: 2.3522, year: 2018}, {city: 东京, lat: 35.6762, lon: 139.6503, year: 2019}, {city: 悉尼, lat: -33.8688, lon: 151.2093, year: 2020} ] def plot_travel_route(data): plt.figure(figsize(12,8)) m Basemap(projectionrobin, lon_00, resolutionc) m.drawcoastlines() m.fillcontinents(colorlightgray, lake_colorlightblue) # 绘制旅行路线 lons [item[lon] for item in data] lats [item[lat] for item in data] x, y m(lons, lats) m.plot(x, y, b-, linewidth2, alpha0.5) # 标记每个城市 colors [r, g, b, y, m] # 不同颜色代表不同年份 for idx, loc in enumerate(data): x, y m(loc[lon], loc[lat]) color colors[loc[year] - 2018] # 根据年份选择颜色 m.plot(x, y, f{color}o, markersize10) plt.text(x, y, f{loc[city]}({loc[year]}), fontsize9, colorcolor) plt.title(我的环球旅行足迹, pad20) plt.show() plot_travel_route(travel_data)进阶标记技巧使用不同颜色表示不同年份的旅行添加鼠标悬停提示需要结合mpld3库在地图上直接显示旅行照片缩略图用渐变色线条表示旅行路线方向4. 地图样式深度定制basemap提供了多种地图样式适合不同场景的展示需求。下面是比较几种常用样式地图样式对比表样式方法效果适用场景示例代码bluemarble()NASA卫星图科技感展示m.bluemarble(scale0.5)shadedrelief()地形阴影山地旅行m.shadedrelief()etopo()海拔着色户外探险m.etopo()drawcountries()国界线跨国旅行m.drawcountries()我最喜欢的是结合地形和自定义颜色的混合风格m Basemap(projectionmill, llcrnrlat-60, urcrnrlat90, llcrnrlon-180, urcrnrlon180, resolutionc) # 自定义颜色填充 m.drawmapboundary(fill_color#a6cee3) m.fillcontinents(color#1f78b4, lake_color#a6cee3) m.drawcoastlines() m.drawcountries(linewidth0.5) # 添加经纬网格 m.drawparallels(range(-90, 91, 30), labels[1,0,0,0]) m.drawmeridians(range(-180, 181, 60), labels[0,0,0,1])5. 旅行地图的创意应用除了基本标记我们还可以用basemap实现更有创意的旅行记录方式1. 旅行热力图from matplotlib.colors import LinearSegmentedColormap # 生成模拟数据 lons np.random.normal(115, 20, 100) lats np.random.normal(35, 15, 100) # 创建热力图 m.hexbin(lons, lats, gridsize30, cmapYlOrRd, mincnt1) plt.colorbar(label访问频率)2. 交互式时间轴地图import matplotlib.animation as animation fig plt.figure(figsize(10,6)) m Basemap(projectionhammer, lon_00) def update(frame): plt.clf() m.drawmapboundary() # 根据frame参数绘制不同年份的数据 # ... ani animation.FuncAnimation(fig, update, framesrange(2015,2021)) ani.save(travel_timeline.gif, writerpillow, fps1)3. 旅行相册地图from matplotlib.offsetbox import OffsetImage, AnnotationBbox def add_photo(m, lon, lat, image_path, zoom0.1): img plt.imread(image_path) im OffsetImage(img, zoomzoom) x, y m(lon, lat) ab AnnotationBbox(im, (x,y), frameonFalse) plt.gca().add_artist(ab) # 为每个地点添加照片 add_photo(m, 116.4, 39.9, beijing.jpg) add_photo(m, 121.47, 31.23, shanghai.jpg)记得保存你的作品basemap支持多种输出格式plt.savefig(my_travel_map.png, dpi300, bbox_inchestight) plt.savefig(travel_map.pdf, formatpdf)
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2489305.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!