中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android高德地圖poi檢索仿微信發送位置實例代碼

發布時間:2020-08-27 12:23:49 來源:腳本之家 閱讀:196 作者:tijjyire 欄目:移動開發

最近項目需求把發送定位模塊改成類似微信發送位置給好友的效果,我使用了高德地圖實現了一個demo,效果圖如下:

Android高德地圖poi檢索仿微信發送位置實例代碼

從主界面中我們可以看到中心標記上面顯示的就是我們定位的地址,下面是一個listview列表,第一條item的數據就是我們定位得到的地址,下面其余的都是我們根據定位得到的經緯度通過poi周邊搜索得到的地址。我們進行了如下操作:

  1. 我們點擊列表的item,中心標記會移動到該item對象的地址上面去。
  2. 我們手動移動地圖的時候,中心標記的地址會發生相應的變化并且下面的列表也會發生相應的變化。
  3. 根據關鍵字poi搜索得到的列表,然后點擊item主界面立馬進行更新操作。

這里貼出主要代碼,首先我們進行地圖地位初始化操作:

@Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_map);
    mapView.onCreate(savedInstanceState);// 此方法必須重寫
    if (aMap == null) {
      aMap = mapView.getMap();
      // 自定義系統定位小藍點
      MyLocationStyle myLocationStyle = new MyLocationStyle();
      // 設置小藍點的圖標
      myLocationStyle.myLocationIcon(BitmapDescriptorFactory.
      fromResource(R.mipmap.ic_location_marker));// 設置小藍點的圖標        
      myLocationStyle.strokeColor(0x7F0070D9);// 設置圓形的邊框顏色
      myLocationStyle.radiusFillColor(0x130070D9);// 設置圓形的填充顏色
//       myLocationStyle.anchor(int,int)//設置小藍點的錨點
      myLocationStyle.strokeWidth(1.0f);// 設置圓形的邊框粗細
      aMap.setMyLocationStyle(myLocationStyle);
      aMap.setLocationSource(this);// 設置定位監聽(1)
      aMap.setOnCameraChangeListener(this);//手動移動地圖監聽 (2)
      aMap.getUiSettings().setMyLocationButtonEnabled(true);// 設置默認定位按鈕是否顯示
      //設置為true表示顯示定位層并可觸發定位,false表示隱藏定位層并不可觸發定位,默認是false
      aMap.setMyLocationEnabled(true);
      aMap.moveCamera(CameraUpdateFactory.zoomTo(17.5f));
    }
    //------------------------------------------添加中心標記
    mMarkerOptions = new MarkerOptions();
    mMarkerOptions.draggable(false);//可拖放性
    mMarkerOptions.icon(BitmapDescriptorFactory.fromResource(R.mipmap.ic_tips_nearby));
    mCenterMarker = aMap.addMarker(mMarkerOptions);
    ViewTreeObserver vto = mapView.getViewTreeObserver();
    vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
      @Override
      public void onGlobalLayout() {
        mapView.getViewTreeObserver().removeGlobalOnLayoutListener(this);
        mCenterMarker.setPositionByPixels(mapView.getWidth() >> 1, mapView.getHeight() >> 1);
        mCenterMarker.showInfoWindow();
      }
    });
    //---------------------------------------------初始化正反編碼類 (3)
    mGeocoderSearch = new GeocodeSearch(this);
    mGeocoderSearch.setOnGeocodeSearchListener(this);

  }

我們注意重點關注在上面的三個監聽回調,1處是定位監聽,有以下兩個回調方法:

    //-----------------地圖定位回調
  //激活定位
  @Override
  public void activate(OnLocationChangedListener onLocationChangedListener) {
    mListener = onLocationChangedListener;
    if (mlocationClient == null) {
      mlocationClient = new AMapLocationClient(this);
      mLocationOption = new AMapLocationClientOption();
      //設置定位監聽
      mlocationClient.setLocationListener(this);(4)
      //設置為高精度定位模式
      mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
      //設置定位參數
      mlocationClient.setLocationOption(mLocationOption);
      // 此方法為每隔固定時間會發起一次定位請求,為了減少電量消耗或網絡流量消耗,
      // 注意設置合適的定位時間的間隔(最小間隔支持為2000ms),并且在合適時間調用stopLocation()
      // 方法來取消定位請求
      // 在定位結束后,在合適的生命周期調用onDestroy()方法
      // 在單次定位情況下,定位無論成功與否,都無需調用stopLocation()方法移除請求,定位sdk內部會移除
      mlocationClient.startLocation();
    }
  }

  //停止定位
  @Override
  public void deactivate() {
    mListener = null;
    if (mlocationClient != null) {
      mlocationClient.stopLocation();
      mlocationClient.onDestroy();
    }
    mlocationClient = null;
  }

4處的監聽定位成功后會回調onLocationChanged這個方法,在這個方法里面我們可以獲得定位到的經緯讀,地址,顯示出上面我們設置的自定義系統定位小藍點出來等等,

  @Override
  public void onLocationChanged(AMapLocation aMapLocation) {
     //這個方法會循環執行
     mLongitude = aMapLocation.getLongitude();//經度
     mLatitude = aMapLocation.getLatitude();//緯度
     cityCode = aMapLocation.getCityCode();//citycode
  }

我們再來分析2處地圖位置改變時回調:

  @Override
  public void onCameraChange(CameraPosition cameraPosition) {
  }

  @Override
  public void onCameraChangeFinish(CameraPosition cameraPosition) {
    /**這個方法很重要,雖然在上述的onLocationChanged方法我們也能獲得坐標點的信息但是我們
      通常在這里獲得定位坐標的經緯度,獲得了經緯度后我們并不能知道該坐標點的具體坐標信息,所以
      需要把對應的坐標點轉化為具體地址,這就是所謂的同步逆地理編碼請求,和定位是黃金搭檔
     */
       mCurrentPoint = new LatLonPoint(cameraPosition.target.
       latitude, cameraPosition.target.longitude);
      // 第一個參數表示一個Latlng,第二參數表示范圍多少米,第三個參數表示是火系坐標系還是GPS原生坐標系
      RegeocodeQuery query = new RegeocodeQuery(mCurrentPoint, 200, GeocodeSearch.AMAP);
      mGeocoderSearch.getFromLocationAsyn(query);// 設置同步逆地理編碼請求
  }

3處我們做的地理正反編碼回調如下:

  //----------------逆地址編碼回調:坐標->地址
  @Override
  public void onRegeocodeSearched(RegeocodeResult result, int rCode) {
    if (rCode == 0) {
      if (result != null && result.getRegeocodeAddress() != null && 
        result.getRegeocodeAddress().getFormatAddress() != null) {
     /**
     * 汽車服務|汽車銷售|汽車維修|摩托車服務|餐飲服務|購物服務|生活服務|
     * 體育休閑服務|醫療保健服務|住宿服務|風景名勝|商務住宅|政府機構及社會團體
     * |科教文化服務|交通設施服務|金融保險服務|公司企業|道路附屬設施|地名地址信息|公共設施
     */
        mPoiQuery = new PoiSearch.Query("", "住宿服務|公司企業", 
        result.getRegeocodeAddress().getCityCode());
        mPoiQuery.setPageSize(10);// 設置每頁最多返回多少條poiitem
        mPoiQuery.setPageNum(0);//設置查第一頁
        PoiSearch poiSearch = new PoiSearch(this, mPoiQuery);
        poiSearch.setOnPoiSearchListener(this);//設置數據返回的監聽器 (5)
        //設置周邊搜索的中心點以及區域
        poiSearch.setBound(new PoiSearch.SearchBound(mCurrentPoint, 1500, true)); 
        poiSearch.searchPOIAsyn();//開始搜索
      } else {
        ToastUtil.show(mContext, R.string.no_result);
      }
    } else {
      ToastUtil.show(mContexts, rCode);
    }

  }

  //----------------地址編碼回調:地址->坐標
  @Override
  public void onGeocodeSearched(GeocodeResult geocodeResult, int rCode) {

  }

我們在這兒進行了poi周邊搜索操作,回調方法

  @Override
  public void onPoiSearched(PoiResult result, int rcode) {
    if (rcode == 0) {
      if (result != null && result.getQuery() != null) {// 搜索poi的結果
        if (result.getQuery().equals(query)) {// 是否是同一條
          poiItems = poiResult.getPois();// 取得第一頁的poiitem數據,頁數從數字0開始
          // 當搜索不到poiitem數據時,會返回含有搜索關鍵字的城市信息
          List<SuggestionCity> suggestionCities = poiResult
              .getSearchSuggestionCitys();
          /**
          * listviw具體操作邏輯
          */ 
        }
      } else if (suggestionCities != null
              && suggestionCities.size() > 0) {
            showSuggestCity(suggestionCities);
          }else {
        ToastUtil.show(mContexts, "對不起,沒有搜索到相關數據!");
      }
    }
  }

  @Override
  public void onPoiItemSearched(PoiItem poiitem, int rcode) {

  }
  /**
   * poi沒有搜索到數據,返回一些推薦城市的信息
   */
  private void showSuggestCity(List<SuggestionCity> cities) {
    String infomation = "推薦城市\n";
    for (int i = 0; i < cities.size(); i++) {
      infomation += "城市名稱:" + cities.get(i).getCityName() + "城市區號:"
          + cities.get(i).getCityCode() + "城市編碼:"
          + cities.get(i).getAdCode() + "\n";
    }
    ToastUtil.show(this, infomation);
  }

類似的含關鍵字的poi搜索也是類似的:

    // 第一個參數表示搜索字符串,第二個參數表示poi搜索類型,第三個參數表示poi搜索區域(空字符串代表全國)
    mPoiQuery = new PoiSearch.Query(key, "", cityCode);
    mPoiSearch = new PoiSearch(this, mPoiQuery);
    mPoiQuery.setPageSize(15);// 設置每頁最多返回多少條poiitem
    mPoiQuery.setPageNum(0);//設置查第一頁
    mPoiSearch.setOnPoiSearchListener(this);
    // 設置搜索區域為以lp點為圓心,其周圍5000米范圍
    LatLonPoint lp=new LatLonPoint(latitude,longitude);
    mPoiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));
    mPoiSearch.searchPOIAsyn();//開始搜索

最后還有一個知識點就是我們點擊item的時候地圖自動去移動的實現,其實就是aMap.moveCamera方法去實現的,它會自動調用onCameraChangeFinish方法走的流程還是和我們手動拖動地圖一樣的。

復制代碼 代碼如下:

aMap.moveCamera(CameraUpdateFactory.newLatLngZoom(new LatLng(poiItem.getLatLonPoint().getLatitude(), poiItem.getLatLonPoint().getLongitude()), 20));

基本上就是這樣了,至于一些細節方面自己去調節和優化吧,哪些問題都不大。以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

永平县| 通山县| 松溪县| 靖远县| 双流县| 项城市| 华坪县| 漳平市| 都兰县| 桓台县| 墨玉县| 建始县| 横山县| 东至县| 内江市| 阳泉市| 获嘉县| 凤庆县| 盐亭县| 沙坪坝区| 长治县| 肥乡县| 鄂州市| 龙陵县| 中西区| 夏河县| 玉溪市| 弥勒县| 南安市| 巨鹿县| 西吉县| 马山县| 江源县| 昭苏县| 杭州市| 凯里市| 仙居县| 紫阳县| 和林格尔县| 定兴县| 洱源县|