1、坐标转换
百度地图API中坐标转换的方法如下:
var convertor = new BMap.Convertor();
convertor.translate(point, 1, 5, translateCallback)
其中的1和5代表什么并不清楚,其实也不太需要理解,point就是个成员为Bmap.Point的数组,也就是点坐标合集,translateCallback就是自己写的回调函数,问题就在于,这个回调函数是不能自定义输入参数的,它的输入参数只有一个data,一个转换后的坐标数组,这就意味着,如果我在使用WinForm与其交互的时候,需要不仅仅是在地图上画出默认mark,而是自定义mark的图标、标签等,那这些参数是不能作为参数传入回调函数的,然而百度地图又只有这一种方法,目前的解决方式就是设置个全局变量来存我输入的自定义参数,然后在回调函数里用全局变量。如果我需要多个点呢?那当然就是只能设全局变量为数组来存储了。
2、信息窗口
百度地图中的mark除了添加图标和标签,还有很重要的一点,是可以绑定点击事件,弹出信息窗口:
var infoWindow = new BMap.InfoWindow("地址:北京市东城区王府井大街88号乐天银泰百货八层", opts); // 创建信息窗口对象
marker.addEventListener("click", function(){map.openInfoWindow(infoWindow,point); //开启信息窗口});
代码很简单,很好理解,我在项目中遇到问题是:我需要不断创建新的InfoWindow,但是最后发现,所有的mark点击之后都在同个地方弹出同一个信息窗口,那是最后一个mark应该绑定的信息窗口和位置,这很容易想到,是因为这个InfoWindow是全局变量会出现的问题,但我并没有这么做过,最后我的解决方法还是比较麻烦的:
首先是设置一个全局变量的mark的数组和InfoWindow的数组,每次new一个新的mark,push到数组中,new一个InfoWindow同样push到对应的数组中,在mark绑定的click事件中,不要写:
marker.addEventListener("click", function(){map.openInfoWindow(infoWindow,point);
而是:
marker[i].addEventListener("click", function(){map.openInfoWindow(infoWindows[markers.indexOf(this)],point);
注意,目前C#的WebBrowser不支持数组使用indexOf方法,得另外写一个。