python+gdal地理坐标转投影坐标

2023-12-11 06:01

本文主要是介绍python+gdal地理坐标转投影坐标,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1 前言

地理坐标系,是使用三维球面来定义地球表面位置,以实现通过经纬度对地球表面点位引用的坐标系。 地理坐标系经过地图投影操作后就变成了投影坐标系。而地图投影是按照一定的数学法则将地球椭球面上点的经维度坐标转换到平面上的直角坐标。

图片

2 流程

2.1 矢量数据地理坐标转投影坐标

要素feature的形状geometry是由一系列点坐标构成的,将每个要素的形状点一一进行坐标转换即可。

下面以WGS84坐标转UTM投影为例:

from osgeo import ogr,osr,gdal
import glob
import osdef vecter_WGS2UTM(shp_path, UTM_shp_path, longitude, is_north):ds = ogr.Open(shp_path)layer = ds.GetLayer(0)driver = ogr.GetDriverByName('ESRI Shapefile')# 创建输出文件if os.path.exists(UTM_shp_path):driver.DeleteDataSource(UTM_shp_path)out_ds = driver.CreateDataSource(UTM_shp_path)outlayer = out_ds.CreateLayer(UTM_shp_path[:-4],geom_type = ogr.wkbPolygon)# 当前地理参考spatialRef = layer.GetFeature(0).GetGeometryRef().GetSpatialReference()# 根据经度计算UTM区号,进而定义UTM投影zone = str(int(longitude/6) + 31)zone = int('326' + zone) if is_north else int('327' + zone)UTM_spatialRef = osr.SpatialReference()UTM_spatialRef.ImportFromEPSG(zone)# 投影转换coordinate_transfor = osr.CoordinateTransformation(spatialRef, UTM_spatialRef)# 定义输出属性表信息feature = layer.GetFeature(0)field_count = feature.GetFieldCount()field_names = []for attr in range(field_count):field_defn = feature.GetFieldDefnRef(attr)field_names.append(field_defn.GetName())outlayer.CreateField(field_defn)out_fielddefn = outlayer.GetLayerDefn()for feature in layer:geometry = feature.GetGeometryRef()geometry.Transform(coordinate_transfor)out_feature = ogr.Feature(out_fielddefn)out_feature.SetGeometry(geometry)for field_name in field_names:out_feature.SetField(field_name,feature.GetField(field_name))outlayer.CreateFeature(out_feature)feature.Destroy()out_feature.Destroy()# 清除缓存ds.Destroy()out_ds.Destroy()# 保存投影文件UTM_spatialRef.MorphFromESRI()prj_path = UTM_shp_path.replace(".shp",".prj")fn = open(prj_path,'w')fn.write(UTM_spatialRef.ExportToWkt())fn.close()

2.2 栅格数据地理坐标转投影坐标

栅格数据每个像素的地理/投影坐标是由仿射矩阵六参数和像素坐标计算得来的,所以先将仿射矩阵六参数进行转换,之后对栅格数据重采样即可。

下面以WGS84坐标转UTM投影为例:

def raster_WGS2UTM(raster_path, UTM_raster_path, longitude, is_north):raster_ds = gdal.Open(raster_path)raster_type = raster_ds.GetRasterBand(1).DataType# 栅格投影spatialRef = osr.SpatialReference()spatialRef.ImportFromWkt(raster_ds.GetProjection())# 根据经度计算UTM区号,进而定义UTM投影zone = str(int(longitude/6) + 31)zone = int('326' + zone) if is_north else int('327' + zone)UTM_spatialRef = osr.SpatialReference()UTM_spatialRef.ImportFromEPSG(zone)# 投影转换coordinate_transfor = osr.CoordinateTransformation(spatialRef, UTM_spatialRef)# 仿射矩阵六参数geotransform = raster_ds.GetGeoTransform()# 左上角upper left、右下角lower right坐标ul_x = geotransform[0]ul_y = geotransform[3]lr_x = geotransform[0]+geotransform[1]*raster_ds.RasterXSize+geotransform[2]*raster_ds.RasterYSizelr_y = geotransform[3]+geotransform[4]*raster_ds.RasterYSize+geotransform[5]*raster_ds.RasterYSize# 左上角、右下角在目标投影中的坐标(UTM_ul_x, UTM_ul_y, UTM_ul_z) = coordinate_transfor.TransformPoint(ul_y, ul_x)(UTM_lr_x, UTM_lr_y, UTM_lr_z) = coordinate_transfor.TransformPoint(lr_y, lr_x)# 创建目标图像文件driver = gdal.GetDriverByName("GTiff")UTM_raster_ds = driver.Create(UTM_raster_path, raster_ds.RasterXSize,raster_ds.RasterYSize,raster_ds.RasterCount,raster_type)# 转换后图像的分辨率resolution = (UTM_lr_x-UTM_ul_x)/raster_ds.RasterXSize# 转换后图像的六个放射变换参数UTM_transform = [UTM_ul_x, resolution, 0, UTM_ul_y, 0, -resolution]UTM_raster_ds.SetGeoTransform(UTM_transform)UTM_raster_ds.SetProjection(UTM_spatialRef.ExportToWkt())# 投影转换后需要做重采样gdal.ReprojectImage(raster_ds, UTM_raster_ds, spatialRef.ExportToWkt(), UTM_spatialRef.ExportToWkt(), gdal.GRA_Bilinear)# 关闭raster_ds = NoneUTM_raster_ds= None

来源:应用推广部

供稿:技术研发部

编辑:方梅

这篇关于python+gdal地理坐标转投影坐标的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/479671

相关文章

Python 字符串裁切与提取全面且实用的解决方案

《Python字符串裁切与提取全面且实用的解决方案》本文梳理了Python字符串处理方法,涵盖基础切片、split/partition分割、正则匹配及结构化数据解析(如BeautifulSoup、j... 目录python 字符串裁切与提取的完整指南 基础切片方法1. 使用切片操作符[start:end]2

Python库 Django 的简介、安装、用法入门教程

《Python库Django的简介、安装、用法入门教程》Django是Python最流行的Web框架之一,它帮助开发者快速、高效地构建功能强大的Web应用程序,接下来我们将从简介、安装到用法详解,... 目录一、Django 简介 二、Django 的安装教程 1. 创建虚拟环境2. 安装Django三、创

基于Python编写自动化邮件发送程序(进阶版)

《基于Python编写自动化邮件发送程序(进阶版)》在数字化时代,自动化邮件发送功能已成为企业和个人提升工作效率的重要工具,本文将使用Python编写一个简单的自动化邮件发送程序,希望对大家有所帮助... 目录理解SMTP协议基础配置开发环境构建邮件发送函数核心逻辑实现完整发送流程添加附件支持功能实现htm

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

基于Python实现温度单位转换器(新手版)

《基于Python实现温度单位转换器(新手版)》这篇文章主要为大家详细介绍了如何基于Python实现温度单位转换器,主要是将摄氏温度(C)和华氏温度(F)相互转换,下面小编就来和大家简单介绍一下吧... 目录为什么选择温度转换器作为第一个项目项目概述所需基础知识实现步骤详解1. 温度转换公式2. 用户输入处

python中update()函数的用法和一些例子

《python中update()函数的用法和一些例子》update()方法是字典对象的方法,用于将一个字典中的键值对更新到另一个字典中,:本文主要介绍python中update()函数的用法和一些... 目录前言用法注意事项示例示例 1: 使用另一个字典来更新示例 2: 使用可迭代对象来更新示例 3: 使用

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Python中的sort()和sorted()用法示例解析

《Python中的sort()和sorted()用法示例解析》本文给大家介绍Python中list.sort()和sorted()的使用区别,详细介绍其参数功能及Timsort排序算法特性,涵盖自适应... 目录一、list.sort()参数说明常用内置函数基本用法示例自定义函数示例lambda表达式示例o

从基础到高阶详解Python多态实战应用指南

《从基础到高阶详解Python多态实战应用指南》这篇文章主要从基础到高阶为大家详细介绍Python中多态的相关应用与技巧,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、多态的本质:python的“鸭子类型”哲学二、多态的三大实战场景场景1:数据处理管道——统一处理不同数据格式

Python利用GeoPandas打造一个交互式中国地图选择器

《Python利用GeoPandas打造一个交互式中国地图选择器》在数据分析和可视化领域,地图是展示地理信息的强大工具,被将使用Python、wxPython和GeoPandas构建的交互式中国地图行... 目录技术栈概览代码结构分析1. __init__ 方法:初始化与状态管理2. init_ui 方法: