如何實現地圖App中附近地點搜索及聚合標記功能

在平常的應用中,常常有須要展現地圖,而且在地圖上顯示地圖標記的需求。華爲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官方論壇
>>華爲地圖服務開源倉庫地址:GitHubGitee

點擊右上角頭像右方的關注,第一時間瞭解華爲移動服務最新技術~

相關文章
相關標籤/搜索