行政区域范围数据,在我们制图或者数据分析时需要用到,而有时却面临数据获取不到的困境,虽然有些收费软件能够实现矢量数据的下载,但他们不生产数据,只是数据的搬运工,却收着昧心钱,鉴于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,可以获取该源代码文件。
二维码如下: