php 对接高德API区域 省市区
上代码!! public function search() { $data = ''; $district_table = District::tableName(); $url = 'https://restapi.amap.com/v3/config/district?parameters&key=67d98030aca29c4ea5671e21de0818ae&subdistrict=3'; $curl = new CurlHelper(); $res = json_decode($curl->get($url, json_encode($data)), true); //省市区县 foreach ($res['districts'][0]['districts'] as $key => $value) { //国下省 $pro[$value['adcode']]['adcode'] = $value['adcode']; $pro[$value['adcode']]['name'] = $value['name']; $pro[$value['adcode']]['level'] = $value['level']; $pro[$value['adcode']]['center'] = $value['center']; $pro[$value['adcode']]['citycode'] = $value['citycode']; foreach ($value['districts'] as $k => $v) { //省下的市 $city[$value['adcode']][$v['adcode']]['adcode'] = $v['adcode']; $city[$value['adcode']][$v['adcode']]['name'] = $v['name']; $city[$value['adcode']][$v['adcode']]['level'] = $v['level']; $city[$value['adcode']][$v['adcode']]['center'] = $v['center']; $city[$value['adcode']][$v['adcode']]['citycode'] = $v['citycode']; //市下县区 foreach ($v['districts'] as $k1 => $v1) { $district[$v['adcode']][$v1['adcode']]['adcode'] = $v1['adcode']; $district[$v['adcode']][$v1['adcode']]['name'] = $v1['name']; $district[$v['adcode']][$v1['adcode']]['level'] = $v1['level']; $district[$v['adcode']][$v1['adcode']]['center'] = $v1['center']; $district[$v['adcode']][$v1['adcode']]['citycode'] = $v1['citycode']; } } } $json_pro = array_column($pro, NULL, 'adcode'); $data_pro = array_column(District::find()->where(['parent_id' => 1])->asArray()->all(), NULL, 'adcode'); $json_pro_adcode = array_keys($json_pro); $data_pro_adcode = array_keys($data_pro); $adcode_same = array_intersect($json_pro_adcode, $data_pro_adcode); //对比数据库表和高德地图省差异 $adcode_diff = array_diff($json_pro_adcode, $data_pro_adcode); //香港和台湾忽略 if ($adcode_diff) { foreach ($adcode_diff as $pro_new_adcode) { $lng_lat = explode(',', $pro[$pro_new_adcode]['center']); $attributes[] = [1, 0, $pro[$pro_new_adcode]['adcode'], $pro[$pro_new_adcode]['name'], $lng_lat[0], $lng_lat[1], $pro[$pro_new_adcode]['level'], ]; } $query = \Yii::$app->db->createCommand(); $query->batchInsert(District::tableName(), ['parent_id', 'citycode', 'adcode', 'name', 'lng', 'lat', 'level',], $attributes)->execute(); } else { //行政省不会改变,不处理! } //市处理 $data_pro_id = array_keys(array_column(District::find()->where(['parent_id' => 1])->asArray()->all(), NULL, 'id')); foreach ($data_pro_id as $pro_id) { $city_pro_adcode = District::find()->where(['id' => $pro_id])->one()['adcode']; //某省的adcode $city_data = District::find()->where(['parent_id' => $pro_id])->asArray()->all(); //某省下的市 //print_r(array_keys($city[$city_pro_adcode]));die(); if (!empty($city_data)) { foreach ($city_data as $city_one) { if (!in_array($city_one['adcode'], array_keys($city[$city_pro_adcode]))) { District::deleteAll('adcode=:adcode', [':adcode' => $city_one['adcode']]); //旧表有多余市! District::deleteAll('parent_id=:parent_id', [':parent_id' => $city_one['id']]);//旧表有多余区县! continue; //兼容旧district表 } //$lng_lat_city=explode(',',$city[$city_pro_adcode][$city_one['adcode']]['center']); //经纬基本都不一样了,如果大批量更新可能会造成所表,后面考虑先在测试环境复制表过去在开启 if ( $city_one['adcode'] != $city[$city_pro_adcode][$city_one['adcode']]['adcode'] || $city_one['name'] != $city[$city_pro_adcode][$city_one['adcode']]['name'] || $city_one['citycode'] != $city[$city_pro_adcode][$city_one['adcode']]['citycode'] || $city_one['level'] != $city[$city_pro_adcode][$city_one['adcode']]['level'] // $city_one['lng']!=$lng_lat_city[0] || // $city_one['lat']!=$lng_lat_city[1] ) { Yii::$app->db->createCommand()->update(District::tableName(), [ 'adcode' => $city[$city_pro_adcode][$city_one['adcode']]['adcode'], 'name' => $city[$city_pro_adcode][$city_one['adcode']]['name'], 'level' => $city[$city_pro_adcode][$city_one['adcode']]['level'], 'citycode' => $city[$city_pro_adcode][$city_one['adcode']]['citycode'], //'lng'=>$lng_lat_city[0], // 'lat'=>$lng_lat_city[1], ], ['id' => $city_one['id']])->execute(); } } } else { //香港和台湾没市不处理 } } //区县处理 $data_pro_id = array_keys(array_column(District::find()->where(['parent_id' => 1])->asArray()->all(), NULL, 'id')); foreach ($data_pro_id as $pro_id) { $city_data = District::find()->where(['parent_id' => $pro_id])->asArray()->all(); //某省下的市 if (!empty($city_data)) { foreach ($city_data as $city_one) { //某市下区县 $district_data = District::find()->where(['parent_id' => $city_one['id']])->asArray()->all(); //某市下的区县 $district_data_1 = District::find()->where(['parent_id' => $city_one['id']])->asArray()->all(); $district_data_new = array_keys(array_column($district_data_1, NULL, 'adcode')); //新增高德地图新返回区县 $json_district_data_new = array_keys($district[$city_one['adcode']]); $adcode_diff_2 = array_diff($district_data_new, $json_district_data_new); //print_r(gettype($adcode_diff_2));die(); if (!empty($adcode_diff_2)) { District::deleteAll(['adcode' => $adcode_diff_2]);//旧表有多余区县! } $district_data_2 = District::find()->orderBy(['id' => 'DESC'])->asArray()->all(); $district_data_new_2 = array_keys(array_column($district_data_2, NULL, 'adcode')); $adcode_diff_1 = array_diff($json_district_data_new, $district_data_new_2); // print_r($adcode_diff_1);die(); if ($adcode_diff_1) { foreach ($adcode_diff_1 as $pro_new_adcode_1) { $lng_lat = explode(',', $district[$city_one['adcode']][$pro_new_adcode_1]['center']); $sql = "INSERT INTO {$district_table} (parent_id,citycode, adcode, name, lng, lat, level) VALUES ({$city_one['id']},'{$district[$city_one['adcode']][$pro_new_adcode_1]['citycode']}', '{$district[$city_one['adcode']][$pro_new_adcode_1]['adcode']}', '{$district[$city_one['adcode']][$pro_new_adcode_1]['name']}', '{$lng_lat[0]}', '{$lng_lat[1]}', '{$district[$city_one['adcode']][$pro_new_adcode_1]['level']}')";//P_MOD // $res = $this->db->createCommand($sql)->execute(); // $attributes[] = [ // $city_one['id'], // 0, //citycode // $district[$city_one['adcode']][$pro_new_adcode_1]['adcode'], // $district[$city_one['adcode']][$pro_new_adcode_1]['name'], // $lng_lat[0], // $lng_lat[1], // $district[$city_one['adcode']][$pro_new_adcode_1]['level'], // ]; $true = District::find()->where(['adcode' => $district[$city_one['adcode']][$pro_new_adcode_1]['adcode'], 'parent_id' => $city_one['id']])->one(); if (empty($true)) { $res = \Yii::$app->db->createCommand($sql)->execute(); // $query = \Yii::$app->db->createCommand(); // $query->batchInsert(District::tableName(), ['parent_id', 'citycode', 'adcode', 'name', 'lng', 'lat', 'level',], $attributes)->execute(); } } } foreach ($district_data as $district_one) { if (!in_array($district_one['adcode'], array_keys($district[$city_one['adcode']]))) { District::deleteAll('id=:id', [':id' => $district_one['id']]);//旧表有多余区县! continue; //兼容旧district表 } //$lng_lat_city=explode(',',$district[$city_one['adcode'][$district_one['adcode']]['center']); elseif ( $district_one['adcode'] != $district[$city_one['adcode']][$district_one['adcode']]['adcode'] || $district_one['name'] != $district[$city_one['adcode']][$district_one['adcode']]['name'] || $district_one['citycode'] != $district[$city_one['adcode']][$district_one['adcode']]['citycode'] || $district_one['level'] != $district[$city_one['adcode']][$district_one['adcode']]['level'] // $city_one['lng']!=$lng_lat_city[0] || // $city_one['lat']!=$lng_lat_city[1] ) { Yii::$app->db->createCommand()->update(District::tableName(), [ 'adcode' => $district[$city_one['adcode']][$district_one['adcode']]['adcode'], 'name' => $district[$city_one['adcode']][$district_one['adcode']]['name'], 'level' => $district[$city_one['adcode']][$district_one['adcode']]['level'], 'citycode' => $district[$city_one['adcode']][$district_one['adcode']]['citycode'], //'lng'=>$lng_lat_city[0], // 'lat'=>$lng_lat_city[1], ], ['id' => $district_one['id']])->execute(); } } } } else { //香港台湾没市,不操作,超出配送范围 } } echo("AMAP API district update success!"); }
其中发现了个好用的函数