城市行政区边界

一、工作背景

1、数据分析从一个城市视角拓展到国内外主要城市的数据比较

2、互联网城市数据的对比分析

3、 百度慧眼,提供了迁徙数据,具体看下长三角的联系

二、准备工作

1、行政区划信息

中国民政部官网提供了每年更新的行政区划,2020年12年有完整的行政区划代码表,省、市、区县、街道、镇。数据下载地址:行政区划代码_中华人民共和国民政部

2、行政区边界信息

在网上搜了一圈后,采用阿里云datav数据可视化平台提供的边界信息,该边界信息来源于高德开放平台。网站地址:datav.aliyun.com/portal/school/atlas/area_selector?spm=a2crr.23498931.0.0.4ad815ddMDdXGW)

三、边界处理

1、数据下载

阿里云datav数据可视化平台提供json数据下载,通过python遍历国内333个地级市下载,python下载代码如下:

urlstr = 'https://geo.datav.aliyun.com/areas_v3/bound/'+ str(id2) +'_full.json'

req = urllib.request.Request(urlstr)

f = urllib.request.urlopen(req)

result = f.read().decode('utf-8')

res_data = json.loads(result)

下载得到境内31个省市、333个地级市的边界json,如下:

2、市、区边界拼合

上述下载的是每个省、每个城市的json,需要拼合为一个全国的省、市、区地理文件。

拼合方法是,逐个解析json文件进行拼合,共输出为三个文件

省级边界、市级边界、区县边界

重点说一下镂空面数据的处理,通过QGIS加载json查看镂空面的wkt,发现镂空面的multipolygon表示如下

(((),(),())),第一个黑括号为完整边界的坐标串,第二个、第三个镂空的面坐标串;

((()),(()),(())),这个常规的面表达。

3、处理程序

try:

req = urllib.request.Request(urlstr)

f = urllib.request.urlopen(req)

result = f.read().decode('utf-8')

res_data = json.loads(result)

rdatas = res_data["features"]

for rdata in rdatas:

polygons = rdata["geometry"]["coordinates"]

ptype = rdata["geometry"]["type"]

if ptype == 'Polygon' :

#print(rdata["properties"]["adcode"])

c1 = 1

wkt2 = '"MultiPolygon((('

for polygon in polygons:

if c1 == 1:

c1 = 2

c2 = 1

for wkt1 in polygon:

if c2==1:

c2 = 2

wkt2 += str(wkt1[0]) +' '+ str(wkt1[1])

else:

wkt2 += ','+ str(wkt1[0])+' '+str(wkt1[1])

wkt2 += ')'

else:

c2 = 1

for wkt1 in polygon:

if c2==1:

c2 = 2

wkt2 += ',('+str(wkt1[0]) +' '+ str(wkt1[1])

else:

wkt2 += ','+ str(wkt1[0])+' '+str(wkt1[1])

wkt2 += ')'

wkt2 += '))"'

elif ptype == 'MultiPolygon' : #or rdata["properties"]["adcode"] in(120113,340800,341700)

c1 = 1

wkt2 = '"MultiPolygon('

for polygon in polygons:

if c1 == 1:

c1 = 2

c2 = 1

for wkt10 in polygon:

for wkt1 in wkt10:

if c2==1:

c2 = 2

wkt2 += '(('+str(wkt1[0]) +' '+ str(wkt1[1])

else:

wkt2 += ','+ str(wkt1[0])+' '+str(wkt1[1])

wkt2 += '))'

else:

c2 = 1

for wkt10 in polygon:

for wkt1 in wkt10:

if c2==1:

c2 = 2

wkt2 += ',(('+str(wkt1[0])+' '+str(wkt1[1])

else:

wkt2 += ','+ str(wkt1[0])+' '+str(wkt1[1])

wkt2 += '))'

wkt2 += ')"'

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值