行政區域範圍數據,在我們製圖或者數據分析時需要用到,而有時卻面臨數據獲取不到的困境,雖然有些收費軟件能夠實現矢量數據的下載,但他們不生產數據,只是數據的搬運工,卻收着昧心錢,鑑於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,可以獲取該源代碼文件。
二維碼如下: