[转]使用Google地图API搜索功能

使用Google地图API搜索功能

由于工作关系,最近这两天研究了下Google地图API,要实现地图位置搜索功能,显示搜索结果并能在地图上标记下来,刚开始还考虑使用51ditu,出于搜索关键字分词等方面考虑,最后还是决定使用Google地图,一直也都是那么的崇拜谷歌的大神,这次就来体验一翻~

在Google地图标记定位到一点

刚开始是实现在Google地图上定位一点的功能,API接口里GMap2类有一个setCenter(center:GLatLng, zoom?:Number, type?:GMapType)方法可以设置地图中心,GLatLng参数以经度和纬度表示的地理坐标点,zoom和type分别为缩放级别和地图类型的可选参数,GLatLng经纬度坐标点可以通过GClientGeocoder类的getLatLng方法获得,getLatLng方法传入地址关键字参数,在回调函数里传递找到的第一个经纬度坐标点,如果没有找到定位点则为null,这样我们就能根据GLatLng经纬度坐标点创建一个GMarker标记并在地图上显示出来。

搜索定位到多个点

根据关键字定位到会存在一个问题,假如搜索关键字在地图上有多个点的话,那么返回的第一个经纬度坐标点不一定就是你所要找的地址,这个时候就有必要返回多个搜索结果点,然后再能让用户选择。刚开始我还以为Google地图API里没有提供返回多个搜索结果的接口,让老萍各一强银说就跑到了Google AJAX Search API,不过那里确实有实现搜索返回多个结果的示例。今天仔细看了下Google地图API,发现它里面本身是提供搜索功能的,我想AJAX Map Search Solution只是自定义实现封装好了类。其实,在创建GMap2实例时可指定GMapOptions参数,里面的GGoogleBarOptions属性即为搜索控件的选项,然后再调用enableGoogleBar()方法就会为地图启用集成搜索控件,GGoogleBarOptions 类属性如下:

属性 类型 说明
showOnLoad Boolean 当设置为 true 时,该属性显示 GoogleBar 中的搜索框(如果启用了控件并加载了地图)。默认情况下,控件中的搜索框是隐藏的,只有当点击该控件的放大镜时才会展开。

(自 2.95 开始)

linkTarget GGoogleBarLinkTarget 该属性允许指定嵌入 GoogleBar 的搜索结果中的链接目标。默认值为 G_GOOGLEBAR_LINK_TARGET_BLANK,该默认值指定这些链接将在新窗口中打开。

(自 2.95 开始)

resultList GGoogleBarResultList or Element 该属性可让您指定 GoogleBar 的搜索结果列表的样式,该样式可能为以下样式的一种:G_GOOGLEBAR_RESULT_LIST_INLINE(默认样式)将结果列表放入搜索框上的表中;G_GOOGLEBAR_RESULT_LIST_SUPPRESS 使用“下一个”/“上一个”按钮替换该列表;传递块级别的 DOM 的 Element 将列表放入您选择的容器(通常为 <div> 元素)中。

(自 2.95 开始)

suppressInitialResultSelection Boolean 系统完成 GoogleBar 中的搜索后就会在其信息窗口中显示第一个结果(这是默认行为),该属性抑制这种行为。

(自 2.95 开始)

suppressZoomToBounds Boolean 该属性还抑制完成 GoogleBar 中的搜索后自动平移和缩放以适合结果集的操作。(该属性抑制默认行为。)

(自 2.95 开始)

onIdleCallback Function 该属性指定 GoogleBar 完成搜索且搜索结果关闭时要调用的回调函数。

(自 2.95 开始)

onSearchCompleteCallback Function 该属性指定 GoogleBar 完成搜索且搜索结果完全显示时要调用的回调函数向该函数传递与搜索控件相关的 GlocalSearch 对象。在结果放到地图上或结果列表中之前调用该回调函数。

(自 2.95 开始)

onGenerateMarkerHtmlCallback Function 此属性可让您指定打开搜索结果标记的信息窗口时要调用的回调函数。应该向该函数先后传递 GMarker、生成的 HTML 字符串和 GlocalSearchResult,并且该函数必须返回要显示在信息窗口中的已修改 HTML 字符串。

(自 2.95 开始)

onMarkersSetCallback Function 该属性可让您指定 GGoogleBar 完成创建标记并将标记放到地图上时要调用的回调函数。必须向该函数传递一个表格对象数组 {result: GlocalSearch, marker: GMarker}。

(自 2.95 开始)

点击搜索结果点信息窗口"错位"问题

问题是这样的,点击返回搜索结果列表时地图会定位到当前点,并且会用信息窗口标注这一点,但不知道Google是为了打开的信息窗口完全可见还是做了什么特殊判断,会使得当前标注这一点不能地图里居中,致使标注点偏移信息窗口显示不完全。由于搜索结果是直接指定resultList元素容器来接收存放的,所以我并不知道在点击事件里对Google地图做了什么样的操作,可能查看gmlocalsearch.js源码会了解一些详情。回到问题的原委来,我只需要获取点击的经纬度坐标点就能把地图位置居中,还好搜索有个onSearchCompleteCallback完成时的回调函数,并传递搜索结果参数过来,那么我就在每次搜索完成把结果保存在一个数组变量里,然后在点击搜索结果列表时获取点击元素的id索引号,于是就能获取当前点击的经纬度坐标了,再调用setCenter就能根据坐标点居中地图,由于有信息窗口,坐标点居中不一定能让信息窗口完全可见,而应该是中偏下一些,调用map.panBy(new GSize(-40,100))方法以动画方式平移指定的距离(左:40px,下:100px),需要注意Google地图API里很多方法都是以动画方式,它内部可能是通过setTimeout来延迟执行实现的,所以我这边有时也要用setTimeout来延迟执行,不然我设置的一些值会被Google的setTimeout延迟执行的给覆盖掉。

示例源代码:

<div id="googleSearch"></div><div id="googleResult" style="width:490px; margin:4px 0;"></div><div id="googleMap" style="width:490px; height:300px; border:solid 1px #ccc">loading...</div><link href="http://www.google.com/uds/css/gsearch.css" rel="stylesheet" type="text/css" /><link href="http://www.google.com/uds/solutions/localsearch/gmlocalsearch.css" rel="stylesheet" type="text/css" /><script src="http://ditu.google.cn/maps?file=api&amp;v=2.x&amp;key=ABQIAAAAzr2EBOXUKnm_jVnk0OJI7xSosDVG8KKPE1-m51RBrvYughuyMxQ-i1QfUnH94QxWIa6N4U6MouMmBA&hl=zh-CN" type="text/javascript"></script><script type="text/javascript">    var map = null;    var geocoder = null;    var mapReady = false;    var mapResult = [];    function initialize() {        if (GBrowserIsCompatible()) {

        //搜索结果元素        var resultElem = document.getElementById("googleResult");        //地图容器元素        var mapElem = document.getElementById("googleMap");

        // 指定实例化地图选项            var options = {            //size : new GSize (338,353),            googleBarOptions : {                onSearchCompleteCallback : function(searcher) {                    //设置结果                    mapResult = searcher.results;                    //统计结果数                    //document.getElementById("sum").innerHTML = searcher.results.length;                    //搜索完成时候自动居中第一个结果                    setTimeout(function() {autoCenter(0);},1000);                },                resultList : resultElem ,                maxCursorPages : 5 ,                suppressZoomToBounds : true            }        };

        map = new GMap2(mapElem, options);

        // 平移及缩放控件(左上角)        map.addControl(new GLargeMapControl());        //比例尺控件(左下角)        map.addControl(new GScaleControl());

        //创建缩略图控件(右下角)        var overviewMap = new GOverviewMapControl();        map.addControl(overviewMap);        //最小化隐藏缩略图控件        setTimeout(function (){overviewMap.hide();},1000);

        geocoder = new GClientGeocoder();

        //为地图启用集成搜索控件GoogleBar(此句顺序位置不可修改)        map.enableGoogleBar();

        //自动居中结果点        window.autoCenter = function (resultIndex){            var result = mapResult[resultIndex];            if( result ) {                setTimeout(function() {                        //构建以经度和纬度表示的地理坐标点                        var point = new GLatLng(result.lat,result.lng);                        //设置中心点                        map.setCenter(point);//map.panTo(point);                        //以动画方式平移指定的距离(左:40px,下:100px)                        map.panBy(new GSize(-40,100));                    },                    500                );            }        }

        //点击搜索结果事件        resultElem.onclick = function (e){            e = window.event || e;            var target = e.target || e.srcElement;            var trElem = target;            //获取冒泡事件的TR层节点            while(trElem && trElem.tagName!="TR")            {                if(trElem.tagName=="TABLE") break;                trElem = trElem.parentNode;            }            if (trElem!=null)            {                //获取点击的结果索引                var resultIndex = trElem.id.substring(trElem.id.length-1);                //自动居中                autoCenter(resultIndex);            }        }

        //初始化位置        var address = "广东省广州市天河区科韵路22号五华大厦";        if (geocoder) {            geocoder.getLatLng(              address,              function(point) {                if (point) {                  map.setCenter(point, 18);                  var marker = new GMarker(point);                  map.addOverlay(marker);                  marker.openInfoWindowHtml(address);                  setTimeout(function (){map.panBy(new GSize(-10,120));},2500);                }              }            );        }

        //获取搜索控件        var searchBar = mapElem.lastChild;        //清空样式        searchBar.style.cssText = "";        //改变搜索控件元素位置        document.getElementById("googleSearch").appendChild(searchBar);

      }    }

    window.onload = function(){        initialize();        document.body.onunload = GUnload;        mapReady = true;    }</script>
时间: 2024-10-29 21:25:18

[转]使用Google地图API搜索功能的相关文章

Google 地图 API for Android

原文:Introduction to Google Maps API for Android 作者:Eunice Obugyei 译者:kmyhy 从健康类 app Runkeeper 到游戏 app 精灵宝可梦,位置服务对现代 app 来说越来越重要. 在本文中,我们将创建一个 app,名字就叫做 City Guide.这个 app 允许用户搜索一个地点,使用 Google 地图显示这个地点的位置并监听用户的位置改变. 我们将学习如何使用 Google 地图 API for Android,G

Google地图API

使用谷歌地图API V3创建交互式地图,分两个步骤来说明,第一是准备工作,第二是如何调用接口进行Google地图的展示. 1. 准备工作 如果想调用Google地图的接口,首先需要拥有一个免费的 Google 地图 API key.想要拥有一个免费的API Key,首先得拥有一个Google账号.想要申请Google的账号,首先得能访问Google的网站注册Gmail.目前在大陆已经很难访问Google的网站了,怎么访问Google的网站不是这里的重点,假设你已经能够访问Google的网站,并且

Google地图接口API之Google地图 API 参考手册(七)

Google 地图API 参考手册 地图 构造函数/对象 描述 Map() 在指定的 HTML 容器中创建新的地图,该容器通常是一个DIV元素. 叠加层 构造函数/对象 描述 Marker 创建一个标记. MarkerOptions 标记的选项.由DirectionsRenderer渲染的所有标记都将使用这些选项. MarkerImage A structure representing a Marker icon or shadow image MarkerShape Defines the

Baidu与Google地图API初探

前天周六,有个好友过来玩,他说想在他的站点中加入地图导航模块,但不知道选择哪个第三方Map API 在网上查了下Baidu.Google.QQ和MapBar等4种Map API(都是採用JS开放API),也查看了它们的SDK开发文档,谈谈自己的体会 Map API文档 BMap API(Baidu)与google.maps API(Google)文档相对最完备.详尽.简洁,而且给出了非常多学习演示样例,非常适合刚開始学习的人入门学习.应用开发 QMap API(QQ)与MapBar API(Ma

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

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

Google 地图 API V3 使用入门

鉴于google被屏蔽,复制过来,供参考. Hello, World 要开始了解 Google Maps API,最简单的方法就是查看简单的示例.以下网页显示了一张以澳大利亚新南威尔士的悉尼为中心的地图: <!DOCTYPE html> <html> <head> <meta name="viewport" content="initial-scale=1.0, user-scalable=no" /> <sty

Google 地图 API V3 之控件

控件概述 通过 Google Maps API 显示的地图包含用户界面元素,以便用户与地图进行交互.这些元素称为“控件”.您可以在 Google Maps API 应用中添加这些控件的多种组合.或者,您也可以不进行任何操作,让 Google Maps API 处理所有控件行为. Maps API 带有一部分可在地图中使用的内置控件: 缩放控件,显示滑块(针对大地图)或“+/-”小按钮(针对小地图),用于控制地图的缩放等级.在非触摸的设备上,该控件默认显示在地图的左上角,而在触摸设备上则显示在左下

Google 地图 API V3 之事件

概述 浏览器中的 JavaScript 是由事件驱动的,这表示 JavaScript 会通过生成事件来响应交互,并期望程序监听感兴趣的事件.Google Maps API V3 的事件模型与 Google Maps API V2 中所使用的事件模型尽管在内在机制上有很大的不同,但两者是十分相似的.有两种类型的事件: 用户事件(如“点击”鼠标事件)是从 DOM 传播到 Google Maps API 中的.这些事件是独立的,并且与标准 DOM 事件不同. MVC 状态更改通知反映了 Maps AP

Google 地图 API V3 之 叠加层

叠加层概述 叠加层是地图上与纬度/经度坐标绑定的对象,会随您拖动或缩放地图而移动.叠加层表示的是“添加”到地图中以标明点.线.区域或对象集合的对象. Maps API 包含以下几种叠加层: 地图上的单个位置是使用标记显示的.标记有时可显示自定义的图标图片,这种情况下标记通常被称为“图标”.标记和图标是 Marker 类型的对象.(有关详情,请参阅下面的标记和图标.) 地图上的线是使用折线(表示一系列按顺序排列的位置)显示的.线是 Polyline 类型的对象.(有关详情,请参阅折线.) 地图上的