• (转) GIS 中地理坐标和屏幕坐标的标准转换方法


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

  • 相关阅读:
    界面控件DevExpress WPF入门 表达式编辑器功能
    Telerik UI for WPF全新版本——拥有Office2019高对比度主题
    DevExpress报表控件v21.2 全新的Visual Studio报表设计器
    报告生成器FastReport .NET入门指南 在Linux中启动应用程序
    文档控件DevExpress Office File API v21.2 自定义字体加载引擎
    UI组件库Kendo UI for Angular入门 如何开始使用图表功能
    WPF界面工具Telerik UI for WPF入门级教程 设置一个主题(二)
    DevExtreme初级入门教程(React篇) TypeScript支持
    报表开发利器FastReport .NET v2022.1 添加关键对象和属性
    python项目打包(一) setup.py、Python源代码项目结构
  • 原文地址:https://www.cnblogs.com/94cool/p/3922441.html
Copyright © 2020-2023  润新知