百度地图2.0API 区分地址解析( BMap.Geocoder().getPoint())和智能搜索(BMap.LocalSearch)

  • Post author:
  • Post category:其他


如下代码所示,我们要实现一个功能,用户在搜索框输入搜索位置关键字,这通常是简单的关键字,需要模糊匹配搜索,比如输入“南山区”,会默认定位到深圳南山区

当我们用 var geoc = new BMap.Geocoder(); geoc实例去解析关键字,输入“南山区”搜索,得到的却是北京天安门的默认经纬度

// 中文搜索定位
	handleSearch = (v = '深圳市', flag) => {
		this.setState({ searchText: v });

		if (v && !flag) {
			const { BMap } = window
			// 创建地址解析器实例     
			var geoc = new BMap.Geocoder();
			// 将地址解析结果显示在地图上,并调整地图视野    
			geoc.getPoint(v, (point) => {
				// 当地址搜索没有结果时 百度地图会默认指向北京 经度116 纬度39-40 因此该种情况不予处理
				if (point && (point.lng.toString().indexOf('116') > -1 || point.lat.toString().indexOf('39') > -1 || point.lat.toString().indexOf('40') > -1)) {
					// Toast.info('没有搜索结果', 500, () => { Toast.hide() });
					return
				}
				if (point) {
					var map = new BMap.Map("allmap");
                    // this.setMarker()做以下4条语句的工作
					// map.clearOverlays(); // 清除所有的marker图标
					// var marker = new BMap.Marker(point); // 创建标注
					// map.addOverlay(marker); // 将标注添加到地图中
                    // map.centerAndZoom(point, this.zoomLevel || 15);

					this.setMarker(map, point, this.zoomLevel || 15);
					map.addEventListener("click", (e) => this.showInfo(e, map, point));
					// map.addOverlay(new BMap.Marker(point));
				}
			});
		}
	}

而当我们使用localSearch本地智能搜索时,却能做到模糊匹配,比如输入“南山区”,会默认定位到深圳南山区

// 中文搜索定位
	handleSearch = (v = '深圳市', flag) => {
		this.setState({ searchText: v });

		if (v && !flag) {
			const { BMap } = window;
			var map = new BMap.Map("allmap");
			var localSearch = new BMap.LocalSearch(map);
			localSearch.enableAutoViewport(); // 允许自动调节窗体大小
			localSearch.setSearchCompleteCallback((searchResult) => {
				var poi = searchResult && searchResult.getPoi(0);
				// console.log('searchResult===>poi', searchResult, poi)
				if (poi) {
					this.setMarker(map, poi.point, this.zoomLevel || 15);
				}
			})
			localSearch.search(v);
		}
	}

原因是这两种API的应用场景不同,原因参考这篇文章

https://blog.csdn.net/weixin_34149796/article/details/85686362

小贴士:

如果你手里有一大批从第三方获取的地址信息(并且只有地址信息),建议您采取如下步骤:

第一、使用百度地图API的地址解析接口,将地址解析为经纬度point数据,并存储在数据库中,方便以后查询和使用;

第二、如果有些地址解析失败了,请使用坐标拾取工具,人工地找到经纬度point信息,并同样储存起来。(

坐标拾取工具,请点击这里。

记住,只有经纬度point信息,能让你打点的位置万无一失!

解说:


什么是地址解析?

地址解析,即Geocoder类,是根据一个地址得到对应的经纬度point。注:地址需要详细到街道,例如“北京市海淀区中关村南大街”。

地址解析类有两个方法,一是getPoint,通过详细到街道的地址,得出一个经纬度。

地址解析的格式如下:

省+城市+区县+街道

(可以不用门牌号)

地址解析成功的例子:北京市 北京市 海淀区 中关村南大街 27号

这是地址解析一定会失败的例子:南京路工行(1、根本没有指定城市,区县。中国有很多城市有南京路,不清楚到底是那一条南京路。2、南京路上可能有不止一个工行,比如银行,ATM,办事处等。)

另外一个是getLocation,又称反地址解析。它利用经纬度point,得出一个详细的地址。


什么是智能搜索?

智能搜索,即localsearch类,可以根据任意关键词查询到对应的POI信息。

关键词可以是“上海市麦当劳”“重庆市解放碑”,当没有城市信息时,默认在当前城市进行搜索。

Localsearch类会根据关键词的内容,智能地搜索POI的title和content信息。比如,搜索“家乐福”时,也能搜索到家乐福附近的面馆,停车场等信息。

智能搜索有三种方法,分别是:search、searchInBounds和searchNearby。利用此三种方法可以搜索到百度地图数据库中所有POI信息。



版权声明:本文为hzxOnlineOk原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。