geopandas的安装是最最最麻烦的了,有很多依赖库,然后版本还很难协调……
我的环境是python3.7,最终成功的效果大概经历了这些步骤:
conda install -c conda-forge geopandas
这个是官网的安装方法之一,会把附带的依赖库一起安装上,如果用pip还需要提前安装GDAL、pyproj这些,而且版本很难协调。然而仍然因为pyproj报错。
这个时候如果用conda install pyproj会安装成1.9.5.1版本,但事实上需要3.0.1版本才满足需求(要不然import geopandas)会报错。
尝试了,如果用pip安装会没有效果,仍然报错,用conda install pyproj==3.0.1会告诉我找不到这个包。最后成功的是用下面这个命令,会自动检查修正环境:
conda install -c conda-forge pyproj==3.0.1
安装时间是挺长的,不过成功了。
因为这个pyproj的问题,还报过第三个错说找不到proj.db。这个网上有不少方法,基本说的都是修改系统变量和添加代码,我是两样都加了,然后重启之后成了。代码如下,也就是这个文件夹里要有这个文件。
import os
os.environ['PROJ_LIB'] =r'D:\anaconda\envs\kkb3.7\Lib\site-packages\pyproj\proj_dir\share\proj'
这中间,因为安装contextily还返工过一次,但大体上版本的搭配是这样的啦,
# Name Version Build Channel
geopandas 0.6.3 py_0 conda-forge
pyproj 3.1.0 pypi_0 pypi
gdal 3.1.4 py37h91875a4_13 conda-forge
libgdal 3.1.4 hade8cfc_13 conda-forge
contextily 1.1.0 pyhd8ed1ab_0 conda-forge
之后,运行这段代码成功了!也就是读取geojson文件,并且显示在在线地图上。
import geopandas as gpd
import matplotlib.pyplot as plt
import contextily as ctx
import os
# 环境配置
os.environ['PROJ_LIB'] =r'D:\anaconda\envs\kkb3.7\Lib\site-packages\pyproj\proj_dir\share\proj'
import matplotlib as mpl
mpl.rcParams['font.sans-serif'] = ['SimHei','Microsoft Jhenghei','Microsoft YaHei','FangSong'] # 汉字字体
mpl.rcParams['font.size'] = 12 # 字体大小
mpl.rcParams['axes.unicode_minus'] = False # 正常显示负号
# 读取保存在本地的geoJson数据
data = gpd.read_file('F:/砖/HK地理空间竞赛/数据库_除三维模型/各检测站点空气质数指数/站点location/站点location.geojson')#修改一下路径
print(data['空氣質素監測站類別'])
# 生成图表
fig, ax = plt.subplots(1,1,figsize = (15,7))
# 投影
proj = data.to_crs(crs='EPSG:3857')
proj.plot(ax=ax,alpha=0.8,column='空氣質素監測站類別', k=2,legend =True)
# 添加文字标注
data['x']=proj['geometry'].map(lambda x: x.x) # 注意这里的x和y是投影过的
data['y']=proj['geometry'].map(lambda x: x.y)
for x,y,label in zip(data['x'], data['y'],data['設施名稱']):
plt.text(x,y,label, fontsize=12, color='black')
# 添加在线地图
ctx.add_basemap(ax,source='https://{s}.tile.openstreetmap.fr/hot/{z}/{x}/{y}.png',zoom=10)
plt.xticks(rotation=20)
# 保存图片
plt.savefig("F:/砖/HK地理空间竞赛/数据库_除三维模型/各检测站点空气质数指数/站点location/MapDisplayAndprojection.png")#修改一下路径
# 展示图片
plt.show()
图大概长这样,上面的点是解析后的geojson。