最近在处理矢量样本的时候,遇到一些shp文件的坐标系为2000坐标,需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。
本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。
在处理矢量数据转换的过程中,有几个关键步骤确保了数据的有效性和可用性。
首先,在转换之前,通过检查并创建目标保存目录,保证了正确的目录结构,这对于避免转换失败或产生错误输出至关重要。
接着,通过osr.SpatialReference对象定义目标坐标系,并使用ImportFromEPSG()方法设置EPSG代码,确保了转换后的数据能够在地理信息系统中正确显示。
此外,通过selectFields参数可以选择性地保留某些字段,而geometryType参数则定义了输出文件中的几何类型,这些选项使用户可以根据具体需求定制输出文件。
重投影选项reproject=True指示GDAL/OGR进行坐标系转换,这对于整合不同坐标系下的数据至关重要。
最后,通过dim参数可以控制输出数据的维度,例如仅保留X和Y坐标,这对于某些特定应用场景是必要的。这些步骤共同构成了一个完整的矢量数据转换流程,确保了数据的准确性和实用性。
具体代码如下:
from osgeo import ogr, gdal
from osgeo import osr
import os
def VectorTranslate(
shapeFilePath,
saveFolderPath,
format="GeoJSON",
accessMode=None,
dstSrsESPG=4326,
selectFields=None,
geometryType="POLYGON",
dim="XY",
):
"""
转换矢量文件,包括坐标系,名称,格式,字段,类型,纬度等。
:param shapeFilePath: 要转换的矢量文件
:param saveFolderPath: 生成矢量文件保存目录
:param format: 矢量文件格式
:param accessMode:None代表creation,'update','append','overwrite'
:param dstSrsESPG: 目标坐标系EPSG代码,4326是wgs84地理坐标系
:param selectFields: 需要保留的字段列表如果都保留,则为None
:param geometryType: 几何类型,"POLYGON","POINT"。。。
:param dim: 新矢量文件坐标纬度,建议查阅官方API。
:return:
"""
if os.path.exists(saveFolderPath) ==0:
os.makedirs(saveFolderPath)
ogr.RegisterAll()
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
data = ogr.Open(shapeFilePath)
layer = data.GetLayer()
spatial = layer.GetSpatialRef()
layerName = layer.GetName()
data.Destroy()
dstSRS = osr.SpatialReference()
dstSRS.ImportFromEPSG(int(dstSrsESPG))
if format == "GeoJSON":
destDataName = layerName + ".geojson"
destDataPath = os.path.join(saveFolderPath, destDataName)
elif format == "ESRI Shapefile":
destDataName = os.path.join(saveFolderPath, layerName)
flag = os.path.exists(destDataName)
os.makedirs(destDataName) if not flag else None
destDataPath = os.path.join(destDataName, layerName + ".shp")
else:
print("不支持该格式!")
return
options = gdal.VectorTranslateOptions(
format=format,
accessMode=accessMode,
srcSRS=spatial,
dstSRS=dstSRS,
reproject=True,
selectFields=selectFields,
layerName=layerName,
geometryType=geometryType,
dim=dim
)
gdal.VectorTranslate(
destDataPath,
srcDS=shapeFilePath,
options=options
)
return destDataPath
if __name__ == '__main__':
shapeFilePath = r'G:\\vector.shp'
saveFolderPath = r'G:\\84'
VectorTranslate(
shapeFilePath,
saveFolderPath,
format="ESRI Shapefile",
accessMode=None,
dstSrsESPG=4326,
selectFields=None,
geometryType="POLYGON",
dim="XY",
)
在上述代码的主程序部分,我们指定了一个Shapefile文件路径和保存目录,并调用了 VectorTranslate 函数将其转换为ESRI Shapefile格式,并重新投影到WGS84坐标系。
在实际应用中,这段代码可以被用来批量处理大量的矢量数据文件,从而简化数据准备过程。例如,当需要将来自不同来源的Shapefile文件统一到一个标准坐标系中时,这样的脚本可以极大地提高工作效率。