您的位置:首页 > 其它

基于Wms协议的Map开发(五:模块组成)

2010-04-30 14:34 330 查看
声明:此系列文章,不是说教,不是告诉任何人如何利用C++
开发电子地图的教程,而且本人水平有限,也达不到教程的地步。只是利用此系列的文章,来记录开发基于
C++
应用在
Windows


开发电子地图的过程。愿对C++
开发感兴趣的朋友,熟知
Gis
开发的朋友,了解
Wms

WFS
协议的朋友,亦或是对
GoogleMap
之类感兴趣的朋友,共同讨论。(废话到此结束)。

模块组成

此Map
模块目前是由
4
个主要模块组成的。分别是
PicSystem

FileSystem


C
ommunicat
e、
Calculate Tiles
四个模块。先来看看他们的总体结构。



模块功能:

(1)
Calculate Tiles:核心计算模块,计算瓦块编号模块,计算当前输入的左上至右下经纬度范围内,在当前
Zoom
缩放级别下,在当前像素宽度下,有哪些
Tile
瓦块,及其他们各自的经纬度范围。

Win32 DLL

(2)
Communicate:通讯模块,根据
Calculate Tiles
模块计算得到的瓦块集合,与服务器通讯,下载瓦块的图片。

Win32 DLL

(3)
FileSystem:文件管理模块,负责监管本地缓冲文件夹,判断是否瓦块是否已存在于本地缓冲文件夹中,是否需要下载。

Win32 DLL

(4)
PicSystem:图片拼接模块,属于跟
UI
相关的模块,为上层模块。负责拼接被
Calculate Tiles
计算得到的,并经
FileSystem
允许拼接的图片。

MFC DLL

模块接口及接口数据类型:

说明

(1


#define

DLL_API

extern

"C"

_declspec
(
dllexport
)


(2


int

index
存在原因:DLL
内部是通过类实现的,为了达到实例化的目的,即类的独立性,
int index
是一个实例的
id
号。

Calculate Tiles:

typedef

struct

tagPoint_d

{


double

ptx
;


//坐标
X


double

pty
;


//坐标
Y

}
POINT_D
, *
PPOINT_D
;

//瓦片编号

typedef

struct

tagTileNum

{


int

numX
;


int

numY
;

}
TILENUM
,*
PTILENUM
;

//瓦片集合

typedef

struct

tagTiles

{


TILENUM

index
;


POINT_D

lefttop
;


POINT_D

rightbottom
;

}
TILES
,*
PTILES
;

DLL_API

int

CreateMap
();

//设置地图属性中心点经纬度当前缩放级别宽度
W
像素高度
H
像素

DLL_API

void

SetMapData
(
int

index
,

int

Zoom
,

POINT_D

TopLeft
,

POINT_D

RightBottom
);

//获得被显示瓦片集合,被显示瓦片集合经纬度范围

DLL_API

void

GetTiles
(
int

index
,
TILES
*
SWTiles
,
int
&
SWTilesCount
,

POINT_D
&
TopLeft
,
POINT_D
&
RightBottom
);

//销毁
PostOffice
对象

DLL_API

void

DestroyMap
(
int

index
);

Communicate:

//经纬度范围

typedef

struct

tagLATLONBB


{


double

minx
;



//最小
x


double

miny
;



//最小
y


double

maxx
;



//最大
x


double

maxy
;



//最大
y

}
LATLONBB
, *
PLATLONBB
;

#endif

//wms标准协议中包含数据

typedef

struct

tagCAPABILITYDATAS


{


int

Width
;



//图片像素宽度


int

Height
;



//图片像素高度


char

ImageType
[
BUFFER_SIZE_COMMON
];
//图片类型


char

Srs
[
BUFFER_SIZE_COMMON
];



//投影类型


char

Name
[
BUFFER_SIZE_SPECIAL
];


//层名(用于拼接)


char

Title
[
BUFFER_SIZE_SPECIAL
];


//层名(用于显示)


LATLONBB

BoundBox
;






//层范围(该层最大范围)

}
CAPABILITYDATAS
,*
PCAPABILITYDATAS
;

//登录服务器

DLL_API

int

LogIn
(
const

char
*
strAddr
);

// 2次调用

DLL_API

bool

GetCapability
(
int

index
,
CAPABILITYDATAS

itemsName
[],
int
&
count
);

// 设置

DLL_API

LATLONBB

SetCapability
(
int

index
,
CAPABILITYDATAS

itemsName
[],
const

int

count
);

// 获取图层
2
次获取

DLL_API

bool

GetMap
(
int

index
,
LATLONBB

maparea
,
char

buf
[],
int
&
buflen
);

// 中断操作

DLL_API

void

AbortMap
(
int

index
,
BOOL

IsAbort
);

//登出服务器

DLL_API

void

LogOut
(
int

index
);

//复制服务器信息

DLL_API

void

CopyServerData
(
int

indexSrs
,
int

indexDes
);

FileSystem:

//double型点

typedef

struct

tagPoint_d

{


double

ptx
;


//坐标
X


double

pty
;


//坐标
Y

}
POINT_D
, *
PPOINT_D
;

//瓦片编号

typedef

struct

tagTileNum

{


int

numX
;


int

numY
;

}
TILENUM
,*
PTILENUM
;

//瓦片集合

typedef

struct

tagTiles

{


TILENUM

index
;


POINT_D

lefttop
;


POINT_D

rightbottom
;

}
TILES
,*
PTILES
;

enum

TASK_TYPE

{


DOWNL_TASK_START
= 0,
//启动下载任务


DOWNL_FILE_END
= 1,


//下载单个文件完成


CALCU_TILES_AREA
= 2,

//计算显示瓦块集合


ERROR_TYPE
= 3,



//错误类型


DOWNL_COMPLETE
= 4,


//任务池中的任务全部完成


CALCU_TILES
= 5,
//瓦片集合

};

//经纬度范围

typedef

struct

tagLATLONBB


{


double

minx
;



//最小
x


double

miny
;



//最小
y


double

maxx
;



//最大
x


double

maxy
;



//最大
y

}
LATLONBB
, *
PLATLONBB
;

//回调

typedef

void
(*
SendTaskInfo
)(
TASK_TYPE

TaskType
,
LPVOID

Data
,
LPVOID

Param
);

/************************************************************************/

/* 建立
PostOffice Keeper
对象
*/

/************************************************************************/

DLL_API

int

CreateKeeper
(
const

char
*
strAddr
,
HANDLE

ServerReady
);

/************************************************************************/

/*

功能:设置地图属性中心点经纬度当前缩放级别宽度W
像素高度
H
像素

参数:


index


目前使用的文件管理实例编号


PostManId

目前使用的文件下载实例编号


CenterPt

中心点经纬度坐标


Zoom


当前缩放级别


TopLeft/RightBottom

左上、右下经纬度坐标


pFun


回调函数地址


userParam

调用SetDepotData
函数所在的指针(
CXXX::this


*/

/************************************************************************/

DLL_API

void

SetDepotData
(
int

index
,
int

Zoom







,
POINT_D

TopLeft
,
POINT_D

RightBottom







,
SendTaskInfo

pFun
,
LPVOID

userParam
);

/************************************************************************/

/* 获得当前条件下地图实际经纬度范围
*/

/************************************************************************/

DLL_API

void

GetKeeperMapArea
(
int

index
,
LATLONBB
&
mapArea
);

/************************************************************************/

/* 中断当前操作
*/

/************************************************************************/

DLL_API

void

AbortSplit
(
int

index
,
BOOL

abort
);

/************************************************************************/

/*销毁
PostOffice Keeper
对象
*/

/************************************************************************/

DLL_API

void

DestroyKeeper
(
int

index
);

PicSystem:

//回调

typedef

void
(*
PicStateFun
)(
PIC_STATE

TaskType
,
LPVOID

Data
,
LPVOID

Param
);

/************************************************************************/

/* 建立
Picture System
对象
*/

/************************************************************************/

DLL_API

int

CreatePicSys
(
const

char
*
strAddr
,
HANDLE

ServerReady
);

/************************************************************************/

/* 获取服务器上所有图层的总范围
*/

/************************************************************************/

DLL_API

void

GetMapArea
(
int

index
,
LATLONBB
&
mapArea
);

/************************************************************************/

/*

功能:设置地图属性中心点经纬度 宽度W
像素

参数:

index


目前使用的文件管理实例编号

PostManId

目前使用的文件下载实例编号

TopLeft


左上点经纬度坐标

RightBottom 右下点经纬度坐标

Zoom


当前缩放级别

TopLeft/RightBottom

左上、右下经纬度坐标

pFun


回调函数地址

userParam

调用SetDepotData
函数所在的指针(
CXXX::this


*/

/************************************************************************/

DLL_API

void

SetData
(
int

index
,
int

PixWidth






,
POINT_D

TopLeft
,
POINT_D

RightBottom






,
PicStateFun

pFun
=
NULL
,
LPVOID

userParam
=
NULL
);

/************************************************************************/

/*销毁
Picture System
对象
*/

/************************************************************************/

DLL_API

void

DestroyPicSys
(
int

index
);



未完待续....................
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: