地图行政区域code数据处理

需求

  1. 数据库内存储有省(province)市(city)区( area ) 3张表。
  2. 因为行政区域有更新,现在从腾讯位置服务获取最新发布的数据来更新本地数据。
    数据下载地址
    下载下来的数据长这样

地图行政区域code数据处理

  1. 处理后的数据是这样的

文件上传中...


代码实现

  • 下载后的数据处理成需要的格式

    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 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 9

反正会失效,感觉没必要存,直接调天地图的接口获取就行了

3个月前 评论
MeditationTm (楼主) 3个月前
Asuna (作者) 3个月前
MeditationTm (楼主) 3个月前

这个代码说实话没有心思看

3个月前 评论

这个我有格式化好的,需要可以找我

3个月前 评论
MeditationTm (楼主) 3个月前
sanders

分级数据,推荐使用 packagist.org/packages/kalnoy/nest... 这个包实现模型进行存储,以便保障查询效率。

3个月前 评论
MeditationTm (楼主) 3个月前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!