GIS(七)——js版搜狗地图搜索功能美化版

最后更新于:2022-04-01 07:03:24

     在前2篇文章中介绍了关键字搜索和周边搜索的功能,但是界面比较简陋,所以这一版我主要做一些美化工作。      这次主要优化的方面有2个方面,一个是页面的样式,包括字体、按钮、布局等;二是要添加一个搜索的智能提示。      首先修改页面的样式,更改 ~~~ #map{position:absolute;width:1364px; height:550px;} #option{ height:50px; width:1336px; border:solid 1px #CCCCCC; padding:10px; } ~~~      添加两个css样式 ~~~ <link href="http://mfxuan.free.800m.net/blogCss/reset.css" type="text/css" rel="stylesheet" /> <link href="http://mfxuan.free.800m.net/blogCss/main.css" rel="stylesheet" type="text/css" /> ~~~      由于周边搜索的填充色太淡了,所以我做了一些修改: ~~~ //改变半圆填充颜色 function changeRadiusColor(){ var i=0; while($("ellipse").length<1 && i<1000){i++; } $("ellipse:eq(0)").attr("fill","#9ec0de"); } ~~~      为了避免在输入内容,但是未点击搜索,而是直接点击周边搜索而出现错误,所以我添加了一个变量: ~~~ var isSearch=false;//标记是否点击搜索 ~~~     修改搜索这个方法,当点击搜索时把这个变量为true: ~~~ //搜索 function search_center(){ var kw = $(".kw").val(); isSearch = true; search(null,kw); } ~~~      添加一个周边查询前的判断方法: ~~~ function search_area_before(classid){ if(!isSearch){//如果没有搜索,则先执行搜索,再搜索周边 search_center(); setTimeout(search_area,1000,classid); //设定搜索半圆的填充色 setTimeout(changeRadiusColor,1500); }else{ search_area(classid); } } ~~~     修改search_area方法,在方法的最后添加一下代码: ~~~ //重新定位地图中心点 setTimeout(toCenter,500); //设定搜索半圆的填充色 setTimeout(changeRadiusColor,300); ~~~     页面全部重新替换一下: ~~~ <body onload="initialize()"> <div class="yxqy"> <!-- 地图搜索 --> <div id="dtss" class="div_tab" style="display:block"> <div class="map_btn"> <span class="ssq"><input type="text" class="kw" onblur="if(this.value=='') $(this).css('background-image','url(http://mfxuan.free.800m.net/blogImage/map_sskBG2.jpg)')" onfocus="$(this).css('background-image','url(http://mfxuan.free.800m.net/blogImage/map_sskBG.jpg)')" onkeydown="if(event.keyCode == '13')search_center();"/> <a href="#" onclick="search_center()"> <img src="http://mfxuan.free.800m.net/blogImage/btn_serch.jpg" width="40" height="40" /></a></span> <!-- 搜索周边 --> <a href="#" onclick="search_area_before('97,1264,1262')"> <img src="http://mfxuan.free.800m.net/blogImage/btn_zbgjz.jpg" /></a> <a href="#" onclick="search_area_before('1228,1403,1330,1332')"> <img src="http://mfxuan.free.800m.net/blogImage/btn_zbcy.jpg" /></a> <a href="#" onclick="search_area_before('83,1321,1259')"> <img src="http://mfxuan.free.800m.net/blogImage/btn_zbsc.jpg" /></a> <a href="#" onclick="search_area_before('C_32')"> <img src="http://mfxuan.free.800m.net/blogImage/btn_zbld.jpg" /></a> <a href="#" onclick="search_area_before('1261')"> <img src="http://mfxuan.free.800m.net/blogImage/btn_zbjc.jpg" /></a> <a href="#" onclick="search_area_before('39')"> <img src="http://mfxuan.free.800m.net/blogImage/btn_zbyy.jpg" /></a> </div> <div id="map" class="map_map"></div> <div id="result"></div> </div> </div> </body> ~~~      这样页面就大变样了。主要是把布局修改了一下,搜索部分和地图之间有了层次感。搜索框和周边搜索也都使用了图片来进行了美化。下面是我美化好的图片和部分原图资料: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cca8e400.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cca9cf70.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccaace8b.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c25aaf11.jpg) [周边搜索按钮PS下载](http://mfxuan.free.800m.net/blogImage/btn_zbgjz.psd)![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccad22cc.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccadf32e.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccaf3cee.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccb10d3d.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccb23544.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccb3bb5b.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccb4b563.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971ccb5bfba.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c2601d58.jpg) ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c26128c9.jpg)      这样,美化部分就算是完成了。      下面就是这个搜索的智能提示了。在所有的地图提供商的搜索页面,都提供了智能提示的功能。所以,我也要把这个功能加到这里。但是却怎么也找不到搜狗地图的智能提示的js。看来搜狗地图没有提供这方面的实例和js。既然这样,那我只好用其他提供商的智能提示了。      在百度上搜索“百度搜索栏智能提示功能代码”,第一个就是教如何在页面上使用百度搜索栏的智能提示。首先在页面上添加一个input: ~~~ <input type="text" name="word" baiduSug="1|2"> ~~~      当设置baiduSug=1时,用户选中sug词条时默认执行表单提交动作;当设置baiduSug=2时,用户选中sug词条时不执行表单提交动作。       然后在网页中引入Javascript文件: ~~~ <script charset="gbk" src="http://www.baidu.com/js/opensug.js"></script> ~~~      这里需要特别强调的是:其中Javascript的文件位置是非常有讲究的!必须放置在</body>标签的后面!      本来吧到这里应该就算是结束了,不过却出现了一个小问题。如果你留意的话,在地图搜索页面,提供商提示的都是地点,但是使用百度搜索栏则提示的不全是地点。所以必须选择另一个方案了。      在百度地图的示例DEMO中,找到了一个输入提示的示例代码,[点击这里](http://developer.baidu.com/map/jsdemo.htm#a6_2)进行查看。智能提示主要是用到了一个js: ~~~ <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=您的密钥"></script> ~~~      这个密钥是你在百度开发者中心注册后得到的,不会的自己百度就行了。下面接着对地图进行修改。在页面上添加百度地图智能提示的js: ~~~ <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=F135d24da388348cb105c6b226fb5801"></script> ~~~     在页面的最后(</html>)加入一段js: ~~~ <script type="text/javascript"> var ac = new BMap.Autocomplete( //建立一个自动完成的对象 {"input" : "suggestId" }); ac.addEventListener("onconfirm", function(e) { //鼠标点击下拉列表后的事件 search_center(); }); </script> ~~~      搜索的input,添加一个id为"suggestId" ,即: ~~~ <input type="text" class="kw" id="suggestId" onblur="if(this.value=='') $(this).css('background-image','url(images/map_sskBG2.jpg)')" onfocus="$(this).css('background-image','url(images/map_sskBG.jpg)')" onkeydown="if(event.keyCode == '13')search_center();"/> ~~~      这样功能上就实现了。但是为了更美观一些,我们再设定一下下拉时的字体样式: ~~~ //百度智能提示下拉框字体 .tangram-suggestion table tr{ font-size:20px; } ~~~      终于完工了,最终的效果图如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c262c672.jpg) [点击这里到网站上查看](http://mfxuan.free.800m.net/searchscenic.html)      到此GIS系列的文章全部结束了。如果文中有什么错误之处,欢迎大家指正。
';

GIS(六)——实现js版搜狗地图周边搜索功能

最后更新于:2022-04-01 07:03:22

     在上一篇文章《[GIS(五)——完成js版搜狗地图基本交互搜索功能](http://blog.csdn.net/xiaoxian8023/article/details/39503017)》中,介绍了搜狗地图的关键字搜索功能,今天就实现以下另一个重要功能吧——那就是周边搜索功能。      按照惯例,还是把官网上的示例代码给大家贴出来。[飞机票](http://map.sogou.com/api/documentation/javascript/api2.5/examples_doc/search_3.html)在此。周边搜索的功能,跟关键字搜索其实是一样的,也是主要用到的了SearchRequest这个类,点击[这里](http://map.sogou.com/api/documentation/javascript/api2.5/reference_service.html#search_request)查看api文档。SearchRequest 对象规范: | 属性 | 类型 | 说明 | |-----|-----|-----| | `map` | `Map` | 进行搜索的地图实例 | | `renderer` | `[SearchRenderer](http://map.sogou.com/api/documentation/javascript/api2.5/reference_service.html#service_srender)` | 将结果进行渲染的对象。也可以通过setRenderer方法设置 | | `range` | `object` | 必选。表示查询范围。范围有多个属性,用于不同范围的查询`{ city:城市<String>, boundFlag:0|2(0代表视野所在的城市内搜索; 2代表视野内搜索)<Number>, center:以中心点查询<LatLng |Point>, radius:以中心点进行查询时指定半径<Number>,limit:0|1(指定半径时有效,代表是否严格限制半径。0代表不限制,1代表限制)<Number> }` | | `what` | `object` | 必选。表示要查询的内容。有三个属性`{ keyword:关键字<String>, classid:[分类id](http://map.sogou.com/api/documentation/javascript/api2.5/sort.html)<String>, id:uid或者dataid<String> }`, 分类id:普通数字代表小类id,前缀加C_的代表大类id。查询时关键字与分类id 可以联合查询。id 只能单独查询,如果存在id属性,就只按id查询。 【[查看所有分类id](http://map.sogou.com/api/documentation/javascript/api2.5/sort.html)】 | | `clientid` | `String` | 可选。为用户提供更稳定的服务。【[查看详情](http://map.sogou.com/api/documentation/javascript/api2.5/clientid.html)】 |      从api文档中也可以看到,range这个参数是用来限定搜索范围的,而what制定查询内容的。所以只要我们想查什么,就要去找它的分类id,然后再进行检索。      好了,要了解的也就这么多,接下来就是代码实现部分了。      在原先的代码,添加一个对象,用来将结果渲染到右侧列表中: ~~~ var sRender_area;//搜索周边渲染对象 ~~~      在initialize方法中,添加创建周边搜索的渲染对象: ~~~ function initialize(){ //.... sRender=new sogou.maps.SearchRenderer();//创建搜索渲染对象 sRender_area=new sogou.maps.SearchRenderer();//创建周边搜索渲染对象 } ~~~      添加一个搜索周边的方法: ~~~ //搜索周边 function search_area(classid){ clearMarker(sRender_area);//清除定位标记 clearMarker(sRender); var request={ 'map':map, 'what':{ 'classid':classid }, 'range':{ 'city':'北京', 'center':new sogou.maps.Point(center.x,center.y), 'radius':1000, 'limit':1 //严格限制半径 } }; var search=new sogou.maps.Search();//创建搜索实例 search.search(request); sRender_area=new sogou.maps.SearchRenderer({'panel':document.getElementById('result')}); search.setRenderer(sRender_area); } ~~~      js都修改完了,添加上搜索周边的按钮: ~~~ <!--搜索周边--> <input type="button" onclick="search_area('1228,1403,1330,1332')" value="周边餐饮" /> <input type="button" onclick="search_area('97,1264,1262')" value="周边公交" /> <input type="button" onclick="search_area('83,1321,1259')" value="周边商场" /> <input type="button" onclick="search_area('C_32')" value="周边酒店" /> <input type="button" onclick="search_area('1261')" value="周边医院" /> ~~~      效果图如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c256f527.jpg) [点击这里到网站上查看](http://mfxuan.free.800m.net/search_ok.html)      周边搜索和关键字搜索都是同一个,只不过设定的参数不一致。而且我可以同时设定关键字和周边搜索,进行范围更小更精确的搜索。只是用的话,其实没什么太大的难度,只要按照官方的api文档和示例代码就可以了解怎么开发了。      上面提到的都是从技术的角度来验证问题,如果真正使用的时候,最起码还是要提供智能提示的功能。界面也不能这么简陋,下一篇文章,我将解决这2个问题。敬请期待吧。      
';

GIS(五)——完成js版搜狗地图基本交互搜索功能

最后更新于:2022-04-01 07:03:20

     最近在做的有关于北京海淀智慧旅游的一个项目,既然是旅游项目,那么涉及到地图的操作也就是必然的事情了。前几篇文章,主要是分享了在地图上标记多个景点及其景点信息的技术。其实跟项目中还是有一些不一样的。项目中要求实时显示景点的信息,根据实时数据,更新Marker的颜色(绿、橙、红),以及实时更新景点Brand上的景点信息(游客流量、舒适度)。这些都没有出现在文章中,文章只是从技术的角度来验证的。      今天主要要做的是地图上的一个基本功能——交互搜索。      其实官网上搜索的例子并不是很多,而且真的不怎么滴。不过作为参考,还是可以的。点击[这里](http://map.sogou.com/api/documentation/javascript/api2.5/examples/index.html#search)查看“[范围查询-指定分类id,关键字](http://map.sogou.com/api/documentation/javascript/api2.5/examples_doc/search_4.html)”代码示例。如果没有你想要的功能,那你就去官方API文档中找吧,点击[这里](http://map.sogou.com/api/documentation/javascript/api2.5/reference_service.html#service_search)看搜索类API。      先贴出我的搜索也代码,很简单,一个输入框,一个搜索按钮: ~~~ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>搜狗地图交互搜索</title> <style type="text/css"> #map{position:absolute;width:1064px; height:550px;} #result{position:absolute;top:30px;left:1064px;width:300px;} </style> <script type="text/javascript" src="http://api.go2map.com/maps/js/api_v2.5.1.js"></script> <script type="text/javascript" src="http://cdn.bootcss.com/jquery/1.11.1-rc2/jquery.min.js"></script></script> </head> <body onload="initialize()"> <input type="text" class="kw" onkeydown="if(event.keyCode == '13') search_center();"/> <input type="button" onclick="search_center()" value="搜索" /> <div id="map" class="map_map"></div> <div id="result"></div> </body> </html> ~~~      既然是地图,肯定缺少不了初始化地图的代码: ~~~ var map;//地图 var markers;//数组:结果标记 var sRender;//搜索渲染对象 //初始化 function initialize(){ var myLatLng = new sogou.maps.Point(12939000,4840250); var myOptions = { zoom: 10, center: myLatLng, mapControlType:5 }; map = new sogou.maps.Map(document.getElementById("map"), myOptions);//创建地图 sRender=new sogou.maps.SearchRenderer();//创建搜索渲染对象 } ~~~      既然是搜索,必须得有搜索的方法: ~~~ //搜索 function search_center(){ var kw = $(".kw").val(); search(null,kw); } //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //以下内容是根据指定内容,进行搜索定位 //xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx //搜索位置(如酒店) function search(classid,kw){ clearMarker(sRender);//清除定位标记 var request={ 'map':map, 'what':{}, 'range':{'city':'北京'} }; if(classid) request.what.classid=classid; if(kw) request.what.keyword=kw+","; var search=new sogou.maps.Search();//创建搜索实例 sRender=new sogou.maps.SearchRenderer();//({'panel':document.getElementById('result')});//创建搜索渲染对象 search.search(request,callback); //执行搜索 search.setRenderer(sRender);//渲染搜索结果 } ~~~      每次搜索,都需要先清理原先的搜索记录: ~~~ //清除标记 function clearMarker(sRender){ $("#result").children().remove();//清空查询列表 sRender.clearResultFeatures(); var m=sRender.getMarkers(); if(m){ //动态改变了数组的值,所以必须是倒着操作 for(var i=m.length-1;m && i>=0;i--){ m[i].setMap(null); m.pop();//将最后一个对象弹出 } } } ~~~      每次搜索完毕,重新定位中心点,我这里是获取第一个搜索结果,作为新的中心点: ~~~ //搜索完毕后的回调,这里重新设定中心点 function callback(result){ setTimeout(getMarkers,500); } //获取中心节点 function getMarkers(){ markers = sRender.getMarkers(); if(markers && markers.length>0){ center = markers[0].options.feature.points[0]; toCenter();//重新定位地图中心点 } } //定位中心 function toCenter(){ map.setCenter(center) } ~~~      js就这么多,值得注意的是,这一串儿的js,都要放到</body>后面。先来看看效果图吧: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c251331e.jpg) ([点击这里到网站上查看](http://mfxuan.free.800m.net/search_simple.html))      简单说一下, 1. 初始化的js,其中map的初始化自然就不用说了,但是多了一个sRender对象,这是一个搜索渲染类对象,就是把搜索结果渲染到地图上。有兴趣的可以看看[官方API文档](http://map.sogou.com/api/documentation/javascript/api2.5/reference_service.html#service_srender); 1. 搜索的js,主要是调用了Search 对象的search方法。搜索参数的设定请参考API文档; 1. 清理的js,本来是只调用sRender对象的clearResultFeatures()方法的,结果执行后发现地图上的marker消失了,但是如果执行sRender.getMarkers(),却发现marker对象还在,只是不在地图上显示了。但是还是占用着资源呢。所以我就把这个marker全部从sRender对象中清除了。 1. 最后一个是重新设置中心点的js,虽然地图会自动设定新的中心点,但是我们后面还要做周边搜索,必须先匹配最符合条件的结果作为中心进行区域搜索,所以这这里先把它做出来了。      如果想把搜索结果以列表的形式显示出来,只要修改一下sRender对象的创建即可: ~~~ sRender=new sogou.maps.SearchRenderer({'panel':document.getElementById('result')}); ~~~      这个result就是页面上一个div的id。这样就会自动把结果放入到这个div中了。      到此搜索功能就基本上完成了。接下来做一下周边搜索的功能。最后再美化一版基本上的思路就是这个样子,大家多多指点吧。
';

GIS(四)——为js版搜狗地图添加边界+Marker和Brand的最终美化版

最后更新于:2022-04-01 07:03:17

     在《[GIS(三)——优化js版搜狗地图的brand标牌样式](http://blog.csdn.net/xiaoxian8023/article/details/38958285)》中,分享了一下Brand样式的修改。现在把这几次Marker和Brand的修改统一再美化一下,算作一个终极优化版吧。      这次优化的主要内容是: 1. 为整个操作的区域,添加边界 1. 为Marker更换动态图片 1. 为Brand更换半透明红色图片 1. 只显示一个Brand,每3秒切换一次 # 1.绘制边界      首先做第一个吧,在搜狗地图上添加边界,是一个很简单的、很基本的,但是又很人性化的一个功能。在官网的实例代码中,覆盖层的第21个示例代码《[画多边形区域、边自动闭合示例](http://map.sogou.com/api/documentation/javascript/api2.5/examples_doc/polygon-autoclose.html)》即是讲解了如何在地图上绘制一个多边形区域。你只要给定几个坐标点,Polygon对象会自动闭合最后一边。[点击这里](http://map.sogou.com/api/documentation/javascript/api2.5/reference.html#Polygon)看官网对Polygon类的说明。下面是实例中关键代码: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c236ba67.jpg)      可以看到new了一个Polygon的对象,其中,path参数是多边形面坐标的有序序列,说白了就是一个坐标数组。strokeColor是边界边框颜色,strokeOpacity则是边界边框的不透明度,取值0.0-1.0。strokeWeight是边界边框的宽度。fillColor是中间的填充颜色,fillOpacity是填充部分的不透明度,同样取值范围是0.0-1.0。      是不是看起来很简单呀。下面的代码是我设定的北京海淀区的边框坐标: ~~~ //加载海淀区边界坐标数据 function loadBound(){ b = [{x:12924312.5,y:4842937.5}, {x:12921625,y:4842750}, {x:12919812.5,y:4847062.5}, {x:12919375,y:4849437.5}, {x:12918625,y:4849937.5}, {x:12918000,y:4850937.5}, //{x: }, {x:12919750,y:4854187.5}, {x:12920625,y:4856187.5}, {x:12922000,y:4856250}, {x:12927062.5,y:4854812.5}, {x:12927375,y:4855937.5}, //{x: }, {x:12931312.5,y:4856437.5}, {x:12931000,y:4858500}, {x:12933000,y:4861187.5}, {x:12934812.5,y:4861375}, {x:12935875,y:4858375}, {x:12936812.5,y:4858687.5}, {x:12938437.5,y:4858000}, //{x: }, {x:12940062.5,y:4857812.5}, {x:12939187.5,y:4853875}, {x:12941000,y:4853250}, {x:12941062.5,y:4854437.5}, {x:12941937.5,y:4853562.5}, {x:12941562.5,y:4852625}, //{x: }, {x:12943125,y:4851000}, {x:12943687.5,y:4849812.5}, {x:12944812.5,y:4850375}, {x:12946000,y:4847187.5}, {x:12949062.5,y:4846000}, {x:12951687.5,y:4847562.5}, {x:12952812.5,y:4848000}, // {x: }, {x:12954750,y:4847000}, {x:12953312.5,y:4845625}, {x:12955812.5,y:4844250}, {x:12956062.5,y:4842937.5}, {x:12951500,y:4841937.5}, {x:12954687.5,y:4836187.5}, {x:12954875,y:4833375}, //{x: }, {x:12953718.75,y:4833406.25}, {x:12953906.25,y:4830593.75}, {x:12952156.25,y:4830125}, {x:12952062.5,y:4831281.25}, {x:12951593.75,y:4831156.25}, {x:12951625,y:4829812.5}, //{x: }, {x:12949000,y:4829750}, {x:12949500,y:4829156.25}, {x:12949875,y:4824531.25}, {x:12949656.25,y:4823187.5}, {x:12947187.5,y:4823187.5}, {x:12945343.75,y:4821718.75}, {x:12945375,y:4823156.25}, //{x: }, {x:12940718.75,y:4823187.5}, {x:12940687.5,y:4825937.5}, {x:12940375,y:4826125}, {x:12940625,y:4826781.25}, {x:12938031.25,y:4826375}, {x:12936031.25,y:4826031.25}, {x:12935718.75,y:4826281.25}, {x:12935656.25,y:4827187.5}, //{x: }, {x:12936375,y:4827593.75}, {x:12936250,y:4828437.5}, {x:12936468.75,y:4830000}, {x:12936156.25,y:4830062.5}, {x:12935031.25,y:4831312.5}, {x:12933843.75,y:4833156.25}, {x:12933187.5,y:4833718.75}, //{x: }, {x:12933000,y:4836031.25}, {x:12932406.25,y:4836312.5}, {x:12931250,y:4835125}, {x:12930937.5,y:4836718.75}, {x:12929968.75,y:4836437.5}, {x:12928843.75,y:4837406.25}, {x:12930906.25,y:4838437.5}, {x:12931250,y:4839375}, {x:12928375,y:4842031.25}] } ~~~      有了坐标,再结合上面的关键代码,写一个在地图上绘制边界的funciton: ~~~ //加载边界 function addbound(){ var triangleCoords = []; for(var i=0;i<b.length;i++){ triangleCoords.push(new sogou.maps.Point(b[i].x,b[i].y)); } var bermudaTriangle = new sogou.maps.Polygon({ path: triangleCoords, strokeColor: "#7CCD7C", strokeOpacity: 0.8, strokeWeight: 3, fillColor: "#7CFC00", fillOpacity: 0.35 }); bermudaTriangle.setMap(map); } ~~~      这样只要调用一下即可在地图上绘制出海淀区的边界了。 # 2.更换Marker动态图片      这个就很简单了,如果忘记了,只要回头看看《[GIS(一)——在js版搜索地图上添加Marker标记](http://blog.csdn.net/xiaoxian8023/article/details/38855281)》这篇文章,就可以完成了。其实就是在生成Marker的时候,设定image参数即可。要设置的动态图片如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc9d3dbf.jpg) 修改的addmarker方法如下(我把图片放到网上了): ~~~ //加载标记 function addmarker(){ for(var i=0;i<p.length;i++){ var point = new sogou.maps.Point(p[i].x,p[i].y); //添加一个图标 var image = 'http://mfxuan.free.800m.net/blogImage/red.gif'; var marker = new sogou.maps.Marker({ position: point, map: map, title:p[i].title, icon:image, visible:true }); markers.push(marker); } } ~~~ # 3.更换Brand半透明图片      这个也很简单,如果忘记的话,看这篇文章《[GIS(二)——在js版搜狗地图上添加brand标牌](http://blog.csdn.net/xiaoxian8023/article/details/38921763)》。由于上次设定了指向不同景点,看起来非常乱,所以我决定还是通知箭头朝上。修改的图片如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc9e1395.jpg)      修改一下addbrand方法,将参数设定为get_up_spirit(),同时先就爱那个visible设为false,后面会讲到。 ~~~ //加载标记牌 function addbrand(){ for(var i=0;i<p.length;i++){ var brand = new sogou.maps.Brand({ position: new sogou.maps.Point(p[i].x,p[i].y), map: map, spirit:get_up_spirit() ,content:p[i].title+"<br /> 城市:北京市" //是否可见,可缺省,缺省为true ,visible:false //指定内容区固定宽度为80,如果不指定,则会根据内容大小自动适应 ,fixSize:new sogou.maps.Size(80,0) //指定css,css要在样式表事先定义好 ,css:"brand" }); brands.push(brand);//将生成的brand,加入到brands数组中 } } ~~~      同时修改get_up_spirit方法,设定背景图片,而且调整anchor下移7个像素。这是因为修改了marker的图片了,为了防止相互遮挡,将图片整体下移。 ~~~ //箭头向上 function get_up_spirit(){ var spirit={ url:"http://mfxuan.free.800m.net/blogImage/22.png", imgSize:[140,87], clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[105,53,33,13]], anchor:[17,-7], footOffset:[0,-63] } return spirit; } ~~~ # 4.设定标牌切换      标牌统一向上,相互之间肯定是遮挡了。所以为了避免遮挡显得凌乱,可以每次只显示一个brand的信息,几秒之后切换一下。这样就完美解决了前面遇到的问题。      修改方法很简单,在addbrand方法中,把所有的brand的visible设为false,添加一个changeView方法,去动态更改brand的visible属性,或者直接调用hide()和show()来控制显示即可: ~~~ //显示某个景点的内容 function changeView(){ //由于new Brand的时候,visible=false,div被隐藏了,所以将所有brand的div都显示出来 $(".brand").parent().parent().css("display","block"); //切换标牌 for(var i=0;i<brands.length;i++){ brands[i].setZIndex(15); brands[i].hide();//所有隐藏 } if(brandId<brands.length){ brands[brandId].show();//显示 brands[brandId].setZIndex(20); brandId = (brandId+1) % brands.length; } } ~~~     当然要先定义一个变量来存储当前显示的brand是哪个: ~~~ var brandId=0;//记录当前显示的brand ~~~     最后修改一下初始化方法initialize,把添加上的方法都在这里面进行调用: ~~~ //初始化数据 function initialize() { //将地图定位在海淀区域 var point = new sogou.maps.Point(12939000,4840250); var myOptions = { zoom: 11, center: point } //加载并初始化地图 map = new sogou.maps.Map(document.getElementById("map_canvas"), myOptions); //加载景点坐标值 loadScenic(); //加载边界坐标值 loadBound(); //加载景点标记 addmarker(); //添加景点标牌 addbrand(); //立即显示一个 changeView(); //每隔3秒,切换景点显示 setInterval(changeView,1000*3); //加载边界 addbound(map); } ~~~      整个效果图就出来了: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c23b93a8.jpg) ([点击这里到网站上查看](http://mfxuan.free.800m.net/showmap.html))      到此js版搜狗地图的2个简单功能就介绍完毕了。接下来我会再做一个交互查询的功能,尽请期待。
';

GIS(三)——优化js版搜狗地图的brand标牌样式

最后更新于:2022-04-01 07:03:15

     从[上一篇博文](http://blog.csdn.net/xiaoxian8023/article/details/38921763)的效果图中,我们看到有几个相近的brand标牌给相互遮挡住了,不能完整的显示。怎么处理一下呢?今天我们就来研究一下这个解决方案。      其实要想不被遮挡,可以让这几个brand位置变动一下,而不总是箭头向下指向景点。如果改变箭头的指向呢?首先我们要了解它原本是怎么处理的。这个肯定是从spirit入手了。      先说一下spirit的参数: ~~~ { url:"http://api.go2map.com/maps/images/v2.5/2.png", imgSize:[140,77], //[[左侧],[中间],[右侧],[尖脚]] //[clipLeft,clipTop,width,heigth] clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[0,53,33,23]], //[尖脚绑定坐标的位置] anchor:[16,23], //尖脚微调偏移 footOffset:[0,-3] } ~~~      这里是[官网](http://map.sogou.com/api/documentation/javascript/api2.5/reference.html#BrandCssSpirit)的描述。url是图片的url地址,可以是本地图片。imgSize是图片的像素大小。clips是原图剪切的位置,如果看不懂继续往下看。anchor是锚点,就是在地图中的尖脚对应的坐标 ,参数也是在图片中的偏移量。footOffset是整个尖脚在地图中显示的位置。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc8e97ea.jpg)      由于这个brand可以自适应宽度,我以为它是以多张图片完成的这个功能,但是看到打开这个url对应的图片(上图),才发现原来只是一张图片。而自适应宽度则是clips设置的功劳了。clips就是从这张图片上切不同的位置作为图片进行显示。clips分为4块,左侧、中间、右侧可以完成自适应宽度。而尖脚则是箭头在图片中的位置。每一个切出来的图片都是从左上角的坐标+宽高切出来的。为什么不设定多设定几张图片呢?这是为了减少下载小图标的次数。 ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c22e249a.jpg)      终于明白了这个brand箭头的处理了。我们要想改变箭头的指向,必须得修改图片了。如果你学做ps,这个工作就简单多了。下面是我修改的图片: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc91c5b0.jpg)      就是多整几个箭头即可。如果想让箭头向右的话,就在切尖角的参数中,切向右箭头的位置,然后anchor也要设定,把箭头偏移到景点的位置。footOffset则需要调整到整个图片的右侧。很简单,自己试着调整一下就明白了。      还回到咱们原先的话题。现在有多个景点,可能需要指向不同的方向,所以咱们就不能设定死了,那么就需要设定4个function,来得到4中方向的spirit。根据具体情况来选择不同的brand指向。      下面是我调整好的function: ~~~ //箭头向上 function get_up_spirit(){ var spirit={ url:"22.png", imgSize:[140,87], clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[105,53,33,13]], anchor:[17,0], footOffset:[0,-63] } return spirit; } //箭头向下 function get_down_spirit(){ var spirit={ url:"22.png", imgSize:[140,87], clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[0,53,33,23]], anchor:[16,23], footOffset:[0,-3] } return spirit; } //箭头向左 function get_left_spirit(){ var spirit={ url:"22.png", imgSize:[140,87], clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[39,53,13,33]], anchor:[0,16], footOffset:[-54,-45] } return spirit; } //箭头向右 function get_right_spirit(){ var spirit={ url:"22.png", imgSize:[140,87], clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[86,53,13,33]], anchor:[12,16], footOffset:[54,-44] } return spirit; } ~~~      对应的效果图如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc92cbbc.jpg)    ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc9441c3.jpg)    ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc95a305.jpg)  ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-01-14_56971cc973ba0.jpg)      4个js方法调好了,那么如何针对不同的景点来设定不同的brand指向呢?其实很简单,我们只要为每个景点跟调用的方法名关联上,通过不同的名字字节调用即可。 ~~~ //加载景点坐标数据 function loadScenic(){ p = [{x:12942902.5,y:4836960.5,title:'颐和园',brand:'up'}, {x:12933625.5,y:4836929.5,title:'香山、植物园',brand:'down'}, {x:12946300.5,y:4839226.5,title:'圆明园遗址公园',brand:'down'}, {x:12948437.5,y:4826035.0,title:'玉渊潭公园',brand:'up'}, {x:12950304.5,y:4829984.0,title:'北京海洋馆',brand:'left'}, {x:12948074.5,y:4829765.0,title:'紫竹院公园',brand:'right'}, {x:12922964.5,y:4853605.5,title:'凤凰岭自然风景区',brand:'down'}]; } ~~~      在景点数组中,设定一个brand属性,取值域为:up、down、left、right。然后再写一个function,这个function主要是把通过brand来调用对应的方法名: ~~~ //获取数据标牌 function get_spirit(flag){ return eval("get_" + flag + "_spirit()"); } ~~~      修改加载标牌的function如下: ~~~ //加载标记牌 function addbrand(){ for(var i=0;i<p.length;i++){ var brand = new sogou.maps.Brand({ position: new sogou.maps.Point(p[i].x,p[i].y), map: map, spirit:get_spirit(p[i].brand)//get_right_spirit() ,content:p[i].title+"<br /> 城市:北京市" //是否可见,可缺省,缺省为true ,visible:true //指定内容区固定宽度为80,如果不指定,则会根据内容大小自动适应 ,fixSize:new sogou.maps.Size(80,0) //指定css,css要在样式表事先定义好 ,css:"brand" }); brands.push(brand);//将生成的brand,加入到brands数组中 } } ~~~      效果图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c231d294.jpg)      效果还不错吧。有没有一点点心动呢?那就快快行动起来吧!      如果你的审美比较高的话,你会发现其实这样处理,虽然都错开了,但是却没有美感。如何处理呢?一篇博文,我将做最终的美化版,大家期待一下吧。
';

GIS(二)——在js版搜狗地图上添加brand标牌

最后更新于:2022-04-01 07:03:13

     在上一篇博文中,我在搜狗地图上添加了Marker标记,但是在用户体验度上还是不够的,如果想了解某些信息,你得把鼠标指向marker,才能看到title里的值。有没有一种可以直接显示在marker上的东东呢?      其实有很多方法可以做到。搜狗地图提供了[叠加层类](http://map.sogou.com/api/documentation/javascript/api2.5/reference.html),但是可以直接在页面上显示信息的,貌似只有InfoWindow、Label和Brand。一般InfoWindow是用来显示大量信息的。所以我们显示少量信息一般选用Label和Brand。但是Label显示的效果比较一般,四棱四角的,而Brand则是圆角矩形。所以我还是推荐使用Brand。当然这两个都是支持css的,如果你css技术过硬,也可以把Label整得跟Brand一样。      今天我就与大家分享一下在js版搜狗地图上,添加Brand标牌。      首先给大家一个官网的示例代码:点[这里进入](http://map.sogou.com/api/documentation/javascript/api2.5/examples_doc/brand-simple.html)查看。我也先贴出我的代码来,让大家一睹为快吧:      首先定义一个brand数组,来记录所有景点的brand信息。 ~~~ var brands = [];//记录所有景点的Brand信息 ~~~      然后添加一个js function,来为所有景点设置一个Brand。 ~~~ //加载标记牌 function addbrand(){ for(var i=0;i<p.length;i++){ var brand = new sogou.maps.Brand({ position: new sogou.maps.Point(p[i].x,p[i].y), map: map, spirit: { url:"http://api.go2map.com/maps/images/v2.5/2.png", imgSize:[140,77], //[[左侧],[中间],[右侧],[尖脚]] //[clipLeft,clipTop,width,heigth] clips:[[0,0,8,51],[8,0,1,51],[132,0,8,51],[0,53,33,23]], //[尖脚绑定坐标的位置] anchor:[16,23], //尖脚微调偏移 footOffset:[0,-3] } ,content:p[i].title+"<br /> 城市:北京市" //是否可见,可缺省,缺省为true ,visible:true //指定内容区固定宽度为80,如果不指定,则会根据内容大小自动适应 //,fixSize:new sogou.maps.Size(80,0) //指定css,css要在样式表事先定义好 ,css:"brand" }); brands.push(brand);//将生成的brand,加入到brands数组中 //侦听对象是brand本身 //sogou.maps.event.addListener(brand,"mouseover",function() //{ //alert("发生mouseover事件,划过了"+this.getContent()) //}); } //侦听对象是map,只侦听一次即可 //sogou.maps.event.addListener(map,"brandclick",function(brand) //{ // alert("发生brandclick事件,点击了"+brand.getContent()) //}); } ~~~      最后修改initialize方法,把刚写的js方法添加到这里面: ~~~ //初始化数据 function initialize() { //此处省略以前的代码... //加载景点标记 addmarker(); //添加景点标牌 addbrand(); } ~~~      代码都有了,样式信息肯定是少不了的。在style中添加样式: ~~~ .brand{font-size:12px;color:#fff;white-space:nowrap;margin:12px 0 0;} ~~~      效果图如下: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c21e5bba.jpg)      效果看起来还不错吧。当然标牌之间有点项目遮挡,这个问题后面再解决。现在我来解释一下这段代码吧。      想要创建Brand对象,请看[官网](http://map.sogou.com/api/documentation/javascript/api2.5/reference.html#BrandOptions)说明。在构建Brand的时候,需要指定position,这个就是地图坐标,可以是搜狗地图坐标或者经纬度坐标。我的代码中把position设定成了每个景点的坐标。map就是当前创建的地图对象。content则是显示内容。css定义标牌中文本的样式的css class。spirit则是这个标牌所用到的背景图片。如果你不设定fixSize,那么这个brand会根据内容长度自动加长。是不是很贴心呀。快来试试吧。      下一篇博文,我们要解决一下brand项目遮挡问题。如果有心的朋友可能已经发现了,我们要从spirit下手。敬请期待吧。      
';

GIS(一)——在js版搜索地图上添加Marker标记

最后更新于:2022-04-01 07:03:11

     由于我们做的是有关于旅游方面的项目,所以涉及到了地图功能。我接到的其中一个任务就是,在地图上显示指定的几个景点,并在地图上加上标记。      我们项目用的是搜狗地图,使用的是js版本。大家有兴趣的话,可以参考[搜索地图api](http://map.sogou.com/api/documentation/javascript/api2.5/reference.html)以及[示例代码](http://map.sogou.com/api/documentation/javascript/api2.5/examples/index.html)。      在地图上添加标记是地图的一个基本功能。这个标记叫做Marker。可以从[这里](http://map.sogou.com/api/documentation/javascript/api2.5/reference.html#Marker)看官网上对于Marker类的介绍。      实现的基本步骤,首先在页面上创建一个地图,然后地图上添加一个marker。你可以对这个marker指定位置、显示内容,在地图上的显隐等。具体请看一下代码: ~~~ <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no" /> <meta http-equiv="content-type" content="text/html; charset=utf-8"/> <title>简单标记示例</title> <link href="http://mfxuan.free.800m.net/blogCss/reset.css" type="text/css" rel="stylesheet" /> <link href="http://mfxuan.free.800m.net/blogCss/main.css" rel="stylesheet" type="text/css" /> <script type="text/javascript" src="http://api.go2map.com/maps/js/api_v2.5.1.js"></script> <!-- 定义地图等样式 --> <style type="text/css"> html {height: auto;} body {height: auto;margin: 0;padding: 0;} #map_canvas {width:1000px;height: 600px;position: absolute;} @media print {#map_canvas {height: 950px;}} </style> <script type="text/javascript"> var p;//定义景点坐标数组 var map;//定义地图对象 var markers=[];//记录所有景点的Marker信息 //初始化数据 function initialize() { //将地图定位在海淀区域 var point = new sogou.maps.Point(12939000,4840250); var myOptions = { zoom: 11, center: point } //加载并初始化地图 map = new sogou.maps.Map(document.getElementById("map_canvas"), myOptions); //加载景点坐标值 loadScenic(); //加载景点标记 addmarker(); } //加载标记 function addmarker(){ for(var i=0;i<p.length;i++){ var point = new sogou.maps.Point(p[i].x,p[i].y); //添加一个图标 var image = '';//'http://api.go2map.com/maps/images/v2.0/flag.png'; var marker = new sogou.maps.Marker({ position: point, map: map, title:p[i].title, icon:image, visible:true }); markers.push(marker); } } //加载景点坐标数据 function loadScenic(){ p = [{x:12942902.5,y:4836960.5,title:'颐和园'}, {x:12933625.5,y:4836929.5,title:'香山、植物园'}, {x:12946300.5,y:4839226.5,title:'圆明园遗址公园'}, {x:12948437.5,y:4826035.0,title:'玉渊潭公园'}, {x:12950304.5,y:4829984.0,title:'北京海洋馆'}, {x:12948074.5,y:4829765.0,title:'紫竹院公园'}, {x:12922964.5,y:4853605.5,title:'凤凰岭自然风景区'}]; } </script> </head> <body onload="initialize()"> <div id="map_canvas"></div> </body> </html> ~~~      效果图: ![](https://docs.gechiui.com/gc-content/uploads/sites/kancloud/2016-02-18_56c53c218d2e8.jpg)      是不是很简单呢?其实有了这些,只是一个最简单的样式。在下一篇博文中,我们为他添添彩。敬请期待吧。
';

前言

最后更新于:2022-04-01 07:03:08

> 原文出处:[GIS搜狗地图开发](http://blog.csdn.net/column/details/sogoumap.html) 作者:[崔成龙](http://blog.csdn.net/xiaoxian8023) **本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!** # GIS搜狗地图开发 > 介绍使用js版搜狗地图api,开发项目。实现Marker、Brand、交互搜索定位、搜索周边等常用功能。
';