您好,登录后才能下订单哦!
这篇文章主要介绍如何使用Pandas,GeoPandas和ArcGIS实现数据处理和绘图,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
第一部分是学习使用pandas进行数据数据。pandas中有两大数据结构,分别是series序列和DataFrame数据框。使用pandas的实验对象是之前电脑本地的一些气象数据,存储格式为.xlsx。实验数据仅仅是实验数据而已,用它来练习pandas还是不错的,至少目前。
pandas数据分析的大概步骤也不复杂,导入库—>读取数据—>数据操作(切片,筛选,组合,排序,批处理等)—>写出数据到csv或xlsx或txt纯文本。
pandas的数据读取很容易:
import pandas as pd
data = pd.read_excel(r'D:\inuyasha\codeX\Python\气象数据1960-2018\1960.xlsx')
series = data['平均气温'] #序列,就是1,2,3这样排列下去的
series_to_dataframe=pd.DataFrame(series) #把series数据结构转为数据框结构,pd两大数据结构
series_to_dataframe
重命名,增加索引操作:
datare = data.rename(columns={'平均气温':'平均温'}) #使用rename方法重命名列的名字,字典,1是原名,2是更换后的名字datare['INDEX'] = datare.index #原基础上增加索引,.index方法,名INDEXdatare['均温'] = datare['平均温'] #没有替代原来的那一列,而是新增一列,一模一样的,末尾添加datare.drop(columns='INDEX') #删除原来列datare
删除某一行,也可以删除多行,index是行索引,axis指针对所有列:
df1 = datare.drop(index=0,axis=1)
据索引删除多行,index是行索引,axis指针对所有列
df2 = datare.drop(index=[0,1,2,3],axis=1)
定位和提取数据:
datare['区站号'].isin([50136]) #isin函数判断这一列中是否存在这个数,数字这不要加引号,否则就成字符串了datare[datare['区站号'].isin([50136])] #在原始数据中取出定位到的数据datare[-datare['区站号'].isin([50136])] #在原始数据中取出定位到的数据,前面加一个横线表示反选
如果想一次就提取多列呢,那就把需要的列以list形式放进去
data_multicolu2 = datare[['区站号','纬度','经度','年','月','日','平均温']] #列表形式把需要的多列切片提取出来data_multicolu2
排序:
datare.sort_values(by='平均温',ascending=False)
还有更多功能,这里就不一一写出来了。多用几次就熟悉了。之前想的一个问题,如何提取多个xlsx里面的某些数据,这不就发挥作用了嘛哈哈。
第二部分是Geopandas读取shp数据+绘图展示+添加经纬度标识(EWSN)
脚本如下:
import geopandas as gpdimport numpy as npimport matplotlib.pyplot as pltimport cartopy.crs as ccrsfrom cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatterimport cmaps#import arcpy
gd_boundary = gpd.read_file('D:\ArcGISgeobase\guangdata\gd_boundary.shp')
gd_road = gpd.read_file('D:\ArcGISgeobase\guangdata\gd_road.shp')
#fig,ax = plt.subplots(figsize=(16,12)) #设置画布大小
plt.figure(figsize=(16, 12))
ax = plt.subplot(projection=ccrs.PlateCarree())
#全局设置
plt.rcParams['font.family'] = 'Times New Roman'
plt.rcParams['font.size'] = 16
gd_boundary.plot(ax=ax,facecolor='none',edgecolor='k',linewidth=0.99) #边界设置
gd_road.plot(ax=ax,edgecolor='b',cmap=cmaps.posneg_2,lw=0.3,legend=False) #路网设置
ax.set_yticks(np.arange(20, 26, 1.0),crs=ccrs.PlateCarree())
ax.set_xticks(np.arange(109, 118, 1.0),crs=ccrs.PlateCarree())
ax.xaxis.set_major_formatter(LongitudeFormatter()) #经纬度标识显示,EWSN
ax.yaxis.set_major_formatter(LatitudeFormatter())
#ax.set_axis_on() #打开矩形边框
ax.set_title('Guangdong_Roads',fontsize=16) #设置标题
plt.grid() #设置网格
展示结果如下图,发现了连经纬度标识都没有,虽然可以根据数据变化方向识别,不过增加上经纬度标识还是要好一些。然后古哥浏览器找了一下看看有没有解决方法,结果没找到,看到很多教程都没有添加这个经纬度标识,于是自己动手:
自己动手添加经纬度标识:
plt.figure(figsize=(16, 10))
ax = plt.subplot(projection=ccrs.PlateCarree())
ax.set_yticks(np.arange(20, 26, 1.0),crs=ccrs.PlateCarree())
ax.set_xticks(np.arange(109, 118, 1.0),crs=ccrs.PlateCarree())
ax.xaxis.set_major_formatter(LongitudeFormatter()) #经纬度标识显示,EWSN
ax.yaxis.set_major_formatter(LatitudeFormatter())
现在来看看效果吧,啊哈,这样的话,经纬度标识不就来了嘛
然后我又想使用ArcPy做一下路网线密度分析,但是配置它太麻烦了,于是转到ArcGIS去操作一把(虽然害怕随时会卡退啊,特别是数据没保存的情况下)
第三部分使用ArcGIS做一下路网线密度操作以及局部放大图。局部放大图有它自己的作用,就是假如在密集度很大的情况下,看起来是模糊一片的,那么就可能需要局部放大了,画一个示意图吧:
So,来到ArcGIS,加载路网数据和矢量边界这两个数据就够了
修饰出图,看起来勉强,这个color好像是前几天自己调的来着,应该是吧,没记错的话。
有一些地方感觉太密集了,不好看,那么就给它局部放大一下,原理就是新建一个数据框。
以上是“如何使用Pandas,GeoPandas和ArcGIS实现数据处理和绘图”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。