前言
全国行政区划检索功能, 由于高德和百度也没有提供一个比较完美的解决方案, 因此使用了腾讯地图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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。