本文主要是最近帮助好友研究JavaScript的百度地图API,同时显示到C# Winform界面。同时遇到了BMap未定义的错误(BMap is not defined)及解决方法。以前写过基于Android的百度地图,其实原理都差不多,希望文章对你有所帮助吧!

一. C#显示百度地图

使用C# Winform显示百度地图主要包括两个步骤:
1.调用百度地图API,通过申请的密钥AK访问JavaScript版本地图;
2.再在C#中webBrowser浏览器控件中访问JS文件,显示地图到窗口。

百度官方文档:http://developer.baidu.com/map/jsmobile.htm
百度申请密钥:http://lbsyun.baidu.com/apiconsole/key

首先,申请密钥如下图所示:

密钥申请成功,如下图AK所示,通过它即可显示JavaScript百度地图。它包括Android端、浏览器端、服务器等应用。

百度地图Hello World:http://developer.baidu.com/map/jsdemo-mobile.htm#a1_1
详细代码如下所示,需要填写你的密钥,本地新建一个a1_1.html即可。

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><style type="text/css">body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;}#golist {display: none;}@media (max-device-width: 780px){#golist{display: block !important;}}</style><script type="text/javascript" src="http://api.map.baidu.com/api?type=quick&ak=您的密钥&v=1.0"></script><title>地图官网展示效果</title>
</head>
<body><a id="golist" href="../demolist.htm">返回demo列表页</a><div id="allmap"></div>
</body>
</html>
<script type="text/javascript">// 百度地图API功能var map = new BMap.Map("allmap");            // 创建Map实例var point = new BMap.Point(116.404, 39.915); // 创建点坐标map.centerAndZoom(point,15);                 // 初始化地图,设置中心点坐标和地图级别。map.addControl(new BMap.ZoomControl());      //添加地图缩放控件
</script>

通过Chrome浏览器打开a1_1.html如下图所示:

然后打开VS2012新建Winform项目,主要界面是通过WebBrowser。如下图所示:

WebBrowser是一个.NET 控件类,在.NET Framework 2.0 版中新增。WebBrowser 类使用户可以在窗体中导航网页。
其中最常见的webBrowser1.Navigate(textBox1.Text.Trim());即可访问URL各类网站。
这里也是通过该控件来显示本地JavaScript网页。核心代码如下:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;//新添加命名空间
using System.Net;
using System.IO;
using System.Security.Permissions;  //交互JSnamespace MapWinForms
{[PermissionSet(SecurityAction.Demand, Name = "FullTrust")][System.Runtime.InteropServices.ComVisibleAttribute(true)]public partial class Form1 : Form{public Form1(){InitializeComponent();}private void button1_Click(object sender, EventArgs e){//本地文件 MapWinForms\bin\Debugstring url = Application.StartupPath + "\\a1_1.html";textBox1.Text = url;string file = "file:///E:\\WinFormBaiduMap\\a1_1.html";//屏蔽js相关错误webBrowser1.ScriptErrorsSuppressed = true; //导航显示本地HTML文件webBrowser1.Navigate(url);}}
}

运行结果如下图所示:

下一篇文章会详细介绍JavaScript一些百度地图常用的函数即应用。
下面是推荐一些相关的优秀博客:
C#调用百度地图API经验分享(四) 期待秋天的叶
基于百度地图API的WinForm地图 秦元培
C#百度地图控件BMap.Net 秦元培
C# Form调用百度地图api攻略及常见问题
百度地图js小结 java_xiaobin
http://www.cnblogs.com/ljmin/archive/2012/07/27/2612413.html

二. 解决BMap未定义问题

在使用C# WebBrowser控件显示百度地图时,通常会报错BMap未定义。
报错:BMap.Map("container") BMap未定义 BMap is not defined


未解决方法:
网上看到很多资料,但是都没有解决。包括:
1.需要将密钥验证的js一定要放在head标签内;
2.C#忽略JS错误:webBrowser1.ScriptErrorsSuppressed = true;
3.在html文件head中添加如下代码:

<script type="text/javascript" src="http://api.map.baidu.com/library/DistanceTool/1.2/src/DistanceTool_min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/DrawingManager/1.4/src/DrawingManager_min.js"></script>
<script type="text/javascript" src="http://api.map.baidu.com/library/SearchInfoWindow/1.4/src/SearchInfoWindow_min.js"></script>

官方解决方法(没有作用):
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=4530
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=3062
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&tid=88488
http://bbs.lbsyun.baidu.com/forum.php?mod=viewthread&page=1&tid=88543
http://blog.csdn.net/zhujianli1314/article/details/45696259
https://segmentfault.com/q/1010000004531211
HTTPS调用百度地图API提示: BMap未定义

后来因为我使用WebBrowser控件显示http://www.baidu.com都不能访问,因为它都是微软开发的软件,我怀疑该控件是调用IE浏览器显示的。
修复如下:工具=》Internet选项=》高级=》重置=》重启电脑。同时可以在安全中,设置启用加载脚本,混合等方法。

修复前确实我自己的IE浏览器不能使用了,对IE浏览器进行了修复后,C#程序确实能通过WebBrowser访问网页了。自己以为是这个原因,后来在加载JS时仍然报错:BMap未定义。

最终解决方法:
该方法只保证能正确调用,但是具体设置密钥错误的原因我也不清楚。
将head中调用密钥的代码修改为不需要密钥的:
<script type="text/javascript"
         src="http://api.map.baidu.com/api?key=&amp;v=1.1&services=true">
</script>

替代的代码:
<script type="text/javascript"
        src="http://api.map.baidu.com/api?type=quick&ak=您的密钥&v=1.0">
</script>
或者使用下面的代码也是能在C#中正常显示的:(AK为我的应用)
<script type="text/javascript"
        src="http://api.map.baidu.com/api?v=1.0&ak=ui7X2CSu3ITjojARL4tILi5W1i9gkDVS">
</script>

三. 备份一段JS百度地图代码

下面是一段代码备份:

<!DOCTYPE html>
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><meta name="viewport" content="initial-scale=1.0, user-scalable=no" /><script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=ui7X2CSu3ITjojARL4tILi5W1i9gkDVS"></script><style type="text/css">body, html,#allmap {width: 100%;height: 100%;overflow: hidden;margin:0;font-family:"微软雅黑";}</style><title>百度地图API测试</title>
</head>
<body><div id="allmap"></div>
</body>
</html>
<script type="text/javascript">    var map = new BMap.Map("allmap");                     // 创建Map实例var pointA = new BMap.Point(113.92983, 22.509397);    // 创建点坐标   地址 蛇口沃尔玛   var pointB = new BMap.Point(113.942129, 22.522642);   //地址 海岸城map.centerAndZoom(pointA, 15);map.enableScrollWheelZoom();                          //启用滚轮放大缩小map.addControl(new BMap.NavigationControl());map.addControl(new BMap.ScaleControl());map.addControl(new BMap.OverviewMapControl());//map.setCurrentCity("北京"); // 设置当前城市信息/**  给地图添加监控 获取当前点击经纬度map.addEventListener("click", function(e){alert(e.point.lng + ", " + e.point.lat); });*/addMarker(pointA, "蛇口沃尔玛", "地址:工业大道和东滨路交汇处<br/>电话:(0755)26816711");           // 创建标注1  addMarker(pointB, "海岸城购物中心", "地址:文心五路33号海岸城东座212号<br/>电话:(0755)86125888");  // 创建标注2  //开始测距       var polyline = new BMap.Polyline([pointA, pointB], { strokeColor: "orange", strokeWeight: 6, strokeOpacity: 0.5 });  //定义折线map.addOverlay(polyline);     //添加折线到地图上polyline.addEventListener("click", function () {    //监听标注事件        alert('从蛇口沃尔玛到海岸城购物中心的距离是:' + (map.getDistance(pointA, pointB)).toFixed(2) + ' 米。');  //获取两点距离,保留小数点后两位});//获取驾车路线//var driving = new BMap.DrivingRoute(map, { renderOptions: { map: map, autoViewport: true} });//driving.search(pointA, pointB);// 编写自定义函数,创建标注function addMarker(point, a, b) {var marker = new BMap.Marker(point);map.addOverlay(marker);//map.removeOverlay(marker);                      // 将标注从地图中移除//marker.setAnimation(BMAP_ANIMATION_BOUNCE);     // 跳动的动画marker.addEventListener("click", function () {    // 监听标注事件  var opts = {         // 创建信息窗口width: 250,      // 信息窗口宽度    height: 100,     // 信息窗口高度    title: a         // 信息窗口标题   }var infoWindow = new BMap.InfoWindow(b, opts);  // 创建信息窗口对象    map.openInfoWindow(infoWindow, point);          // 打开信息窗口           //alert("marker的位置是" + p.lng + "," + p.lat);   });}
</script>

运行结果如下图所示:

参考:
http://blog.csdn.net/smartsmile2012/article/details/47754163
http://www.sufeinet.com/thread-7897-1-1.html

PS:最后希望文章对你有所帮助!这篇文章主要是一些在线笔记和入门介绍,非常基础的内容,详细知识参考百度地图官方文档。
(By:Eastmount 2016-05-15 深夜2点半  http://blog.csdn.net/eastmount/ )

C#调用百度地图API入门解决BMap未定义问题相关推荐

  1. 前端调用百度地图API,解决ios上地图不显示、https访问不了等问题

    注册申请百度地图ak 不会的童鞋们点链接 这里还是说一下注册的时候要注意的白名单填写项,如不确定直接写 * 号 下面说具体操作 在页面引入js文件 <script type="text ...

  2. IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应

    (转)IOS开发百度地图API入门到精通-用点生成路线,导航,气泡响应 IOS百度地图API开发自定义气泡,点击气泡自动生成路线,以及拖拽 IOS百度地图开发POISearch搜索附近停车场,附近加油 ...

  3. c语言api获取百度地图,H5调用百度地图API获取地理位置

    //获取当前位置 var geolocation = new BMap.Geolocation(); geolocation.getCurrentPosition(function(r){ alert ...

  4. 百度地图AK申请注意+百度地图API生成热力图+调用百度地图API自动获取经纬度和地址

    文章目录 一.百度地图AK密钥申请 二.调用百度地图API生成热力图 三.调用百度地图API自动获取经纬度和地址 一.百度地图AK密钥申请 点击百度地图API控制台,输入登录账户,即可进入,若账户未完 ...

  5. 调用百度地图API出现 error inflating class com.baidu.mapapi.map.mapview

    调用百度地图API出现 error inflating class com.baidu.mapapi.map.mapview 问题如下 本来以为解决了,但后来重新运行了一下,又坏了,然后改成原来的样子 ...

  6. Python调用百度地图api路径查询

    通过调用百度地图api获取两个地点的距离和时间.参数详见百度地图api官方文档. # -*- coding: utf-8 -*- """ Created on Thu M ...

  7. centerandzoom 无效_Django调用百度地图api在地图上批量增加标记点

    在调用百度地图api进行web开发时遇到了一个需求,我们需要在网页中内嵌一个div 然后在div中调用百度地图的js显示我们所需要的地区.根据需求坐标在地图上添加若干个标记点,并批量的为各个标记点设置 ...

  8. HTML5页面调用百度地图API,获取当前位置并导航到目的地

    微信也可用, <!DOCTYPE html> <html lang="zh-cmn-Hans"><meta charset="UTF-8&q ...

  9. 调用百度地图API,如何只显示某个省份的地图

    需求如下 1.调用百度地图API 2.只显示某个省份的地图如安徽省,其他的都不要显示 实现步骤如下 1.调用百度地图Api,显示地图 https://blog.csdn.net/tian_jiangn ...

最新文章

  1. 痛苦的老师开心的我们
  2. java面试基础_Java面试基础
  3. 市面上有哪几种门_选择 low-e门窗玻璃,你想知道的都在这了
  4. django中collectstatic的使用
  5. Arduino蓝牙无线自动下载程序 Arduino无线下载
  6. redies数据类型及应用场景
  7. 解决缓存和数据库双写数据一致性问题
  8. 阿里 70 后程序员的 24 个“避坑”法则
  9. 浅谈mian函数的参数解析
  10. 木马万能查杀清除方法,木马专杀
  11. QT—常用容器 QStringList,QVector,QMap,QHash,QVariant
  12. Python3不存在raw_input( )了
  13. QUIC linux编译
  14. BSN与区块链云服务的区别是什么?
  15. python requests cookie处理
  16. 笔记②:牛客校招冲刺集训营---C++工程师(面向对象(友元、运算符重载、继承、多态) -- 内存管理 -- 名称空间、模板(类模板/函数模板) -- STL)
  17. 前端访问后端html,前端访问没问题 后端无法访问
  18. C语言实现雷达RD成像算法,RD成像算法分析
  19. Multicore Navigator (CPPI):Notify end of QM interrupt
  20. 半天速成Python超简网站

热门文章

  1. mongodb 对内存的严重占用以及解决方法
  2. Python(88)_双下划线方法
  3. Hadoop数据倾斜及解决办法
  4. Tunnel Warfare(HDU1540+线段树+区间合并)
  5. mysql数据开启远程登录,修改端口,开放防火墙端口
  6. [转]密码技术-实现数字信封和数字签名
  7. javascript调用Flash里对象的方法(函数)搞了五个小时。
  8. 一个filter子查询测试
  9. Java黑皮书课后题第9章:*9.5(使用GregorianCalendar类)Java API中有一个位于包java.util中的类GregorianCalendar
  10. 数据结构课程设计---学生信息管理系统