当前位置: 首页 > news >正文

使用GDAL进行坐标转换

1、地理坐标系与投影坐标系

空间参考中主要包含大地水准面、地球椭球体、投影坐标系等几部分内容。地图投影就是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方法,一般有两种坐标系来进行表示,分别是地理坐标系和投影坐标系。如下图所示,描述了地理坐标系与投影坐标系之间的关系。

图1 地理坐标与投影坐标关系

地理坐标系即球体坐标,投影坐标即投影后的平面坐标;常见的地理坐标GPS坐标,常见的投影坐标墨卡托投影。

常用的坐标系为地理坐标系(Geograpic Coordinate System,简称GCS)和投影坐标系(Projected Coordinate System,简称PCS)。

1.1、地理坐标系统

地理坐标系统(GCS)用一个三维的球面来确定地物在地球上的位置,地面点的地理坐标有经度、纬度、高程构成。地理坐标系统与选择的地球椭球体和大地基准面有关。椭球体定义了地球的形状,而大地基准面确定了椭球体的中心。

  地理坐标系 (GCS) 使用三维球面来定义地球上的位置。GCS中的重要参数包括角度测量单位、本初子午线和基准面(基于旋转椭球体)。地理坐标系统中用经纬度来确定球面上的点位,经度和纬度是从地心到地球表面上某点的测量角。球面系统中的水平线是等纬度线或纬线,垂直线是等经度线或经线。这些线包络着地球,构成了一个称为经纬网的格网化网络。

GCS中经度和纬度值以十进制度为单位或以度、分和秒 (DMS) 为单位进行测量。纬度值相对于赤道进行测量,其范围是 -90°(南极点)到 +90°(北极点)。经度值相对于本初子午线进行测量。其范围是 -180°(向西行进时)到 180°(向东行进时)。

1.2、投影坐标系统

投影坐标系统是根据某种映射关系,将地理坐标系统中由经纬度确定的三维球面坐标投影到二维的平面上所使用的坐标系统。在该坐标系统中,点的位置是由(x,y,z)坐标来确定的。由于投影坐标是将球面展会在平面上,因此不可避免会产生变形。这些变形包括3种:长度变形、角度变形以及面积变形。通常情况下投影转换都是在保证某种特性不变的情况下牺牲其他属性。根据变形的性质可分为等角投影、等面积投影等。

我国的基本比例尺地形图(1:5千,1:1万,1:2.5万,1:10万,1:25万,1:50万,1:100万)中,大于或等于1:50万均采用高斯-克吕格投影(Gauss_Kruger),又叫横轴墨卡托投影(Transverse Mercator);1:100万的地形图采用正轴等角圆锥投影,又叫兰勃特投影(Lambert Conformal Conic);海上小于50万的地形图多用正轴等角圆柱投影,又叫墨卡托投影(Mercator)。在开发GIS系统中应该采用与我国基本比例尺地形图系列一致的地图投影系统。

2、坐标系转换

根据参考文章,封装成一个类使用。

import numpy as np
from osgeo import gdal, osrclass GdalTif(object):def __init__(self, tif_path):self.tif_path = tif_pathself.dataset = self._read_tif(tif_path)@staticmethoddef _read_tif(tif_path):""" 读取GDAL地理数据:param tif_path: tif图像路径:return: GDAL地理数据"""dataset = gdal.Open(tif_path)if dataset is None:print(tif_path + " 文件无法打开")return datasetdef get_geo_trans(self):""" 获取仿射矩阵信息:return: 仿射矩阵信息有六个参数,描述的是栅格行列号和地理坐标之间的关系:(0:左上角横坐标(投影坐标,经度);1:像元宽度,影像东西/水平方向分辨率;2:行旋转,如果图像北方朝上,该值为0;3:左上角纵坐标(投影坐标,纬度);4:列旋转,如果图像北方朝上,该值为0;5:像元高度,影像南北/垂直方向分辨率;)如果图像不含地理坐标信息,默认返回值是:(0,1,0,0,0,1)"""return self.dataset.GetGeoTransform()def get_projection(self):""" 获取数据投影信息:return: INFO"""return self.dataset.GetProjection()def get_srs_pair(self):""" 获得给定数据的投影参考系和地理参考系:param dataset: GDAL地理数据:return: 投影参考系和地理参考系"""prosrs = osr.SpatialReference()prosrs.ImportFromWkt(self.dataset.GetProjection())geosrs = prosrs.CloneGeogCS()return prosrs, geosrsdef imagexy2geo(self, row, col):""" 根据GDAL的六参数模型将影像图上坐标(行列号)转为投影坐标或地理坐标(根据具体数据的坐标系统转换):param dataset: GDAL地理数据:param row: 像素的行号(i):param col: 像素的列号(j):return: 行列号(row, col)对应的投影坐标或地理坐标(x, y) - WGS84"""trans = self.dataset.GetGeoTransform()x = trans[0] + col * trans[1] + row * trans[2]y = trans[3] + col * trans[4] + row * trans[5]return (x, y)def geo2imagexy(self, x, y):""" 根据GDAL的六 参数模型将给定的投影或地理坐标转为影像图上坐标(行列号):param x: 投影或地理坐标x:param y: 投影或地理坐标y:return: 影坐标或地理坐标(x, y)对应的影像图上行列号(row, col)"""trans = self.dataset.GetGeoTransform()a = np.array([[trans[1], trans[2]], [trans[4], trans[5]]])b = np.array([x - trans[0], y - trans[3]])return np.linalg.solve(a, b)[::-1]  # 使用numpy的linalg.solve进行二元一次方程的求解def geo_to_lonlat(self, x, y):""" 将投影坐标转为经纬度坐标(具体的投影坐标系由给定数据确定):param x: 投影坐标x:param y: 投影坐标y:return: 投影坐标(x, y)对应的经纬度坐标(lon, lat)"""prosrs, geosrs = self.get_srs_pair()ct = osr.CoordinateTransformation(prosrs, geosrs)coords = ct.TransformPoint(x, y)return coords[:2]def lonlat2geo(self, lon, lat):""" 将经纬度坐标转为投影坐标(具体的投影坐标系由给定数据确定):param dataset: GDAL地理数据:param lon: 地理坐标lon经度:param lat: 地理坐标lat纬度:return: 经纬度坐标(lon, lat)对应的投影坐标"""prosrs, geosrs = self.get_srs_pair()ct = osr.CoordinateTransformation(geosrs, prosrs)coords = ct.TransformPoint(lon, lat)return coords[:2]def main():tif_file = r"C:\Users\i\Desktop\dsm.tif"gda = GdalTif(tif_file)print("数据投影信息:", gda.get_projection())pt = (300, 500)print("pt = ", pt)print("图上坐标 -> 投影坐标:")point = gda.imagexy2geo(*pt)print("WGS84 point:", point)print("投影坐标 -> 图上坐标:")pt = gda.geo2imagexy(*point)print("pixel pt:", pt)print("投影坐标 -> 经纬度:")coord = gda.geo_to_lonlat(*point)print("gps coord:", coord)print("经纬度 -> 投影坐标:")point = gda.lonlat2geo(*coord)print("point:", point)if __name__ == '__main__':main()

测试结果:

数据投影信息: PROJCS["CGCS2000 / 3-degree Gauss-Kruger CM 111E",GEOGCS["China Geodetic Coordinate System 2000",DATUM["China_2000",SPHEROID[
"CGCS2000",6378137,298.257222101,AUTHORITY["EPSG","1024"]],AUTHORITY["EPSG","1043"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["d
egree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4490"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_orig
in",0],PARAMETER["central_meridian",111],PARAMETER["scale_factor",1],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["
metre",1,AUTHORITY["EPSG","9001"]],AXIS["Northing",NORTH],AXIS["Easting",EAST],AUTHORITY["EPSG","4546"]]
pt =  (300, 500)
图上坐标 -> 投影坐标:
WGS84 point: (402657.7898284429, 2052764.045716705)
投影坐标 -> 图上坐标:
pixel pt: [300. 500.]
投影坐标 -> 经纬度:
gps coord: (3.535317397929979, 124.8387146988415)
经纬度 -> 投影坐标:
point: (402657.78982844297, 2052764.0457167062)

参考文章:

1、谈谈地理坐标和投影坐标

http://www.360doc.com/content/22/1214/01/65719465_1060178233.shtml

相关文章:

使用GDAL进行坐标转换

1、地理坐标系与投影坐标系空间参考中主要包含大地水准面、地球椭球体、投影坐标系等几部分内容。地图投影就是把地球表面的任意点,利用一定数学法则,转换到地图平面上的理论和方法,一般有两种坐标系来进行表示,分别是地理坐标系和…...

日常编程中和日期相关的代码和bug

本文主要是Java中和日期时间相隔的几个常用代码函数代码,做了总结,希望在日常编码中,可以帮到大家。 1.计算闰年 记住一个短语,“四年一润,百年不闰,四百再润”,不管换啥语言,相信…...

ATT与Intel汇编语法区别

寄存器、变量(常量)与立即数 在Intel汇编中,无论是寄存器、变量(常量)还是立即数,都是直接使用的,例如下列例子中分别加载一个变量(常量)与立即数到寄存器中&#xff1a…...

Spring Cloud Alibaba全家桶(一)——Spring Cloud Alibaba介绍

前言 本文为 Spring Cloud Alibaba介绍 相关知识,下边将对微服务介绍(包括:系统架构演变、微服务架构介绍、常见微服务架构),Spring Cloud Alibaba介绍(包括:Spring Cloud Alibaba 的定位、Spri…...

2023年网红营销10大趋势解读:品牌出海必看

前不久influencermarketinghub发布了《2023年影响者营销基准报告》,报告总结了3500多家营销机构、品牌和其他相关专业人士对当前网红营销现状的看法,以及预测了未来网红营销的一个发展趋势。本期Nox聚星就带领大家详细解读关于2023年网红营销的10大趋势。…...

Java学习笔记 --- 正则表达式

一、体验正则表达式 package com.javase.regexp;import java.util.regex.Matcher; import java.util.regex.Pattern;/*** 体验正则表达式,给文本处理带来哪些便利*/ public class Regexp_ {public static void main(String[] args) {//假设,编写了爬虫&…...

【基础算法】字符串哈希

🌹作者:云小逸 📝个人主页:云小逸的主页 📝Github:云小逸的Github 🤟motto:要敢于一个人默默的面对自己,强大自己才是核心。不要等到什么都没有了,才下定决心去做。种一颗树,最好的时间是十年前…...

unity 多个模型或物体无限循环拖拽 类似无限列表循环

using System.Collections; using System.Collections.Generic; using UnityEngine; public class ModelAnimal : MonoBehaviour { //需滑动的物体 public GameObject m_objA; //音乐 public GameObject m_objB; //电话 public GameObject m_objC; //导航 public GameObject m…...

GroupDocs.Merger for Java

GroupDocs.Merger for Java GroupDocs.Merger for Java是一个文档操作API,可帮助您合并、拆分、交换或删除文档页面。API通过启用或禁用密码提供保护,并允许开发人员加入PDF、Microsoft Word、Excel和Powerpoint文档。 支持的文件格式 Microsoft Office格…...

04--WXML

1、什么是WXML什么是Wxml呢?我们首先要介绍一下Html,Html的全称为HyperTextMarkup Language,翻译过来就是超文本标记语言,这种语言目前已经普遍用于前端开发,而wxml正是从html演变而来,它基于微信这个平台&…...

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (五)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…...

每月一书(202302)《狂飙》

文章目录剧情内容观看收获正菜很硬配菜很足食物还有喻义又到了每月一书的时间,本月没有阅读书籍,不过看了一部叫《狂飙》的电视剧,因为该电视剧热度高,所以我也凑个热闹。下面分享一下我看完后的体会。 剧情内容 这是一部扫黑和…...

wsl2 docker 安装

一. 更换镜像源 备份默认源: cp /etc/apt/sources.list /etc/apt/sourses.list.bak 编辑文件: vim /etc/apt/sources.list 删除原有内容并替换为: # 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释 deb …...

极光笔记 | 埋点体系建设与实施方法论

PART 01 前 言随着网络技术的发展,从粗犷型到精细化运营型,再到现在的数字化运营,数据变得越来越细分和重要,不仅可以进行策略调整,还可以实现自动化的精细化运营。而数据价值的起点就是埋点,只有合理地埋点…...

SpringMVC中的各注解类理解

目录 一、概念 二、springmvc注解详解 (一)控制层注解 1.Controller 2.RequestMapping 3.ResponseBody (二)配置类(bean类)注解 4.configuration 5.Bean 一、概念 在学习springmvc的时候&#x…...

DNF搭建服务器服务端搭建教程

DNF搭建服务器服务端搭建教程 我是艾西,今天给大家分享下怎么样自己搭建一个DNF。 前阵子体验了下其他GM搭建的服,那么对于自己搭建的好处在于出道即巅峰! 想要什么武器就是一串代码命令的事情。 下面我跟大家说一下需要准备那些东西&#x…...

【论文简述】Learning Optical Flow with Adaptive Graph Reasoning(AAAI 2022)

一、论文简述 1. 第一作者:Haofei Xu 2. 发表年份:2022 3. 发表期刊:AAAI 4. 关键词:光流、图神经网络、自适应 5. 探索动机:现有光流估计方法主要解决基于特征相似性的匹配问题,少有工作研究如何显式…...

qt QCustomPlot学习

QCustomPlot 是一个基于Qt的画图和数据可视化C控件。QCustomPlot 致力于提供美观的界面,高质量的2D画图、图画和图表,同时为实时数据可视化应用提供良好的解决方案。 该绘图库专注于制作美观、出版物质量高的2D绘图、图形和图表,并为实时可视…...

【HDFS】FsDatasetImpl系列文章(七):finalizeBlock方法和unfinalizeBlock方法

一、finalizeBlock 1.1 调用点&调用场景 主要用于完成block的写入。调用点有两处: ① BlockReceiver#receiveBlock方法里: 这个调用场景发生在:datanode在所有的packet都接收完了之后,如果是数据复制、balancer、或者stage是TRANSFER_FINALIZED的情况下,调用finaliz…...

测试部门来了个99年的卷王之王,老油条感叹真干不过,但是...

在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…...

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…...

uniapp 对接腾讯云IM群组成员管理(增删改查)

UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习(Reinforcement Learning, RL)是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程,然后使用强化学习的Actor-Critic机制(中文译作“知行互动”机制),逐步迭代求解…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

Linux离线(zip方式)安装docker

目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...

基于Java+MySQL实现(GUI)客户管理系统

客户资料管理系统的设计与实现 第一章 需求分析 1.1 需求总体介绍 本项目为了方便维护客户信息为了方便维护客户信息,对客户进行统一管理,可以把所有客户信息录入系统,进行维护和统计功能。可通过文件的方式保存相关录入数据,对…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战

说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象: android studio报错: [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决: 不要动CMakeLists.…...