Geopandas轻松处理shp文件的投影转换

        在绘制一张降水的地理分布图时,始终不能将地图边界在图上显示出来,经过一番折腾,最后发现问题出在shp文件的地图投影:该投影下的边界并不是以经纬度(如 [121.22269, 40.94580])给出,而是以X、Y坐标值给出(如[ 1338807.250, 4516312.500,]),不能显示地图的原因是错将后者作为经纬度。

        查阅了几种改变投影的工具,pyshp,pyproj的Transformer,Proj,CRS等,看的晕头转向,却仍然没有将X、Y坐标正确转换为经纬度坐标。最后是这篇文章(Map projections — Intro to Python GIS documentation)帮助了我,轻松用Geopandas搞定。以下是大体过程:

import geopandas as gpd

# 读入原shp文件
shp = gpd.read_file('../shp_files/NINE_BASINS/liuyu.shp') 

# 利用.crs 属性获取投影信息(实际我们并不需要知道这些详细信息,to_crs会自动使用)
print(shp.crs)  

# 利用.copy()方法复制为新的shp对象,用来变换投影
shp_new = shp.copy()

# 利用.to_crs()方法将原投影转换为epsg关键字所指定的投影,这里4326对应WGS84投影。
shp_new = shp_new.to_crs(epsg=4326) 

# 利用字段值索引其中一个子区域用于绘图(shp文件含9大流域,这里只需要珠江流域)。
shp_zhujiang = shp_new[shp_new['W1102WB0_1']=="珠江流域片"]['geometry']

#----
# 此处略去绘图过程
#----

# 利用add_geometries在等值线图上叠加地图边界shp_zhujiang。
ax.add_geometries(shp_zhujiang, crs=projection, facecolor='none', edgecolor='k', linewidth=2,zorder=1)

绘图结果如下:

注:

1. 所用的9大流域片边界数据来源:中国科学院资源环境科学数据中心。采用的投影方式是:"Albers_Conic_Equal_Area"。

2. epsg=4326中的数字是Well Known ID (WKID),其与投影的对应关系,可以查看地理坐标(Coordinate Systems)和投影坐标(Coordinate Systems)。

    

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你可以使用GDAL库中的Python绑定来进行shp文件投影转换。首先,确保你已经安装了GDAL库。然后,按照以下步骤进行操作: 1. 导入必要的库: ```python from osgeo import ogr, osr ``` 2. 打开原始的shp文件: ```python source = ogr.Open('path/to/source.shp') layer = source.GetLayer() ``` 3. 创建一个新的shp文件作为输出: ```python driver = ogr.GetDriverByName('ESRI Shapefile') output = driver.CreateDataSource('path/to/output.shp') outLayer = output.CreateLayer('output', geom_type=ogr.wkbPolygon) ``` 4. 定义原始坐标系和目标坐标系: ```python sourceSR = layer.GetSpatialRef() targetSR = osr.SpatialReference() targetSR.ImportFromEPSG(targetEPSG) # 替换targetEPSG为你想要的目标EPSG代码 ``` 5. 创建一个坐标转换器: ```python transform = osr.CoordinateTransformation(sourceSR, targetSR) ``` 6. 遍历原始图层中的要素,并进行投影转换: ```python for feature in layer: geom = feature.GetGeometryRef() geom.Transform(transform) # 创建新要素并将转换后的几何体添加到新图层中 newFeature = ogr.Feature(outLayer.GetLayerDefn()) newFeature.SetGeometry(geom) outLayer.CreateFeature(newFeature) newFeature = None source = None output = None ``` 这样,你就可以将原始shp文件中的几何体投影到目标坐标系,并保存为新的shp文件。 注意:在代码中,将`path/to/source.shp`和`path/to/output.shp`替换为你实际的文件路径,将`targetEPSG`替换为你想要的目标EPSG代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值