echarts 和国标编码转化

    2018年3月8日更新:

    从全部地理数据查找某个地理数据时,由整体遍历改为二分法,将时间复杂度从O(n2)降低到O(log2n)。

    同时将js里的数据按照编码排序重新生成js变量,提供二分法的格式基础

    飞线需要坐标数据,名称数据需要国家的汉字名称数据,而接口返回的数据是国标编码。前面两个博客已经梳理了世界的国标编码和国家中文名称,国家英文名称和坐标点的对应关系http://blog.csdn.net/abcmaopao/article/details/79409840;中国的地理名称,坐标点和行政编码之前的关系http://blog.csdn.net/abcmaopao/article/details/79554904,使用echarts的转化工具http://echarts.baidu.com/spreadsheet.html将博客中的表格转化为js文件保存起来。

    飞线数据接口返回格式如下:

    {
"data": [{
"from": "CN",
"to": "US"
},
{
"from": "IN",
"to": "CA"
},
{
"from": "RU",
"to": "CA"
}
]

}

地理数据接口返回格式如下:

{
    "CN": {
        "total": 56985,
        "list": {
            "370000": 2345,
            "370100": 1234,
            "370200": 10000
        }
    },
    "US": {
        "total": 23659
    },
    "370000": {
        "total": 20659
    },
    "130000": {
        "total": 23659
    },
    "371400": {
        "total": 20659
    },
    "370100": {
        "total": 3659
    }

}

传参时将echarts名称转化为国标编码函数如下:

function compute_basecode(name,type){
var echarts_this_array = (type == "world")?echarts_world:echarts_china;
for(var jndex in echarts_this_array){
var echarts_jndex = echarts_this_array[jndex];
if(echarts_jndex.name == name){
return echarts_jndex.code;
}
}
return "";

}

收到数据从国标编码转化为中文名称+中英文名称映射或者坐标数据代码如下:

function compose_echarts(data,method){
var min = 9999999,max = -9999999,result = {};
result['data'] = [];
var echarts_this_array = (method.indexOf("world_") > -1)?echarts_world:echarts_china;
if(method.indexOf("_point") > -1){
result['min'] = min;
result['max'] = max;
for(var index in data){
var current = data[index];
var jndex = BinarySearch(echarts_this_array,index,'code');
if(jndex > -1){
var echarts_jndex = echarts_this_array[jndex];
result['data'].push({"name":echarts_jndex.name,"value":current.total});
if(current.total < result['min']){
result['min'] = current.total;
}
if(current.total > result['max']){
result['max'] = current.total;
}
}
}
//世界地图需要额外扩展映射数据
if(method.indexOf("world_") > -1){
result['nameMap'] = {};
for(var jndex in echarts_this_array){
var echarts_jndex = echarts_this_array[jndex];
result['nameMap'][echarts_jndex.prop] = echarts_jndex.name;
}
}
}
else if(method.indexOf("_line") > -1){
for(var index in data){
var from_code = data[index].from;
var to_code   = data[index].to  ;
var from_location = null,to_location = null;
var jndex = BinarySearch(echarts_this_array,from_code,'code');
if(jndex > -1){
var echarts_jndex = echarts_this_array[jndex];
from_location = [echarts_jndex.x,echarts_jndex.y];
}
var kndex = BinarySearch(echarts_this_array,to_code,'code');
if(kndex > -1){
var echarts_kndex = echarts_this_array[kndex];
to_location = [echarts_kndex.x,echarts_kndex.y];
}
if(from_location != null && to_location != null){
result['data'].push([from_location,to_location]);
}
}
}
return result;
}


/**
 * 二分查找法定位
 * @param arr 需要定位的数组
 * @param target 需要被确认位置的数据
 * @param field 该属于所在的字段
 * @returns 数据所在位置索引,不存在则为-1
 */
function BinarySearch(arr, target, field) {
    let s = 0;
    let e = arr.length - 1;
    let m = Math.floor((s + e) / 2);
    let sortTag = arr[s][field] <= arr[e][field];//确定排序顺序


    while (s < e && arr[m][field] !== target) {
        if (arr[m][field] > target) {
            sortTag && (e = m - 1);
            !sortTag && (s = m + 1);
        } else {
            !sortTag && (e = m - 1);
            sortTag && (s = m + 1);
        }
        m = Math.floor((s + e) / 2);
    }
    return (m>-1 && arr[m][field] == target)?m:-1;
}

分别如下面代码形式去调用:

var data = compose_echarts(data,'world_point');

params['country'] = (mapArray.length > 1)?compute_basecode(mapArray[1],'world'):"";

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值