当前位置: 首页 > news >正文

GeoPandas 城市规划:Python 空间数据初学者指南

安装和设置

在深入研究数据之前,我们需要准备好工具。设置 GeoPandas 及其必要的依赖项是第一步。

我们将在 Google Colab 中完成此操作。

!pip install geopandas contextily matplotlib

空间数据有多种格式,但 GeoJSON 是常见且易于访问的格式。GeoPandas 可以直接将各种空间文件类型读取到名为 GeoDataFrame 的结构中。GeoDataFrame 本质上是在 Pandas DataFrame 的基础上添加了一个专门用于几何图形的列。这种结构使得将表格属性(例如人口或土地利用类型)与地理形状结合起来变得非常直观。

我们将使用一个示例数据集:“world-administrative-boundaries.geojson”文件。

# Import geopandas for spatial data.
import geopandas as gpd# Import matplotlib for plotting.
import matplotlib.pyplot as plt# Define the path to the GeoJSON file.
file_path = '/content/world-administrative-boundaries.geojson'# Load the GeoJSON file into a GeoDataFrame (spatial data table).
world_boundaries = gpd.read_file(file_path)
  • import geopandas as gpd:此行导入 GeoPandas 库并赋予其简写名称gpd。这是一个常见的约定。
  • import matplotlib.pyplot as plt:这将从 Matplotlib 导入绘图模块,别名为plt
  • file_path = '/content/world-administrative-boundaries.geojson':这会创建一个变量file_path,用于存储数据文件的位置。请记住:您需要将文件上传到 Colab 会话的文件系统才能使其正常工作。您可以使用 Colab 左侧边栏上的文件浏览器图标来执行此操作。world-administrative-boundaries.geojson
  • world_boundaries = gpd.read_file(file_path):这是加载空间数据的核心命令。gpd.read_file()读取 GeoJSON 文件并创建GeoDataFrame。可以将 GeoDataFrame 视为超强的 pandas DataFrame,它还可以理解地理形状和位置。

检查你的数据

数据加载完成后,了解其结构和内容至关重要。检查 GeoDataFrame 与检查常规 Pandas DataFrame 类似,但针对其空间特性,增加了一些关键内容

# Display the first 5 rows of the GeoDataFrame.
print("First 5 rows of the GeoDataFrame:")
display(world_boundaries.head())# Get basic info about the GeoDataFrame (columns, data types, etc.).
print("\nInformation about the GeoDataFrame:")
world_boundaries.info()# Display the Coordinate Reference System (CRS) of the data.
print("\nCoordinate Reference System (CRS):")
print(world_boundaries.crs)# Display the first 5 geometry entries (the shapes).
print("\nGeometry column:")
print(world_boundaries.geometry.head())

没有任何

这些命令允许您:

  • 查看前几行和前几列,包括特殊geometry列。初步浏览有助于确认数据已正确加载,并能立即了解与每个空间特征相关的属性。对于城市规划师来说,这可能意味着快速查看建筑物高度、土地用途或分区分类等列。
  • 使用 获取每列的数据类型和非空值的摘要.info()。这对于识别缺失数据或理解不同数据类型的表示方式至关重要,因为这会直接影响后续分析。例如,如果“population”列以字符串而不是整数形式加载,则您知道在执行计算之前需要对其进行转换。
  • 至关重要的是,请使用 检查坐标参考系 (CRS).crs。CRS 告诉您地理坐标如何映射到平面或球体上,是精确空间运算和测量的基础。如果没有正确的 CRS,您的空间分析可能会严重偏差,就像在不知道比例尺或投影的情况下尝试测量地图上的距离一样。
  • 检查几何列本身,了解空间特征的表示方式。这可以是POINTLINESTRINGPOLYGON或多部分几何体,直接反映您正在建模的真实世界特征,例如交通交叉路口(点)、道路网络(线)或城市公园(面)。

基本数据可视化

通常,理解空间数据的最快方法是在地图上查看。GeoPandas 与 Matplotlib 无缝集成,使基本绘图变得非常简单。这种快速可视化功能对城市规划人员来说非常宝贵,无需打开单独的 GIS 应用程序即可快速进行质量检查和初步探索性数据分析。

# Plot the geographic shapes from the GeoDataFrame.
print("Plotting the world administrative boundaries:")
world_boundaries.plot()# Add a title to the plot.
plt.title("World Administrative Boundaries")# Show the plot.
plt.show()

没有任何

  • world_boundaries.plot():此单一命令生成 GeoDataFrame 中所有地理形状(几何图形)的图world_boundaries
  • plt.title("World Administrative Boundaries"):这为我们的地图设置了一个清晰的标题。
  • plt.show():此命令显示我们创建的图。

这段简单的代码可以生成 GeoDataFrame 中地理形状的基本图。它能很好地确认数据是否正确加载,并带来初步的视觉印象。例如,绘制城市边界或公共交通路线网络,可以立即获得坐标表无法传达的空间信息。

选择和聚焦数据

在城市规划中,您经常需要关注特定区域或要素集。GeoPandas 允许您使用熟悉的 Pandas 索引和筛选技术来选择数据子集。此功能对于目标分析至关重要,例如检查特定社区、基础设施走廊或人口群体。

# Select data for Canada from the GeoDataFrame.
canada = world_boundaries[world_boundaries['name'] == 'Canada']# Display the first 5 rows of the Canada data.
print("First 5 rows of the Canada GeoDataFrame:")
display(canada.head())# Plot the boundaries of Canada.
print("\nPlotting Canada:")
canada.plot()# Add a title to the Canada plot.
plt.title("Canada Administrative Boundaries")# Show the plot.
plt.show()

没有任何

没有任何

  • canada = world_boundaries[world_boundaries['name'] == 'Canada']:这是一个标准的 Pandas 风格过滤操作。它会从world_boundariesGeoDataFrame 中选择所有“name”列的值恰好为“Canada”的行。结果存储在一个名为 的新 GeoDataFrame 中canada,该 GeoDataFrame 现在仅包含“Canada”的几何图形和属性。
  • display(canada.head()):我们显示 GeoDataFrame 的前几行canada来验证我们的选择是否正确,并且我们只有加拿大的数据。
  • canada.plot():这绘制了 GeoDataFrame 中包含的地理形状canada(加拿大边界)。
  • plt.title("Canada Administrative Boundaries"):设置加拿大地图的标题。
  • plt.show():显示绘图。

此代码演示了如何筛选world_boundariesGeoDataFrame,以便根据“name”列仅选择“加拿大”的数据。然后,您可以绘制此子集以仅可视化所选要素。此技术对于根据特定关注区域定制分析至关重要。例如,您可以筛选全市地块数据集,使其仅显示商业用地地块,或者仅选择特定区域内的洪水区域来评估风险。

使用底图添加地理背景

虽然绘制边界很有用,但添加底图可以提供至关重要的现实世界背景。contextily这是一个非常棒的库,它与 GeoPandas 集成,可以从各种来源(例如 OpenStreetMap 或卫星图像)添加背景地图。这将简单的形状图转换为利益相关者可以立即理解的有意义的地图。

# Import contextily for adding basemaps.
import contextily as cx# Plot Canada's boundaries, making them semi-transparent and setting figure size/edge color.
ax = canada.plot(figsize=(10, 10), alpha=0.5, edgecolor='k')# Add a basemap to the plot using Canada's CRS.
cx.add_basemap(ax, crs=canada.crs.to_epsg())# Set the plot title.
ax.set_title("Canada with Basemap")# Show the plot.
plt.show()

没有任何

  • import contextily as cx:导入contextily库并赋予其别名cx
  • ax = canada.plot(figsize=(10, 10), alpha=0.5, edgecolor='k'):此行canada再次绘制 GeoDataFrame。
  • figsize=(10, 10):使图稍微大一些,以便于更好的可见性。
  • alpha=0.5:使绘制的国家边界半透明(50%不透明),以便我们可以看到下面的底图。
  • edgecolor='k':将边界线的颜色设置为黑色('k')。
  • ax = ...:我们将绘图输出分配给名为 的变量ax。此变量是一个 Matplotlib Axes 对象,它代表绘制绘图的区域。contextily需要此ax对象将底图添加到正确的绘图中。
  • cx.add_basemap(ax, crs=canada.crs.to_epsg()):这是来自的关键功能contextily
  • ax:我们传递 Axes 对象(ax),以便contextily它知道在哪里添加底图。
  • crs=canada.crs.to_epsg()contextily与投影坐标参考系 (CRS) 配合使用效果最佳。我们获取 GeoDataFrame 的 CRS canadacanada.crs),并将其转换为 EPSG 代码 ( .to_epsg()) 并提供给contextily。这确保了底图与我们的空间数据正确对齐。
  • ax.set_title("Canada with Basemap"):为带有底图的绘图设置描述性标题。
  • plt.show():显示带有底图的最终图。

此代码使用一些样式(透明度和边缘颜色)绘制选定的国家/地区边界,然后将cx.add_basemap()其叠加到底图上。请注意,提供 CRS 非常重要,以contextily确保底图与数据正确对齐。添加底图可以使您的空间可视化更具信息量且更易于解读,从而帮助您清晰地传达复杂的空间信息。对于城市规划人员来说,在卫星图像上展示拟议的开发项目或在街道地图上展示现有的基础设施,可以使演示文稿更具影响力。

计算几何属性(面积)

计算面积等属性是城市规划中的常见任务,对于了解土地消耗、人口密度或公园规模至关重要。GeoPandas 提供了.area此类属性。然而,要获得准确的结果,需要仔细关注数据的坐标参考系 (CRS)。直接在地理坐标参考系 (CRS) 中计算面积(例如常见的 EPSG:4326,使用经纬度)会以平方度为单位,这并非现实世界面积的有效测量单位。

# Calculate the area of Canada in square degrees (CRS: EPSG:4326).
# This is not a standard area unit for geographic CRS.
canada_area_degrees = canada.geometry.area# Print the area in square degrees.
print("\nArea of Canada (in square degrees, using EPSG:4326):")
print(canada_area_degrees)# Reproject Canada's data to EPSG:3395 (meters) for accurate area calculation.
canada_projected = canada.to_crs(epsg=3395)# Calculate the area again, now in square meters.
canada_area_meters = canada_projected.geometry.area# Print the area in square meters.
print("\nArea of Canada (in square meters, after reprojecting to EPSG:3395):")
print(canada_area_meters)
Area of Canada (in square degrees, using EPSG:4326):
34    1694.025087
dtype: float64Area of Canada (in square meters, after reprojecting to EPSG:3395):
34    5.112767e+13
dtype: float64
<ipython-input-7-3259849806>:4: UserWarning: Geometry is in a geographic CRS. Results from 'area' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.canada_area_degrees = canada.geometry.area
  • canada_area_degrees = canada.geometry.area:此行计算 GeoDataFrame 中几何体(代表加拿大的多边形)的面积canada。由于canadaGeoDataFrame 当前使用的是地理坐标系 (EPSG:4326),因此 的结果.area平方度为单位。您可能会在此处看到 UserWarning,这是 GeoPandas 提醒您,这种以平方度为单位的计算可能并非您在实际测量面积时所需的单位。
  • print(...):这些行以平方度为单位打印计算出的面积。
  • canada_projected = canada.to_crs(epsg=3395):这是精确计算面积的关键步骤。.to_crs()用于将 GeoDataFrame 从当前 CRS重新投影到新的 CRS。我们将重新投影到 EPSG:3395(世界墨卡托坐标系),这是一个以米为单位的投影 CRS。重新投影会转换坐标,以便在新的坐标系中准确地表示形状。
  • canada_area_meters = canada_projected.geometry.area:现在canada_projectedGeoDataFrame 位于投影的 CRS(EPSG:3395)中,计算.area将以该 CRS 的单位产生结果 - 在本例中为平方米
  • print(...):这些行以平方米为单位打印计算出的面积。

正如此代码的输出所示,要获得以平方米或平方公里等单位计算的精确面积,您必须先将数据重新投影到合适的投影 CRS,然后再计算面积。代码演示了如何使用.to_crs()将数据重新投影到投影 CRS (EPSG:3395),然后以平方米为单位计算面积。这凸显了空间分析中的一个关键概念:CRS 对计算至关重要!理解并正确应用 CRS 转换对于从空间数据中获取有意义的定量洞察至关重要,无论您是在计算拟建绿地的面积,还是计算新开发项目占用的总土地面积。

结论

这篇 GeoPandas 入门教程将帮助您掌握使用 Python 进行城市规划应用空间数据处理的基本技能。我介绍了一些基本步骤:

  • 设置您的环境,这是任何项目的关键第一步。
  • 将空间数据加载到 GeoDataFrame 中,将您的地理信息带入强大的分析结构。
  • 检查数据的结构和 CRS,对于了解数据集的属性和确保准确的分析至关重要。
  • 创建基本的可视化效果,将原始数据转换为易于理解的地图。
  • 选择特定的特征进行重点分析,使您能够集中精力于感兴趣的领域。
  • 使用底图添加有价值的地理背景,使您的地图信息丰富且易于解释。
  • 计算几何属性,同时了解 CRS 和重投影的重要作用,确保您的定量分析精确。
http://www.dtcms.com/a/287661.html

相关文章:

  • gitee 分支切换
  • 【kafka4源码学习系列】kafka4总体架构介绍
  • Gerrit workflow
  • 3-大语言模型—理论基础:生成式预训练语言模型GPT(代码“活起来”)
  • 2、Redis持久化详解
  • 【iOS】编译和链接、动静态库及dyld的简单学习
  • 历史数据分析——国药现代
  • ABP VNext + Kubernetes Istio:微服务网格实战指南
  • 基于Socket来构建无界数据流并通过Flink框架进行处理
  • 读书笔记:最好使用C++转型操作符
  • 【C++】初识C++(2)
  • c#泛型集合(ArrayList和List、Dictionary的对比)
  • 记录我coding印象比较深刻的BUG
  • 支付宝支付
  • fastjson2 下划线字段转驼峰对象
  • 链路聚合技术(思科链路聚合实验)
  • 【Linux驱动-快速回顾】简单了解一下PinCtrl子系统:设备树如何被接解析与匹配
  • 【取消分仓-分布式锁】
  • PCIe RAS学习专题(3):AER内核处理流程梳理
  • windows docker-03-如何一步步学习 docker
  • VSCode用Python操作MySQL:环境配置与代码验证
  • CentOS 清理技巧
  • 音视频学习(四十):H264码流结构
  • Tailwind CSS中设定宽度和高度的方法
  • ubuntu下好用的录屏工具
  • TCP 和 UDP 在创建套接字(Socket)时的区别
  • Claude Code 最新详细安装教程
  • 在 Solidity 中,abi是啥
  • day11 ADC
  • [spring6: AspectMetadata AspectInstanceFactory]-源码解析