在平常的應用中,常常有須要展現地圖,而且在地圖上顯示地圖標記的需求。華爲HMS的Map Kit提供了這樣的能力。能夠先繪製地圖,而後在地圖上繪製標記點,並按不一樣比例尺實現不一樣的標記聚合。本文將具體展現如何結合定位、位置、地圖服務的相關能力,實現附近服務搜素,並在地圖上顯示出來。html
應用場景
- 旅行類應用,能夠搜索景點,而後在地圖上顯示各個景點。
- 共享類應用,好比共享單車,能夠在地圖上繪製附件的單車。
項目用到的關鍵功能點
定位服務: 使用定位服務獲取當前設備經緯度座標。
關鍵字搜索:使用位置服務關鍵字搜索能力經過指定的關鍵字和可選的地理範圍,查詢諸如旅遊景點、企業和學校之類的地點。
地圖顯示:使用地圖服務地圖顯示能力在界面上繪製地圖。
聚合標記:使用地圖服務聚合標記能力在顯示的地圖上繪製標記,且不一樣比例尺能夠對標記進行不一樣程度的聚合。java
集成準備
1. AGC帳號註冊,項目建立
1) 註冊成爲開發者
註冊地址:https://developer.huawei.com/consumer/en/service/josp/agc/index.html?ha_source=hms1android
2) 建立應用,添加sha256,開啓map/site開關,下載json文件git
2. 集成Map + Site SDKgithub
1) 將「agconnect-services.json」文件拷貝到應用級根目錄下
• 在「allprojects > repositories」中配置HMS Core SDK的Maven倉地址。
• 在「buildscript > repositories」中配置HMS Core SDK的Maven倉地址。
• 若是App中添加了「agconnect-services.json」文件則須要在「buildscript > dependencies」中增長agcp配置。json
buildscript { repositories { maven { url 'https://developer.huawei.com/repo/' } google() jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.3.2' classpath 'com.huawei.agconnect:agcp:1.3.1.300' } } allprojects { repositories { maven { url 'https://developer.huawei.com/repo/' } google() jcenter() } }
2) 在「dependencies 」中添加以下編譯依賴app
implementation 'com.huawei.hms:maps:{version}' implementation 'com.huawei.hms:site:{version}' implementation 'com.huawei.hms:location:{version}' }
3) 在文件頭添加配置maven
apply plugin: 'com.huawei.agconnect'
4) 在android中配置簽名。將生成簽名證書指紋用的簽名文件複製到您工程的app目錄下,並在「build.gradle」文件中配置簽名ide
signingConfigs { release { // 簽名證書 storeFile file("**.**") // 密鑰庫口令 storePassword "******" // 別名 keyAlias "******" // 密鑰口令 keyPassword "******" v2SigningEnabled true v2SigningEnabled true } } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' debuggable true } debug { debuggable true } }
項目中用到的主要代碼及功能
1. 定位服務獲取定位oop
private void getMyLoction() { fusedLocationProviderClient = LocationServices.getFusedLocationProviderClient(this); SettingsClient settingsClient = LocationServices.getSettingsClient(this); LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder(); mLocationRequest = new LocationRequest(); builder.addLocationRequest(mLocationRequest); LocationSettingsRequest locationSettingsRequest = builder.build(); //檢查設備定位設置 settingsClient.checkLocationSettings(locationSettingsRequest) .addOnSuccessListener(new OnSuccessListener<LocationSettingsResponse>() { @Override public void onSuccess(LocationSettingsResponse locationSettingsResponse) { //設置知足定位條件,再發起位置請求 fusedLocationProviderClient .requestLocationUpdates(mLocationRequest, mLocationCallback, Looper.getMainLooper()) .addOnSuccessListener(new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { //接口調用成功的處理 Log.d(TAG, "onSuccess: " + aVoid); } }); } })
2. 文本搜索:經過實現位置服務中的TextSearch功能實現文本內容搜索,獲取附近服務點。
SearchResultListener<TextSearchResponse> resultListener = new SearchResultListener<TextSearchResponse>() { // Return search results upon a successful search. @Override public void onSearchResult(TextSearchResponse results) { List<Site> siteList; if (results == null || results.getTotalCount() <= 0 || (siteList = results.getSites()) == null || siteList.size() <= 0) { resultTextView.setText("Result is Empty!"); return; } updateClusterData(siteList);//更新服務點到地圖標記 } // Return the result code and description upon a search exception. @Override public void onSearchError(SearchStatus status) { resultTextView.setText("Error : " + status.getErrorCode() + " " + status.getErrorMessage()); } }; // Call the place search API. searchService.textSearch(request, resultListener);
3. 地圖繪製
@Override public void onMapReady(HuaweiMap huaweiMap) { hMap = huaweiMap; hMap.moveCamera(CameraUpdateFactory.newLatLngZoom(Constants.sMylatLng, 1)); hMap.setMyLocationEnabled(true); hMap.getUiSettings().setMyLocationButtonEnabled(true); initCluster(huaweiMap); }
4. 和在地圖上繪製聚合標記
private ClusterManager<MyItem> mClusterManager; List<MyItem> items = new ArrayList<>(); private void initCluster(HuaweiMap hMap) { mClusterManager = new ClusterManager<>(this, hMap); hMap.setOnCameraIdleListener(mClusterManager); // Add a custom InfoWindowAdapter by setting it to the MarkerManager.Collection object from // ClusterManager rather than from GoogleMap.setInfoWindowAdapter //refer: https://github.com/billtom20/3rd-maps-utils mClusterManager.getMarkerCollection().setInfoWindowAdapter(new HuaweiMap.InfoWindowAdapter() { @Override public View getInfoWindow(Marker marker) { final LayoutInflater inflater = LayoutInflater.from(SearchClusterActivity.this); final View view = inflater.inflate(R.layout.custom_marker_window, null); final TextView textView = view.findViewById(R.id.textViewTitle); String text = (marker.getTitle() != null) ? marker.getTitle() : "Cluster Item"; textView.setText(text); return view; } @Override public View getInfoContents(Marker marker) { return null; } }); }
//更新聚合標記 private void updateClusterData(List<Site> siteList) { items = new ArrayList<>(); mClusterManager.clearItems(); for (Site s: siteList) { Coordinate location = s.getLocation(); MyItem myItem = new MyItem(location.lat,location.lng,s.name,s.formatAddress); items.add(myItem); } mClusterManager.addItems(items); Coordinate coordinate = siteList.get(0).getLocation(); LatLng latLng = new LatLng(coordinate.lat,coordinate.lng); mClusterManager.cluster(); hMap.animateCamera(CameraUpdateFactory.newLatLngZoom (latLng,14 )); }
項目成果展現
Query中輸入想搜索的地點、服務, 點擊search 按鈕,下方地圖顯示相應的聚合座標
>>訪問華爲地圖服務官網,瞭解更多相關內容
>>獲取華爲地圖服務開發指導文檔
>>華爲HMS Core官方論壇
>>華爲地圖服務開源倉庫地址:GitHub、Gitee
點擊右上角頭像右方的關注,第一時間瞭解華爲移動服務最新技術~