地理坐标与屏幕坐标转换(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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

使用Python开发一个现代化屏幕取色器

《使用Python开发一个现代化屏幕取色器》在UI设计、网页开发等场景中,颜色拾取是高频需求,:本文主要介绍如何使用Python开发一个现代化屏幕取色器,有需要的小伙伴可以参考一下... 目录一、项目概述二、核心功能解析2.1 实时颜色追踪2.2 智能颜色显示三、效果展示四、实现步骤详解4.1 环境配置4.

java Long 与long之间的转换流程

《javaLong与long之间的转换流程》Long类提供了一些方法,用于在long和其他数据类型(如String)之间进行转换,本文将详细介绍如何在Java中实现Long和long之间的转换,感... 目录概述流程步骤1:将long转换为Long对象步骤2:将Longhttp://www.cppcns.c

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

使用Python实现获取屏幕像素颜色值

《使用Python实现获取屏幕像素颜色值》这篇文章主要为大家详细介绍了如何使用Python实现获取屏幕像素颜色值,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、一个小工具,按住F10键,颜色值会跟着显示。完整代码import tkinter as tkimport pyau

在Java中将XLS转换为XLSX的实现方案

《在Java中将XLS转换为XLSX的实现方案》在本文中,我们将探讨传统ExcelXLS格式与现代XLSX格式的结构差异,并为Java开发者提供转换方案,通过了解底层原理、性能优势及实用工具,您将掌握... 目录为什么升级XLS到XLSX值得投入?实际转换过程解析推荐技术方案对比Apache POI实现编程