通过Navit学习笔记(一)、Navit学习笔记(二)的介绍,我们已经对Navit有了初步的认识。Navit是学习导航程序开发很好的例子,从本文开始,我们对Navit的源代码做简要的分析,以求学习和提高。
navit的内核包括:
1、一个设置地图对象
2、一个或多个车辆
3、一套用于地图解析的图像对象
4、一个用于显示的GUI对象
5、一个路经对象
6、一个导航对象
...
在详细介绍Navit内核前,我们先来学习Navit的坐标模块,坐标模块包括projection投影模块,coor坐标模块。在projection投影模块中有文件projection.h 和 projection.c ,在projection.h中定义了:
枚举对象:
1、projection:主要定义投影的类型定义
*projection_none 不投影,
*projection_mg mg上投影,
*projection_garmin garmin投影,
*projection_screen 屏幕投影,
*projection_utm utm投影,
*projection_gk gk投影
2、enum map_datum 定义了数据的投影坐标系包括none、wgs84标准和dhdn标准
*map_datum_none none,
*map_datum_wgs84 wgs84标准,
*map_datum_dhdn dhdn标准
3、定义了coord结构,改结构使用coord.h中的定义
4、根据枚举projection定义了 enum projection projection_from_name(const char *name,struct coord *offset)函数用于将字符型的投影类型名称转换成字符projection投影枚举类型。
5、定义函数char *projection_to_name(enum projection proj,struct coord *offset)用于将投影类型转换成字符形式。
整个porjection的实现代码如下:
1
#include
<
string
.h
>
2
#include
<
glib.h
>
3
#include
"
coord.h
"
4
#include
"
debug.h
"
5
6
#include
"
projection.h
"
//
头文件引用
7
8
//
定义投影类型名称结构
9
struct
projection_name {
10
enum
projection projection;
//
枚举 projection 类型
11
char
*
name;
//
投影名称
12
};
13
14
//
根据projection_name结构定义 projection_names[]数组,数组中projection枚举类型和char类型名称一一对应
15
struct
projection_name projection_names[]
=
{
16
{projection_none,
""
},
17
{projection_mg,
"
mg
"
},
18
{projection_garmin,
"
garmin
"
},
19
{projection_utm,
"
utm
"
},
20
{projection_gk,
"
gk
"
},
21
};
22
23
//
实现头文件中的projection_from_name函数,其中参数name为projection类型名词,offset为coord结构
24
enum
projection
25
projection_from_name(
const
char
*
name,
struct
coord
*
offset)
26
{
27
int
i;
28
int
zone;
29
char
ns;
30
31
for
(i
=
0
; i
<
sizeof
(projection_names)
/
sizeof
(
struct
projection_name) ; i
++
)
32
{
33
if
(
!
strcmp(projection_names[i].name, name))
34
return
projection_names[i].projection;
35
}
36
if
(offset) {
37
if
(sscanf(name,
"
utm%d%c
"
,
&
zone,
&
ns)
==
2
&&
zone
>
0
&&
zone
<=
60
&&
(ns
==
'
n
'
||
ns
==
'
s
'
)) {
38
offset
->
x
=
zone
*
1000000
;
39
offset
->
y
=
(ns
==
'
s
'
?
-
10000000
:
0
);
40
return
projection_utm;
41
}
42
}
43
return
projection_none;
44
}
45
//
返回projection类型的名称
46
char
*
47
projection_to_name(
enum
projection proj,
struct
coord
*
offset)
48
{
49
int
i;
50
51
for
(i
=
0
; i
<
sizeof
(projection_names)
/
sizeof
(
struct
projection_name) ; i
++
) {
52
if
(projection_names[i].projection
==
proj)
53
return
projection_names[i].name;
54
}
55
return
NULL;
56
}
在coord.h文件中定义了
1、宏定义
*coord_is_equal(a,b)用于对两个coord结构的相等操作
*为了防止一些平台出现浮点截断误差,定义了
1
#ifdef AVOID_FLOAT
2
/*
*
3
* On platforms where we are trying to avoid floats, sometimes we can't.
4
* It is better on these platforms to use single precision floating points
5
* over double percision ones since performance is much better.
6
*/
7
typedef
float
navit_float;
8
#define
navit_sin(x) sinf(x)
9
#define
navit_cos(x) cosf(x)
10
#define
navit_tan(x) tanf(x)
11
#define
navit_atan(x) atanf(x)
12
#define
navit_acos(x) acosf(x)
13
#define
navit_asin(x) asinf(x)
14
#define
navit_sqrt(x) sqrtf(x)
15
#else
16
typedef
double
navit_float;
17
#define
navit_sin(x) sin(x)
18
#define
navit_cos(x) cos(x)
19
#define
navit_tan(x) tan(x)
20
#define
navit_atan(x) atan(x)
21
#define
navit_acos(x) acos(x)
22
#define
navit_asin(x) asin(x)
23
#define
navit_sqrt(x) sqrt(x)
24
#endif
2、结构类型
*coord 定义了int类型的墨卡托坐标系
struct
coord {
int
x;
/*
!< X-Value
*/
int
y;
/*
!< Y-Value
*/
};
* pcoord 定义了一个包含projection枚举类型的墨卡托坐标系
struct
pcoord {
enum
projection pro;
int
x;
/*
!< X-Value
*/
int
y;
/*
!< Y-Value
*/
};
*coord_rect 定义了矩形形状的坐标系结构
struct
coord_rect {
struct
coord lu;
//
矩形左上点的coord结构
struct
coord rl;
//
矩形有下点的coord结构
};
*coord_d 双精度的墨卡托坐标系
struct
coord_d {
double
x;
/*
!< X-Value
*/
double
y;
/*
!< Y-Value
*/
};
*coord_geo_cart WGS84标准的笛卡尔坐标系
struct
coord_geo_cart {
navit_float x;
/*
!< X-Value
*/
navit_float y;
/*
!< Y-Value
*/
navit_float z;
/*
!< Z-Value
*/
};
*struct attr;
3、枚举类型
*coord_format 答应地理坐标的格式化类型枚举
enum
coord_format
{
/*
*
* Degrees with decimal places.Ie 20.5000 N 110.5000 E
*/
DEGREES_DECIMAL,
/*
*
* Degrees and minutes.ie 20 30.00 N 110 30.00 E
*/
DEGREES_MINUTES,
/*
*
* Degrees, minutes and seconds.ie 20 30 30.00 N 110 30 30 E
*/
DEGREES_MINUTES_SECONDS
};
4、函数
1
//
根据p获取墨卡托坐标系/点
2
struct
coord
*
coord_get(unsigned
char
**
p);
3
//
获取新的墨卡托坐标点
4
struct
coord
*
coord_new(
int
x,
int
y);
5
//
从attr结构多项中获取坐标系/点
6
struct
coord
*
coord_new_from_attrs(
struct
attr
*
parent,
struct
attr
**
attrs);
7
//
销毁墨卡托坐标系/点
8
void
coord_destroy(
struct
coord
*
c);
9
//
墨卡托坐标系/点分析
10
int
coord_parse(
const
char
*
c_str,
enum
projection pro,
struct
coord
*
c_ret);
11
//
包含
12
int
pcoord_parse(
const
char
*
c_str,
enum
projection pro,
struct
pcoord
*
c_ret);
13
//
坐标打印
14
void
coord_print(
enum
projection pro,
struct
coord
*
c, FILE
*
out
);
15
//
新的矩形坐标范围框
16
struct
coord_rect
*
coord_rect_new(
struct
coord
*
lu,
struct
coord
*
rl);
17
18
void
coord_rect_destroy(
struct
coord_rect
*
r);
19
//
区域重叠
20
int
coord_rect_overlap(
struct
coord_rect
*
r1,
struct
coord_rect
*
r2);
21
//
区域包含
22
int
coord_rect_contains(
struct
coord_rect
*
r,
struct
coord
*
c);
23
//
区域扩展
24
void
coord_rect_extend(
struct
coord_rect
*
r,
struct
coord
*
c);
25
//
坐标格式化
26
void
coord_format(
float
lat,
float
lng,
enum
coord_format,
char
*
buffer,
int
size);
5、coord.h定义的属性、函数
1
enum
coord_format;
2
enum
projection;
3
struct
attr;
4
struct
coord;
5
struct
coord_rect;
6
struct
pcoord;
7
struct
coord
*
coord_get(unsigned
char
**
p);
8
struct
coord
*
coord_new(
int
x,
int
y);
9
struct
coord
*
coord_new_from_attrs(
struct
attr
*
parent,
struct
attr
**
attrs);
10
void
coord_destroy(
struct
coord
*
c);
11
struct
coord_rect
*
coord_rect_new(
struct
coord
*
lu,
struct
coord
*
rl);
12
void
coord_rect_destroy(
struct
coord_rect
*
r);
13
int
coord_rect_overlap(
struct
coord_rect
*
r1,
struct
coord_rect
*
r2);
14
int
coord_rect_contains(
struct
coord_rect
*
r,
struct
coord
*
c);
15
void
coord_rect_extend(
struct
coord_rect
*
r,
struct
coord
*
c);
16
int
coord_parse(
const
char
*
c_str,
enum
projection pro,
struct
coord
*
c_ret);
17
int
pcoord_parse(
const
char
*
c_str,
enum
projection pro,
struct
pcoord
*
pc_ret);
18
void
coord_print(
enum
projection pro,
struct
coord
*
c, FILE
*
out
);
19
void
coord_format(
float
lat,
float
lng,
enum
coord_format fmt,
char
*
buffer,
int
size);
20
unsigned
int
coord_hash(
const
void
*
key);
21
int
coord_equal(
const
void
*
a,
const
void
*
b);