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

最近在做的有关于北京海淀智慧旅游的一个项目,既然是旅游项目,那么涉及到地图的操作也就是必然的事情了。前几篇文章,主要是分享了在地图上标记多个景点及其景点信息的技术。其实跟项目中还是有一些不一样的。项目中要求实时显示景点的信息,根据实时数据,更新Marker的颜色(绿、橙、红),以及实时更新景点Brand上的景点信息(游客流量、舒适度)。这些都没有出现在文章中,文章只是从技术的角度来验证的。

今天主要要做的是地图上的一个基本功能——交互搜索。

其实官网上搜索的例子并不是很多,而且真的不怎么滴。不过作为参考,还是可以的。点击这里查看“范围查询-指定分类id,关键字”代码示例。如果没有你想要的功能,那你就去官方API文档中找吧,点击这里看搜索类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>后面。先来看看效果图吧:

点击这里到网站上查看

简单说一下,

  1. 初始化的js,其中map的初始化自然就不用说了,但是多了一个sRender对象,这是一个搜索渲染类对象,就是把搜索结果渲染到地图上。有兴趣的可以看看官方API文档
  2. 搜索的js,主要是调用了Search 对象的search方法。搜索参数的设定请参考API文档;
  3. 清理的js,本来是只调用sRender对象的clearResultFeatures()方法的,结果执行后发现地图上的marker消失了,但是如果执行sRender.getMarkers(),却发现marker对象还在,只是不在地图上显示了。但是还是占用着资源呢。所以我就把这个marker全部从sRender对象中清除了。
  4. 最后一个是重新设置中心点的js,虽然地图会自动设定新的中心点,但是我们后面还要做周边搜索,必须先匹配最符合条件的结果作为中心进行区域搜索,所以这这里先把它做出来了。

如果想把搜索结果以列表的形式显示出来,只要修改一下sRender对象的创建即可:

sRender=new sogou.maps.SearchRenderer({'panel':document.getElementById('result')});

这个result就是页面上一个div的id。这样就会自动把结果放入到这个div中了。

到此搜索功能就基本上完成了。接下来做一下周边搜索的功能。最后再美化一版基本上的思路就是这个样子,大家多多指点吧。

时间: 2024-08-28 22:41:58

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

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

在上一篇文章<GIS(五)--完成js版搜狗地图基本交互搜索功能>中,介绍了搜狗地图的关键字搜索功能,今天就实现以下另一个重要功能吧--那就是周边搜索功能. 按照惯例,还是把官网上的示例代码给大家贴出来.飞机票在此.周边搜索的功能,跟关键字搜索其实是一样的,也是主要用到的了SearchRequest这个类,点击这里查看api文档.SearchRequest 对象规范: 属性 类型 说明 map Map 进行搜索的地图实例 renderer SearchRenderer 将结果进行渲染的对象.也

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

在<GIS(三)--优化js版搜狗地图的brand标牌样式>中,分享了一下Brand样式的修改.现在把这几次Marker和Brand的修改统一再美化一下,算作一个终极优化版吧. 这次优化的主要内容是: 为整个操作的区域,添加边界 为Marker更换动态图片 为Brand更换半透明红色图片 只显示一个Brand,每3秒切换一次 1.绘制边界 首先做第一个吧,在搜狗地图上添加边界,是一个很简单的.很基本的,但是又很人性化的一个功能.在官网的实例代码中,覆盖层的第21个示例代码<画多边形区域.

在js版搜狗地图上添加brand标牌

在上一篇博文中,我在搜狗地图上添加了Marker标记,但是在用户体验度上还是不够的,如果想了解某些信息,你得把鼠标指向marker,才能看到title里的值.有没有一种可以直接显示在marker上的东东呢? 其实有很多方法可以做到.搜狗地图提供了叠加层类,但是可以直接在页面上显示信息的,貌似只有InfoWindow.Label和Brand.一般InfoWindow是用来显示大量信息的.所以我们显示少量信息一般选用Label和Brand.但是Label显示的效果比较一般,四棱四角的,而Brand则

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

在前2篇文章中介绍了关键字搜索和周边搜索的功能,但是界面比较简陋,所以这一版我主要做一些美化工作. 这次主要优化的方面有2个方面,一个是页面的样式,包括字体.按钮.布局等:二是要添加一个搜索的智能提示. 首先修改页面的样式,更改 #map{position:absolute;width:1364px; height:550px;} #option{ height:50px; width:1336px; border:solid 1px #CCCCCC; padding:10px; } 添加两个c

优化js版搜狗地图的brand标牌样式

从上一篇博文的效果图中,我们看到有几个相近的brand标牌给相互遮挡住了,不能完整的显示.怎么处理一下呢?今天我们就来研究一下这个解决方案. 其实要想不被遮挡,可以让这几个brand位置变动一下,而不总是箭头向下指向景点.如果改变箭头的指向呢?首先我们要了解它原本是怎么处理的.这个肯定是从spirit入手了. 先说一下spirit的参数: { url:"http://api.go2map.com/maps/images/v2.5/2.png", imgSize:[140,77], //

如何在手机网站上添加百度地图(带搜索功能)

在手机网站上添加百度地图,直接用百度API里的代码就可以, http://developer.baidu.com/map/ 就可以生成地图 输入地址等一些信息,但是如何添加地址搜索 这样的地址搜索如何添加 而且添加后会出现冲突 小尖角好像是固定定位, 还没搞出来~~~

百度地图 v3.5搜索功能,和地图缩放按钮更改样式

搜索应该是比较简单一块了. 先说一下缩放按钮 //设置是否显示缩放控件 mMapView.showZoomControls(false); 先将缩放控件隐藏,然后直接在地图页面自己定义两个按钮. case R.id.minus_sign: float zoomLevel = mBaiduMap.getMapStatus().zoom; if(zoomLevel>4){ mBaiduMap.setMapStatus(MapStatusUpdateFactory.zoomOut()); minus_

Ext JS 实现建议词模糊动态搜索功能

代码: new Ext.form.ComboBox({ store: new Ext.data.JsonStore({ idProperty: 'VehicleNo', url: '../ajax/test.ashx, fields: ['VehicleNo', 'phoneNum'] }), id:'querynodesid', emptyText:'快速检索', hiddenName: 'VehicleNo', displayField: 'VehicleNo', valueField: '

搜狗地图下载|搜狗地图app下载

搜狗地图除了搜索.公交.自驾导航等地图的基本功能之外,另外还有多功能商店.路书.卫星图.手机地图等其他特色应用,全方位地满足了人们随时随地掌握出行生活的需要.搜狗地图链接应用简介搜狗地图是国内最早的地图网站,数据覆盖全国将近400个城市和3000个区县,搜狗地图不仅有搜索.公交.自驾导航等功能还有多功能商店.路书.卫星图.手机地图等特色,出门必备导航软件.软件特色智能副驾:全程语音交流,解决您驾驶中的问题:省时导航:路线智能避堵,全程路况鹰眼图,导航贴心播报:智能搜索:数据全面丰富,沿途搜.周边