地理坐标与屏幕坐标转换(VC++)

2023-10-23 16:50

本文主要是介绍地理坐标与屏幕坐标转换(VC++),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在底层GIS开发中,我们经常会碰到空间数据可视化问题,当我们拿到地理数据之后,我们该怎么把它展现在我们的计算机屏幕中呢,这或许是一个比较简单的问题。

我们知道,地理坐标系是我们用户自定义的坐标系,而显示在计算机屏幕上的坐标是基于屏幕坐标来绘制的,那么改如何转化呢?

首先,我们来熟悉几个概念:

地理坐标系,通常原点在左下角,X轴的方向是向右递增,Y轴的方向是向上递增。

屏幕坐标系,通常它的原点在左上角,X轴的方向向右递增,Y轴的方向是向下递增的。正好与地理坐标系相反。

 

第一种方法:

中心点配对法,将视图的中心和地理空间的中心点匹配,然后给定一个地理坐标根据该坐标和视野中心点的偏移和比例尺来进行计算就可以获得屏幕坐标,反之也是如此;

 

关于这种方法,可以参考其他的资料。

其实这种方法也很简单,像ArcGIS等GIS软件就是基于这种转换方式进行的。其代码如下:

地理坐标转屏幕坐标

	OGRPoint ptCenter = GetMapCenter();		//地图中心点POINT pt;pt.x = draw->m_ScreenWidth/2 + (long)((poPoint->getX()-ptCenter.getX())*draw->m_Scale+0.5);pt.y = draw->m_ScreenHeigh/2 - (long)((poPoint->getY()-ptCenter.getY())*draw->m_Scale+0.5);return pt;

 

屏幕坐标转地理坐标

	OGRPoint ptCenter = GetMapCenter();		//地图中心点POINT pt;pt.x = draw->m_ScreenWidth/2 + (long)((poPoint->getX()-ptCenter.getX())*draw->m_Scale+0.5);pt.y = draw->m_ScreenHeigh/2 - (long)((poPoint->getY()-ptCenter.getY())*draw->m_Scale+0.5);return pt;

下过如下图所示:



第二种方法:利用相似比(完整显示地图)

 

这幅图是网上的一副图片,我希望没有版权问题。

通常情况下,我们取X和Y方向比例因子较大的作为比例因子,即

double xScale = rect.Width()/width;		//x方向的比例系数double yScale = rect.Height()/height;	//y方向的比例系数double scale = max(xScale,yScale);


从而地理坐标转换为屏幕坐标的代码如下:

pts[index].x = (int)((poPoint->getX()-minx)*scale);pts[index].y = (int)(rect.Height()-(poPoint->getY()-miny)*scale);


GDI设备描述表(device context,DC)包含了特定的显示设备的信息、图像的显示属性及特定的显示窗口等信息,用GDI编程的第一步必须获取当前的设备描述表的句柄(hDC),然后将该句柄作为参数调用GDI提供的API函数。我们在绘图时,通常是各个地理实体分别绘制,以线串为例:

//以下代码是根据直线的方法绘制for (int index = 0; index < numPoints - 1; index ++){dcMem.MoveTo(pts[index]);dcMem.LineTo(pts[index + 1]);}


这只是在这方面的初步探索,还有就是现实效率不高,当元素特别多时,就显得非常慢,在以后会逐步加入空间索引机制,加快图形搜索和显示效率,下面是运行结果的截图,

这篇关于地理坐标与屏幕坐标转换(VC++)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/269161

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

C++变换迭代器使用方法小结

《C++变换迭代器使用方法小结》本文主要介绍了C++变换迭代器使用方法小结,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录1、源码2、代码解析代码解析:transform_iterator1. transform_iterat

详解C++中类的大小决定因数

《详解C++中类的大小决定因数》类的大小受多个因素影响,主要包括成员变量、对齐方式、继承关系、虚函数表等,下面就来介绍一下,具有一定的参考价值,感兴趣的可以了解一下... 目录1. 非静态数据成员示例:2. 数据对齐(Padding)示例:3. 虚函数(vtable 指针)示例:4. 继承普通继承虚继承5.

C++中std::distance使用方法示例

《C++中std::distance使用方法示例》std::distance是C++标准库中的一个函数,用于计算两个迭代器之间的距离,本文主要介绍了C++中std::distance使用方法示例,具... 目录语法使用方式解释示例输出:其他说明:总结std::distance&n编程bsp;是 C++ 标准

Java实现时间与字符串互相转换详解

《Java实现时间与字符串互相转换详解》这篇文章主要为大家详细介绍了Java中实现时间与字符串互相转换的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、日期格式化为字符串(一)使用预定义格式(二)自定义格式二、字符串解析为日期(一)解析ISO格式字符串(二)解析自定义

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

python+opencv处理颜色之将目标颜色转换实例代码

《python+opencv处理颜色之将目标颜色转换实例代码》OpenCV是一个的跨平台计算机视觉库,可以运行在Linux、Windows和MacOS操作系统上,:本文主要介绍python+ope... 目录下面是代码+ 效果 + 解释转HSV: 关于颜色总是要转HSV的掩膜再标注总结 目标:将红色的部分滤