|
| 1 | +#! /usr/bin/env python |
| 2 | +# -*- coding: utf-8 -*- |
| 3 | +# __file__: administrative_region |
| 4 | +# 天地图行政区获取 |
| 5 | +import datetime |
| 6 | +import requests |
| 7 | +import json |
| 8 | +import codecs |
| 9 | +import pymongo |
| 10 | + |
| 11 | +key = "a4ee5c551598a1889adfabff55a5fc27" |
| 12 | + |
| 13 | +client = pymongo.MongoClient(host='localhost', port=27017) |
| 14 | + |
| 15 | +db = client.lvyou |
| 16 | +collection = db.tianditu |
| 17 | + |
| 18 | + |
| 19 | +def points_calc(shi, points): |
| 20 | + """ |
| 21 | + 将文本坐标转换成浮点坐标 |
| 22 | + :param shi: 市级行政区名称 |
| 23 | + :param points: "116.403 39.972,116.402 39.97,116.405 39.97,116.405 39.964," |
| 24 | + :return: [[x1,y1],[x2,y2]] |
| 25 | + """ |
| 26 | + x_list = [] |
| 27 | + y_list = [] |
| 28 | + for i in points: |
| 29 | + s = [x for x in i['region'].split(",")] |
| 30 | + s = [x.split(' ') for x in s] |
| 31 | + for j in s: |
| 32 | + x_list.append(eval(j[0])) |
| 33 | + y_list.append(eval(j[1])) |
| 34 | + |
| 35 | + res = [[x, y] for x, y in zip(x_list, y_list)] |
| 36 | + |
| 37 | + polygon = {'type': 'Polygon', 'coordinates': [res]} |
| 38 | + return polygon |
| 39 | + |
| 40 | + |
| 41 | +def xianggang_calc(chi): |
| 42 | + """ |
| 43 | + 处理香港的数据 |
| 44 | + :param chi: |
| 45 | + :return: |
| 46 | + """ |
| 47 | + |
| 48 | + for i in chi['child']: |
| 49 | + sheng_point = i['points'] |
| 50 | + sheng_name = i['name'] |
| 51 | + sheng_reg = points_calc(sheng_name, sheng_point) |
| 52 | + i['geom_tey'] = sheng_reg |
| 53 | + |
| 54 | + pass |
| 55 | + |
| 56 | + |
| 57 | +def do_zizhiqu(zz): |
| 58 | + """ |
| 59 | + 处理自治区 |
| 60 | + :param zz: 自治区 |
| 61 | + :return: |
| 62 | + """ |
| 63 | + for ii in zz: |
| 64 | + # 市区 |
| 65 | + s = calc_rege(ii) |
| 66 | + ii['geom_tey'] = s |
| 67 | + cs = ii.get('child') |
| 68 | + if cs: |
| 69 | + for c in cs: |
| 70 | + saa = calc_rege(c) |
| 71 | + c['geom_tey'] = saa |
| 72 | + pass |
| 73 | + |
| 74 | + |
| 75 | +def calc_rege(chi): |
| 76 | + """ |
| 77 | + 计算区域 |
| 78 | + :param chi: |
| 79 | + :return: |
| 80 | + """ |
| 81 | + aomen = chi['name'] |
| 82 | + aomen_point = chi.get('points') |
| 83 | + if aomen_point: |
| 84 | + aomen_reg = points_calc(aomen, aomen_point) |
| 85 | + return aomen_reg |
| 86 | + else: |
| 87 | + return None |
| 88 | + |
| 89 | + |
| 90 | +def run(): |
| 91 | + """ |
| 92 | + 运行函数 |
| 93 | + :return: |
| 94 | + """ |
| 95 | + r = requests.get( |
| 96 | + 'http://api.tianditu.gov.cn/administrative?postStr={"searchWord":"中国","searchType":"1","needSubInfo":"true","needAll":"true","needPolygon":"true","needPre":"true"}&tk=a4ee5c551598a1889adfabff55a5fc27') |
| 97 | + |
| 98 | + data = json.loads(r.text) |
| 99 | + |
| 100 | + data['spider_time'] = datetime.datetime.now().strftime('%Y-%m-%d %H-%M-%S') |
| 101 | + data = data['data'] |
| 102 | + for item in data: |
| 103 | + |
| 104 | + child_list = item['child'] |
| 105 | + |
| 106 | + for chi in child_list: |
| 107 | + # 处理的是省 |
| 108 | + chi_reg = calc_rege(chi) |
| 109 | + chi['geom_tey'] = chi_reg |
| 110 | + if chi['name'] == '澳门': |
| 111 | + aomen_reg = calc_rege(chi) |
| 112 | + chi['geom_tey'] = aomen_reg |
| 113 | + elif chi['name'] == '香港': |
| 114 | + xianggang_calc(chi) |
| 115 | + else: |
| 116 | + chi_chi = chi['child'] |
| 117 | + sheng_point = chi['points'] |
| 118 | + sheng_name = chi['name'] |
| 119 | + |
| 120 | + if '自治区' in sheng_name: |
| 121 | + do_zizhiqu(chi_chi) |
| 122 | + |
| 123 | + else: |
| 124 | + for ii in chi_chi: |
| 125 | + # 市区 |
| 126 | + s = calc_rege(ii) |
| 127 | + ii['geom_tey'] = s |
| 128 | + |
| 129 | + cs = ii.get('child') |
| 130 | + if cs: |
| 131 | + for c in cs: |
| 132 | + saa = calc_rege(c) |
| 133 | + c['geom_tey'] = saa |
| 134 | + |
| 135 | + collection.insert(chi) |
| 136 | + |
| 137 | + pass |
| 138 | + |
| 139 | + |
| 140 | +if __name__ == '__main__': |
| 141 | + run() |
0 commit comments