“详规一张图”——上海土地利用数据
在城市规划和土地管理领域,精确且详尽的空间数据是进行有效决策的基石。随着地理信息系统(GIS)技术的发展,我们能够以前所未有的精度和细节来捕捉、分析和展示土地利用信息。这不仅提升了数据的质量和可靠性,还使得城市规划者能够更深入地理解城市的结构和动态变化。通过GIS技术的应用,复杂的地理空间数据可以被转化为易于理解和操作的信息,从而支持更加科学合理的城市规划和管理决策。
上海的用地统计数据不仅提供了一个全面的视角,让我们得以深入了解这座国际化大都市的土地使用现状及其变化趋势,而且也为未来城市发展的预测和规划提供了坚实的数据支持。作为一个高度发达的城市,上海在土地管理和城市规划方面一直走在世界前列。政府通过严格的土地用途管制和高效的基础设施建设,确保了城市的可持续发展和居民的生活质量。随着时代的发展和技术的进步,上海继续探索创新方法,以进一步优化其城市规划和土地使用的效率,促进城市的和谐发展。
上海用地规划官网:详细规划“一张图”公众版
我们参考HTML网页信息的GET获取方法,先看3个关键部分标头、负载、 预览;
标头:通常包括URL的连接,也就是目标资源的位置,可以了解网页使用的是GET请求方法;
负载:对于GET请求:负载通常包含了传递的参数,这里我们可以看到它的传参包括,当前位置坐标,使用的坐标系EPSG:4326;
预览:指的是对响应内容的快速查看或摘要显示,我们可以看到当前地块的标签信息,和geometry的几何多边形信息;
这里有一个细节需要注意一下,因为我们的获取方法是以创建网格点进行遍历,所有这里要考虑上海行政区的最大和最小坐标的边界,另外这里的坐标系是Web墨卡托投影(EPSG:4326);
接下来就是数据获取部分,先讲一下方法思路,一共三个步骤;
方法思路
- 以约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 json
import geopandas as gpd
from shapely.geometry import shape
from urllib3.exceptions import InsecureRequestWarning
import time # 用于在请求之间添加延迟
import os # 导入os模块# 禁用不安全请求警告
requests.packages.urllib3.disable_warnings(category=InsecureRequestWarning)def fetch_page(url, params):"""发送请求获取网页内容"""try:response = requests.get(url=url, params=params, verify=False) # 禁用SSL验证if response.status_code == 200:return response.json() # 返回JSON格式的数据else:print(f"Failed to retrieve the page. Status code: {response.status_code}")return Noneexcept Exception as e:print(f"An error occurred: {e}")return Nonedef create_grid(min_longitude, max_longitude, min_latitude, max_latitude, step):"""创建一个网格,返回一系列的(longitude, latitude)坐标对"""grid_points = []current_longitude = min_longitudewhile current_longitude <= max_longitude:current_latitude = min_latitudewhile current_latitude <= max_latitude:grid_points.append((current_longitude, current_latitude))current_latitude += stepcurrent_longitude += stepreturn grid_pointsif __name__ == '__main__':# 请求配置url = 'https://map4.shanghai-map.net/arcgis/rest/services/planblock20250110/MapServer/identify'# 上海市的地理范围和步长min_longitude = 120.80012536879065 # 上海市最小经度max_longitude = 122.27874755895266 # 上海市最大经度min_latitude = 30.54553222673087 # 上海市最小纬度max_latitude = 31.945383160404504 # 上海市最大纬度step = 0.0001 # 步长,单位:度# 创建网格grid_points = create_grid(min_longitude, max_longitude, min_latitude, max_latitude, step)features = []for point in grid_points:geometry_str = json.dumps({'x': point[0], 'y': point[1], 'spatialReference': {'wkid': 4326}})params = {'sr': 4326,'layers': 'all','tolerance': 1,'returnGeometry': 'true','imageDisplay': '651,852,96','mapExtent': f'{min_longitude},{min_latitude},{max_longitude},{max_latitude}','geometry': geometry_str,'geometryType': 'esriGeometryPoint','f': 'json'}print(f"Fetching data for point {point}...")json_response = fetch_page(url, params)# 在请求之间添加延迟以减少服务器负载time.sleep(0.1)if json_response and 'results' in json_response:for result in json_response['results']:geom = result.get('geometry', {})attributes = result.get('attributes', {})if geom and 'rings' in geom:geom_with_type = {'type': 'Polygon', 'coordinates': geom['rings'],'spatialReference': geom.get('spatialReference')}try:polygon = shape(geom_with_type) # 使用shapely的shape函数直接转换GeoJSON到Shapely几何对象# 确保PLANLAND_1字段存在并且是字符串类型planland_1 = attributes.get('PLANLAND_1', '')if not isinstance(planland_1, str):planland_1 = str(planland_1)# 将几何和属性信息添加到列表中features.append({'geometry': polygon,**attributes,'PLANLAND_1': planland_1.encode('utf-8').decode('utf-8') # 确保使用UTF-8编码})except Exception as e:print(f"Error converting geometry to shape: {e}")if features:gdf = gpd.GeoDataFrame(features, crs="EPSG:4326")# 检查并创建输出文件夹output_dir = './shp'if not os.path.exists(output_dir):os.makedirs(output_dir) # 创建文件夹# 将结果保存为shapefile,确保使用UTF-8编码gdf.to_file(os.path.join(output_dir, "output.shp"), encoding='utf-8', driver="ESRI Shapefile")print("Shapefile saved successfully.")else:print("No valid polygons found.")
获取数据标签如下,BLENDLANDP(混合用地属性)、LANDAREA(用地面积)、PLANLANDPR(规划用地属性)、PLANLAND_1(规划用地类型)、PLOTNUMBER(地块编号)、PLOTRATIO( 容积率)、PLOTRATIOM( 最大容积率)、PROJECTNUM(项目编号)、SHAPE_Area(形状面积)、SHAPE_Leng(形状长度)、Shape(形状类型),其他一些非关键标签,这里省略;
第三步:提取每个地块的属性信息,提取几何信息,将处理后的数据转换为GeoDataFrame格式,存为shp文件,将数据导入ArcGIS进行可视化;
通过上述步骤,我们成功地从上海的土地利用统计数据中提取了详细的空间数据,并将其转换为shp格式。这些数据不仅涵盖了土地用途描述、详细土地用途描述、总容积率、地块ID、区域名称、规划区域名称和分区名称等关键信息,还包含了几何形状信息,使得我们可以进行进一步的空间分析和可视化,生成的shp文件可以导入到ArcGIS或其他GIS软件中进行详细的分析和展示。这为我们提供了宝贵的数据支持,有助于城市规划者更好地理解新加坡的土地使用现状及其变化趋势,从而制定更加科学合理的未来城市发展计划。
文章仅用于分享个人学习成果与个人存档之用,分享知识,如有侵权,请联系作者进行删除。所有信息均基于作者的个人理解和经验,不代表任何官方立场或权威解读。