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!");
    }

 

其中发现了个好用的函数

php 对接高德API区域 省市区