文档章节

Google Map 开发(三):Google Map 地点搜索功能

范特彪西
 范特彪西
发布于 2018/07/20 19:44
字数 1115
阅读 304
收藏 0

开发国内应用当我们需要使用到地图时,首选肯定是高德地图或者百度地图,这是因为它们的地图功能足够强大,对于开发人员来说,更是因为 API 封装的完善和简单的调用实现,扩展功能强大。

如果要开发全球通用的 APP,需要集成地图,我们难免会对需要使用的地图 SDK 进行一番调研,百度和高德并没有全世界范围的地图数据,在亚洲或许还能使用以下,对于需要全球范围内都要使用到的就那么不适用了。

所以我们可选方案就只有 MapBox 和 Google Map 了,相对于 MapBox,Google Map 的地点数据非常详尽,特别是对于多语言,区分国家这类的 APP 了。在地图开发中,多语言是一件特别麻烦的事情,例如手机语言是中文,定位位置是美国,现在在地图上用中文搜索美国黄石公园,因为手机语言是中文,也要求搜索返回结果是中文。或者手机语言是中文,我在中国湖北搜索武汉 East Lake 要求返回查询东湖的英文结果等等,因为你不能确定你的 APP 用户是哪国人,在哪个国家使用你的 APP,这样一来如果自己实现语言和区域转换就极度复杂了,就算是调用 Google Map WebService API,要处理好数据也不是那么容易的事情。另外一个场景就是,就是假定我的定位位置是日本,我的搜索结果只允许返回日本的数据,同样,实现在哪个国家搜索地点,就返回哪个国家的地点数据等,这时候,使用 Google Map 就方便多了。

Google Map 的 Android 搜索自动提示文档可参考:

https://developers.google.com/places/android-sdk/autocomplete

对于这个功能的实现,Google Map 的建议是使用 Activity 或者 Fragment,如果你的 APP 风格比较统一,不想让用户跳转到其它 Activity 中,那么就可以使用 Fragment,在我的项目中就是这么使用的。

第一步是界面,代码如下,在你的对应的 Layout 添加:

<fragment
  android:id="@+id/place_autocomplete_fragment"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:name="com.google.android.gms.location.places.ui.PlaceAutocompleteFragment"
  />

在 Java 代码中的处理控件的事件和搜索返回结果:

PlaceAutocompleteFragment autocompleteFragment = (PlaceAutocompleteFragment)
getFragmentManager().findFragmentById(R.id.place_autocomplete_fragment);

autocompleteFragment.setOnPlaceSelectedListener(new PlaceSelectionListener() {
    @Override
    public void onPlaceSelected(Place place) {
        // TODO: Get info about the selected place.
        Log.i(TAG, "Place: " + place.getName());
    }

    @Override
    public void onError(Status status) {
        // TODO: Handle the error.
        Log.i(TAG, "An error occurred: " + status);
    }
  });

当然这是非常极简的调用了,上面说到的依据国家区域等,下面会提到。

AutocompleteFilter 会为地点搜素功能设置过滤器,文档参见:

https://developers.google.com/android/reference/com/google/android/gms/location/places/AutocompleteFilter

我们可以先构造一个 AutocompleteFilter.Builder 对象

AutocompleteFilter.Builder typeFilterBuilder = new AutocompleteFilter.Builder().setTypeFilter(AutocompleteFilter.TYPE_FILTER_NONE);

接下来可以通过 setCountry(String country) 方法设置返回结果的国家区域。country 参数在文档中的描述如下:

The country to restrict results to. This should be a ISO 3166-1 Alpha-2 country code (case insensitive). If this is not set, no country filtering will take place.

对于 ISO 3166-1 是国际上规定的国家区域码,目前全球230多个国家已经有对应的国家代码,可以参考:

https://en.wikipedia.org/wiki/ISO_3166-1_alpha-2

至此自动搜索的功能基本就可以实现,相信大部分开发者实现起来也没有太大问题,更多的是搜索框,文字如何和主题色保持一致,这个就相对麻烦点了,通过查看 PlaceAutocompleteFragment 的源代码,可以知道搜索框 Fragment 是三个控件组成,一个放大镜 ImageView 控件,一个 EditText 用于输入关键字的控件,还有一个清除搜索的 × 图标控件,基于此,我们可以动态的删除或隐藏控件即可。

try {
    EditText editText = mAutocompleteView.getView().findViewById(R.id.place_autocomplete_search_input);
    editText.setTextColor(ContextCompat.getColor(getApplicationContext(), R.color.color_258CAA));
    editText.setHintTextColor(ContextCompat.getColor(getApplicationContext(), R.color.color_258CAA));
    editText.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
    View view = mAutocompleteView.getView().findViewById(R.id.place_autocomplete_search_button);
    view.setVisibility(View.GONE);
} catch (Exception __) {
    Log.e("GoogleMap",__);
}

© 著作权归作者所有

范特彪西
粉丝 15
博文 4
码字总数 3717
作品 0
杭州
程序员
私信 提问
10款在Google labs诞生的Android应用程序

Google研究部门的高级副总裁Bill Coughran通过Google博客表示公司将关闭Google labs,因为Google打算集中资源开发重点项目。 Google计划先结束所有实验,然后着重开发那些已成形的产品。这并...

小卒过河
2011/07/22
1K
8
【设计体验之旅——jQuery就是牛!】第一部 35个高级jQuery插件使用体验持续更新(三)

gmap(google地图应用插件) 【下载地址】--------》Download 【应用范围】 google地图的简单应用,地点表示,图片显示,pup显示等等; 【使用体验】 首先,我们根据作者的提示去Google申请一个...

游戏人间Linux
2012/02/05
126
0
Web开发系列 - GIS

Google Maps JQuery Maps google map是怎样工作的 Google Maps API编程资源大全 google map限制地图缩放级别和显示范围 WebGIS近来学习小结,GoogleMap影像在线矢量化简述 google map v3 ap...

长征2号
2017/08/09
0
0
Google的全新在线地图API演示网站 - More than a map

日期:2012-10-28 来源:GBin1.com More Than A Map是Google最新上线的Google地图API使用的演示网站,提供了丰富的Google Maps API的使用。 包括一下几个方面的功能展示: 基础功能 卫星功能...

gbin1
2012/10/29
13
0
各家地图公司地图开发API比较

各家地图公司地图开发API比较 一、谷歌地图API地址:http://code.google.com/apis/maps/ 基于Google Maps,能够使用 JavaScript 将 Google Maps 嵌入网页中。API 提供了大量实用工具用以处理...

睡得
2015/05/25
2.8K
5

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
16
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
18
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部