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,可以獲取該源代碼文件。
二維碼如下:
在這裏插入圖片描述

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