from :http://www.cnblogs.com/WonKerr/archive/2010/01/01/Coord_Transform.html

在GIS中,当你拿到一个图层的地理坐标后,如果需要绘制到屏幕上,那么不可避免的需要在地理坐标和屏幕坐标之间进行转换,转换的方法相信每一个做GIS的都会有自己的实现方法,本文描述的是和ArcGIS、WMS、OpenLayers完全一致的坐标转换方法,当然这三个工具、标准、脚本也是采用的相同的方法;

因为采用完全一致的坐标转换方法,因此在我自己实现的WMS服务程序中提供的含透明通道的图,可以完全和ArcGIS提供的图在WEB客户端进行精确的匹配;

现在来介绍坐标转换的原理,其实该原理很简单,就是将视图的中心点和视野的中心点进行配对,然后给定一个地理坐标根据该坐标和视野中心点的偏移和比例尺来进行计算就可以获得屏幕坐标,反之亦然;

下面就是将窗口坐标转换为地理坐标的代码:

1
2
ptGeo.x = geo_center_.x + ( ptWnd.x - see_center_.x ) * resolution_ ;
ptGeo.y = geo_center_.y - ( ptWnd.y - see_center_.y ) * resolution_ ;

下面是将地理坐标转化为窗口坐标的代码:

1
2
ptWnd.x = see_center_.x + ( long )( ( ptGeo.x - geo_center_.x ) / resolution_ + 0.5 );
ptWnd.y = see_center_.y - ( long )( ( ptGeo.y - geo_center_.y ) / resolution_ + 0.5 );

在上面的代码中,see_center_ 是屏幕坐标的窗口中心、geo_center_ 是地理坐标的视野中心,而 resolution_ 就是当前的比例尺;

然而最关键的是,当传入的视野和窗口的比例不一致时,如何进行处理,标准的做法就是分别计算水平和垂直的比例尺,然后取其中较大的那个值作为比例尺,也就是说比例尺的调整向着地理视野更小的方向进行调整,参考如下的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
void Coord_Transform::Reset_Resolution( GeoRect & extent , DevRect & client )
{
    //  calc geo_center_ Member
    geo_center_.x = ( extent.left + extent.right ) / 2.0 ;
    geo_center_.y = ( extent.top + extent.bottom ) / 2.0 ;
 
    //  calc see_center_ Member
    see_center_.x = ( client.left + client.right ) / 2 ;
    see_center_.y = ( client.top + client.bottom ) / 2 ;
 
    //  calc resolution_ Member
    double RoH = extent.Height( ) / client.Height( ); //    Resolution of Height
    double RoW = extent.Width( ) / client.Width( );  // Resolution of Width
    this->resolution_ = RoH > RoW ? RoH : RoW ;
    this->geo_change_ = true ;
}

在 WMS 协议中,如果请求的图片大小和视野的宽高比不成比例时也是要求将图片较小的一边增加,让地理视野和图片的比例一致,然后进行绘制,最后一步将生成的图片进行不等比放缩到原始请求的图片大小,这是为了保证客户端采用非矩形点阵的显示设备时能够正常显示地理图;

(转) GIS 中地理坐标和屏幕坐标的标准转换方法的更多相关文章

  1. (十)WebGIS中地理坐标与屏幕坐标间的转换原理

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 1.前言 地图本身是拥有坐标的,一般可以大致分为平面坐标和经纬度坐标, ...

  2. [转]基于WorldWind平台的建筑信息模型在GIS中的应用

    1 引言   随着BIM(Building Information Modeling)的不断发展,建筑信息建模的理念贯穿着建筑.结构.施工.运行维护以及拆迁再规划的整个建筑的生命周期,这种理念不仅使得 ...

  3. 浅谈设计模式在GIS中的应用

    设计模式在GIS中的应用 一.设计模式概述 随着面向对象技术的广泛应用,软件复用在越来越多的开发工程中被采用.在研究软件复用的过程中,设计模式的概念被提了出来.所谓设计模式就是一些设计面向对象的软件的 ...

  4. GIS中的空间参考

    GIS一般都是研究的基于地球的某个区域,例如一个国家.省或市的情况,既然地球上都有经纬度来标识,那么直接用经纬度来标识物体的位置不可以吗?但如果应用不一样,在实际中选择的空间参考系也是不一样的.例如我 ...

  5. GIS中的坐标系定义与转换

    GIS中的坐标系定义与转换 青岛海洋地质研究所 戴勤奋 2002-3-27 14:22:47 ----------------------------------------------------- ...

  6. 聊聊GIS中的坐标系|再版

    本文约6500字,建议阅读时间15分钟. 作者:博客园/B站/知乎/csdn/小专栏 @秋意正寒 版权:转载请告知,并在转载文上附上转载声明与原文链接(https://www.cnblogs.com/ ...

  7. 聊聊GIS中的坐标系|再版 详细定义、计算及高程系统

    本篇讲坐标系统的详细定义,有关坐标系的变换公式,以及简单说说高程坐标系统. 本文约6000字,阅读时间建议45分钟.硬内容比较多,如有疏漏错误请指出,建议有兴趣的朋友进一步阅读. 作者:博客园/B站/ ...

  8. 地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了

    地图四叉树一般用在GIS中,在游戏寻路中2D游戏中一般用2维数组就够了 四叉树对于区域查询,效率比较高. 原理图

  9. GIS中相交的定义(OGC相交的定义)

    我们常用GIS中的相交,比如在地图漫游的时候,屏幕显示的图形和屏幕这个包络线就是相交的关系.我们常用的GIS工具,拉框查询,这个用到的也是相交. 首先题目开起来很简单(开始的时候我是这样想的),但是做 ...

随机推荐

  1. Django的模型

    Django的模型类相当于数据库的一张表,模型类的实例对象相当于表中的一行内容 Django提供了多种创建对象的方式,常用如下: 通过create()方法 1.Person.objects.creat ...

  2. 李洪强iOS开发之OC[004] - OC和C的差异的学习

  3. ROW模式的SQL无法正常同步的问题总结

    转自:http://blog.chinaunix.net/uid-20639775-id-4664792.html#_Toc29623 ROW模式的SQL无法正常同步的问题总结 一. 问题起因.... ...

  4. HDU 5355 Cake(2015多校第六场,搜索 + 剪枝)

    Cake Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Sub ...

  5. RocketMQ 消息队列单机部署及使用

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51086876 相关文章: <RocketMQ 消息队列单机部署及使用> ...

  6. Python Theano ValueError: y_i value out of bounds

    参考 https://groups.google.com/forum/#!topic/theano-users/tY3fNAPYd9k 这个问题是由于outs的数量没有设置对. 里面写到 “excep ...

  7. hdu 1078 FatMouse and Cheese【dp】

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意:每次仅仅能走 横着或竖着的 1~k 个格子.求最多能吃到的奶酪. 代码: #include ...

  8. Android APK反编译就这么简单 具体解释

    在学习Android开发的过程你.你往往会去借鉴别人的应用是怎么开发的,那些美丽的动画和精致的布局可能会让你爱不释手,作为一个开发人员.你可能会非常想知道这些效果界面是怎么去实现的,这时,你便能够对改 ...

  9. 【ask】webstorm调试node单个js文件

    The procedure falls into two parts: first we start an application as usual and then connect to it wi ...

  10. PHP中通过数组遍历找出最小值

    举例: $a = array(1,2,4,0,9,8,6);//定义一个数组 $len = count($a);//获取数组的长度 $min = $a[0];//默认情况下数组的第一个值是最小的 fo ...