GPS导航(2):电子地图生成

位置==============================================

地球本身不是一个正球体,而是一个极半径略短、赤道半径略长,北极略突出、南极略扁平,近似千梨形的椭球休。

经度和纬度

国际上统一规定以通过英国伦敦格林威治天文台的经线为起始经线(0°),也叫本初子午线。从起始经线开始,向东、西各以180°计算,向东称东经,向西称西经。

所有垂直于地轴的平面与地球椭球面的交线,称为纬线。赤道纬度为零,赤道以北为北纬,以南为南纬,向北向南各分90°。纬度不同的纬线长度不相等。

纬度值相对于赤道进行测量,其范围是 -90°(南极点)到 +90°(北极点)。经度值相对于本初子午线进行测量。其范围是 -180°(向西行进时)到 180°(向东行进时)。

地图投影

地图投影就是将椭球面上的经纬网按照一定的数学法则转移到平面上,建立球面上点(阿尔法,伽马)与平面上点(x,y) 之间的函数关系。地图投影虽然解决了球而与平面之间的矛盾,但在平面上完全无误地表示地球的各部分是不可能的,必然会带来长度、面积、角度等变形。

  • 高斯一克吕格投影
  • 墨卡托投影

参考:https://www.cnblogs.com/rainbow70626/p/4379615.html

电子地图生成过程

地理信息系统(GIS)

有时又称为“地学信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下,对整个或部分地球表层(包括大气层)空间中的有关地理分布数据进行采集储存管理运算分析显示描述的技术系统。

地理信息系统软件

ArcGIS:a(儿话音) ke(轻音) ji(四声) s(轻音)

Maplnfo:https://baike.baidu.com/item/MapInfo/8738110?fr=aladdin

SuperMap GIS(中国的软件):https://baike.baidu.com/item/supermap/536994?fr=aladdin

arcgis有哪些功能 - arcgis是什么_arcgis是做什么的

电子地图生成实例

电子地图存储结构

由于电子地图图元为不等长记录,为了提高插入、删除、查找效率,电子地图通常采用索引文件结构,常用的存储结构有TAB 、SHP
和MIF 等。

MIF 格式
MIF 是Maplnfo 定义的通用数据交换文本文件,由矢量图形数据文件(. MIF) 和属性文件(. MID) 组成,如图所示。

属性文件存储了矢截图形的属性信息,每一行构成一个记录。矢量图形数据文件由文件头和数据组成,文件头主要定义了矢量文件记录的字段,数据则包含了矢量图形数据及样式,每一行构成一个矢量图形。

MIF文件支持的矢量图形有:点(point) 、直线(line)、折线(polyline) 、区域(region) 、圆弧(arc) 、文本(text)、矩形(rectangle) 、圆角矩形(roundedrectangle)、椭圆(ellipse) 等。属性文件的第一个记录必须与矢量图形数据文件中的第一个矢量图形对应,第二个记录与第二个矢量图形对应,依此类推,若记录没有与之对应的矢量图形,必须在图形数据文件中填写''NONE" 以填充。

电子地图读写

当前应用广泛的电子地图主要是Maplnfo软件系列,该软件系列并不支持在Linux下进行开发只是提供了MIF文件格式,用来对外交换数据,MIF文件里的空问数据以ASCI码方式保存。

直接读取MIF文件,必须要准确识别各数据的类型和含义,工作量大,代码冗长。为简便开发,我们通过Mitab库函数来读取MIF地图文件,联合Qt的 QPainter函数显示地图,程序更加精炼,较好的实现了嵌人式Linux电子地图显示。

Mitab 库

Mitab库基于GIS协会关于简单要素的规范实例 ,OGR库开发,同时它还是一个开源的C++库,主要用来读写Maplnfo的TAB文件和MIF/MID文件。可从 Mitah官网下载到该库,目前最新的版本是1.7。

Mitab 库的使用
以Mitab-1.7.0 在x86 Linux 平台上的使用为例,解压缩mitab-1. 7. 0. tar. gz 软件包,生成mitab-1. 7. 0 目录。
在mitab-1.7.0 目录,运行make 命令,在ogr 、cpl 子目录,生成ogr 、cpl 的静态链接库ogr. a 、cpl. a, 在mitab 子目录,生成mitab 的静态链接库mitab. a 及其动态链接库。mitab 库c++ 接口的头文件为mitab/ mitab. h,C 接口头文件为mitab/capi.h 。在mitab-1. 7. 0 目录,运行make clean 命令则可以清除生成的库文件。

基于Mitab 的电子地图遍历

1.基于C接口的遍历
Mitab 提供了一系列的C语言接口,用于TAB 格式电子地图的遍历,其遍历算法为:

(1)调用mitab_c_open 打开MIF或TAB文件文件,函数会自动识别文件属性;
(1)调用mitab_c_get_field_count 获取矢量图形属性字段个数;
(3)调用mitab_c_next_fcature_id 获取一个矢量图形的标识符;
(4)调用mitab_c_rcad_fcaturc 读取矢量图形;
(5)调用mitab_c_get_field_name 和mitab_c_get_field_as_string获取矢量图形的属性名及值。
(6)调用mitab_c_get_type 和mitab_c_get_parts 获取矢量图形
的类型和组成单元数量(对集合类矢量图形组成单元可不止一个);
(7)调用mitab_c_gct_vcrtcx_count 获取矢量图形每一个单元的结点数量;
(8)调用mitab_c_get_vertex_x 和mitab_c_get_vertex_y 获取结点的坐标;
(9)调用mitab_c_destroy_feature 销毁矢量图形;
(10)跳转(3),直到图层中的所有矢量图形被访问过。
采用以上算法基于x86 Linux 平台编写的示例代码如下。

实例代码:

mitab_handle dataset;
int feature_id, num_ficlds;
//打开图层
dataset = mitab_c_open(pszFilename);
if(dataset == NULL)
{
	printf("mitab_c_open(%s)failed.\n%s\n", pszFilename,mitab_c_getlasterrormsg()) ;
	exit(1);
}
//获取属性字段个数
num_fields = mitab_c_get_field_count(dataset);
//遍历矢量图形
for(feature_id = mitab_c_next_feature_id(dataset, - 1);
    feature_id! = -1;
	feature_id = mitab_c_next_feature_id(dataset, feature_id))
{
	mitab_feature feature;
	int feature_type, num_parts, partno, pointno, fieldno;
	//读取矢量图形
	feature = mitab_c_read_feature(dataset , feature_id);
	if(feature == NULL)
	{
		printf("Failed to read feature%d. \n%s\n", feature_id,
		mitab_c_getlasterrormsg()) ;
		exit(1);
	}
	//显示矢量图形屈性名及值
	for(fieldno = 0; fieldno < num_fields; fieldno++)
	{
		printf(" %s = %s\n", 
		       mitab_c_get_field_name(dataset, fieldno),
			   mitab_c_get_field_as_string(feature, fieldno));
       //获取矢截图形的类型及组成单元
		feature_type = mitab_c_get_type(feature);
		num_parts = mitab_c_get_parts(feature);
		//逐单元显示每个单元结点的坐标信息
		for(partno = 0; partno < num_parts; partno++)
		{
			int num_points = mitab_c_get_vertex_count(feature, partno);
			if (num_ parts >= 1)
				printf("Partno%d,\n", partno);
			for (pointno = 0; pointno < num_points; pointno++)
			{
				double dX, dY;
				dX = mitab_c_get_vertex_x(feature, partno, pointno) ;
				dY = mitab_c_get_vertex_y(feature, partno, pointno);
				printf("%.16g%.16g\n", dX, dY);
			}
		}
		//销毁矢量图形
		mitab_c_destroy_feature(feature);
	}
		//关闭图层
		mitab_c_close(dataset);
}

基于c++ 接口的遍历
Mitab 提供了一系列的c++ 类,用于TAB 格式电子地图的操作,其遍历算法为:
(1)调用IMaplnfoFile::SmartOpen 方法创建IMaplnfoFile 类对象poSrcFile;
(2)调用poSrcFile->GetNextFeatureld 获取矢量图形标识符;
(3)调用poSrcFile->GetFeatureRef 获取TABFeature 类对象poFeature;
(4)调用poFeature->DumpReadable 显示矢量图形信息,包括矢量图形及其属性信息;
(5)跳转到(2),直到图层中的所有矢量图形被访问过。
采用以上算法基于x86 Linux 平台编写的示例代码如下。

实例代码:

IMaplnfoFile *poSrcFile = NULL;
int nFeatureId;
TABFeature *poFeature;
//打开图层
if ((poSrcFile= IMapInfoFile::SmartOpen(pszSrcFname)) == NULL)
{
	printf("Failed to open %s\n", pszSrcFname);
	return -1;
}
//遍历矢量图形
nFcaturcId = -1;
while ((nFeatureId = poSrcFile->GetNextFeatureId(nFeatureId)) ! = -1)
{
	//获取TABFcaturc 类对象
	poiFeature = poSrcFile->GetFeatureRef(nFcaturcId);
	if (poFeature)
	{
		poFcaturc->DumpRcadablc(stdout);
	}else
	{
		printf("Failed to rgad feature %d.\n", nFcaturcId):
		return -1;//GctFeatureRcfO() failed, Error
	}
}
//在关闭图层
poSrcFilc->Close();
delete poSrcFilc;

总结:

电子地图是顺应信息技术发展要求的必然产物。电子地图的生
成方法多种多样,利用栅格图像矢量化是其中的一种方法。
在制作电子地图的过程中,我们可以选择ArcGIS 、Maplnfo 、SuperMap 等地理信息系统软件,我们使用Maplnfo 软件介绍了由栅格图像矢量化得到电子地图的过程。
不同的地理信息系统软件生成的电子地图存储格式也不相同, Maplnfo 支持的电子地图格式有TAB 、MIF 等,TAB 是一种二进制文件,而MIF 是一种文本文件,可以将TAB 格式转换为MIF格式,从而阅读电子图文件的全部信息; 
ArcGIS 支持的电子地图格式有SHP 等。
为了有效地使用生成的电子地图,必需能够对电子地图进行读写,我们使用了一款能够有效读写TAB 格式电子地图的开源软
件——Mitab 库,详细论述了Mitab 库的使用方法,给出了利用其C语言和c++ 语言接口实现电子地图遍历的关键代码。

猜你喜欢

转载自blog.csdn.net/QQ2558030393/article/details/90034154