【MapGIS二次开发】基于工作区的投影变换的实现

  先祝各位中秋快乐,祝在家过节的童鞋全家幸福,在外奔波的童鞋保重身体!最近在忙着做MapGIS二次开发的程序,中秋尽情休息了两天也懒得写东西了,与其挤牙膏似地挤出个“文囧”,还不如分享一段程序里的代码,说不定能给许多新学MapGIS二次开发的童鞋一点帮助。

  这段程序主要是实现将当前打开的图件经过投影转换,转换成地理坐标系的图件,MapGIS自带的投影转换需要设置许多参数,并且批量转文件的时候只能一次性选择一个目录下的所有文件,不能跨目录的转换,很不方便,可以通过二次开发的方式自定义投影转换方式,各种参数自己设置,这样很多局限就消失了。这里以常用的转地理坐标系为例,看一下MapGIS二次开发中怎样进行投影转换。代码如下,注释已经很详细了,一看即懂:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
MAP_PARA *m_hMapTYCS;   //MAP_PARA是一个包含详细地图参数的结构体
m_hMapTYCS = new MAP_PARA;
//预设的投影转换后的参数值
m_hMapTYCS->unit = UNIT_DMS; //坐标单位设置为 度分秒
m_hMapTYCS->vUnit = UNIT_DMS;
m_hMapTYCS->infoUnit = UNIT_DMS;
m_hMapTYCS->rate = 1; //水平比例尺
m_hMapTYCS->vRate = 1;  //垂直比例尺
m_hMapTYCS->mapw = 1;   //图幅宽,这个参数不影响最终成图的
m_hMapTYCS->maph = 1;   //图幅高,同上
m_hMapTYCS->jd0 = 0;//空间数据数据左下角经度  , 数据单位统一采用UNIT_DMS格式
m_hMapTYCS->wd0 = 0;//空间数据数据左下角纬度  , 数据单位统一采用UNIT_DMS格式
m_hMapTYCS->djd = 100;//空间数据数据经度跨度    , 数据单位统一采用UNIT_DMS格式
m_hMapTYCS->dwd = 100;//空间数据数据纬度跨度    , 数据单位统一采用UNIT_DMS格式
m_hMapTYCS->h = 0;  //空间数据大地水准面与参考椭球面之间的高差
m_hMapTYCS->H = 0; //空间数据投影平面与大地水准面的高差
m_hMapTYCS->earthParam = EP_Xian80; //椭球参数设置为西安80
m_hMapTYCS->type = TYPE_JWD; //坐标系类型 地理坐标系
m_hMapTYCS->projType = PRJ_LonLat;   //地理坐标系(经纬度)
m_hMapTYCS->lon = 0;    //投影原点经度
m_hMapTYCS->lat = 0;    //投影原点纬度
m_hMapTYCS->dx = 0;     //偏移X
m_hMapTYCS->dy = 0;     //偏移Y
MAPPROJECT m_mapPrj=GetProject();   //获得当前打开的工程信息
for (int i=0; i<=2;i++)   //1是点,0是线,2是区
{
    short *pIndex = _PRJGetFileIndexsByType(m_mapPrj,i);//文件的索引号数组     
    for (int j=0; j<pIndex[0]; j++)   //pIndex[0]为工程中i类型文件的个数
    {      
        int iIndex = pIndex[j+1];  //某文件的索引号
        int iAi = _PRJGetItemArea(m_mapPrj,iIndex);  //某文件的工作区号
        _ConvertArea(iAi,iAi,m_hMapTYCS,1,0,0);//在原工作区基础上上进行投影转换
    }
}
delete m_hMapTYCS; //记得删除
m_hMapTYCS=NULL;
_RestoreWindow(); //重置窗口

  以上就是投影转换的关键代码,具体用在什么地方你可以自由发挥想象了,里边的参数都可以自行设置,具体地一些宏定义值请参看帮助文档,介绍很详细的。有问题的话欢迎在下边给我留言~~

  PS:貌似首页被谷哥给K了,但其它页面收录是正常的,谁能告诉我究竟是什么原因呢?非常感谢!