又开始折腾高德的JS API,这个相对来说简单一些。遇到几个问题,这里简单记录一下。一下API版本最后更新时间为 2016年12月7日 ,v1.3。
(一)坐标转换
高德提供了由GPS(wgs84),baidu等坐标转换为高德地图坐标的转换方法:AMap.convertFrom。这个方法却是向服务器做POST GET查询,将提交的坐标数据或者坐标array计算出结果后返回。
当提交array时,array的数目不能超过一定数值,否则会返回error(粗测是400左右)。所以如果一次性需转换大量数据的时候需要做好拆分工作。其次是范围。转换只是对国内地理坐标有效,国外的位置信息即使传给服务器,仍旧传回相同的数据,这倒是没什么惊讶的。
代码随机生成了100,000个在指定范围内的坐标值,然后用这些坐标去请求转换坐标,将最终结果绘制到地图上,绘制的结果如最后。散布的散点怀疑是配对出错,暂时忽略问题。
var aaa=new Array();
for (var i = 0; i < 100000; i++)//在纬度40~60,经度50~140见生成10w个点对象,除了lnglat属性都是自定义的属性
aaa.push({name:i,lnglat:new AMap.LngLat((Math.random()*90+50),(Math.random()*40+20)));
var mass=new AMap.MassMarks(aaa,{若干属性});
mass.setMap(map);
for(var i=start_len;i<(result["locations"].length+start_len);i++){
if(all_positions[i].lnglat.getLat()!=result["locations"][i-start_len].getLat()&&all_positions[i].lnglat.getLng()!=result["locations"][i-start_len].getLng()){
all_positions[i].lnglat=result["locations"][i-start_len];
tmp.push(all_positions[i]);
}
}
在绘制大量的不需要后期更改的marker时,首选还是AMap.MassMarks。这个与Marker在性能上不是差几个数量级的问题。当然,节约了性能也就意味着功能上的欠缺,这个图层只能配置相同的style(但可以添加多个图层),可以接受点击(click),鼠标滑进(mouseover),鼠标滑出(mouseout)等事件,不可以更改每个marker(实际上是一个包含lnglat属性的对象)的属性。而每个事件中,参数的data属性才是该对象。如:
function on_click(obj){
var marker=new AMap.Marker({map:map});//点击时绘制一个自己的marker
marker.setPosition(obj.data.lnglat);//设置marker的位置为点击对象的位置
}