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