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

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

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

相关推荐
阳光是sunny1 分钟前
走进AI(1):细说RAG、MCP、Agent、Function Call
前端·ai编程
剪刀石头布啊10 分钟前
var、let、const与闭包、垃圾回收
前端·javascript
剪刀石头布啊11 分钟前
js常见的单例
前端·javascript
剪刀石头布啊12 分钟前
数据口径
前端·后端·程序员
剪刀石头布啊16 分钟前
http状态码大全
前端·后端·程序员
剪刀石头布啊18 分钟前
iframe通信、跨标签通信的常见方案
前端·javascript·html
宇之广曜27 分钟前
搭建 Mock 服务,实现前端自调
前端·mock
yuko093129 分钟前
【手机验证码】+86垂直居中的有趣问题
前端
用户15129054522032 分钟前
Springboot中前端向后端传递数据的几种方式
前端
阿星做前端33 分钟前
如何构建一个自己的 Node.js 模块解析器:node:module 钩子详解
前端·javascript·node.js