使用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汇编中,无论是寄存器、变量(常量)还是立即数,都是直接使用的,例如下列例子中分别加载一个变量(常量)与立即数到寄存器中:…...

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年的卷王之王,老油条感叹真干不过,但是...
在程序员职场上,什么样的人最让人反感呢? 是技术不好的人吗?并不是。技术不好的同事,我们可以帮他。 是技术太强的人吗?也不是。技术很强的同事,可遇不可求,向他学习还来不及呢。 真正让人反感的,是技术平平&…...

CSS 网页动画【快速掌握知识点】
目录 前言 一、使用CSS3动画 二、使用CSS过渡 三、使用CSS变换: 前言 CSS是一种用于网页设计和排版的语言,也可以用它来制作网页动画。 一、使用CSS3动画 CSS3引入了动画属性,允许您为元素设置动画效果。您可以使用关键帧来定义动画的开始…...

电脑技巧:分享六个非常实用的资源网站
今天小编给大家分享六个非常实用的资源网站,大家一起来看看吧! 1、高清壁纸:Wallhaven 一个免费的高清壁纸下载网站,里面的壁纸资源丰富,更新速度也快,各种类型的壁纸都能找到,尤其是动漫壁纸。…...

【Java基础 下】 027 -- 异常、File、综合案例
目录 一、异常 1、异常的分类 ①、Error ②、Exception ③、小结 2、编译时异常和运行时异常 ①、编译时异常 ②、运行时异常 ③、为什么异常要分成编译时异常和运行时异常? ④、小结(运行时异常和编译时异常的区别) 3、异常的作用 ①、查看b…...

教师管理系统的设计与实现
技术:Java、JSP等摘要:1.1 计算机管理教师的意义近年来,随着经济的发展,教育正面向着大型化、规模化的方向发展,教师数量急剧增加,有关教师的各种信息量也成倍增长。在这种情况下用计算机可使人们从繁重的劳…...

【Java】线程使用方式
(1)继承 Tread 类 继承Thread类,创建一个新的线程类重写run()方法,将需要并发执行的业务代码编写在run()方法中 //继承Thread来创建一个线程类 class MyThread extends Thread{Overridepublic void run(){System.out.println("hello Thread"…...

零基础想转行学习Python,该如何学习,有学习路线分享吗?(2023年给初学者的建议)
Python属于一种面向对象、解释性的高级语言,它如今在众多领域都被应用,包括操作系统管理、Web开发、服务器运维的自动化脚本、科学计算、桌面软件、服务器软件(网络软件)、游戏等方面,且Python在今后将被大规模地应用到大数据和人工智能方面。…...

IDEA Maven install Failed to execute goal org.apache.maven.plugins异常处理
目录一、异常错误二、原因三、解决方法修改pom.xml资源配置文件一、异常错误 由于服务器编译拦截了静态资源,导致出现异常,需要重新打包编译 打开IDEA带的Maven管理,双击clean清除由项目编译创建的target 再双击install安装jar包到本地仓库…...

TensorFlow-Keras - FM、WideAndDeep、DeepFM、DeepFwFM、DeepFmFM 理论与实战
目录 一.引言 二.浅层模型概述 1.LR 2.FM 3.FMM 4.FwFM 5.FmFM 三.常用推荐算法实现 Pre.数据准备 1.FM 2.WideAndDeep 3.DeepFM 4.DeepFwFM 5.DeepFmFM 四.总结 1.函数测试 2.函数效果与复杂度对比[来自FmFM论文] 3.More 一.引言 推荐系统中常见的 CTR 模型…...

Java浅析电信数据采集
技术:Java等摘要:电信运营系统中,电信计费系统是主要的支撑系统,占有重要地位。对于电信计费系统是电信运营商的核心竞争力之一这一观点愈来愈被业界认同。电信计费系统中的数据蕴含着企业经营态势、客户群分布特征及消费习惯、各…...

那些开发中需要遵守的产研开发规范
入职新公司第三天,没干啥其他活,基本在阅读产研开发规范。公司在技术方面沿用的是阿里的一套技术,所以入职之前需要先阅读《阿里巴巴开发规范》。今天整理一些平时需要关注的阿里规约和数据库开发规范,方便今后在开发过程中查阅。…...