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

1 前言

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

图片

2 流程

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

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

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

from osgeo import ogr,osr,gdal
import glob
import os

def 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.RasterYSize
    lr_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 = None
    UTM_raster_ds= None

来源:应用推广部

供稿:技术研发部

编辑:方梅

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/235649.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

RabbitMQ学习二

RabbitMQ学习二 发送者的可靠性生产者连接重试机制生产者确认机制开启生产者确认定义ReturnCallback定义confirmCallback MQ的可靠性交换机和队列持久化消息持久化LazyQueue控制台配置Lazy模式代码配置Lazy模式 消费者的可靠性失败重试机制失败处理策略业务幂等性唯一消息ID业务…

Hiera实战:使用Hiera实现图像分类任务(二)

文章目录 训练部分导入项目使用的库设置随机因子设置全局参数图像预处理与增强读取数据设置Loss设置模型设置优化器和学习率调整策略设置混合精度,DP多卡,EMA定义训练和验证函数训练函数验证函数调用训练和验证方法 运行以及结果查看测试完整的代码 在上…

龙良曲PyTorch入门到实战 深度学习

文章目录 笔记激活函数与Loss的梯度lesson5 手写数字识别问题lesson6 基本数据类型lesson7 创建tensorlesson8 索引和切片lesson9 维度变换lesson10 broadcastinglesson11 分割和合并lesson12 数学运算lesson13 Tensor统计lesson14 Tensor高阶lesson16 什么是梯度lesson17 常见…

初识Ceph --组件、存储类型、存储原理

目录 ceph组件存储类型块存储文件存储对象存储 存储过程 ceph Ceph(分布式存储系统)是一个开源的分布式存储系统,设计用于提供高性能、高可靠性和可扩展性的存储服务,可以避免单点故障,支持块存储、对象存储以及文件系…

Java项目-瑞吉外卖Day2

完善登录功能: 完善未登录不能访问/backend/index.html。使用拦截器或过滤器。 创建过滤器。 重写doFilter方法。 查看是否过滤成功。 处理流程如下: 添加员工功能: 点击保存,可以看到请求信息。 再看前端代码&a…

使用React 18、Echarts和MUI实现温度计

关键词 React 18 Echarts和MUI 前言 在本文中,我们将结合使用React 18、Echarts和MUI(Material-UI)库,展示如何实现一个交互性的温度计。我们将使用Echarts绘制温度计的外观,并使用MUI创建一个漂亮的用户界面。 本文…

MySQL - InnoDB 和 MyISAM 的索引实现的区别

InnoDB 和 MyISAM 底层都是 B 树的实现,但是二者却完全不同 。 主键索引文件存储不同 MyISAM 引擎的索引文件和数据文件是分离的,而 InnoDB 引擎的索引文件和数据文件是不分离的。 MyISAM 引擎的叶子节点存储的是数据文件的地址,而 InnoDB 的…

textarea文本框回车enter的时候自动提交表单,根据内容自动高度

切图网近期一个bootstrap5仿chatgpt页面的项目遇到的&#xff0c;textarea文本框回车enter的时候自动提交表单&#xff0c;根据内容自动高度&#xff0c;代码如下&#xff0c;亲测可用。 <textarea placeholder"Message ChatGPT…" name"" rows"&q…

Qt之Ui样式表不影响子类的配置

Qt之Ui样式表不影响子类的配置 问题 在ui界面上布局时&#xff0c;当对容器进行样试设计时&#xff0c;会对容器内其它成员对象也进行了修改 分析 对应*.ui文件内容 从这个写法来看&#xff0c;它的样式属性会影响其成员对象样式属性。 解决方法 在容器的样式表中写时适…

离散型随机变量的分布律(也称概率质量函数:probability mass function, PMF)

设是一个离散型随机变量&#xff0c;可能的取值为&#xff0c;取各个值的概率记为&#xff1a; &#xff08;1&#xff09; 其中 并且&#xff0c; 公式&#xff08;1&#xff09;就称为离散型随机变量的分布律&#xff0c;也称概率质量函数&#xff1a;probability ma…

前端怎么调用node接口---小白

1.基于node搭建express后端脚手架&#xff1a;基于node搭建express后端脚手架 2.在node里边写一个接口 // 引入express const express require(express) // 创建实例 const app express() // 创建监听端口 const port 3000 // 定义接口 app.get(/api/getData,(req,res) &g…

java 获取泛型T的class对象

问题描述 最近在封装es方法的时候遇到一个问题,就是泛型T怎么获取对应的class对象,代码如下: /*** Author: hrd* CreateTime: 2023/11/27 15:08* Description:*/ public interface IESIndex<R, P extends BaseModel> {/**** param p* param id 唯一ID* return*/IndexResp…

C#结合JavaScript实现多文件上传

目录 需求 引入 关键代码 操作界面 ​JavaScript包程序 服务端 ashx 程序 服务端上传后处理程序 小结 需求 在许多应用场景里&#xff0c;多文件上传是一项比较实用的功能。实际应用中&#xff0c;多文件上传可以考虑如下需求&#xff1a; 1、对上传文件的类型、大小…

风险评估是什么,为什么被称为保护网络安全的重要一环!

随着互联网的普及和信息技术的快速发展&#xff0c;网络已经成为人们生活和工作中不可或缺的一部分。然而&#xff0c;网络在为我们带来便利的同时&#xff0c;也存在着各种安全风险。因此&#xff0c;进行网络风险评估是保护网络安全的重要一环。而为什么说风险评估是保护网络…

2.2 C语言之常量

2.2 C语言之常量 一、常量 一、常量 类似于1234的整数常量属于int类型。 printf("%d\n", 1234);long类型的常量以l或L结尾 printf("%d\n", 123456789l);printf("%d\n", 123456789L);如果一个整数太大&#xff0c;以至于无法用int类型表示时&…

LINUX-ROS集成安装MQTT库步骤注意事项

环境信息 roottitan-ubuntu1:/home/mogo/data/jp/paho.mqtt.cpp# lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 18.04.5 LTS Release: 18.04 Codename: bionic 步骤 安装doxygen sudo apt install doxygen 构…

Tomcat从认识安装到详细使用

文章目录 一.什么是Tomact?二.Tomcat的安装1.下载安装包2.一键下载3.打开Tomcat进行测试4.解决Tomcat中文服务器乱码 三.Tomcat基本使用1.启动与关闭Tomcat2.Tomcat部署项目与浏览器访问项目 四.Tomcat操作中的常见问题1.启动Tomcat后&#xff0c;启动窗口一闪而过&#xff1f…

Day15——File类与IO流

1.java.io.File类的使用 1.1 File类的理解 File 类及本章下的各种流&#xff0c;都定义在 java.io 包下。一个 File 对象代表硬盘或网络中可能存在的一个文件或者文件目录&#xff08;俗称文件夹&#xff09;&#xff0c;与平台无关。&#xff08;体会万事万物皆对象&#xf…

金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞分析

文章目录 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞分析前言一、漏洞描述二、影响版本三、POC四、漏洞原理分析参考链接&#xff1a; 金山终端安全系统V9.0 update_software_info_v2.php处SQL注入漏洞分析 前言 免责声明&#xff1a;请勿利用文章内的相…