python对tif数据重投影

一、不同投影坐标系的区别

地理坐标系(Geographic Coordinate System, GCS)和投影坐标系(Projected Coordinate System, PCS)是两种常见的坐标系统,它们在表示地理信息时有着不同的方式。以下是它们的主要区别:

1. 定义方式

  • 地理坐标系 (GCS)

    • 地理坐标系使用球面或椭球体上的经纬度(纬度和经度)来描述地球表面上的位置。

    • 纬度(Latitude)表示地球赤道平面上某点与赤道的角度,范围为 -90° 到 +90°。

    • 经度(Longitude)表示某点相对于本初子午线(零度经线)的角度,范围为 -180° 到 +180°。

    • GCS 是基于一个地球模型(通常是一个椭球体或球体),例如 WGS 84 或 NAD83。

    示例

    • WGS 84(EPSG:4326)

    • NAD83(EPSG:4269)

  • 投影坐标系 (PCS)

    • 投影坐标系则将地球的三维曲面转换为二维平面,使用平面坐标(通常是X和Y坐标)来描述位置。

    • 投影坐标系通常使用某种数学投影方式(如墨卡托投影、UTM投影等)将球面上的坐标转换为平面坐标系上的点。

    • 这类坐标系常常使用米、英尺或其他线性单位来表示距离。

    示例

    • UTM(Universal Transverse Mercator,EPSG:32633)

    • Web Mercator(EPSG:3857)

2. 表示方式

  • 地理坐标系

    • 坐标单位是角度(度,°),例如,经度和纬度。

    • 坐标系是三维的,描述地球表面上的位置。

    例如:WGS 84(纬度:40°N,经度:75°W)

  • 投影坐标系

    • 坐标单位通常是(m)或英尺(ft),并且是二维的坐标。

    • 它通过投影方法将地球表面(球面)投影到平面上,通常会失真。

    例如:UTM 区域 33N(X: 500000, Y: 4649776)

3. 使用场景

  • 地理坐标系

    • 地理坐标系适合用于全球范围内的应用,尤其是在需要精确表示位置时(例如 GPS 定位、全球范围的地图、气候模型等)。

    • 由于地球是一个三维的球体,地理坐标系能够更好地反映地球表面的真实情况。

    应用:GPS 定位、卫星数据、气象数据等。

  • 投影坐标系

    • 投影坐标系适合用于局部区域的地图和精确测量,特别是在需要计算距离、面积等物理量时。

    • 因为它是基于平面坐标,因此失真问题在大范围投影时会变得显著。为了减小失真,常常需要使用合适的投影方法和区域划分。

    应用:精确的地图制图、地籍调查、城市规划、地理分析等。

4. 转换关系

  • 地理坐标系通常用于表示全球位置,而投影坐标系适用于局部区域,因为平面上的坐标系统更适合测量短距离。

  • 从地理坐标系转换到投影坐标系(例如,从 WGS 84 转换到 UTM 坐标系)是常见的需求。转换时需要用到合适的投影算法,如墨卡托投影、横轴墨卡托投影等。

5. 优缺点

  • 地理坐标系的优点

    • 全球适用,不受局部区域影响。

    • 适合全球性的数据表示。

    • 缺点

      • 不适合做精确测量。

      • 对于局部区域的数据处理和分析来说,坐标单位(角度)不够直观,转换成平面坐标系后可以避免失真。

  • 投影坐标系的优点

    • 精确度较高,适用于局部区域的距离、面积和角度测量。

    • 方便绘制和分析地图。

    • 缺点

      • 只适用于较小范围的区域,投影过程中存在失真问题。

      • 不适用于全球数据的表示。

总结:

  • 地理坐标系:用于描述地球表面上的位置,坐标单位为经纬度(角度),适合全球范围内的数据。

  • 投影坐标系:将地球表面的三维坐标转换为二维平面坐标,坐标单位通常为米或英尺,适合局部区域的数据处理和测量。

这两种坐标系各有优势,通常在实际应用中,根据不同需求使用不同的坐标系统。

二、EPSG投影代码

EPSG(European Petroleum Survey Group)是一个全球地理信息系统(GIS)领域中广泛使用的坐标参考系统(CRS)代码标准。每个坐标参考系统(例如,地理坐标系统、投影坐标系统等)都有一个唯一的 EPSG 代码。

常见的 EPSG 代码示例:

  1. WGS 84 (全球定位系统标准)

    • EPSG:4326:这是一种地理坐标系统,使用经度和纬度来表示位置,通常与 GPS 和许多地理信息系统(GIS)应用程序兼容。

  2. UTM (Universal Transverse Mercator)

    • EPSG:32633:这是 UTM 投影系统中的一个常用区域,适用于东经6°至12°的区域(例如,德国地区)。

    • EPSG:32733:这是 UTM 投影系统中的另一区域,适用于南半球的相同经度范围。

  3. Web Mercator

    • EPSG:3857:这是在线地图服务(如 Google Maps、OpenStreetMap 和 Bing Maps)常用的投影坐标系,广泛应用于互联网地图。

  4. WGS 84 / Pseudo-Mercator

    • EPSG:4326:这种坐标系将地球的经纬度数据表示为度,并且经常用在地图投影中。

常见 CRS 类型:

  1. 地理坐标系统(Geographic Coordinate Systems):使用经度和纬度来描述地球上的位置,单位通常是度(°)。

    • 例如:EPSG:4326(WGS84)、EPSG:4269(NAD83)等。

  2. 投影坐标系统(Projected Coordinate Systems):使用平面坐标来描述位置,通常使用米或英尺作为单位。

    • 例如:EPSG:3857(Web Mercator)、EPSG:32633(UTM区33N)等。

如何查询 EPSG 代码?

你可以通过以下几种方式查找特定的 EPSG 代码:

  1. EPSG 官网:EPSG.io 提供了一个搜索工具,你可以通过输入坐标系统名称或相关信息来查找代码。

  2. GIS 软件:在 QGIS 或 ArcGIS 等地理信息软件中,你可以查看和选择不同的 EPSG 代码。

在 Python 中使用 EPSG 代码:

如果你使用 rasterio 或 pyproj 等库来处理地理数据,可以通过 EPSG 代码来指定坐标系统。

例如,使用 pyproj 定义投影坐标系:

from pyproj import CRS

# 定义 WGS 84 坐标系统
crs = CRS.from_epsg(4326)  # WGS 84
print(crs)


import rasterio
from rasterio.warp import calculate_default_transform

# 打开原始影像
with rasterio.open('input.tif') as src:
    # 设置目标坐标系统为 EPSG:4326 (WGS 84)
    transform, width, height = calculate_default_transform(
        src.crs, 'EPSG:4326', src.width, src.height, *src.bounds)
    print(transform, width, height)
三、一个例子

这里我展示一个利用python实现对tif的坐标转换

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Sat Nov 23 11:37:13 2024

@author: Chistrong wen
University of Stuttgart, Institute of Geodesy
"""


import rasterio
from rasterio.warp import calculate_default_transform, reproject, Resampling
import matplotlib.pyplot as plt
import numpy as np

# 打开原始影像
src_path = '/Users/chistrongwen/Downloads/SM_V3.0/SM_2016_10.tif'  # 输入影像的路径
dst_crs = 'EPSG:3857'  # 目标坐标系 (例如 WGS84)

with rasterio.open(src_path) as src:
    # 计算目标影像的坐标转换和新尺寸
    transform, width, height = calculate_default_transform(
        src.crs, dst_crs, src.width, src.height, *src.bounds)
    
    # 更新元数据,准备保存新的影像
    kwargs = src.meta.copy()
    kwargs.update({
        'crs': dst_crs,
        'transform': transform,
        'width': width,
        'height': height
    })
    
    # 创建一个数组来存储重新投影后的影像
    reprojected_image = np.zeros((height, width), dtype=np.float32)
    
    # 将重新投影后的数据保存到新的文件中
    with rasterio.open('reprojected_output.tif', 'w', **kwargs) as dst:
        for i in range(1, src.count + 1):  # 循环处理所有波段
            reproject(
                source=rasterio.band(src, i),
                destination=rasterio.band(dst, i),
                src_transform=src.transform,
                src_crs=src.crs,
                dst_transform=transform,
                dst_crs=dst_crs,
                resampling=Resampling.nearest)
    
    # 显示原始影像和重新投影后的影像
    with rasterio.open(src_path) as src:
        original_image = src.read(1)  # 读取第一个波段

    # 绘制图形:显示原始影像和重新投影后的影像
    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
    
    ax1.imshow(original_image, cmap='viridis')
    ax1.set_title('Original image')
    
    # 显示重新投影后的影像
    with rasterio.open('reprojected_output.tif') as reprojected_src:
        reprojected_image = reprojected_src.read(1)
    
    ax2.imshow(reprojected_image, cmap='viridis')
    ax2.set_title('reprojection (EPSG:4326)')
    
    plt.show()

我们可以看到投影前后的区别

❤️欢迎点赞收藏❤️

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

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

相关文章

Django+Nginx+uwsgi网站使用Channels+redis+daphne实现简单的多人在线聊天及消息存储功能

网站部署在华为云服务器上,Debian系统,使用DjangoNginxuwsgi搭建。最终效果如下图所示。 一、响应逻辑顺序 1. 聊天页面请求 客户端请求/chat/(输入聊天室房间号界面)和/chat/room_name(某个聊天室页面)链…

多目标粒子群优化(Multi-Objective Particle Swarm Optimization, MOPSO)算法

概述 多目标粒子群优化(MOPSO) 是粒子群优化(PSO)的一种扩展,用于解决具有多个目标函数的优化问题。MOPSO的目标是找到一组非支配解(Pareto最优解),这些解在不同目标之间达到平衡。…

oracle会话追踪

一 跟踪当前会话 1.1 查看当前会话的SID,SERIAL# #在当前会话里执行 示例: SQL> select distinct userenv(sid) from v$mystat; USERENV(SID) -------------- 1945 SQL> select distinct sid,serial# from v$session where sid1945; SID SERIAL# …

python 画图例子

目录 多组折线图点坐标的折线图 多组折线图 数据: 第1行为x轴标签第2/3/…行等为数据,其中第一列为标签,后面为y值 图片: 代码: import matplotlib.pyplot as plt# 原始数据字符串 # 第1行为x轴标签 # 第2/3/...行等为数据,其中第一列为标签,后面…

未来已来:少儿编程竞赛聚焦物联网,激发创新潜力

随着人工智能与物联网技术(IoT)的快速发展,少儿编程教育正在迎来新的变革浪潮。近年来,各类少儿编程竞赛纷纷增加了物联网相关主题,要求学生结合编程知识和硬件设备设计智能家居、智慧城市等创新项目。这一趋势不仅丰富…

Java-08 深入浅出 MyBatis - 多对多模型 SqlMapConfig 与 Mapper 详细讲解测试

点一下关注吧!!!非常感谢!!持续更新!!! 大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html 目前已经更新到了: MyBatis&#xff…

字符串专题 算法小题

感觉很久不做题了, 本身自己虽然就没水平就是啦哈哈~ 那下面分享几道最近写的几道题, 都很简单, 是关于"字符串"的, 只不过会稍微用到一点代码能力就是了, 算是比较基础的题目. 目录 1.最长公共区域(⭐⭐⭐ 代码)1.1 题目描述1.2 题目思路方法1: 两两求公共区域方法2…

虚拟化的三种方式

1.前言 Virtualization(虚拟化)是让公开的虚拟资源等同于被虚拟化的底层物理资源。虚拟化在各个领域应用很广泛,不局限于计算机科学领域。无论是在硬件、软件还是在嵌入式子系统中,虚拟化总是使用或组合三种简单的技术来实现的:多路复用(Mul…

使用yolov5查看模式标注情况

import cv2 from ultralytics import YOLO# 加载模型 model YOLO(E:\\yolov\\yolov9\\runs\\detect\\train4\\weights\\best.pt) # 替换为您的模型路径# 读取视频文件 cap cv2.VideoCapture(5.mp4) # 替换为您的视频文件路径# 定义输出视频的编码器和创建VideoWriter对象 f…

Rust 力扣 - 198. 打家劫舍

文章目录 题目描述题解思路题解代码题目链接 题目描述 题解思路 假设f(i)表示在[1, i]号内的房屋内进行偷盗能够获得的最高金额 存在递推公式 f(i) max(f(i - 1), f(i - 2) nums[i]) 即f(i)为选择i - 1号房屋的最大金额 和 选择i - 2号房屋的最大金额 的最大值 题解代码 …

Redis持久化、主从及哨兵架构详解

Redis持久化 RDB快照(snapshot) 在默认情况下,Redis将内存数据库快照保存在名字为dump.rdb的二进制文件中。 你可以对Redis进行设置,让它在“N秒内数据集至少有M个改动”这一条件被满足时,自动保存一次数据集。 比…

解决启动Tomcat时出现的乱码问题

日志乱码 日志乱码就是启动Tomcat时红色的字体出现乱码(下图没有乱码)。 解决方案 : 找到Tomcat的安装目录,点进conf目录 点进logging.properties文件 找到java.util.logging.ConsoleHandler.encoding字段,修改成GBK…

网络爬虫——常见问题与调试技巧

在开发网络爬虫的过程中,开发者常常会遇到各种问题,例如网页加载失败、数据提取错误、反爬机制限制等。以下内容将结合实际经验和技术方案,详细介绍解决常见错误的方法,以及如何高效调试和优化爬虫代码。 1. 爬虫过程中常见的错误…

初识Linux(3):Linux基础环境工具(上)

目录 1. yum 1.1 软件的生态 1.2 yum使用 2. vim 4. vim三种模式的更详细命令 5. gcc 6. 重要概念:函数库 7. 动态库与静态库 8. 自动化构建工具:make/Makefile .PHONY 9. make 与 是否执行 %通识符 生成两个可执行程序 10.练习 &#xff…

负载均衡在线OJ项目

OnlineJudge 前言所用技术开发环境 1. 需求分析2. 项目宏观结构3. compile_server服务设计3.1 compiler服务设计3.2 runner服务设计3.3 compile_run3.4 compile_server.cpp 4. oj_server服务设计4.1 model设计4.2 view设计4.3 control设计4.3.1 获取题目列表功能4.3.2 获取单个…

Kafka 分区分配及再平衡策略深度解析与消费者事务和数据积压的简单介绍

Kafka:分布式消息系统的核心原理与安装部署-CSDN博客 自定义 Kafka 脚本 kf-use.sh 的解析与功能与应用示例-CSDN博客 Kafka 生产者全面解析:从基础原理到高级实践-CSDN博客 Kafka 生产者优化与数据处理经验-CSDN博客 Kafka 工作流程解析&#xff1a…

使用argo workflow 实现springboot 项目的CI、CD

文章目录 基础镜像制作基础镜像设置镜像源并安装工具git下载和安装 Maven设置环境变量设置工作目录默认命令最终dockerfile 制作ci argo workflow 模版volumeClaimTemplatestemplatesvolumes完整workflow文件 制作cd argo workflow 模版Workflow 结构Templates 定义创建 Kubern…

进程间通信--详解

目录 前言一、进程间通信介绍1、进程间通信目的2、进程间通信发展3、进程间通信的分类4、进程间通信的必要性5、进程间通信的技术背景6、进程间通信的本质理解 二、管道1、什么是管道2、匿名管道pipe(1)匿名管道的原理(2)pipe函数…

【虚拟机】VMWare的CentOS虚拟机断电或强制关机出现问题

VMware 虚拟机因为笔记本突然断电故障了,开机提示“Entering emergency mode. Exit the shell to continue.”,如下图所示: 解决方法:输入命令: xfs_repair -v -L /dev/dm-0 注:报 no such file or direct…

FinalShell进行前端项目部署及nginx配置

首先需要准备服务器(阿里云、腾讯云都可)与域名; 示例为阿里云服务器; 1.进行FinalShell下载 下载官网 https://www.hostbuf.com/ 2.下载完毕后 配置FinalShell ssh ​ 名称自定义即可! 2-1 提示连接成功 ​ 3.首先检查nginx是否下载 …