首页 > 代码库 > 在VC/MFC中嵌入Google地图——图文并茂
在VC/MFC中嵌入Google地图——图文并茂
最近需要实验室需要将在无人机地面站中嵌入地图,在网上找了很多资料,终于有些眉目了,
首先,做这个需要用到的知识有,MFC控件、MFC类库、JavaScript脚本语言,Google API、Google离线地图;由于google离线地图不怎么会,首先从google在线地图开始。
下面总结一下这几天搞google地图的步骤,有附图,对MFC和JS脚本语言不懂的同学有用。
在线Google 地图步骤:
(1)、建立基于对话框的MFC工程。
由于我对MFC基本不了解,所以从网上下载了个例子,但是不知道例子中那一部分是涉及google地图的部分,这个时候我只能一步步的从新建工程开始,建立了一个基于对话框的MFC工程,工程中自动生成了3个类,他们是(1)\classCThird_ProjApp:publicCWinApp\(2)\ classCForth_ProjDlg:publicCDialogEx\,(3)\ classCAboutDlg:publicCDialogEx
\此3个类中我只需要了解CForth_ProjDlg就可以了,因为我们接下来的操作对象是CForth_ProjDlg。
(2)、向工程中添加web browser控件。
方法如下:工具----选择工具箱项------COM组件,microsoft browser前面的复选框勾选上。(添加其他的active X控件也是同样的方法),然后在界面中添加控件。调整web browser控件的大小使之能显示我们需要的google地图。如图所示,
(3)、为web browser控件添加变量m_map。
这样在工程中就多了两个文件,其中包含classCExplorer1:publicCWnd类及其实现。在CForth_ProjDlg类中多了一个 CExplorer1类型的 变量m_map。
(4)在对话框界面中添加几个按钮控件和文本框。同时添加处理函数。对应的文本框要添加value型的变量m_lat,m_long,m_Zoom_Level
(5)在打开地图的处理函数中加入Navigate函数,Navigate函数是web browser控件引入外部网页到MFC中的函数。
例如:
voidCForth_ProjDlg::OnBnClickedButton1_OpenMap()
{
m_map.Navigate(_T("E:/googleMap/googleMap_Online_js/google.html"),NULL,NULL,NULL,NULL);
}
其中E:/googleMap/googleMap_Online_js/google.html是javascript语言写的脚本。到此位置,最基本的功能已经实现了,如果需要与google地图交互,请继续往下看。
javascript编写的google.html脚本如下所示:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:v="urn:schemas-microsoft-com:vml">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
<title>Google 地图 JavaScript API 示例: 地图标记</title>
<script src=http://www.mamicode.com/"http://ditu.google.cn/maps?file=api&v=2&key=ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA&hl=zh-CN">
(6)更改中心位置需要涉及到从MFC中向JS脚本文件中的函数传递参数的问题了,下面开始讲解这一部分。
此处介绍一种通过CWebPage类来解决此问题的方法:
(a)、从网上下载CWebPage.h和CWebPage.cpp。将其加入工程中。
(b)、在对话框或者视图的实现文件中,加入#include "WebPage.h",在按钮的响应函数中就可以调用javascript函数了,具体代码如下:(c)在js文件中编写TansTo函数;以上脚本中有写,
(d)通过界面设置缩放级别。
前面讲过,添加三个文本框,给文本框添加value型变量。在传参数控件的处理函数中写入以下程序:
void CForth_ProjDlg::OnBnClickedButton2_ChangeCenter() { // TODO: 在此添加控件通知处理程序代码 UpdateData(TRUE); CWebPage web; web.SetDocument(m_map.get_Document()); CComVariant varResult; const CString funcName("TansTo"); //const CString m_latitude("23.1650922");//传递的参数:纬度 //const CString m_longtitude("113.4752355");//经度 const CString m_latitude(m_lat); const CString m_longtitude(m_long); const CString m_lev(m_Zoom_Level); web.CallJScript(funcName,m_latitude,m_longtitude,m_lev); }
到此为止,我们在线的google地图已经做好了,在此过成中,遇到了几个问题:第一、从网上下载CWebPage.h和CWebPage.cpp在我的vs2010中打开有错误,说什么+号重载的不对。第二、向js脚本中传递缩放等级的时候一直报错,这个问题困扰了一上午,最后我将变量做加法运算,发现结果是字符串运算的结果,所以在js中处理缩放等级的时候用了一个perseInt函数转换格式,为什么纬度和经度的不需要格式转换而缩放等级需要呢?这个我搞不明白,欢迎指教!
离线Google 地图步骤:
为了实现能在没有网络的情况下操作地图,需要Google地图离线化,离线地图我在网上找了很多资料,但是大部分资料是不适合使用的,不适合的原因主要是js脚本和离线瓦片地图的路径格式不对,找了很多不适合用的资料,最后当我在搜索google地图api的某个函数的时候,搜到了一哥们的博客,博客中有js脚本,有怎么样下载瓦片地图,哥们博客地址为
http://cjnetwork.iteye.com/blog/1485328,将其中的js打开,地图就出来了,后来我下载了我们需要地方的瓦片地图,输入经纬度,马上就找到了对应的地址。将js脚本稍作修改,就可以从MFC中向地图传递参数了,离线地图与在线地图相比,加载地图的速度更快了。
因为离线对应的js脚本不止一个,有很多是不需要修改的,对外的一个js编写的html文件如下:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>无标题文档</title> <style> #map_canvas{ background-color: #CCC; width:600px; height: 600px; position: absolute; bottom:0px; left:0; right:0; top:20; margin: 0; padding: 0; } </style> <!--<script type="text/javascript" src=http://www.mamicode.com/"http://maps.google.com/maps/api/js?sensor=false"></script> -->>
接下来我想记一下google API的相关东西,给出网页如下:http://www.360doc.com/content/11/0201/23/2475285_90383000.shtml
总结,我将这段时间的google地图api的源代码上传到了我的百度网盘:有需要的可以下载!
地址为:http://pan.baidu.com/s/1jGuUCq6