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,可以获取该源代码文件。
二维码如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章