안드로이드 필지필회 - 리스트가 있는 지도 POI 주변 검색

17835 단어 androidpoi지도.
모바일 액세스가 좋지 않은 경우 – > Github 버전
배경.
먼저 효과도를 보십시오: (회사 부근의 국가 무역을 중심으로)
위에는 지도, 아래에는 지리적 위치 목록, 어떤 것은 지리적 위치 목록(QQ동적 위치)만 있는데 이것은 매우 흔히 볼 수 있는 기능이다.POI 주변 검색이라는 전문적인 명칭이 있습니다.
이루어지다
이 효과는 실현하기는 사실 매우 간단하지만, 먼저 지도의 API를 읽어야 한다. 여기는 고덕지도의 안드로이드 SDK를 사용하고, SDK의 설정은 여기에 설명을 하지 않고, 문장 끝에 링크를 놓아서 학습할 수 있다.
아이디어:
  • 지도의 위치 추적 기능을 이용하여 사용자의 현재 위치를 획득
  • 획득한 위치 정보에 따라 POI 검색을 호출하여 위치 목록을 획득
  • ListView 전시 위치 목록
  • 사용자는 지도를 드래그하여 지도 중심 좌표의 위치 정보를 얻고 2~3단계를 수행한다
  • 코드:
    Layout:
    <LinearLayout  xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" >
    
        <com.amap.api.maps2d.MapView  android:id="@+id/map_local" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="2"/>
    
        <ListView  android:id="@+id/map_list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="3" android:divider="@color/space" android:dividerHeight="1dp" android:scrollbars="none"/>
    
    </LinearLayout>

    Activity:
    public class New_LocalActivity extends Activity implements LocationSource, AMapLocationListener, AMap.OnCameraChangeListener, PoiSearch.OnPoiSearchListener {
    
        @BindView(R.id.map_local)
        MapView mapView;
        @BindView(R.id.map_list)
        ListView mapList;
    
        public static final String KEY_LAT = "lat";
        public static final String KEY_LNG = "lng";
        public static final String KEY_DES = "des";
    
    
        private AMapLocationClient mLocationClient;
        private LocationSource.OnLocationChangedListener mListener;
        private LatLng latlng;
        private String city;
        private AMap aMap;
        private String deepType = "";// poi    
        private PoiSearch.Query query;// Poi     
        private PoiSearch poiSearch;
        private PoiResult poiResult; // poi     
        private PoiOverlay poiOverlay;// poi  
        private List<PoiItem> poiItems;// poi  
    
        private PoiSearch_adapter adapter;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_new__local);
            ButterKnife.bind(this);
            mapView.onCreate(savedInstanceState);
            init();
        }
    
        private void init() {
            if (aMap == null) {
                aMap = mapView.getMap();
                aMap.setOnCameraChangeListener(this);
                setUpMap();
            }
    
            deepType = "  ";//       
        }
    
        //--------    Start ------
    
        private void setUpMap() {
            if (mLocationClient == null) {
                mLocationClient = new AMapLocationClient(getApplicationContext());
                AMapLocationClientOption mLocationOption = new AMapLocationClientOption();
                //      
                mLocationClient.setLocationListener(this);
                //          
                mLocationOption.setOnceLocation(true);
                mLocationOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);
                //      
                mLocationClient.setLocationOption(mLocationOption);
                mLocationClient.startLocation();
            }
            //           
            MyLocationStyle myLocationStyle = new MyLocationStyle();
            myLocationStyle.myLocationIcon(BitmapDescriptorFactory
                    .fromResource(R.drawable.location_marker));//         
            myLocationStyle.strokeColor(Color.BLACK);//          
            myLocationStyle.radiusFillColor(Color.argb(100, 0, 0, 180));//          
            myLocationStyle.strokeWidth(1.0f);//          
            aMap.setMyLocationStyle(myLocationStyle);
            aMap.setLocationSource(this);//       
            aMap.getUiSettings().setMyLocationButtonEnabled(true);//             
            aMap.setMyLocationEnabled(true);//    true             ,false              ,   false
        }
    
        /** *     poi   */
        protected void doSearchQuery() {
            aMap.setOnMapClickListener(null);//   poi            
            int currentPage = 0;
            query = new PoiSearch.Query("", deepType, city);//             ,       poi    ,       poi    (        )
            query.setPageSize(20);//            poiitem
            query.setPageNum(currentPage);//       
            LatLonPoint lp = new LatLonPoint(latlng.latitude, latlng.longitude);
    
            poiSearch = new PoiSearch(this, query);
            poiSearch.setOnPoiSearchListener(this);
            poiSearch.setBound(new PoiSearch.SearchBound(lp, 5000, true));
            //         lp    ,   2000   
            poiSearch.searchPOIAsyn();//     
    
        }
    
        @Override
        public void onLocationChanged(AMapLocation aMapLocation) {
            if (mListener != null && aMapLocation != null) {
                if (aMapLocation.getErrorCode() == 0) {
                    //       
                    mListener.onLocationChanged(aMapLocation);
                    //         
                    latlng = new LatLng(aMapLocation.getLatitude(), aMapLocation.getLongitude());
                    aMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latlng, 14), 1000, null);
                    city = aMapLocation.getProvince();
                    doSearchQuery();
                } else {
                    String errText = "    ," + aMapLocation.getErrorCode() + ": " + aMapLocation.getErrorInfo();
                    Log.e("AmapErr", errText);
                }
            }
        }
    
        @Override
        public void activate(OnLocationChangedListener listener) {
            mListener = listener;
            mLocationClient.startLocation();
        }
    
        @Override
        public void deactivate() {
            mListener = null;
            if (mLocationClient != null) {
                mLocationClient.stopLocation();
                mLocationClient.onDestroy();
            }
            mLocationClient = null;
        }
    
        @Override
        public void onCameraChange(CameraPosition cameraPosition) {
        }
    
        @Override
        public void onCameraChangeFinish(CameraPosition cameraPosition) {
            latlng = cameraPosition.target;
            aMap.clear();
            aMap.addMarker(new MarkerOptions().position(latlng));
            doSearchQuery();
        }
    
        @Override
        public void onPoiSearched(PoiResult result, int rCode) {
            if (rCode == 0) {
                if (result != null && result.getQuery() != null) {//   poi   
                    if (result.getQuery().equals(query)) {//       
                        poiResult = result;
                        poiItems = poiResult.getPois();//       poiitem  ,     0  
                        List<SuggestionCity> suggestionCities = poiResult
                                .getSearchSuggestionCitys();
                        if (poiItems != null && poiItems.size() > 0) {
                            adapter = new PoiSearch_adapter(this, poiItems);
                            mapList.setAdapter(adapter);
                            mapList.setOnItemClickListener(new mOnItemClickListener());
    
                          }
                        }
                        else {
                            Logger.d("   ");
                        }
                    }
                } else {
                    Logger.e("   ");
                }
            } else if (rCode == 27) {
                Logger.e("error_network");
            } else if (rCode == 32) {
                Logger.e("error_key");
            } else {
                Logger.e("error_other:" + rCode);
            }
        }
    
        @Override
        public void onPoiItemSearched(PoiItem poiItem, int i) {
    
        }
    
        //--------    End ------
    
        @Override
        protected void onResume() {
            super.onResume();
            mLocationClient.startLocation();
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            mLocationClient.stopLocation();
        }
    
        @Override
        protected void onDestroy() {
            mLocationClient.onDestroy();
            super.onDestroy();
        }
    
        private class mOnItemClickListener implements AdapterView.OnItemClickListener {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent();
                intent.putExtra(KEY_LAT, poiItems.get(position).getLatLonPoint().getLatitude());
                intent.putExtra(KEY_LNG, poiItems.get(position).getLatLonPoint().getLongitude());
                intent.putExtra(KEY_DES, poiItems.get(position).getTitle());
                setResult(RESULT_OK, intent);
                finish();
            }
        }

    예시의Activity는 startActivityForResult 방식으로 시작되었고 마지막으로 위치를 클릭하면 선택한 위치 정보를 되돌려줍니다.
    총결산
    제가 처음으로 상술한 효과를 실현하려고 할 때도 어찌할 바를 몰랐습니다. 지도 API에 대해 전면적인 인식을 가지지 못했기 때문에 나중에 많은 자료를 보고 지도의 기능점을 결합시켜 설계도에서의 효과를 실현했습니다.
    다음은 초보자는 반드시 기초 API의 응용을 배워야 하는 자료입니다.
  • 고독 개발자 센터
  • 모과망 - 고덕 안드로이드 SDK를 어떻게 사용하여 LBS의 개발을 진행하는가
  • 리스트가 있는 지도 POI 주변 검색
  • 만약 당신에게 무슨 문제가 있으면 블로그에 글을 남길 수 있습니다.
    PS:
    네가 주목할 수 있는 나의 Github, CSDN, 웨이보

    좋은 웹페이지 즐겨찾기