在城市規劃和土地管理領域,精確且詳盡的空間數據是進行有效決策的基石。隨著地理信息系統(GIS)技術的發展,我們能夠以前所未有的精度和細節來捕捉、分析和展示土地利用信息。這不僅提升了數據的質量和可靠性,還使得城市規劃者能夠更深入地理解城市的結構和動態變化。通過GIS技術的應用,復雜的地理空間數據可以被轉化為易于理解和操作的信息,從而支持更加科學合理的城市規劃和管理決策。
新加坡的用地統計數據不僅提供了一個全面的視角,讓我們得以深入了解這座國際化都市的土地使用現狀及其變化趨勢,而且也為未來城市發展的預測和規劃提供了堅實的數據支持。新加坡作為一個高度發達的城市國家,其土地管理和城市規劃一直走在世界前列。政府通過嚴格的土地用途管制和高效的基礎設施建設,確保了城市的可持續發展和居民的生活質量。
新加坡用地規劃官網:URA SPACE
我們參考HTML網頁信息的GET獲取方法,先看3個關鍵部分標頭、負載、?預覽;
標頭:通常包括URL的連接,也就是目標資源的位置,可以了解網頁使用的是GET請求方法;
負載:對于GET請求:負載通常包含了傳遞的參數,這里我們可以看到它的傳參包括,當前位置坐標,使用的坐標系EPSG:4326;
預覽:指的是對響應內容的快速查看或摘要顯示,我們可以看到當前地塊的標簽信息,和geometry的幾何多邊形信息;
這里有一個細節需要注意一下,因為我們的獲取方法是以創建網格點進行遍歷,所有這里要考慮新加坡的最大和最小坐標的邊界,另外這里的坐標系是Web墨卡托投影(EPSG:3857);
接下來就是數據獲取部分,先講一下方法思路,一共三個步驟;
方法思路
- 以約10m為間隔(0.0001度)創建網格點,這些網格點將覆蓋整個新加坡區域;
- 遍歷每個網格點,構建API請求URL,發送HTTP請求獲取該區域的土地用途數據;
- 提取每個地塊的屬性信息,提取幾何信息,將處理后的數據轉換為GeoDataFrame格式,存為shp文件;
第一步:我們先找到對應數據存儲位置,獲取所有地塊的屬性信息,經過測試,每次查詢一個地塊會對應一個html,我們通過修改坐標位置來進行數據獲取;
第二步:以約10m為間隔(0.0001度)創建網格點,利用GET請求獲取所有網格對應地塊信息,并根據標簽進行保存,另存為shp,tips如果對精度有進一步要求可以修改grid_size = 0.0001 這個參數;
完整代碼#運行環境 Python 3.11
import requests
import geopandas as gpd
from shapely.geometry import Polygon
import math
from pyproj import Transformer# 定義坐標轉換器
transformer = Transformer.from_crs("EPSG:3857", "EPSG:4326", always_xy=True)# 新加坡邊界(Web墨卡托投影)
xmin, ymin = 11532510.446400002, 127973.29659999907
xmax, ymax = 11622551.8041, 166493.53660000116# 轉換為WGS84坐標
lon_min, lat_min = transformer.transform(xmin, ymin)
lon_max, lat_max = transformer.transform(xmax, ymax)# 定義網格大小(度)
grid_size = 0.0001 # 約10m# 創建網格點
lons = []
lats = []
current_lon = lon_min
while current_lon < lon_max:current_lat = lat_minwhile current_lat < lat_max:lons.append(current_lon)lats.append(current_lat)current_lat += grid_sizecurrent_lon += grid_size# 存儲所有特征
all_features = []
all_geometries = []# 遍歷每個網格點
for lon, lat in zip(lons, lats):url = f"https://maps.ura.gov.sg/arcgis/rest/services/MP19/Landuse_gaz/MapServer/46/query?returnGeometry=true&where=1%3D1&outSR=4326&outFields=*&inSr=4326&geometry=%7B%22x%22%3A{lon}%2C%22y%22%3A{lat}%2C%22spatialReference%22%3A%7B%22wkid%22%3A4326%7D%7D&geometryType=esriGeometryPoint&spatialRel=esriSpatialRelWithin&f=json"headers = {'User-Agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/137.0.0.0 Mobile Safari/537.36 Edg/137.0.0.0'}try:response = requests.get(url, headers=headers)if response.status_code == 200:data = response.json()for feature in data['features']:attributes = feature['attributes']geometry = feature['geometry']['rings'][0]polygon = Polygon(geometry)# 檢查是否已經存在相同的OBJECTIDif not any(f['OBJECTID'] == attributes['OBJECTID'] for f in all_features):all_features.append({'OBJECTID': attributes['OBJECTID'],'LU_DESC': attributes['LU_DESC'],'LU_DT_DESC': attributes['LU_DT_DESC'],'GPR_NUM': attributes['GPR_NUM'],'PARCEL_ID': attributes['PARCEL_ID'],'REGION_N': attributes['REGION_N'],'PLN_AREA_N': attributes['PLN_AREA_N'],'SUBZONE_N': attributes['SUBZONE_N']})all_geometries.append(polygon)print(f"Processed point: {lon}, {lat}")except Exception as e:print(f"Error processing point {lon}, {lat}: {str(e)}")continue# 創建GeoDataFrame
gdf = gpd.GeoDataFrame(all_features, geometry=all_geometries, crs='EPSG:4326')# 保存到shapefile
gdf.to_file("singapore_land_use.shp")print("Shapefile saved successfully.")
腳本執行結束,我們會得到一個文件名為lsingapore_land_use的shp圖層,獲取數據標簽如下,LU_DESC(土地用途描述)、LU_DT_DESC(詳細土地用途描述)、GPR(總容積率)、PARCEL_ID(地塊ID) 、REGION_N(區域名稱)、PLN_AREA_N(規劃區域名稱)、SUBZONE_N(分區名稱)、SUBZONE_NO(分區編號)、SHAPE_Area(地塊面積)、SHAPE_Length(地塊周長),其他一些非關鍵標簽,這里省略;
第三步:提取每個地塊的屬性信息,提取幾何信息,將處理后的數據轉換為GeoDataFrame格式,存為shp文件,將數據導入ArcGIS進行可視化;
通過上述步驟,我們成功地從新加坡的土地利用統計數據中提取了詳細的空間數據,并將其轉換為shp格式。這些數據不僅涵蓋了土地用途描述、詳細土地用途描述、總容積率、地塊ID、區域名稱、規劃區域名稱和分區名稱等關鍵信息,還包含了幾何形狀信息,使得我們可以進行進一步的空間分析和可視化,生成的shp文件可以導入到ArcGIS或其他GIS軟件中進行詳細的分析和展示。這為我們提供了寶貴的數據支持,有助于城市規劃者更好地理解新加坡的土地使用現狀及其變化趨勢,從而制定更加科學合理的未來城市發展計劃。
文章僅用于分享個人學習成果與個人存檔之用,分享知識,如有侵權,請聯系作者進行刪除。所有信息均基于作者的個人理解和經驗,不代表任何官方立場或權威解讀。