共计 1867 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
CitySpace 数据集是城市空间分析领域的经典开源数据集,包含建筑轮廓、道路网络、POI 点等多模态地理空间数据。它的核心价值在于:

- 覆盖全球 20+ 主要城市的标准化数据
- 包含几何特征(如多边形、线串)和属性数据(如类别、高度)
- 支持跨城市的对比研究和机器学习建模
数据解析
解压后的数据集通常包含以下目录结构:
CitySpace/
├── metadata.json # 数据版本和坐标系说明
├── cities/
│ ├── new_york/
│ │ ├── buildings.geojson
│ │ ├── roads.geojson
│ │ └── pois.csv
│ └── london/
│ └── ...
└── statistics/ # 预计算的指标文件
关键文件说明:
- GeoJSON 文件:存储空间几何对象(需用 geopandas 处理)
- CSV 文件:存储属性数据(可用 pandas 直接读取)
- metadata.json:记录数据采用的 CRS 坐标系(常用 EPSG:4326)
实战演示
数据加载
安装依赖库:
pip install geopandas pandas matplotlib folium
加载建筑数据示例:
import geopandas as gpd
# 读取 GeoJSON 文件(自动转换为 GeoDataFrame)buildings = gpd.read_file('CitySpace/cities/new_york/buildings.geojson')
print(f"共加载 {len(buildings)} 条建筑记录")
print(buildings.crs) # 查看坐标系
数据清洗
处理异常值的典型操作:
# 过滤无效几何体(如面积为 0 的建筑)valid_buildings = buildings[buildings.area > 0]
# 处理高度缺失值(用类别平均高度填充)mean_heights = valid_buildings.groupby('type')['height'].mean()
valid_buildings['height'] = valid_buildings.apply(lambda x: mean_heights[x['type']] if pd.isna(x['height']) else x['height'],
axis=1
)
可视化实践
静态可视化
绘制建筑高度分布直方图:
import matplotlib.pyplot as plt
plt.figure(figsize=(10, 6))
valid_buildings['height'].hist(bins=50)
plt.title('纽约市建筑高度分布')
plt.xlabel('高度(米)')
plt.ylabel('频数')
plt.grid(True)
plt.show()
交互式地图
生成热力图(需提前安装 folium):
import folium
from folium.plugins import HeatMap
# 创建底图(定位到纽约市中心)nyc_map = folium.Map(location=[40.7128, -74.0060], zoom_start=12)
# 准备热力图数据(经度、纬度、权重)heat_data = [[point.y, point.x, height]
for point, height in zip(
valid_buildings.geometry.centroid,
valid_buildings['height']
)]
# 添加热力图层
HeatMap(heat_data, radius=15).add_to(nyc_map)
nyc_map.save('nyc_building_heatmap.html')
避坑指南
- 坐标系不匹配:
- 问题:不同图层 CRS 不一致导致叠加错位
-
解决:用
to_crs()统一坐标系(如 EPSG:4326) -
内存不足:
- 问题:处理大城市数据时内存溢出
-
解决:使用
chunksize参数分块读取,或选用 Dask 库 -
几何无效错误:
- 问题:
is_valid检查失败导致空间运算报错 - 解决:运行
buffer(0)修复几何体(如df.geometry = df.geometry.buffer(0))
进阶建议
- 城市对比分析:
- 计算多个城市的建筑密度 / 高度分布差异
-
使用空间自相关指标(如 Moran’s I)
-
路网可达性建模:
- 结合 OSMNX 库分析道路网络特征
-
计算步行可达的公共服务设施覆盖率
-
3D 可视化:
- 用 PyVista 或 Cesium 生成城市三维模型
- 添加高度和纹理信息
完整代码示例可在 GitHub 模板库 获取,包含可直接运行的 Colab Notebook。
正文完
发表至: 地理空间分析
近一天内
