Shapefile是GIS中非常重要的数据类型,在ArcGIS中称为要素类。它主要包括点、线和折线。本文重点介绍python geopandas读取和创建shapefiles的方法。请有需要的朋友参考。
Shapefile是GIS中非常重要的数据类型,在ArcGIS中称为要素类。它主要包括点、线和折线。geopandas作为一种非常常见的矢量文件格式,为shapefile的读写提供了良好的支持,其DataFrame结构相当于GIS数据中的一个属性表,使得直接操作矢量数据的属性表成为可能,使得在python中操作地理数据更加方便。本文将向您介绍如何读写Shapefile文件(。shp,shx,dbf和其他格式)。
开发准备
由于geopanda有几个依赖库,建议您使用Miniconda或Anaconda来安装geopanda。
安装命令:
conda install-c conda-forge geo pandas
国内形象:
conda install-c https://mirrors . tuna . Tsinghua . edu . cn/anaconda/cloud/conda-forge geo pandas
用途:导入geopandas
我这里用的是geopandas 0.7的版本,版本之间差别不大。最新的0.8版本在查询和仓储方面增加了一些功能。
shapefile文件信息的读取
与pyshp库相比,geopandas库的数据读取、显示、分析和扩展效果更好。可以读取ArcGIS中zip、GeoJson、gdb中的shapefile和QGIS中GeoPackage中存储的矢量数据。
将geopandas作为gpd导入
从matplotlib导入pyplot作为plt
data=GPD . Read _ file(r ' e:\ GIS data \行政区划数据2019\ province.shp') #读取磁盘上的矢量文件
# data=GPD . Read _ file(' shape file/China . gdb ',layer=' province') #读取gdb中的矢量数据
Print(data.crs) #查看数据对应的投影信息
Print(data.head()) #查看前5行数据
data.plot()
Plt.show()#简单显示
显示效果:
shapefile文件的创建
创建类的效率非常高,不仅可以创建特征实体,还可以写入属性信息和定义投影。下面简单介绍下三个要素类的创建方法。
创建点要素类
核心代码:
#对应于shapely.geometry中的点,用于表示单个点。让我们创建一个由几个点对象组成的点对象。
cq=geopandas。GeoSeries(【几何。点(110,60),
几何。点(110.5,50.4),
几何。点(120,55),
几何。点(107.8,54.6),
几何。点(114.6,50)],
Crs='EPSG:4326 ',#指定的坐标系是WGS 1984
index=[' 1号',' 2号',' 3号',' 4号',' 5号'],#相关索引
)
#将数据导出为shapefile文件
cq.to_file('。/output/{}。嘘。格式(os.path.basename(__file__)。替换('。py ','')),
驱动程序='ESRI形状文件',
编码='utf-8 ')
创建线状要素类
核心代码:
#这里shapely . geometry . linestring([(x1,y1),(x2,y2),])用于创建多个点依次相连的线段。
cq=geopandas。GeoSeries(【几何。LineString([(0,0),(1,1),(1,0)]),
几何。LineString([(0.5,2),(0,1),(-1,0)]),
EPSG:4326,
Index=[' Line 1 ',' b'])
cq.to_file('。/output/{}。嘘。格式(os.path.basename(__file__)。替换('。py ','')),
驱动程序='ESRI形状文件',
编码='utf-8 ')
创建面要素类
核心代码:
#对应于shapely.geometry中的多边形,用于表示表面。让我们创建一个由几个多边形对象组成的多边形。
cq=geopandas。GeoSeries(【几何。多边形([(14,14),(13,18),(20,11),(18,10)]),
几何。多边形([(0,0),(10,0),(10,10),(0,10)],
[((1, 3), (5, 3), (5, 1), (1, 1)),
((9, 9), (9, 8), (8, 8), (8, 9))]),
几何。多边形([(11,2),(11,10),(12,10),(12,2)])
],
索引=['简单面', '复杂面,' c区'], # 构建一个索引字段
crs='EPSG:4326 ',#坐标系是:WGS 1984年年
)
cq.to_file(./output/{} .嘘。格式(os.path.basename(__file__).替换('。py ','')),
驱动程序='ESRI形状文件,
编码='utf-8 ')
拓展应用实例
展高程点
高程点文件存储格式与卡斯中读取的数据;数字录音带格式一致,示例:【1、ZDH 450000.000、DYG 4100000.002、450000.000、4100000.002】其中,"1"代表的是"点号”,“ZDH”代表的是"代码",之后的分别是"东坐标、北坐标、高程值"即y、X、H或者是x、Y、H
美国电脑软件公司公司的计算机辅助设计软件中展点效果
地质公园中展点效果
实现代码
# -*-编码:utf-8 -*-
进口熊猫作为螺纹中径
将地质公园作为每日加仑数(gallons per day)导入
从匀称的.几何学导入点
从matplotlib导入pyplot作为plt
从matplotlib.ticker导入函数格式化程序
# 读取数据
文件路径='。/数据-使用/高程数据csv '
rankings_colname=['名称','标记','经度','纬度','高度'];
df=pd.read_csv(文件路径,标题=无,名称=排名_列名)
# print(df.head(5))#输出前五行数据查看
xy=[zip中正常男性染色体组型的点(xy )( df['经度],df['纬度'])]
pts=gpd .地理系列(xy) #创建点要素数据集
#保存为自行榴弹炮(自行榴弹炮)文件
pts.to_file(./输出/展高程点' shp ',驱动程序='ESRI形状文件,编码='utf-8 ')
''无花果是用来设置图像大小参数,斧头是行列有多少个点'''
fig,ax=plt.subplots(figsize=(8,6)) #返回一个包含数字和轴线对象的元组
ax=pts.plot(ax=ax,
facecolor='white ',
edgecolor='black ',
标记='X ',
线宽=0.5,#内外符号比例系数
markersize=12,
标签='高程点)
# 地图标注
new_texts=[plt.text(x_ 1,y_ 1,text,fontsize=8) for x_,y_,text in
zip(df['经度],df['纬度],df['名称'])]
# 设置坐标轴
def formatnum(x,pos):
#返回'$%.1f$x$10^{4}$' % (x/10000)#科学计数法显示
return int(x) #取整显示
formatter=func formatter(格式编号)
ax.yaxis.set_major_formatter(格式化程序)
# 美观起见隐藏顶部与右侧边框线
ax.spines['右']。set_visible(False)
ax.spines['top'].set_visible(False)
plt.grid(True,alpha=0.4) #显示网格,透明度为50%
ax.legend(title='图例,loc='右下,ncol=1,shadow=True) #添加图例
plt.title('展高程点,fontdict={'weight': 'normal ',' size': 20}) #设置图名改变图标题字体
# 保存图片
' plt.savefig('图像/展高程点. png ',dpi=300,bbox_inches='tight ',pad_inches=0)
plt.show()
点集转面
将一系列点的集合转为面状要素类,下面以甘肃省的地震带为例(字段对应:名称,面索引,点索引,经度,纬度)。
数据预览
效果预览
实现代码
将地质公园作为每日加仑数(gallons per day)导入
进口熊猫作为螺纹中径
从匀称的.几何学导入多边形
从matplotlib导入pyplot作为plt
raw=pd.read_excel(' ./数据-使用/甘肃省地震带. xls') #原始数据
# 转换为面要素
output=raw.groupby('id') \。应用(lambda df: Polygon([(x,y) for x,y in zip(df['经度],df['纬度']))))\。to_frame(name='geometry ')
# 转换为地理数据框架
输出=gpd .地理数据框架(输出,crs='EPSG:4326 ')
output.plot()
# 地图标注
new _经度=raw。group by(' name ',as_index=False),['经度'].平均值()
new_latitude=raw.groupby('name ',as_index=False)['latitude'].平均值()
new_df=pd.merge(pd .数据帧(新经度),pd .数据框架(新纬度))
new_texts=[plt.text(x_,y_,text,fontsize=8) for x_,y_,text in
zip(new_df['经度],new_df['纬度],new_df['名称'])]
# 导出shapefile
输出到文件('输出/地震带shp’.
plt.show()
创建缓冲区、多环缓冲区
实现代码:
导入操作系统
匀称地进口
将地质公园作为每日加仑数(gallons per day)导入
将matplotlib.pyplot作为plt导入
polygon=shapely . geometry . polygon([(0,0),(1,0),(1,1),(0,1)])
#分别绘制多边形和多边形前向缓冲区。坐标系为WGS1984,单位为度。
cq=gpd。地理系列([多边形,
多边形.缓冲区(距离=1),
多边形.缓冲区(距离=3)],
crs='EPSG:4326 ')
#将数据导出为shapefile文件
cq.to_file('。/output/{}。嘘。格式(os.path.basename(__file__)。替换('。py ','')),
驱动程序='ESRI形状文件',
编码='utf-8 ')
ax=cq.plot(alpha=0.2)
Ax.axis('off') #取消坐标轴的显示
plt.show()
写在最后
随着相关完整代码的下载,还有更多有趣的内容,有兴趣的朋友可以自己实践一下。喜欢的朋友可以关注一下,后续会继续更新,精彩无限——
链接:https://pan.baidu.com/s/1g7G8sQ17-9XIhojyQ1M7Ww
提货代码:59vz
最后给你一个强安利学习博客:https://www.cnblogs.com/feffery/tag/geopandas/.
以上是python geopandas读取和创建shapefile文件方法的详细内容。关于python读取shapefile文件的更多信息,请关注我们的其他相关文章!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。