Android的高德地图实现行政区域显示

  • Android app中查看位置,当位置没有具体地址,而是一个区镇的时候,一直没想好怎么处理。知道仔细看了一遍高德地图的官方文档,看到有行政区域这个功能,我们可以通过DistrictSearch类来发起一个异步的区域查询,之后在回调中处理返回的边界数据,我们可以通过画线的方式,将边界点依次连接起来,就圈出了某个行政区域,边界数据很多,需要在子线程中处理。查询的参数设置需要用到DistrictSearchQuery类,并设置需要边界数据。需要注意的是:高德地图可以搜索的区域等级是五级:分别是国家、省、市、区、街道,到了街道之后,是没有返回边界数据的,无法实现街道的区域标识
  • 具体做法如下:
    第一步:初始化区域搜索,并设置回调监听
  //初始化区域搜索
        districtSearch = new DistrictSearch(getApplicationContext());
        districtSearch.setOnDistrictSearchListener(this);//绑定监听器;

第二步:初始化区域搜索参数

 //获取行政区划边界--最多只能到街道,而街道是没有边界数据的,所以不能使用街道,需要使用区
                String keyword;
                if (!TextUtils.isEmpty(fromLocation.county.name)) {
                    keyword = fromLocation.county.name;
                    fromQuery = new DistrictSearchQuery();
                    //設置關鍵字
                    fromQuery.setKeywords(keyword);
                    //設置是否返回邊界值
                    fromQuery.setShowBoundary(true);
                    //不显示子区域边界
                    fromQuery.setShowChild(false);
                    districtSearch.setQuery(fromQuery);
                    //开启异步搜索
                    districtSearch.searchDistrictAsyn();
                }

第三步:在
//行政区划异步搜索的回调
@Override
public void onDistrictSearched(DistrictResult districtResult) {}

处理回调结果

 if (districtResult != null && districtResult.getDistrict() != null) {
                if (districtResult.getAMapException().getErrorCode() == AMapException.CODE_AMAP_SUCCESS) {

                        ArrayList<DistrictItem> district = districtResult.getDistrict();
                        if (district != null && district.size() > 0) {

                            //adcode 440106
                            //获取对应的行政区划的item
                            DistrictItem districtItem = getDistrictItem(district, fromLocation.county.getId());
                            if (districtItem == null) {
                                return;
                            }
                            utils.logD("---------------------------------preview------------------2");
                            //创建划线子线程
                            fromRunnable = new PolygonRunnable(districtItem, handler);
                             //线程池执行
                            ThreadWorker.execute(fromRunnable);
                        }
                 }
       }

Runnable代码

private class PolygonRunnable implements Runnable {
        private DistrictItem districtItem;
        private Handler handler;
        private boolean isCancel = false;

        /**
         * districtBoundary()
         * 以字符串数组形式返回行政区划边界值。
         * 字符串拆分规则: 经纬度,经度和纬度之间用","分隔,坐标点之间用";"分隔。
         * 例如:116.076498,40.115153;116.076603,40.115071;116.076333,40.115257;116.076498,40.115153。
         * 字符串数组由来: 如果行政区包括的是群岛,则坐标点是各个岛屿的边界,各个岛屿之间的经纬度使用"|"分隔。
         * 一个字符串数组可包含多个封闭区域,一个字符串表示一个封闭区域
         */
        public PolygonRunnable(DistrictItem districtItem, Handler handler) {

            this.districtItem = districtItem;
            this.handler = handler;
        }

        public void cancel() {
            isCancel = true;
        }

        /**
         * Starts executing the active part of the class' code. This method is
         * called when a thread is started that has been created with a class which
         * implements {@code Runnable}.
         */
        @Override
        public void run() {
            utils.logD("---------------------------------preview------------------5");
            if (!isCancel) {
                try {
                    String[] boundary = districtItem.districtBoundary();
                    if (boundary != null && boundary.length > 0) {
                        utils.logD("---------------------------------preview------------------11");
                        utils.logD("----------- " + boundary.toString());
                        for (String b : boundary) {
                            if (!b.contains("|")) {
                                String[] split = b.split(";");
                                PolylineOptions polylineOptions = new PolylineOptions();
                                boolean isFirst = true;
                                LatLng firstLatLng = null;
                                for (String s : split) {
                                    String[] ll = s.split(",");
                                    if (isFirst) {
                                        isFirst = false;
                                        firstLatLng = new LatLng(Double.parseDouble(ll[1]), Double.parseDouble(ll[0]));
                                    }
                                    polylineOptions.add(new LatLng(Double.parseDouble(ll[1]), Double.parseDouble(ll[0])));
                                }
                                if (firstLatLng != null) {
                                    polylineOptions.add(firstLatLng);
                                }
                                utils.logD("---------------------------------preview------------------6");
                                polylineOptions.width(10).color(Color.BLUE).setDottedLine(true);
                                Message message = handler.obtainMessage();
                                message.what = 18;
                                message.obj = polylineOptions;
                                handler.sendMessage(message);
                            }
                        }
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                    utils.logD("---------------------------------preview------------------7");
                }
            }
        }
    }

第四步:主线程在地图上添加边界线

 private Handler handler = new Handler(Looper.getMainLooper()) {
        @Override
        public void handleMessage(Message msg) {
            if (18 == msg.what) {
                PolylineOptions options = (PolylineOptions) msg.obj;
                aMap.addPolyline(options);
            }
        }
    };

感谢!努力!

<think>好的,用户想了解如何在高德地图API中设置或显示特定的区域范围。我需要根据提供的引用资料来整理答案。首先,引用4提到了Android中使用LatLngBounds设置显示区域范围,而引用2则提到了搜索地区后显示在地图可视范围内。可能需要结合这两个部分。 用户的问题可能涉及两种场景:一种是根据地理坐标设置显示范围,另一种是根据行政区域名称自动调整。引用2提到调用行政区域查询接口获取边界数据,然后调整地图可视区域。引用4中的代码示例使用LatLngBounds来包含特定区域,这适用于已知坐标的情况。 接下来需要分步骤说明两种方法。首先,使用地理边界坐标的方法,需要创建LatLngBounds对象,并通过setMapStatus设置地图状态。然后,根据行政区域查询的方法,需要调用高德的行政区域查询接口,解析返回的边界坐标,再调整可视区域。 还需要注意不同平台的实现可能不同,比如Android和JavaScript的API调用方式有差异。引用3提到申请Key和调用API的方法,这可能需要在步骤中提醒用户先获取Key。 最后,生成相关问题时要考虑用户可能进一步想知道如何获取区域坐标、处理多个覆盖物或进行区域搜索。确保回答覆盖了主要方法,并引导用户参考官方文档。</think>在高德地图API中设置或显示指定区域范围主要通过两种方式实现:地理边界坐标调整和行政区域查询适配。以下是具体实现方法: 一、地理边界坐标调整法 1. 创建边界范围对象 ```javascript // JavaScript示例 var bounds = new AMap.Bounds( new AMap.LngLat(116.297611,39.781327), // 西南角坐标 new AMash.LngLat(116.353454,39.81229) // 东北角坐标 ); ``` 2. 设置地图显示范围 ```javascript map.setBounds(bounds); ``` 该方法适用于已知区域精确坐标的场景,可确保地图自动缩放到刚好包含指定矩形区域[^4]。 二、行政区域查询适配法 1. 调用行政区域查询接口 ```python # Python示例 import requests url = "https://restapi.amap.com/v3/config/district" params = { "keywords": "深圳市", "key": "your_api_key", "subdistrict": "0" } response = requests.get(url, params=params) ``` 2. 解析返回数据中的边界坐标 ```javascript // 处理JSON响应 var bounds = data.districts[0].boundaries; var polygon = new AMap.Polygon({ path: bounds, strokeColor: "#FF33FF", strokeWeight: 2 }); polygon.setMap(map); ``` 3. 自动适配显示范围 ```javascript map.setFitView(); // 自动调整到合适视野 ``` 此方法通过高德地图的Web服务API获取行政区划边界数据,特别适合需要动态显示行政区域的场景[^2][^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值