使用rasterio计算tif文件中两点之间的物理实际距离

news2024/11/27 2:35:06

假设有一张含有地理坐标信息的tif格式的图片及其对应的jpg或者png格式的普通图片
如下图所示:
地理信息图

在这里插入图片描述
其中第一张为tif格式的地理信息图,第二张为按照一定比例下采样之后转换得到的普通jpg图片

如何计算jpg图片中任意两点之间的实际距离呢?
比如,计算图中间位置的桥的长度,也就是桥两个端点之间的距离

在tif图片中,如果我们知道了点的经纬度就可以使用geopy包中的geodesic函数计算两点间的距离
代码如下

from geopy.distance import geodesic
distance = geodesic((lat1,lon1), (lat2,lon2)).meters

其中lat1,lon1为第一个点的纬度和经度

所以问题的关键在于如何找到jpg图片中的点对应的经纬度
为了达到该目标需要经过3个步骤

步骤一

找到jpg中的点在图片中所在的相对图片宽和高的比例
代码如下:

import cv2 as cv
image = cv.imread('example.jpg')
h, w, c = image.shape
# 选取两个点
pick1_x, pick1_y = 2022, 2160
pick2_x, pick2_y = 1902, 2160
pick1_x_ratio, pick1_y_ratio = pick1_x/w, pick1_y/h
pick2_x_ratio, pick2_y_ratio = pick2_x/w, pick2_y/h

步骤二

按照比例找到两个点对应的tif图中的行与列
代码如下:

import rasterio
with rasterio.open(tif_file) as src:
	tmp_height = src.height  # 数据高度
    tmp_width = src.width  # 数据宽度
    pick1_col, pick1_row = int(pick1_x_ratio*tmp_width), int(pick1_y_ratio*tmp_height)
    pick2_col, pick2_row = int(pick2_x_ratio*tmp_width), int(pick2_y_ratio*tmp_height)

步骤三

将行列号转换为以地图单位(Map units)表示的坐标
代码如下:

with rasterio.open(tif_file) as src:
	pick1_lon_map, pick1_lat_map = src.xy(pick1_row, pick1_col)
    pick2_lon_map, pick2_lat_map = src.xy(pick2_row, pick2_col)

步骤四

将地图单位坐标转换为十进制度数(Decimal Degrees)坐标,
此处应注意使用的坐标系
代码如下:

import pyproj
import rasterio
with rasterio.open(tif_file) as src:
	# 定义源坐标系统和目标坐标系统(这里以 EPSG:4326 作为目标坐标系统,即 WGS84 经纬度坐标系统)
	src_proj = pyproj.Proj(src.crs)  # src.crs为获取到的tif图中的源坐标系统
    dst_proj = pyproj.Proj(init='EPSG:4326')
    print("picked points 坐标转换")
    pick1_long, pick1_latt = pyproj.transform(src_proj, dst_proj, pick1_lon_map, pick1_lat_map)
    pick2_long, pick2_latt = pyproj.transform(src_proj, dst_proj, pick2_lon_map, pick2_lat_map)

步骤五

根据十进制坐标,计算两点之间的距离
代码如下:

from geopy.distance import geodesic
# 纬度在前,经度在后
distance = geodesic((pick1_latt, pick1_long), (pick2_latt, pick2_long)).meters
print(f"选取的两点之间的距离:{distance} meters")

选取的两点为桥的两个端点,因此最终计算得到桥长为15.57米
在这里插入图片描述

整体代码如下:

import cv2 as cv
import rasterio
from geopy.distance import geodesic
import pyproj

# 打开图像文件
tif_file_path = 'path_to_tif_file'
jpg_file_path = 'path_to_jpg_file'

image = cv.imread(jpg_file_path)
h, w, c = image.shape

# 打开TIFF文件
with rasterio.open(tif_file_path) as src:
    # 选取桥头两个点
    pick1_x, pick1_y = 2022, 2160
    pick2_x, pick2_y = 1902, 2160

    tmp_height = src.height  # 数据高度,行数
    tmp_width = src.width  # 数据宽度,列数

    # step1 and step2: 计算两点所占比例及其在tif中对应的行列号
    pick1_col, pick1_row = int(pick1_x*tmp_width/w), int(pick1_y*tmp_height/h)
    pick2_col, pick2_row = int(pick2_x*tmp_width/w), int(pick2_y*tmp_height/h)
    
    # step3: 计算对应的地图单位坐标
    print("picked point 经纬度")
    pick1_lon, pick1_lat = src.xy(pick1_row, pick1_col)
    pick2_lon, pick2_lat = src.xy(pick2_row, pick2_col)
    print("pick1经纬度:", pick1_lon, ' ', pick1_lat)
    print("pick2经纬度:", pick2_lon, ' ', pick2_lat)


    # 定义源坐标与目标坐标系统(这里以 EPSG:4326 作为目标坐标系统,即 WGS84 经纬度坐标系统)
    src_proj = pyproj.Proj(src.crs)
    dst_proj = pyproj.Proj(init='EPSG:4326')

    # step 4: 将地图单位坐标转为十进制经纬度坐标
    print("picked points 坐标转换")
    pick1_long, pick1_latt = pyproj.transform(src_proj, dst_proj, pick1_lon, pick1_lat)
    pick2_long, pick2_latt = pyproj.transform(src_proj, dst_proj, pick2_lon, pick2_lat)
    print(f"第一个点经纬度:{pick1_long}  {pick1_latt}")
    print(f"第二个点经纬度:{pick2_long}  {pick2_latt}")

    # step5: 计算两点之间的距离
    distance = geodesic((pick1_latt, pick1_long), (pick2_latt, pick2_long)).meters
    print(f"选取的两点之间的距离:{distance} meters")

还有一个转换值得关注,
即行列号与地图单位坐标之间的互相转换
代码如下:

import rasterio
with rasterio.open(tif_file) as src:
	# 行列号转地图单位坐标
	lon_map, lat_map = src.xy(row, col)
	# 地图单位坐标转行列号
	row, col = src.index(lon_map, lat_map)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

终于等到你:期待已久的CAD .NET 15 Crack

期待已久的CAD .NET 15 现已推出!新包包括一个.NET 6 框架构建。目前,它仅与 Windows 兼容,但我们计划在未来的版本中添加对 Linux 的支持。 我们还进行了一系列更改以增强库的稳定性并改进其导入和导出功能。他们来了: 改进了 DW…

Scala--03

第6章 面向对象 Scala 的面向对象思想和Java 的面向对象思想和概念是一致的。 Scala 中语法和 Java 不同,补充了更多的功能。 6.1类和对象详解 6.1.1组成结构 构造函数: 在创建对象的时候给属性赋值 成员变量: 成员方法(函数) 局部变量 代码块 6.1.2构造器…

详解c++---map的介绍

目录标题 map容器的介绍pair的介绍map的构造函数insert函数make_pair函数find函数map的[ ]重载multimap map容器的介绍 通过之前的学习想必大家对set容器的理解应该非常的深刻了,我们知道他的底层是一个k结构的搜索二叉树,可以对数据进行去重并排序&…

Redis实现分布式锁详解

Redis实现分布式锁详解 一 分布式锁简介二 Redis实现分布式锁核心思路三 Redis实现分布式锁实践3.1 锁的基本接口3.2 加锁解锁逻辑3.3 修改业务逻辑3.4 单元测试观察结果 四 Redis分布式锁误删情况4.1.Redis分布式锁误删情况逻辑说明:4.2 解决Redis分布式锁误删问题…

当心健身跑步应用悄悄泄露用户住址

据BleepingComputer 6月11日消息,美国北卡罗来纳州立大学罗利分校的研究人员发现 Strava 应用程序的热图功能存在隐私风险,可能导致攻击者识别出用户的家庭住址。 Strava 是一款流行的跑步伴侣和健身追踪应用程序,在全球拥有超过 1 亿用户&a…

2个月“我“从功能测试进阶到自动化测试,offer收到麻了...

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 自动化测试是将人…

C++【STL】之vector模拟实现

C vector类模拟实现 上一篇讲解了vector的使用,这一篇接着介绍vector的模拟实现,这里依然是讲解常用接口的模拟实现,话不多说,正文开始! 文章目录: C vector类模拟实现1. 成员变量2. 默认成员函数2.1 构造…

使用lcov生成覆盖率报告

使用lcov生成覆盖率报告 1- 需要准备的东西1.1 工具lcov1.2 需要用到中间脚本 gcno gcda1.3 源文件 2- 生成覆盖率报告2.1 step1: 编译阶段2.2 step2: 数据收集与提取阶段2.3 step3: 报告形成阶段2.4 step4: lcov生成覆盖率报告结果info文件2.5 step5: genhtml 命令生成网页版的…

给定一个字符串比如“abcdef”,要求写个函数变成“defabc”,位数是可变的。

首先可以使用字符串切片的方法来实现这个需求。 具体做法是:① 定义一个整数变量 n 表示要切割的位置,本实例中为 3 。 ② 将字符串按照 n 分割成两个字串,即 “abc” 和 “def”。 ③ 将两个字符串颠倒顺序,即 “cba” 和 “fed…

数据结构 栈和队列

栈和队列基本概念 栈(Stack)和队列(Queue)都是常见的数据结构,用于存储和操作一组元素。它们在结构和操作方式上有所不同。 栈的基本概念: 栈是一种线性数据结构,具有后进先出(L…

CentOS GCC 离线升级 编译安装 8.3.0

从系统自带的 gcc-4.8.5 版本升级至 gcc-8.3.0 版本 目录 下载源代码: 下载依赖: 编译(约一个小时) 重开控制台确认是否生效 下载源代码: https://ftp.gnu.org/gnu/gcc/gcc-8.3.0/gcc-8.3.0.tar.gzhttps://ftp.gn…

Nacos和Feign

Nacos配置管理 统一配置管理实现 1.引入Nacos的配置管理客户端依赖 <!--nacos的配置管理依赖--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency…

国产开源中文大语言模型再添重磅玩家:清华大学NLP实验室发布100亿参数规模的开源可商用大语言模型CPM-Bee

5月27日&#xff0c;OpenBMB发布了一个最高有100亿参数规模的开源大语言模型CPM-BEE&#xff0c;OpenBMB是清华大学NLP实验室联合智源研究院成立的一个开源组织。该模型针对高质量中文数据集做了训练优化&#xff0c;支持中英文。根据官方的测试结果&#xff0c;其英文测试水平…

Python零基础入门(二)——IDE介绍以及Python+PyCharm的安装

系列文章目录 个人简介&#xff1a;机电专业在读研究生&#xff0c;CSDN内容合伙人&#xff0c;博主个人首页 Python入门专栏&#xff1a;《Python入门》欢迎阅读&#xff0c;一起进步&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 码字不易&#xff0c;如果觉得文章不…

docker容器介绍及安装

Docker介绍 Docker 起源于2013年。 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go语言开发&#xff0c;Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的系统。 优点&#xff1a; 可以用来快速交付应用。加…

SQL 的window开窗函数简单使用

背景&#xff1a; 开窗函数不论是spark的还是clickhouse的在日常的查询中是一个很常用的功能&#xff0c;特别是他想要解决的问题和group by的很类似&#xff0c;这两种容易引起混淆&#xff0c;本文就简单的描述下开窗函数的简单用法 使用详解 首先窗口函数和group by是完全…

caj文件在线转换成pdf方法,看这个就会了!

当需要将Caj文件转换为PDF格式时&#xff0c;有多种方法可供选择。本文将介绍三种常用的方法&#xff0c;以帮助您完成这个任务。 第一种方法&#xff1a;使用记灵在线工具 一种常用的方法是利用记灵在线工具&#xff0c;它是一款提供免费文件转换服务的在线工具。以下是使用…

消息队列RabbitMQ

1. 消息队列 RabbitMQ 消息队列是一种在应用程序之间发送和接收消息的方法&#xff0c;可以实现异步通信、解耦应用、提高系统性能等效果。RabbitMQ 是一款常用的开源消息中间件&#xff0c;它实现了 AMQP 协议规范&#xff0c;并提供了可靠性、灵活性、易用性等优秀特性。本文…

DBSyncer安装_配置postgresql和mysql_sqlserver_oracel全量增量同步---数据全量增量同步之DBSyncer001

国内做开源的大神做的,用了一下还可以,就是不能和Phoenix这种操作hbase等数据库一起用, https://gitee.com/ghi/dbsyncer#postgresql 这个是官网,下载安装非常简单,官网也有中文详细说明. 直接下载安装包: 然后解压到某个地方,主要要用unzip dbsyncer.zip -d /opt/module这样…

干翻Mybatis源码系列之第十篇:Mybatis拦截器基本开发、使用和细节分析

给自己的每日一句 不从恶人的计谋&#xff0c;不站罪人的道路&#xff0c;不坐亵慢人的座位&#xff0c;惟喜爱耶和华的律法&#xff0c;昼夜思想&#xff0c;这人便为有福&#xff01;他要像一棵树栽在溪水旁&#xff0c;按时候结果子&#xff0c;叶子也不枯干。凡他所做的尽…