Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(5) 小结

        经过不断试用与修改,这个查看器最终还是完成了设计、实现。查看器,顾名思义,没有编辑功能:说的白一点,只是一个以OpenStreetMap为底图的显示装置罢了。和专业GIS相比,这款基于插件的OpenStreetMap瓦片查看器客户端显得单薄。和消费类GIS(如面向浏览器的地图API)相比,它是本地的,似乎和Native应用更加合拍。

       其实一直以来想利用业余时间做这样一个工具,使得非计算机专业的工程师们可以拥有一款支持漫游、标图、动画效果的轻量级地理信息插件,特别是掌握C++、C#等本地工具的工程师们可以不经学习即能获得GIS二次开发能力,目前看来,已经做到了~~我们看看这些效果。

1、在Qt中引入planetosm widget

      通过Qt designer 的插件功能,我们可以方便的引入OSM瓦片查看器客户端:

这使得这款查看器可以在windows, Linux下运行,比如

1.1 Qt widget in RaspberryPI (ARM)

Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(5) 小结_第1张图片


1.2 Qt widget in Ubuntu

Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(5) 小结_第2张图片

2、在Windows下使用ActiveX

      托ActiveQt的福,Widgets 直接可以发布为 ActiveX控件,从而使得外部程序如 C#, MFC 开发的东东可以直接使用:
Qt 插件综合编程-基于插件的OpenStreetMap瓦片查看器客户端(5) 小结_第3张图片

3、外部开发接口-简单并直观

对C#等外部程序,提供基于键-值的高度可扩展接口。 

云盘接口说明PDF, 提取0466


可以看一看操作的接口,如何标绘一个点到地图上:
string res = axqtaxviewer_planetosm.osm_layer_call_function("geomarker1",
"function=update_point;name=哈哈;type=1;" +
"lat=35.2;lon=101.783;" +
"style_pen=2;color_pen=0,0,255,128;width_pen=3;" +
"style_brush=1;color_brush=0,255,0,128;" +
"color_label=0,0,255,96;weight_label=99;size_label=12;" +
"width=16;height=20;");
在上面的操作中,C#调用的是函数 osm_layer_call_function,这个函数有两个参数。第一个参数表示要调用哪个图层的功能,也就是图层的名字;第二个参数是调用功能的参数表,为分号分割参数对,等号分割键、值的字符串。通过这个统一的接口,可以访问各个插件(图层)提供的几十种功能。我们也可以插入一个多边形:
string res = axqtaxviewer_planetosm.osm_layer_call_function("geomarker1",
"function=update_polygon;name=ID4;type=4;"+
<"lat0=12.2;lon0=67.3;"+
"lat1=14.3;lon1=62.8;"+
"lat2=22.7;lon2=66.5;"+
"lat3=11.5;lon3=72.2;"+
"lat4=10.8;lon4=69.4;"+
"style_pen=2;color_pen=0,0,255,128;" +
"width_pen=3;style_brush=1;color_brush=0,255,0,128;");

 并顺带为标记添加上文字注释,这些注释可以在用户点击时弹出:
res = axqtaxviewer_planetosm.osm_layer_call_function("geomarker1",
"function=update_props;name=ID2;" +
"LABEL=Neimeng;EXPRESS=YunDa;Pero=NORMAL;" +
"CheckTime=2014-12-30 07:18:32;" +
"From=Huhehaote;To=YinChuan");

在Qt内部,除了上述方式,还有等效的QMap<QString, QVariant> 映射方式,对一个图层pif, 执行:
			QMap<QString, QVariant> inPara, outPara;
			inPara["function"] = "update_point";
			inPara["name"] = "YUNDA-EXPRESS-23837364";
			inPara["lat"] = lat;
			inPara["lon"] = lon;
			inPara["color_pen"] = "0,0,255,128";
			inPara["color_brush"] = "0,0,0,64";
			inPara["width"] = "7";
			inPara["height"] = "7";
			inPara["type"] = 1;
			outPara = pif->call_func(inPara);

就会插入一个点。

           如果想为这个地图开发新的图层和插件,只要仿照工程中两个插件 grid, geomarker 产生自己的插件即可。配合主线程的定时器,不停的更新图元的坐标,便产生了动画效果。

-----------------------------------------------------

4、后记

        非计算机专业的工程师们大量使用本地开发工具,在不同的领域创造价值。与前端工程师不同,OpenStreetMap 对应的Web前端对他们是陌生的,希望这款小工具能够帮助他们在需要时利用几天时间迅速在本地应用程序中获得简单的GIS体验,追逐心中的梦想。这款查看器本身在不断更新,编译源代码是最好的方式。由于依赖项很多,我在发布时,最后只能使用Depwalker等软件把动态链接库弄妥。最好的办法是把编译出的Release东东拷贝到 Qt库的bin文件夹下,而后调用

idc.exe .\qtaxviewer_planetosm.dll /regserver
注册控件(XP下采用Qt5.3.2+regsvr32.exe注册会有问题)。
      *在  win7 下,需要使用管理员注册。使用用户权限也是可以注册的,但仅能本用户使用。
      为了方便windows用户尝试,使用Qt5.3.2-msvc2010工具链预生成了 一个包,有兴趣的人可以下载。
       点击下载Qt5.3.2-mcvc2010开发包,提取码fb2d
      点击下载演示包,提取码8dc1
     

你可能感兴趣的:(C++,插件,qt,openstreetMap,QtCreator)