整理了一份全国行政区划数据表,省市区县各级已经用 golang 做了关联,三级联动

April · · 5048 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

代码如下:


package main

import (
    "database/sql"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "strconv"
    "strings"

    _ "github.com/go-sql-driver/mysql"
)

type tude struct {
    Lat float32 `json:lat`
    Lng float32 `json:lng`
}

type region struct {
    Id       string   `json:id`
    Name     string   `json:name,omitempty`
    Fullname string   `json:fullname`
    Location tude     `json:location`
    Cidx     []int    `json:cidx,omitempty`
    Pinyin   []string `json:pinyin,omitempty`
}

type response struct {
    Status  int        `json:status`
    Message string     `json:message`
    Result  [][]region `json:result`
}

func main() {
    result := getRegionData()
    db, err := sql.Open("mysql", "root:root@tcp(localhost:8889)/DBName")
    if err != nil {
        log.Fatal(err)
    }
    defer db.Close()
    insertIntoDB(db, result) // 插入获取到的地址数据

    fixData(db, "[1-9][0-9]0000", "", 0, 1)                // 处理省级:只需要将省级 level 更新为 1
    fixData(db, "[1-9][0-9]{3}00", "[0-9]{2}00", 10000, 2) // 处理地级市:更新市级 level 为 2、parent 为其上级 region_id
    fixData(db, "[1-9][0-9]{3}00", "[0-9]{2}", 100, 3)     // 处理区县:更新区县 level 为 3、parent 为其上级 region_id
    fixData(db, "[1-9][0-9]{3}00", "[0-9]{4}", 10000, 2)   // 处理县级市:更新市级 level 为 2、parent 为其上级 region_id
}

/**
* 整理数据层级
 */
func fixData(db *sql.DB, regexp, regexp2 string, offset, level int) {
    stmt, err := db.Prepare("UPDATE `lc_tencent_regions` SET level=?,parent=? WHERE region_code REGEXP ? AND parent=0 AND level=0")
    defer stmt.Close()
    if err != nil {
        log.Fatal(err)
    }
    if regexp2 == "" {
        _, err := stmt.Exec(level, 0, regexp)
        if err != nil {
            log.Fatal(err)
        }
    } else {
        rows, err := db.Query("SELECT region_id,region_code FROM `lc_tencent_regions` WHERE region_code REGEXP ?", regexp)
        defer rows.Close()
        if err != nil {
            log.Fatal(err)
        }
        var (
            region_id   int
            region_code int
        )
        for rows.Next() {
            rows.Scan(&region_id, &region_code)
            regexp := strconv.Itoa(region_code/offset) + regexp2
            _, err := stmt.Exec(level, region_id, regexp)
            if err != nil {
                log.Fatal(err)
            }
        }
    }
}

func getRegionData() [][]region {
    resp, err := http.Get("http://apis.map.qq.com/ws/district/v1/list?key=腾讯LBS的key,可以在 lbs.qq.com 上免费获得")
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    var rg response
    err = json.Unmarshal(body, &rg)
    if err != nil {
        log.Fatal(err)
    }
    if rg.Status != 0 {
        log.Fatal(rg.Message)
    }

    return rg.Result
}

/**
* 数据入库
 */
func insertIntoDB(db *sql.DB, result [][]region) {
    sqlStr := "INSERT INTO `lc_tencent_regions`(region_code,name,region_name,lat,lng,pinyin,cidx)VALUES"
    vals := []interface{}{}
    for _, value := range result {
        for _, v := range value {
            cidx := int2Str(v.Cidx)
            pinyin := strings.Join(v.Pinyin, ",")
            sqlStr += "(?,?,?,?,?,?,?),"
            vals = append(vals, v.Id, v.Name, v.Fullname, fmt.Sprintf("%.5f", v.Location.Lat), fmt.Sprintf("%.5f", v.Location.Lng), pinyin, cidx)
            fmt.Println(v)
        }
    }
    stmt, err := db.Prepare(sqlStr[:len(sqlStr)-1])
    if err != nil {
        log.Fatal(err)
    }
    defer stmt.Close()
    res, err := stmt.Exec(vals...)
    if err != nil {
        log.Fatal(err)
    }
    fmt.Println(res.RowsAffected())
}

/**
* 数字转字符串
 */
func int2Str(v []int) string {
    var str []string
    for _, i := range v {
        str = append(str, strconv.Itoa(i))
    }
    return strings.Join(str, ",")
}

附件:lbstencentregions.sql


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

5048 次点击  
加入收藏 微博
4 回复  |  直到 2017-07-02 11:28:20
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传