模拟数据+前端搜索

我有一定的房产数据,还有一定的银行数据,我想在百度地图上标注出来,并且能搜索到这些数据。可是百度的数据库里并没有我的数据,怎么办呢?

----------------------------------------------------------------------------------------------------------------------------------------------------------------

一、无需数据库,如何建立自己的地理信息表

如果让初学者去建立数据库,那么意味着大家还要学习数据库,以及网络后端的知识。为了方便学习,能够快速的掌握如何构建房产地图,银行地图等,我们可以把数据存储在前端,搜索自己数据的一个办法。

首先,我们需要为自己的数据建立一个数组,把他们存储起来,像这样:

 1 // 标注点数组
 2 var BASEDATA = [
 3 {title:"奥亚酒店",content:"北苑路169号",point:"116.422792|40.009471",isOpen:1,icon:{w:21,h:21,l:115,t:46,x:1,lb:10}},
 4 {title:"珀丽酒店",content:"将台西路8号",point:"116.484289|39.97936",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 5 {title:"贵国酒店",content:"左家庄1号",point:"116.454494|39.964011",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 6 {title:"科通酒店",content:"民族园路8号院2号楼",point:"116.394601|39.987925",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 7 {title:"将台酒店",content:"酒仙桥路甲12号",point:"116.496024|39.976864",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 8 {title:"成宏酒店",content:"北四环东路惠新东桥西北侧",point:"116.429445|39.995392",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 9 {title:"华商酒店",content:"延静西里2号",point:"116.488962|39.921939",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
10 {title:"标华酒店",content:"北京市 朝阳区红庙路柴家湾1号",point:"116.489284|39.92104",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
11 {title:"万程酒店",content:"天坛路89号",point:"116.411762|39.89457",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
12 {title:"黎昌酒店",content:"永定门外彭庄乙58号",point:"116.393532|39.876272",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
13 {title:"北京银行",content:"北京市海淀区白石桥路39号",point:"116.329593|39.952398",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
14 {title:"海淀银行",content:"丹棱街16西门",point:"116.315551|39.984388",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
15 {title:"北京银行",content:"北京市西城区文津街附近",point:"116.391713|39.929007",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
16 {title:"首都银行",content:"东三环南路88号",point:"116.469899|39.87684",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
17 {title:"国家银行",content:"中关村南大街33号",point:"116.331292|39.949031",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
18 {title:"崇文区银行",content:"北京市崇文区花市大街113号(乐天玛特超市旁)的敕建火德真君庙内",point:"116.427671|39.903568",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
19 {title:"朝阳区银行",content:"北京市朝阳区朝外小庄金台里17号",point:"116.47766|39.922295",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
20 {title:"宣武区银行",content:"教子胡同8号",point:"116.374561|39.894302",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
21 {title:"东城区银行",content:"交道口东大街85号",point:"116.41927|39.9474",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
22 {title:"西城区银行",content:"北京市西城区后广平胡同26号",point:"116.368099|39.942332",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}}
23 ]

注意:这部分是写在JS里的。

其中,title是信息窗口打开后的标题,同时也是label标签的取值。

content是信息窗口的内容。

point是经纬度,请使用百度坐标(获取地址:http://dev.baidu.com/wiki/static/map/API/tool/getPoint/

isopen是控制信息窗口是否打开的开关。

icon里的选项是控制marker图片的,width是宽,height是高等等。

二、如何查找,并显示自己的数据

你需要在HTML中写一个搜索框,一个搜索按钮。

1 <p>
2 <input id="keyword" type="text" style="150px;" value="银行"/>
3 <input type="button" value="搜索" onclick="search('type','show','keyword')"/>
4 </p>

搜索框,需要一个id,例如keyword来传递要搜索的参数。我写了银行。本案例中,由于有酒店数据,你还可以写酒店。

搜索按钮,上面需要一个点击事件onclick="search('type','show','keyword')"。根据type类型、show是否显示、keyword关键词来做搜索。

那么,当搜索的内容,就是id=keyword里面的keyword和我自己的数据,就是步骤一里的数组,相同时,我就创建一个marker标注,并且默认打开它的信息窗口。

 1 window.search = function(name_t,name_s,id_d){
 2 var t_o = document.getElementsByName(name_t);
 3 var s_o = document.getElementsByName(name_s);
 4 var s_v,t_v,d_v = document.getElementById(id_d).value;
 5 for(var i = 0; i < t_o.length; i++){
 6 if(t_o[i].checked){
 7 t_v = t_o[i].value;
 8 }
 9 }
10 for(var i = 0; i < s_o.length; i++){
11 if(s_o[i].checked){
12 s_v = s_o[i].value;
13 }
14 }
15 searchClass.trim(t_v) == "" && (t_v = "single");
16 var dd = searchClass.search({k:"title",d:d_v,t:t_v,s:s_v});
17 addMarker(dd);//向地图中添加marker
18 }

三、全部源代码

为了更加符合用户的搜索习惯,我设计了精确查找和模糊查找两种情况。

精确查找:就是用户输入的KeyWord,和我数据库里的一模一样时,就打开信息窗口。这时候一般只能打开一个。因为你自己的数据应该不会有重复的。

模糊查找:比如查找酒店,会显示全部的酒店。比如查找银行,会显示全部的银行数据。默认打开第一个的信息窗口。

为了方便大家看到我添加进去的数据信息,这里还设计了“仅查找到的内容”和“显示所有的内容”

仅查找到的内容:用户搜什么,就显示出什么来。

显示所有的内容:显示我全部添加的数据。

全部源代码在这里,我减去可很多数据,大家可以自己添加.

  1 <html>
  2 <head>
  3 <meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
  4 <title>自家数据+前端搜索</title>
  5 <script type="text/javascript" src="http://api.map.baidu.com/api?v=1.1&services=true"></script>
  6 </head>
  7 <body>
  8 <div style="520px;height:340px;border:1px solid gray" id="container"></div>
  9 <p>
 10 二选一:
 11 <input id="type1" type="radio" name="type" value="single"/><label for="type1">精准查找</label>
 12 <input id="type2" type="radio" name="type" value="more" checked="checked"/><label for="type2">模糊查找</label>
 13 </p>
 14 <p>二选一:
 15 
 16 <input id="show1" type="radio" name="show" value="" checked="checked"/><label for="show1">仅查找到的内容</label>
 17 <input id="show2" type="radio" name="show" value="all"/><label for="show2">显示所有内容</label>
 18 </p>
 19 <p>
 20 <input id="keyword" type="text" style="150px;" value="银行"/>
 21 <input type="button" value="搜索" onclick="search('type','show','keyword')"/>
 22 </p> 
 23 </body>
 24 </html>
 25 <script type="text/javascript">
 26 // 标注点数组
 27 var BASEDATA = [
 28 {title:"奥亚酒店",content:"北苑路169号",point:"116.422792|40.009471",isOpen:1,icon:{w:21,h:21,l:115,t:46,x:1,lb:10}},
 29 {title:"珀丽酒店",content:"将台西路8号",point:"116.484289|39.97936",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 30 {title:"北京银行",content:"北京市海淀区白石桥路39号",point:"116.329593|39.952398",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 31 {title:"海淀银行",content:"丹棱街16西门",point:"116.315551|39.984388",isOpen:0,icon:{w:21,h:21,l:0,t:0,x:6,lb:5}},
 32 ]
 33 
 34 //创建和初始化地图函数:
 35 function initMap(){
 36 window.map = new BMap.Map("container");
 37 map.centerAndZoom(new BMap.Point(116.412318,39.887037),12);
 38 map.enableScrollWheelZoom();
 39 map.addControl(new BMap.NavigationControl());
 40 window.searchClass = new SearchClass();
 41 searchClass.setData(BASEDATA)
 42 var dd = searchClass.search({k:"title",d:"银行",t:"more",s:""});//t:{single|more},s{all|!all}
 43 addMarker(dd);//向地图中添加marker
 44 }
 45 window.search = function(name_t,name_s,id_d){
 46 var t_o = document.getElementsByName(name_t);
 47 var s_o = document.getElementsByName(name_s);
 48 var s_v,t_v,d_v = document.getElementById(id_d).value;
 49 for(var i = 0; i < t_o.length; i++){
 50 if(t_o[i].checked){
 51 t_v = t_o[i].value;
 52 }
 53 }
 54 for(var i = 0; i < s_o.length; i++){
 55 if(s_o[i].checked){
 56 s_v = s_o[i].value;
 57 }
 58 }
 59 searchClass.trim(t_v) == "" && (t_v = "single");
 60 var dd = searchClass.search({k:"title",d:d_v,t:t_v,s:s_v});
 61 addMarker(dd);//向地图中添加marker
 62 }
 63 
 64 //创建marker
 65 window.addMarker = function (data){
 66 map.clearOverlays();
 67 for(var i=0;i<data.length;i++){
 68 var json = data[i];
 69 var p0 = json.point.split("|")[0];
 70 var p1 = json.point.split("|")[1];
 71 var point = new BMap.Point(p0,p1);
 72 var iconImg = createIcon(json.icon);
 73 var marker = new BMap.Marker(point,{icon:iconImg});
 74 var iw = createInfoWindow(i);
 75 var label = new BMap.Label(json.title,{"offset":new BMap.Size(json.icon.lb-json.icon.x+10,-20)});
 76 marker.setLabel(label);
 77 map.addOverlay(marker);
 78 label.setStyle({
 79 borderColor:"#808080",
 80 color:"#333",
 81 cursor:"pointer"
 82 });
 83 
 84 (function(){
 85 var _json = json;
 86 var _iw = createInfoWindow(_json);
 87 var _marker = marker;
 88 _marker.addEventListener("click",function(){
 89 this.openInfoWindow(_iw);
 90 });
 91 _iw.addEventListener("open",function(){
 92 _marker.getLabel().hide();
 93 })
 94 _iw.addEventListener("close",function(){
 95 _marker.getLabel().show();
 96 })
 97 label.addEventListener("click",function(){
 98 _marker.openInfoWindow(_iw);
 99 })
100 if(!!json.isOpen){
101 label.hide();
102 _marker.openInfoWindow(_iw);
103 }
104 })()
105 }
106 }
107 //创建InfoWindow
108 function createInfoWindow(json){
109 var iw = new BMap.InfoWindow("<b class='iw_poi_title' title='" + json.title + "'>" + json.title + "</b><div class='iw_poi_content'>"+json.content+"</div>");
110 return iw;
111 }
112 //创建一个Icon
113 function createIcon(json){
114 var icon = new BMap.Icon("http://openapi.baidu.com/map/images/us_mk_icon.png", new BMap.Size(json.w,json.h),{imageOffset: new BMap.Size(-json.l,-json.t),infoWindowOffset:new BMap.Size(json.lb+5,1),offset:new BMap.Size(json.x,json.h)})
115 return icon;
116 }
117 
118 function SearchClass(data){
119 this.datas = data;
120 }
121 // rule = {k:"title",d:"酒店",s:"all",t:"single"}=>t{single:(key=?),more:(key like[%?%])}//t:{single|more},s{all|!all}
122 SearchClass.prototype.search = function(rule){
123 if(this.datas == null){alert("数据不存在!");return false;}
124 if(this.trim(rule) == "" || this.trim(rule.d) == "" || this.trim(rule.k) == "" || this.trim(rule.t) == ""){alert("请指定要搜索内容!");returnfalse;}
125 var reval = [];
126 var datas = this.datas;
127 var len = datas.length;
128 var me = this;
129 var ruleReg = new RegExp(this.trim(rule.d));
130 var hasOpen = false;
131 
132 var addData = function(data,isOpen){
133 // 第一条数据打开信息窗口
134 if(isOpen && !hasOpen){
135 hasOpen = true;
136 data.isOpen = 1;
137 }else{
138 data.isOpen = 0;
139 }
140 reval.push(data);
141 }
142 var getData = function(data,key){
143 var ks = me.trim(key).split(/./);
144 var i = null,s = "data";
145 if(ks.length == 0){
146 return data;
147 }else{
148 for(var i = 0; i < ks.length; i++){
149 s += '["' + ks[i] + '"]';
150 }
151 return eval(s);
152 }
153 }
154 for(var cnt = 0; cnt < len; cnt++){
155 var data = datas[cnt];
156 var d = getData(data,rule.k);
157 if(rule.t == "single" && rule.d == d){
158 addData(data,true);
159 }else if(rule.t != "single" && ruleReg.test(d)){
160 addData(data,true);
161 }else if(rule.s == "all"){
162 addData(data,false);
163 }
164 }
165 return reval;
166 }
167 SearchClass.prototype.setData = function(data){
168 this.datas = data;
169 }
170 SearchClass.prototype.trim = function(str){
171 if(str == null){str = "";}else{ str = str.toString();}
172 return str.replace(/(^[s	xa0u3000]+)|([u3000xa0s	]+$)/g, "");
173 }
174 
175 
176 initMap();//创建和初始化地图
177 </script>

最后依然感谢@酸奶小妹的博文。后续资料有空整理。

原文地址:https://www.cnblogs.com/ao-xiang/p/5527918.html