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

在城市规划和土地管理领域,精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统(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软件中进行详细的分析和展示。这为我们提供了宝贵的数据支持,有助于城市规划者更好地理解新加坡的土地使用现状及其变化趋势,从而制定更加科学合理的未来城市发展计划。

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

相关推荐
望获linux18 分钟前
【实时Linux实战系列】硬实时与软实时设计模式
linux·运维·服务器·数据库·操作系统·rtos·嵌入式软件
前端 贾公子2 小时前
pnpm 的 resolution-mode 配置 ( pnpm 的版本解析)
前端
伍哥的传说2 小时前
React 自定义Hook——页面或元素滚动到底部监听 Hook
前端·react.js·前端框架
Cyanto4 小时前
深入MyBatis:CRUD操作与高级查询实战
java·数据库·mybatis
linT_T4 小时前
数字化管理新趋势:权限分级看板如何筑牢安全防线
信息可视化
datascome4 小时前
文章发布易优CMS(Eyoucms)网站技巧
数据库·经验分享·爬虫·数据采集·eyoucms·易优cms
Leo.yuan4 小时前
数据清洗(ETL/ELT)原理与工具选择指南:企业数字化转型的核心引擎
大数据·数据仓库·数据挖掘·数据分析·etl
麦兜*4 小时前
Spring Boot 集成Reactive Web 性能优化全栈技术方案,包含底层原理、压测方法论、参数调优
java·前端·spring boot·spring·spring cloud·性能优化·maven
知了一笑4 小时前
独立开发第二周:构建、执行、规划
java·前端·后端
有想法的py工程师5 小时前
PostgreSQL 锁等待监控,查找等待中的锁
数据库