python实现全国省市县矢量数据下载,下载shp数据到本地

行政区域范围数据,在我们制图或者数据分析时需要用到,而有时却面临数据获取不到的困境,虽然有些收费软件能够实现矢量数据的下载,但他们不生产数据,只是数据的搬运工,却收着昧心钱,鉴于python功能的强大,因此利用爬虫技术和gdal插件,实现全国省市县shp数据下载成为可能。
这里先介绍一下我的实现思路:
首先,根据行政区域code获取geojson字符串,这里接口用网上现成的
第二步,将geojson转换成gdal支持的坐标串
第三步,利用gdal将坐标串转换成shp,并赋予参考坐标和属性信息

第三步为整个过程的核心,可以参照我之前的博客:python利用gdal生成shp

效果如下:

在这里插入图片描述

完整代码如下:

# -*- coding: utf-8 -*-
import requests
import json
import gdal
import osr
import ogr

gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
gdal.SetConfigOption("SHAPE_ENCODING", "GBK")

print("地名code查询地址:http://datav.aliyun.com/tools/atlas/#")
province = input('请输要查询的地名code:')
url = 'https://geo.datav.aliyun.com/areas/bound/' + province + '.json'
html = requests.get(url).text
unicodestr = json.loads(html)

dat = unicodestr["features"][0]["properties"]
geo = unicodestr["features"][0]["geometry"]["coordinates"]
name = dat["name"]
adcode = dat["adcode"]


def create_polygon(coords):
    ring = ogr.Geometry(ogr.wkbLinearRing)
    for coord in coords:
        for xy in coord:
            ring.AddPoint(xy[0], xy[1])

            poly = ogr.Geometry(ogr.wkbPolygon)
            poly.AddGeometry(ring)
    return poly.ExportToWkt()


wkt = create_polygon(geo)
driver = ogr.GetDriverByName("ESRI Shapefile")
data_source = driver.CreateDataSource(name + ".shp")
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
layer = data_source.CreateLayer(name, srs, ogr.wkbMultiPolygon)
field_name = ogr.FieldDefn("Name", ogr.OFTString)
field_name.SetWidth(14)
layer.CreateField(field_name)

field_adcode = ogr.FieldDefn("Adcode", ogr.OFTString)
field_adcode.SetWidth(14)
layer.CreateField(field_adcode)

feature = ogr.Feature(layer.GetLayerDefn())
feature.SetField("Name", name)
feature.SetField("Adcode", adcode)

line = ogr.CreateGeometryFromWkt(wkt)
feature.SetGeometry(line)
layer.CreateFeature(feature)

feature = None
data_source = None
print(name+"下载结束!")

关注微信公众号:python趣味爱好者,后台回复:shp,可以获取该源代码文件。
二维码如下:
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值