`
accpxudajian
  • 浏览: 451987 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

获取行政区划地名地址的简称

阅读更多

 

 

做地图相关的项目就会涉及到地名地址的查询,那么查询的结果就是行政区划数据,
这个方法是为了更好的展示,  而对地名地址数据进行自动划分和截取的功能。 
 

#方法体

 

 

/**
*获取字符串简称的方法
*@param fullString 原字符串(必填)
*@param key 截取的关键字(选填) 如果为空,则从头开始截取
*@param type 截取类型(next 下一个行政区划,last 最后一个行政区划,self 当前行政区划)
*@param maxLen 最大长度(选填 默认为100)
*@return 截取后的字符串的简称
*****/
function getShortName(fullString,key,type,maxLen){
	if(!fullString){return "";}
	var defMaxLen = 10;//默认最大长度

	//混合参数处理
	if(typeof(key)=='undefined'){//没有第二个参数,则截取最大长度,然后立即返回。
		return fullString.substr(0,defMaxLen);
	}else if(typeof(key)=='number'){//第二个参数是最大长度,则截取指定长度立即返回
		maxLen = key-0||defMaxLen;
		return fullString.substr(0,maxLen);
	}else if(typeof(type)=='number'){//第三个参数是最大长度,那么第四个表示type类型
		var temp = maxLen;//临时中间变量
		maxLen = type-0||defMaxLen;
		type = temp||"last";
	}else{//按照正常顺序传递参数
		maxLen = maxLen-0 || defMaxLen;
		key = key||fullString;
		type = type||"last";	
	}
	if(fullString.indexOf(key)==-1){//查询关键字不在字符串中,则截取最大长度,然后立即返回。
		return fullString.substr(0,maxLen);
	}
	//混合参数处理结束
	//log("fullString ="+fullString+",key="+key+",type="+type+",maxLen = "+maxLen);
	var index = fullString.indexOf(key);
	var len = fullString.length;
	
	var unitArr = "国,省,市,区,县,乡,镇,村,州,组,委,盟,旗,号,胡同".split(",");//发现缺少则补充 街,路,
	var reg = new RegExp(unitArr.join("|"));//行政区划单位的正则
	var wordArr = fullString.split(reg);//去掉了行政区划的地名地址的数组
	var wordLen = wordArr.length;//所有地名地址的长度
	//log(wordArr);
	//默认是获取最后一个也是最小范围的一个行政区划级别
	//IE9,FF,Chrome下,fullString如果最后一个单词匹配正则,则wordArr最后一个是""字符串,所以得向前去一个
	var name =  wordArr[wordLen-1]||wordArr[wordLen-2];//默认type='last' 
	
	//log("name = "+name);
	if("self"==type){//当前关键字所在的地名地址级别		
		name =  key.replace(reg,"");//去掉了行政区划的当前的地名		
	}else if("next"==type){//下一个行政区划级别的地名地址		
		name =  key.replace(reg,"");//去掉了行政区划的当前的地名
		var nextIndex = 0;//通过循环,找到下一个地名地址所在的索引(没想到更好的办法)
		for(var i=0;i<wordLen;i++){
			if(wordArr[i].indexOf(name)>=0 ){//使用模糊匹配 这个就是当前的地名地址所在的位置
				if((i+1)<wordLen){//判断是否还有下一个
					nextIndex = i+1;
				}else{//没有下一个了
					nextIndex = i;
				}
				break;
			}
		}
		name = wordArr[nextIndex];
	}
	var newName = name;//添加行政区划单位
//	log("newName = "+newName);
	var matchCount = 0;//匹配次数
	//由于数据可能不是按照正则里边的行政区划顺序,所以只能通过循环并比对的方法
	for(var j=0;j<unitArr.length;j++){	
		//添加完行政区划后,可在字符串中找到。
		if(fullString.indexOf(name+unitArr[j])>=0 ){
			//log("中啦-----------newName="+newName);
			newName = name+unitArr[j];
			matchCount++;//匹配次数自增
			if("self"==type){//本身模式 找到第一个就break
				break;
			}else if("next"==type){
				if(matchCount>=2){//next模式 只进行2次,使用matchCount区分次数
					break;
				}
			}else{/*不可break,因为后边可能有重名的更小级别的行政区划 例如吉林省吉林市*/}
		}
		//log("matchCount="+matchCount);
	}

	newName =  newName.substr(0,maxLen);
	//log("key = "+key+",newName = "+newName);	
	//log("<br/>");
	return newName;
}

 

#测试

 

 

//测试数据
var value ="中国吉林省吉林市长春区延庆县合隆镇华西沟村";
log(getShortName(value,"吉林",4,"self"));
log(getShortName(value,"吉林","next",4));
log(getShortName(value,"广顺南大街"));
log(getShortName(value,"长春"));
log(getShortName(value,"延庆县"));
log(getShortName(value,"合隆镇"));
log(getShortName(value,"ABC",5));
log(getShortName(value,"华西"));

log(getShortName("中国北京市","北京"));
log(getShortName(value,5));
log(getShortName(value,"长春",2));

log(getShortName("中国北京市","北京",4));
log(getShortName(value));
/*
返回结果:
吉林省
吉林市
中国吉林省吉林市长春
华西沟村
华西沟村
华西沟村
中国吉林省
华西沟村
北京市
中国吉林省
华西
北京市
*/
 

 

 

 

愤怒的coder 

 

 

  • 大小: 29.7 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics