“详规一张图”——新加坡土地利用数据
在城市规划和土地管理领域,精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统(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软件中进行详细的分析和展示。这为我们提供了宝贵的数据支持,有助于城市规划者更好地理解新加坡的土地使用现状及其变化趋势,从而制定更加科学合理的未来城市发展计划。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。