zoukankan      html  css  js  c++  java
  • 腾讯地图获取全国行政区划检索列表Demo

    前言

    全国行政区划检索功能, 由于高德和百度也没有提供一个比较完美的解决方案, 因此使用了腾讯地图iOS SDK内部封装的Web接口来实现. 行政区划共分为三个等级, 省级/市级/区级, 对于北京市和天津市这样的城市, 通常直接认为是省级, 并直接以同样的内容来填充市级. 但是SDK内部并没有提供这样的填充, 因此需要自行再省级里面将其复制到市级。

    使用场景

    给用户提供选择行政区域和居住地等功能的行政区划选择器。

    准备

    腾讯地图3D SDK

    行政区划检索

    核心代码

    - (void)searchWithDistrictSearchOption:(QMSDistrictBaseSearchOption *)districtSearchOption didRecevieResult:(QMSDistrictSearchResult *)districtSearchResult {
        
        _provinceModelArray = [NSMutableArray array];
        
        NSArray *provinceArray = districtSearchResult.result[0];
        NSArray *cityArray = districtSearchResult.result[1];
        NSArray *districtArray = districtSearchResult.result[2];
        
        for (QMSDistrictData *provinceData in provinceArray) {
            ProvinceModel *provinceModel = [ProvinceModel provinceWithDistrictData:provinceData];
            
            // 取出市级
            NSMutableArray *cityModelArray = [NSMutableArray array];
            NSArray<NSNumber *> *cidx = provinceData.cidx;
            QMSDistrictData *cityData = cityArray[cidx.firstObject.intValue];
            
            // 判断二级结构后面是否还有三级结构
            // 如果没有, 则直接使用一级结构作为二级结构, 二级结构作为三级结构, 如: 北京-北京-东城区
            if (cityData.cidx == nil) {
                CityModel *cityModel = [CityModel cityWithDistrictData:provinceData];
                [cityModelArray addObject:cityModel];
                
                // 设置三级结构
                NSMutableArray *districtModelArray = [NSMutableArray array];
                int firstIndex = provinceData.cidx.firstObject.intValue;
                int lastIndex = provinceData.cidx.lastObject.intValue;
                
                // 将二级结构设置为三级结构
                for (int i = firstIndex; i < lastIndex + 1; i++) {
                    QMSDistrictData *districData = cityArray[i];
                    DistrictModel *districtModel = [DistrictModel districtWithDistrictData:districData];
                    [districtModelArray addObject:districtModel];
                }
                
                cityModel.districts = districtModelArray;
                provinceModel.cities = cityModelArray;
            } else {
                // 填充二级结构
                int cityFirstIndex = provinceData.cidx.firstObject.intValue;
                int cityLastIndex = provinceData.cidx.lastObject.intValue;
                
                for (int i = cityFirstIndex; i < cityLastIndex + 1; i++) {
                    QMSDistrictData *cityData = cityArray[i];
                    CityModel *cityModel = [CityModel cityWithDistrictData:cityData];
                    [cityModelArray addObject:cityModel];
                    
                    // 设置三级结构
                    int districtFirstIndex = cityData.cidx.firstObject.intValue;
                    int districtLastIndex = cityData.cidx.lastObject.intValue;
                    NSMutableArray *districtModelArray = [NSMutableArray array];
                    
                    for (int i = districtFirstIndex; i < districtLastIndex + 1; i++) {
                        QMSDistrictData *districtData = districtArray[i];
                        DistrictModel *districtModel = [DistrictModel districtWithDistrictData:districtData];
                        [districtModelArray addObject:districtModel];
                    }
                    
                    cityModel.districts = districtModelArray;
                }
                
                provinceModel.cities = cityModelArray;
            }
            
            [_provinceModelArray addObject:provinceModel];
        }
        
        _selectProvinceModel = _provinceModelArray[0];
        _selectCityModel = _selectProvinceModel.cities[0];
        _selectDistrictModel = _selectCityModel.districts[0];
        
        [self setupPickerView];
    }
    

    以上就是核心代码,由于需要解析返回的行政区划的内容, 并且数据共有省市区三个数组, 对于北京市这样的特殊例子并没有第三个数组, 因此需要额外的步骤区拆分, 直接看部分代码可能有一些晦涩, 因此建议同学们可以直接下载Demo尝试。

    示例:展示行政区划Picker

    点评

    该功能目前还有些许不足之处,比如:

    1、省市区三个行政区划如果要同时获取的话, 由于API返回的是三个数组, 因此自己去处理有些麻烦。

    2、直辖市这样的城市, 由于不存在省份, 相比其他省份少了一个层级, 而API也没有直接提供占位数据, 建议腾讯官方可以改进一下。

    链接

    感兴趣的同学可以在码云中下载Demo尝试一下。

    作者:面糊

    链接:https://www.jianshu.com/p/40044b625c63

    来源:简书

    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  • 相关阅读:
    【Java EE 学习 36】【struts2】【struts2系统验证】【struts2 ognl值栈】【struts2 ongl标签】【struts2 UI标签】【struts2模型驱动和令牌机制】
    【Java EE 学习 35 下】【struts2】【struts2文件上传】【struts2自定义拦截器】【struts2手动验证】
    【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
    【Java EE 学习 34】【struts2学习第一天】
    【JavaScript中的正则表达式】
    【Java EE 学习 33 下】【validate表单验证插件】
    【Java EE 学习 33 上】【JQuery样式操作】【JQuery中的Ajax操作】【JQuery中的XML操作】
    【Java EE 学习 32 下】【JQuery】【JQuey中的DOM操作】
    【Java EE 学习 32 上】【JQuery】【选择器】
    【Java EE 学习 31】【JavaScript基础增强】【Ajax基础】【Json基础】
  • 原文地址:https://www.cnblogs.com/TencentLBS/p/13685349.html
Copyright © 2011-2022 走看看