“详规一张图”——新加坡土地利用数据

在城市规划和土地管理领域,精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统(GIS)技术的发展,我们能够以前所未有的精度和细节来捕捉、分析和展示土地利用信息。这不仅提升了数据的质量和可靠性,还使得城市规划者能够更深入地理解城市的结构和动态变化。通过GIS技术的应用,复杂的地理空间数据可以被转化为易于理解和操作的信息,从而支持更加科学合理的城市规划和管理决策。

新加坡的用地统计数据不仅提供了一个全面的视角,让我们得以深入了解这座国际化都市的土地使用现状及其变化趋势,而且也为未来城市发展的预测和规划提供了坚实的数据支持。新加坡作为一个高度发达的城市国家,其土地管理和城市规划一直走在世界前列。政府通过严格的土地用途管制和高效的基础设施建设,确保了城市的可持续发展和居民的生活质量。

新加坡用地规划官网:URA SPACE

我们参考HTML网页信息的GET获取方法,先看3个关键部分标头、 负载、 预览;

**标头:**通常包括URL的连接,也就是目标资源的位置,可以了解网页使用的是GET请求方法;

**负载:**对于GET请求:负载通常包含了传递的参数,这里我们可以看到它的传参包括,当前位置坐标,使用的坐标系EPSG:4326;

**预览:**指的是对响应内容的快速查看或摘要显示,我们可以看到当前地块的标签信息,和geometry的几何多边形信息;

这里有一个细节需要注意一下,因为我们的获取方法是以创建网格点进行遍历,所有这里要考虑新加坡的最大和最小坐标的边界,另外这里的坐标系是Web墨卡托投影(EPSG:3857);

接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;

方法思路

  1. 以约10m为间隔(0.0001度)创建网格点,这些网格点将覆盖整个新加坡区域;
  2. 遍历每个网格点,构建API请求URL,发送HTTP请求获取该区域的土地用途数据;
  3. 提取每个地块的属性信息,提取几何信息,将处理后的数据转换为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软件中进行详细的分析和展示。这为我们提供了宝贵的数据支持,有助于城市规划者更好地理解新加坡的土地使用现状及其变化趋势,从而制定更加科学合理的未来城市发展计划。

文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。

相关推荐
伤不起bb5 分钟前
NoSQL 之 Redis 集群
数据库·redis·nosql
溜达哥17 分钟前
git commit 执行报错 sh: -/: invalid option
前端·javascript·git
迷途思凡28 分钟前
各数据库字段类型统计
数据库
江梦寻31 分钟前
最新Chrome与Selenium完美兼容指南(含驱动下载与配置)
前端·chrome·selenium·测试工具·edge·edge浏览器
Menior_35 分钟前
进程地址空间(比特课总结)
前端·chrome
大数据魔法师39 分钟前
MongoDB(八) - MongoDB GridFS介绍及使用Python操作GridFS
数据库·python·mongodb
wowocpp1 小时前
mybatis 关联映射---一对一关联映射
数据库·mybatis
1977835461 小时前
PostgreSQL初体验
数据库·postgresql
晚风_END1 小时前
postgresql|数据库|只读用户的创建和删除(备忘)
数据库·postgresql·oracle
kymjs张涛1 小时前
前沿技术周刊 2025-06-09
android·前端·ios