地图行政区域code数据处理
需求
- 数据库内存储有省(province)市(city)区( area ) 3张表。
- 因为行政区域有更新,现在从腾讯位置服务获取最新发布的数据来更新本地数据。
数据下载地址
下载下来的数据长这样
- 处理后的数据是这样的
代码实现
下载后的数据处理成需要的格式
private function makeData() { $list = DB::connection($this->connection) ->table('m_region_data')->orderBy('adcode')->get()->toArray(); $insert_array = []; foreach ($list as $item) { $adcode = $item->adcode; $name_arr = explode(',', $item->name); $insert_array[] = [ 'code' => $adcode, 'a_name' => $name_arr[0] ?? '', 'b_name' => $name_arr[1] ?? '', 'c_name' => $name_arr[2] ?? '', 'd_name' => $name_arr[3] ?? '', ]; } $insert_a_c = array_chunk($insert_array, 200); foreach ($insert_a_c as $c) { DB::connection($this->connection)->table('目标表')->insert($c); } }
更新的省
private $provider_arr = [ '云南省', '四川省', '贵州省', '青海省' , '河北省', '山西省', '辽宁省', '吉林省' , '江苏省', '浙江省', '安徽省', '福建省' , '江西省', '山东省', '河南省', '湖北省' , '湖南省', '广东省', '海南省', '陕西省', '甘肃省' , '黑龙江省', '新疆维吾尔自治区', '广西壮族自治区', '宁夏回族自治区', '西藏自治区', '内蒙古自治区' , '北京市', '重庆市', '上海市', '天津市', '香港特别行政区' ];
脚本调用
/** * 更新行政区域编码 * @return void */ public function handler() { echo '开始更新行政区域编码:' . PHP_EOL; $this->makeRegionCode(); echo '更新行政区域编码完成' . PHP_EOL; } private function makeRegionCode() { var_dump('处理省:' . count(array_unique($this->provider_arr))); foreach ($this->provider_arr as $item) { var_dump('处理省份:' . $item); $this->makeProv($item); } }
实际处理
private function makeProv($str) { try { DB::beginTransaction(); $list = DB::connection($this->connection)->table('m_p') ->where('b_name', $str) ->get() ->toArray(); var_dump('当前省共有数据:' . count($list)); //省处理 $p = DB::connection($this->connection)->table('province') ->where('status', 1) ->where('name', $str) ->first(); if (empty($p)) { DB::connection($this->connection)->table('province')->insertGetId([ 'code' => 0, 'name' => $str, 'is_new' => 2, 'is_up' => 2, ]); var_dump('插入省数据异常成功:' . '_' . $str); return; } if ($str === '香港特别行政区') { $s_r_c = DB::connection($this->connection)->table('m_p')->where('b_name', $str)->where('c_name', $str)->where('d_name', '')->value('code'); } else { $s_r_c = DB::connection($this->connection)->table('m_p')->where('b_name', $str)->where('c_name', '')->where('d_name', '')->value('code'); } DB::connection($this->connection)->table('province')->where('id', $p->id) ->update([ 'code' => $s_r_c, 'is_up' => 1, ]); $this->setCodeConfirm($s_r_c); echo '省: ' . $str . '_' . $s_r_c . $p->name . '_id:' . $p->id . PHP_EOL; //市处理 $c_name_arr = array_filter(array_unique(array_column($list, 'c_name'))); foreach ($c_name_arr as $item) { $code = DB::connection($this->connection)->table('m_p') ->where('b_name', $str) ->where('c_name', $item) ->value('code'); $this->setCodeConfirm($code); echo $item . ' _市_:' . $code . PHP_EOL; $queryCity = DB::connection($this->connection)->table('city') ->where('pid', $p->id) ->where('name', $item) ->select(['id', 'pid', 'sid', 'code', 'name']) ->first(); //不存在插入 if (empty($queryCity)) { $city_pid = DB::connection($this->connection)->table('city')->insertGetId([ 'code' => $code, 'name' => $item, 'pid' => $p->id, 'is_new' => 1, 'is_up' => 1, ]); echo '插入市成功:' . $code . '_' . $item . PHP_EOL; } else { DB::connection($this->connection)->table('city')->where('id', $queryCity->id)->update([ 'code' => $code, 'is_up' => 1, 'update_at' => date('Y-m-d Hs') ]); $city_pid = $queryCity->id; } //区处理 $areaList = DB::connection($this->connection)->table('m_p') ->where('b_name', $str) ->where('c_name', $item) ->get() ->toArray(); $a_name_arr = array_filter(array_unique(array_column($areaList, 'd_name'))); // var_dump($item . ' 区县数:' . count($a_name_arr)); foreach ($a_name_arr as $area_item) { $area_code = DB::connection($this->connection)->table('m_p') ->where('b_name', $str) ->where('c_name', $item) ->where('d_name', $area_item) ->value('code'); $this->setCodeConfirm($area_code); echo "区县 _ : $area_item" . $area_code . PHP_EOL; $queryArea = DB::connection($this->connection)->table('m_area') ->where('pid', $city_pid) ->where('name', $area_item) ->first(); if (empty($queryArea)) { DB::connection($this->connection)->table('m_area')->insertGetId([ 'code' => $area_code, 'name' => $area_item, 'pid' => $city_pid, 'is_new' => 1, 'is_up' => 1, ]); echo '插入区县成功:' . $area_code . '_' . $area_item . PHP_EOL; } else { DB::connection($this->connection)->table('m_area')->where('id', $queryArea->id)->update([ 'code' => $area_code, 'is_up' => 1, 'updated_at' => date('Y-m-d Hs') ]); } } } DB::commit(); } catch (\Exception $e) { DB::rollBack(); var_dump($e->getMessage()); } }
总结
- 开始之前并没有想好怎么去实现,想的是一点一点的先写了再说。
- 后面处理了感觉不太对,仔细分析了一下数据,更换了处理方式
- 如果有更好的实现方式欢迎指正,非常感谢。
本作品采用《CC 协议》,转载必须注明作者和本文链接
反正会失效,感觉没必要存,直接调天地图的接口获取就行了
这个代码说实话没有心思看
这个我有格式化好的,需要可以找我
分级数据,推荐使用 packagist.org/packages/kalnoy/nest... 这个包实现模型进行存储,以便保障查询效率。