一、关于多样化地图

早期使用Python绘制地图主要是绘制静态地图,现在随着研究深入也会去探索一些新的方法因为Python不仅仅只支持一些静态地图的绘制,动态地图和网络分析图Python其实也不在话下,比如我前段时间利用航空数据绘制的东南亚与中国南部地区的网络关系图,这些图使用了Networks、geopandas、matplotlib等库完成:

这几张也被matplotlib官方进行了转发!

在这里插入图片描述

和利用matolotlib里的animation和html函数绘制的一月气温动态变化图(点击就是动态了):

下图是深圳市南山区的部分公园分布地图,在传统GIS数据叠加的基础上加入了一些文字进行修饰,使图纸的美观度得到了一定的提升。

在这里插入图片描述

展示这些图主要是想给大家介绍一些不同的地图绘制方法,希望大家能有所帮助。

如果你没有Python基础,满屏的代码和英文让你觉得很慌,但是你对编程又很难提起兴趣。那我推荐你可以去试一试夜曲编程的交互式Python课程,交互式课堂让你的每一步操作都能得到及时的反馈。

在这里插入图片描述

夜曲编程的课程基于在线的编辑器进行操作,对于小白来说,这跳过了复杂的编辑器环境安装过程,能最快的接触到Python的真正知识,比自己找资料自学高效多了,能少走很多弯路。关键是这个体验课现在是免费的!关注「夜曲编程」回复「免费教程」就可以领取到免费的Python入门基础知识课程。

二、关于传统静态地图

要画一张好看的地图,数据量的多少、底图的支持程度与选择乃至个人的美学素养是一张好看的地图重要的因素。目前python也有很多能够实现地图可视化的包,这里给大家推荐最基础也是个人最常使用的两个包geopandas配合contextily来进行地理信息的可视化。

后面将涉及各种类型图形的介绍,代码数量可能会较多,但都是非常简单的代码块,一定要坚持看下去哦!

在这里插入图片描述
1 geopandas数据的导入

geopandas与大名鼎鼎的pandas库有异曲同工之妙,甚至我们可以说geopandas就是地理信息领域的pandas。准确说,geopandas是将地理信息记录在数据表中,并可以通过一系列的绘图库进行显示,和arcmap中的属性表非常类似。

目前geopandas支持读取shp、geojson,和pandas一样只需要一行代码就可以导入:

Taiwan = gpd.read_file("/Users/creative/Documents/python/geopandas/data/Taiwan_shp/gadm36_TWN_0.shp")

如果你是已经整理好的经纬度坐标表格,也可以通过简单的几行代码将其转换为geodataframe的格式:

df = pd.read_excel(data_path) #先利用pandas导入
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lng, df.lat)) #转换为geodataframe
gdf.crs = 'EPSG:4326' #设置坐标系

值得一提的是,如果你对python中关于openstreetmap数据下载的osmnx库有一定的了解,你也可以直接从openstreetmap中下载街道网络数据或者行政边界数据转化为geodataframe格式,形成一个从数据下载到数据可视化的闭环。

import osmnx as ox
import geopandas as gpd

"""下载城市边界"""
city = ox.geocode_to_gdf('india')

"""基于范围下载路网"""
G = ox.graph_from_bbox(22.5229, 22.5178, 113.9265, 113.9360, network_type='drive')
G_projected = ox.project_graph(G)

"""保存为geodataframe"""
nodes, edges = ox.graph_to_gdfs(G_projected)

2 利用geopandas和contextily绘图

数据导入之后,我们就可以进入正题了,如何画出一张漂亮的地图。

2.1 最简单的绘图

在geopandas中只需要一行代码就可以将图像进行可视化(不过在此之前要设置好你的参考坐标系),如果你想可视化台湾的行政边界,只需要输入以下的代码就可以轻松实现

Taiwan.to_crs("EPSG:3857").plot()

2.2 进行数据可视化

数据可视化是检验一个好的绘图库的基本标准,以下本文将使用台湾省的军事设施数据进行简单的数据可视化。

以下图标数据来源openstreetmap中关于台湾省的土地利用数据,不代表本人观点。
基础地图和数据来自 OpenStreetMap 和 OpenStreetMap 基金会

首先,我们先将所有的数据在地图上进行描绘:

fig = plt.figure(figsize=(15,15),dpi=300)
ax = fig.add_subplot(1,1,1)
Taiwan.boundary.to_crs("EPSG:3857").plot(ax=ax, edgecolor='k',linewidth=1, zorder=2)
city.boundary.to_crs("EPSG:3857").plot(ax=ax,edgecolor='gray',linewidth=0.8,zorder=1)
for idx, _ in enumerate(city.geometry.representative_point().to_crs(3857)):
    region = city.loc[idx, 'NL_NAME_2']
    ax.text(_.x, _.y, region, ha="center", va="center", size=6,color='k')
military_point.to_crs("EPSG:3857").plot(column='type', cmap='YlGn',markersize=5,edgecolor='k',linewidth=0.3, ax=ax, legend=True,legend_kwds={'loc': 8,"title":"图例","shadow":True,"ncol":5}, zorder=3)
ctx.add_basemap(ax, source='https://d.basemaps.cartocdn.com/light_nolabels/{z}/{x}/{y}.png',zoom=8)

在这里插入图片描述
从图中我们似乎可以认为台湾省大量军事设施布置在台湾海峡一侧,但是这只是我们肉眼可见的数据,从地理信息数据处理的角度来看,我们还需要将其数量赋值到台湾省每一个市中才能更加清晰的进行分析。

这个时候geopandas像arcmap一样给我们提供了空间连接功能,只需要几行代码就可以快速的进行空间连接:

sjoin = gpd.sjoin(city,military_point) #括号内填入要空间连接的geodataframe

这个时候我们点的信息就赋予到了我们的面上面,我们只需要进行一下简单的汇总统计就可以实现对每一个市的军事设施数量进行统计

sjoin = sjoin["NL_NAME_2"].value_counts().reset_index() #汇总统计

sjoin = sjoin.rename(columns={"NL_NAME_2":"military_count","index":"NL_NAME_2"})

count_city = city.merge(sjoin, on='NL_NAME_2') #再次连接属性表

count_city.head(1)


其中military_count就是我们计算的结果,接着我们把结果可视化到我们的地图中(后文代码部分就差不多了,这里将不加入代码块了):

在这里插入图片描述
定量可视化后我们可以更清晰的发现,台湾省军事设施主要分布在台北市周边地图、台中、高雄、花莲等地,并不是单一部署在台湾海峡一岸。我们在统计数据的时候还发现这套数据也包括机场和军事基地等设施,那么我们就可以思考,如果从这些基地出发,台湾最大的军事覆盖范围将有多大呢?

geopandas的buffer功能为我们这个想法提供了支撑,我们假设台湾省目前的F16b的基本作战半径为700公里,最大作战半径为1300公里,来观察这个作战半径可以覆盖的区域。

在这里插入图片描述
根据结果我们可以发现在台湾省1300公里半径内可以到达广东省的深圳市和上海市区,而在700公里则可以覆盖东南沿海的一些城市。

然而,真实的情况是它可能连台湾海峡都飞不过。。。。。

利用buffer功能,在城市规划领域我们可以划定一些公共服务设施的服务半径,这里我们也简单绘制了一张台湾军事电台可以覆盖的一些范围(假定服务半径为20000m)

在这里插入图片描述
在对军事设施进行简单的分析后,我们也可以关注台湾省的社会经济信息,如灯光地图就常常被用来衡量城市的繁荣程度与城市夜经济的发达程度,利用contextily库我们可以轻松的把灯光地图和我们的geodataframe结合起来进行分析与研究。

在这里插入图片描述
地形图与卫星影像地图也常常是我们分析的重点,我们在使用gis时常常为这种数据的获取而感到头痛,但是在geopandas里,你依旧只需要几行代码就可以轻松的实现这些数据的操作与分析,为了图像好看,我们将这几张地图放到一起来进行可视化。
在这里插入图片描述
geopandas也支持绘制热力地图等操作(这里偷懒放了官网的图)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
除了区域层面的分析外,对于微观层面的分析,geopandas也不在话下,比如下面这张商业店铺的分析图从数据的获取到可视化就完成依靠python完成。

在这里插入图片描述
在这里插入图片描述
还有一些关于子图等等的操作本文没有进行介绍,以后有时间补上。

三、Python绘制地图的不足

作为强大的python中的地理信息处理库,geopandas也支持如同arcmap中的某些功能,同时和osmnx、shapely等库配合进行更加强大的地理处理。

但是geopandas与arcmap相比依旧有较大的差距,比如说目前不支持比例尺和指北针的绘制。对一些高级的地理处理功能也没有办法进行。如果需要进行专业的研究,我们还是离不开arcgis的帮助。

本文主要提供了一种与传统地理数据处理不同的思路,希望对大家有所帮助!如果你有更多关于Python与城市规划结合方面的问题,欢迎评论留言和我探讨!


这里我为大家准备了一份针对零基础的Python学习资料,有兴趣的同学可以看看哦。

「 Python经验分享 」

学好 Python 不论是就业还是做副业赚钱都不错,但要学会 Python 还是要有一个学习规划。最后给大家免费分享一份全套的 Python 学习资料,给那些想学习 Python 的小伙伴们一点帮助!

一、Python所有方向的学习路线

Python所有方向路线就是把Python常用的技术点做整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
9f49b566129f47b8a67243c1008edf79.png

二、学习软件

工欲善其事必先利其器。学习Python常用的开发软件都在这里了,给大家节省了很多时间。

8c4513c1a906b72cbf93031e6781512b.png

三、入门学习视频

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

afc935d834c5452090670f48eda180e0.png

四、实战案例

光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。

252731a671c1fb70aad5355a2c5eeff0.png

五、面试资料

我们学习Python必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

6c361282296f86381401c05e862fe4e9.png

d2d978bb523c810abca3abe69e09bc1a.png

这份完整版的Python全套学习资料已经上传CSDN
朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐