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

如何用Python画出你想要的世界_Python开发


Geopandas也可以绘制非常多好看的图,比如说我下面这张图:


目前,Geopandas主要支持以下一些功能:

1.1 读取、创建地理信息数据

Geopandas读取地理数据非常的方便,它只需要几行代码就可以将shp文件转换为GeoDataFrame:park = gpd.read_file("/Users/creative/OneDrive - stu.hit.edu.cn/Arcgis_Analysis/Data/Shp/研究公园信息.shp")park.head(1)

GeoDataFrame和pandas的DataFrame非常类似,只不过多了最后一个关于geometry的地理信息字段,用来进行地理信息的描述如果你是excel或者csv等格式的文本文件,需要转换为GeoDataFrame,就需要结合pandas进行操作,原理类似于Arcgis里的添加XY数据,以下就是代码:
df = pd.read_excel(data_path)
gdf = gpd.GeoDataFrame(df, geometry=gpd.points_from_xy(df.lng, df.lat)) #选择XY坐标为地理坐标
gdf.crs = ‘EPSG:4326’ #指定坐标系

1.2 处理地理信息数据(工具箱!如空间连接等)

Geopandas也可以和GiS软件一样进行一些简单的空间处理操作,比如说裁剪、融合、空间连接等(这里放上图),以下就是代码:

如何用Python画出你想要的世界_Python教程_02


“”“取交集”""

country_cores = geopandas.overlay(countries, capitals, how='intersection')
country_cores.plot(alpha=0.5, edgecolor='k', cmap='tab10');

如何用Python画出你想要的世界_Python开发_03


“”“裁剪”""

country_peripheries = geopandas.overlay(countries, capitals, how='difference')
country_peripheries.plot(alpha=0.5, edgecolor='k', cmap='tab10');

如何用Python画出你想要的世界_Python开发_04


空间连接没有相关的图,不过原理上是和gis软件里类型的,这里放上代码:

cities_with_country = geopandas.sjoin(cities, countries, how=“inner”, op=‘intersects’)

括号里第一二个参数为要进行连接的两个文件,how是数据保存的方式(保存第一个文件数据、保存第二个文件数据、保存交集数据三个选项),op是选项(有相交、在内部、包含三种选择)

1.3 城市网络(UNA)

城市网络和社交网络相比,多了一个地理属性。多数情况下,我们可以使用basemap或者geopandas与NetworkX一起协同完成这个工作。下图是基于basemap和NetworkX绘制的航线图:

如何用Python画出你想要的世界_Python教程_05


这里放上主要部分的代码:

"""叠加basemap"""
fig = plt.figure(figsize=(9,8),dpi=300)
ax = fig.add_subplot(1,1,1)
m = Basemap(
projection='merc',
llcrnrlon=90,
llcrnrlat=5,
urcrnrlon=120,
urcrnrlat=30,
lat_ts=0,
resolution='l',
suppress_ticks=True)

“”“绘制关系网络”""

nx.draw_networkx_nodes(G = graph, pos = pos, nodelist = [x for x in graph.nodes() if counts['total_flight'][x] >= 100],
node_color = 'r', alpha = 0.8,
node_size = [counts['total_flight'][x]*4 for x in graph.nodes() if counts['total_flight'][x] >= 100])

nx.draw_networkx_labels(G = graph, pos = pos, font_size=10,
labels = {x:x for x in graph.nodes() if counts['total_flight'][x] >= 100})

nx.draw_networkx_nodes(G = graph, pos = pos, nodelist = [x for x in graph.nodes() if counts['total_flight'][x] < 100],
node_color = '#c0d0e1', alpha = 0.9,
node_size = [counts['total_flight'][x]*4 for x in graph.nodes() if counts['total_flight'][x] < 100])

nx.draw_networkx_edges(G = graph, pos = pos, edge_color = '#013a55', width = routes_yga['counts']*0.75,
alpha=0.2, arrows = False)

m.drawcountries(linewidth = 1)
m.drawstates(linewidth = 0.2)
m.drawcoastlines(linewidth=1)
m.fillcontinents(alpha = 0.3)
line1 = mlines.Line2D(range(1), range(1), color="white", marker='o', markerfacecolor="red")
line2 = mlines.Line2D(range(1), range(1), color="white", marker='o',markerfacecolor="#c0d0e1")
line3 = mlines.Line2D(range(1), range(1), color="#013a55", marker='',markerfacecolor="#013a55")
plt.legend((line2, line3), ( 'airports', 'routes'),
loc=4, fontsize = 'medium')

以上就是小编我低头码了一下午的分享,对于自己动手描画出的世界真的特别有意思,有兴趣的可以自己去动手试试,更想深入学习了解Python的可以私信小编我,免费分享学习资料给你!!!

如何用Python画出你想要的世界_Python教程_06