GDAL坐标转换六参的使用方法
https://blog.csdn.net/ivan_ljf/article/details/9175857
GDAL六参坐标转换是一种二维坐标转换的参数,常在GDALDataset 类中的CPLErr SetGeoTransform( double* padfTransform )使用;下面让我们先来谈论一下二维的仿射变换。
仿射变换变换公式:
展开形式:
x’,y’为目标坐标,x,y为原始坐标,dx,dy为平移参数。A为存储用于绕(dx,dy)旋转,和x,y方向的拉伸比例参数。
与GDAL坐标转换六参的对应:
double *dfGeoTransform = new double[6];
dfGeoTransform[0] = dx;
dfGeoTransform[1] = a11;
dfGeoTransform[2] = a12;
dfGeoTransform[3] = dy;
dfGeoTransform[4] = a21;
dfGeoTransform[5] = a22;
初始化时,A为2×2的单位矩阵,dx = dy = 0.0;
即dfGeoTransform[] = {0.0,1.0,0.0,0.0,0.0,1.0};
坐标平移:
dx = dx + xtranslation;
dy = dy + xtranslation;
坐标旋转:
坐标缩放:
下面来个示例:
#include "ogrsf_frmts.h"
#include "stdio.h"
#include <iostream>
#include <string>
using namespace std;// 定义坐标转换器
class GeoTransform
{
public:GeoTransform(){// 初始化六参数dfGeoTransform[0] = 0.0;dfGeoTransform[1] = 1.0;dfGeoTransform[2] = 0.0;dfGeoTransform[3] = 0.0;dfGeoTransform[4] = 0.0;dfGeoTransform[5] = 1.0;}~GeoTransform(){}// 设置平移void SetTranslate(const double dx, const double dy){dfGeoTransform[0] += dx;dfGeoTransform[3] += dy;}// 设置旋转角度void SetRotate(const double dangle){dfGeoTransform[1] = dfGeoTransform[1] * cos(dangle) + dfGeoTransform[2] * sin(dangle);dfGeoTransform[2] = - dfGeoTransform[1] * sin(dangle) + dfGeoTransform[2] * cos(dangle);dfGeoTransform[4] = dfGeoTransform[4] * cos(dangle) + dfGeoTransform[5] * sin(dangle);dfGeoTransform[5] = - dfGeoTransform[4] * sin(dangle) + dfGeoTransform[5] * cos(dangle);}// 设置x,y方向缩放比例void SetScale(const double xScale, const double yScale){dfGeoTransform[1] = dfGeoTransform[1] * xScale;dfGeoTransform[2] = dfGeoTransform[2] * yScale;dfGeoTransform[4] = dfGeoTransform[4] * xScale;dfGeoTransform[5] = dfGeoTransform[5] * yScale;}// 转换坐标OGRPoint Transform(const double dx, const double dy){double x, y;x = dfGeoTransform[0]+ dx * dfGeoTransform[1] + dy * dfGeoTransform[2];y = dfGeoTransform[3]+ dx * dfGeoTransform[4] + dy * dfGeoTransform[5];return OGRPoint(x,y);}private:double dfGeoTransform[6];
};int main()
{const char *pszDriverName = "DXF";OGRSFDriver *poDriver;RegisterOGRDXF();CPLSetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");CPLSetConfigOption("GDAL_DATA", "C:\\GDAL\\data"); //改了这句话就对了:OGR创建DXF格式需要data文件夹下的head.dxf,所以首先要设置GDAL_DATA的目录。poDriver = OGRSFDriverRegistrar::GetRegistrar()->GetDriverByName(pszDriverName );if( poDriver == NULL ){printf( "%s driver not available.\n", pszDriverName );exit( 1 );}OGRDataSource *poDS;const char* pszFileName="out.dxf";poDS = poDriver->CreateDataSource( pszFileName, NULL );if( poDS == NULL ){printf( "Creation of output file failed.\n" );exit( 1 );}OGRLayer *poLayer;poLayer = poDS->CreateLayer( "out", NULL, wkbUnknown, NULL );if( poLayer == NULL ){printf( "Layer creation failed.\n" );exit( 1 );}OGRFeature *poFeature = OGRFeature::CreateFeature( poLayer->GetLayerDefn() );// 原始矩形OGRLinearRing oSquare;oSquare.addPoint(2.0,2.0);oSquare.addPoint(4.0,2.0);oSquare.addPoint(4.0,3.0);oSquare.addPoint(2.0,3.0);oSquare.closeRings();poFeature->SetGeometry( &oSquare );if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ){printf( "Failed to create feature in dxffile.\n" );exit( 1 );}// 定义转换器GeoTransform geoTransform;// 平移geoTransform.SetTranslate(2.0,3.0);// 旋转geoTransform.SetRotate(2);// 缩放比例geoTransform.SetScale(2.0,3.0);// 转换坐标之后的矩形OGRLinearRing oSquare2;oSquare2.addPoint(&geoTransform.Transform(2.0,2.0));oSquare2.addPoint(&geoTransform.Transform(4.0,2.0));oSquare2.addPoint(&geoTransform.Transform(4.0,3.0));oSquare2.addPoint(&geoTransform.Transform(2.0,3.0));oSquare2.closeRings();poFeature->SetGeometry( &oSquare2 );if( poLayer->CreateFeature( poFeature ) != OGRERR_NONE ){printf( "Failed to create feature in dxffile.\n" );exit( 1 );}OGRFeature::DestroyFeature( poFeature );OGRDataSource::DestroyDataSource( poDS );
}
GDAL坐标转换六参的使用方法相关推荐
- 机器学习调参自动优化方法
本文旨在介绍当前被大家广为所知的超参自动优化方法,像网格搜索.随机搜索.贝叶斯优化和Hyperband,并附有相关的样例代码供大家学习. 一.网格搜索(Grid Search) 网格搜索是暴力搜索,在 ...
- 针对高分辨率雷达和相机的无标定板的像素级外参自标定方法
介绍:固态激光雷达和相机的外参标定系统 摘要 这是今年的一篇针对高分辨率的固态激光雷达(非重复性扫描型)或者多线的激光雷达和相机在无标定板的环境中自动化外参标定的一篇文章.本文的方法不需要基于巧克力板 ...
- 张驰课堂:企业如何利用六西格玛设计DFSS方法研发新产品
六西格玛设计DFSS作为六西格玛管理核心方法系统之一,六西格玛设计DFSS的应用绝不仅仅局限于对现有业务流程的再造,而且还广泛应用于新的产品或服务流程的设计,它是六西格玛管理战略实施的最高境界.作为一 ...
- 软件工程学习笔记——第六章 软件设计方法
目录 第一章 概述 第二章 过程和活动 第三章 软件过程模型 第四章 问题定义和可行性研究方法 第五章 需求分析方法-1 第五章 需求分析方法-2 第六章 软件设计方法 第七章 软件实施与测试方法 第 ...
- node.js取参四种方法req.body,req.params,req.param,req.body
node.js取参四种方法req.body,req.params,req.param,req.body 参考:https://my.oschina.net/u/2519530/blog/535309 ...
- Java抽象类中,普通方法依赖抽象方法时,抽象方法有入参的实现方法
学些Java的抽象类和抽象方法,书中介绍一个例子: [问题描述]编写一个抽象父类SpeedMeter速度表,提供普通方法getSpeed()计算速度,给子类使用,但留给子类实现抽象方法getRadiu ...
- url传参 获取参数方法
url传参 获取参数方法 //调用const infos = this.getQuery(); //该方法返回一个对象 key 为所传参数名 value 参数值getQuery(key) {var s ...
- jfinal ajax传值,JFINAL+Ajax传参 array 数组方法 获取request中数组操作
前台代码js var _list =[]; for (var i = 0; i < array.length; i++) { _list[i] = array[i]; } $.ajax({ ty ...
- gdal坐标转换总结(转换)
转自https://blog.csdn.net/qq_32657025/article/details/80176520 首先,在进行坐标转换之前,有必要先了解一下有关坐标系的几个基本概念. 地理坐标 ...
- CUDA(六). 从并行排序方法理解并行化思维——冒泡、归并、双调排序的GPU实现
在第五讲中我们学习了GPU三个重要的基础并行算法: Reduce, Scan 和 Histogram,分析了 其作用与串并行实现方法. 在第六讲中,本文以冒泡排序 Bubble Sort.归并排序 M ...
最新文章
- 云南计算机应用技术专科学校排名,2021年云南十大专科学校排名 云南最好的高职院校...
- halcon知识:对空图像的系列操作
- 深度学习入门笔记系列 ( 二 )——基于 tensorflow 的一些深度学习基础知识
- perl脚本执行linux命令行,Perl调用shell命令方法小结
- php js offset,获取元素的偏移量offset实例详解
- 2016年4月20日作业
- 题目242-计算球体积
- Python软件包的安装(3种方法)
- c语言如何命名开根号函数,c++开根号函数?
- 手机测试移动网速的软件,移动测试网速(中国移动在线测速)
- ssh介绍和使用--SecureCRT工具和ssh命令使用,以及sshd配置
- 用css和HTML做loding小动画
- Unity Android 加载Sprite
- office正在更新,请稍后(无法正常启动,错误0xc0000142)
- 新颖的 USB HUB快充方案助您无忧!!(兼容PD、QC、AFC等快充协议)
- 关于锐捷认证与傻瓜路由器
- pytorch1.13启用caffe2
- 将WINDOWS服务里的服务创建快捷方式到桌面
- 苹果自研处理器搭载全新MacBook 价格更亲民
- Box2D和Chipmunk的一些对比
热门文章
- 华为p6电信版 android 4.5,华为p6电信版驱动
- 瑞星网络版杀毒软件安装部署
- 解决黑苹果核显HD4400开机卡在“io console user: gio screen lock state 3”问题/HD4400核显只有7M问题
- 将人民币大写金额格式转为数字金额格式C#代码
- 从零开始学_JavaScript_系列(八)——js系列2(事件触发顺序、文本读取、js编写ajax、输入验证、下拉菜单)
- 第一章:【UCHome二次开发】uchome文件体系介绍
- Mac下修改HD3000显存到1GB
- 学术会议演讲视频录制全方位指南
- sdelete使用指南(Windows Sysinternals Suite工具介绍转)
- vue-pdf 通过文件流预览pdf文件