基于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
四个模块。先来看看他们的总体结构。
![](http://student.csdn.net/attachment/201004/27/472207_12723532385zNj.jpg)
模块功能:
(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
);
未完待续....................
开发电子地图的教程,而且本人水平有限,也达不到教程的地步。只是利用此系列的文章,来记录开发基于
C++
应用在
Windows
下
开发电子地图的过程。愿对C++
开发感兴趣的朋友,熟知
Gis
开发的朋友,了解
Wms
、
WFS
协议的朋友,亦或是对
GoogleMap
之类感兴趣的朋友,共同讨论。(废话到此结束)。
模块组成
此Map模块目前是由
4
个主要模块组成的。分别是
PicSystem
、
FileSystem
、
C
ommunicat
e、
Calculate Tiles
四个模块。先来看看他们的总体结构。
![](http://student.csdn.net/attachment/201004/27/472207_12723532385zNj.jpg)
模块功能:
(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
);
未完待续....................
相关文章推荐
- 基于Wms协议的Map开发(七:计算模块)
- 基于Wms协议的Map开发(六:通讯模块)
- 基于Wms协议的Map开发(一:概要)
- 基于Wms协议的Map开发(二:相关概念)
- 基于Wms协议的Map开发(三:写在前面)
- 基于Wms协议的Map开发(四:系统设计)
- 基于ONVIF协议的(IPC)客户端程序开发-4:onvif协议有soap和rtsp协议组成
- 2.4G无线射频通信模块nRF24L01+开发笔记(基于MSP430RF6989与STM32f0308)(1.(2)有错误,详见更正)
- 使用CXF开发WebService程序的总结(五):基于Map数据类型处理的的客户端和服务端代码的编写
- Linux平台下基于BitTorrent应用层协议的下载软件开发--位图模块(bitfield.h)
- Linux平台下基于BitTorrent应用层协议的下载软件开发--消息处理模块(message.c)
- Linux平台下基于BitTorrent应用层协议的下载软件开发--哈希模块(sha1.c)
- 基于ONVIF协议的(IPC)客户端程序开发-10 设备校时
- C#开发基于ESMTP协议的邮件发送系统经验总结
- 基于Video4Linux的视频采集模块开发
- 基于TR-069 协议的开发(一)
- 基于MQTT协议进行应用开发
- 基于ArcGIS10.0和Oracle10g的空间数据管理平台四(C#开发)-通用数据管理模块
- 移动网络应用开发中,使用 HTTP 协议比起使用 socket 实现基于 TCP 的自定义协议有哪些优势?
- 基于Asterisk的VoIP开发指南——Asterisk 模块编写指南(1)