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.pswp.cn/news/915251.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/915251.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

力扣面试150题--环形子数组的最大和

Day 80 题目描述思路 初次做法&#xff1a;在昨天代码的基础上修改 计算普通子数组的最大和 使用动态规划计算以每个位置为起点的最大子数组和&#xff08;存储在 val 中&#xff09;&#xff0c;并更新全局最大值 rightmax。计算后缀和与前缀和 sum[i]&#xff1a;从位置 i 到…

python类Keys

类Keys的定义:Elass Keys (object): 程轩开Set of special keys codes.#n# 第 15 章 网络爬虫 合情些准出照地限公轵 esms0 pro 瘀 Δ器代刍奄炖慧 图 15-39 工件肉业鱼光得 国有上子 理人场营&#xff0c;有司;可有B 相关围书 图 15-40 页源代码 ython". 名可能不鞋 NUL…

svn如何设置忽略文件夹或者文件的提交

使用svn&#xff0c;每次提交代码时&#xff0c;都会把java的编译文件target&#xff0c;或者前端的node_modules&#xff0c;dist等不需要提交的目录或这文件&#xff0c;列出来实现。通过配置svn&#xff0c;可以在提交代码时&#xff0c;自动忽略这些不需要提交到仓库的文件…

MonoGame 游戏开发框架日记 -06

第六章&#xff1a;动画类以及动画精灵 好久不见家人们好久没更新MonoGame系列了&#xff0c;不是主包弃坑了&#xff0c;主要是主包最近忙着搞项目学科一找暑假工打&#xff0c;这不一闲下来就立刻马不停蹄的来给大家更新了&#xff0c;今天的教程代码部分比较多接下来我们正式…

LVS四种工作模式深度解析

LVS&#xff08;linux virual server&#xff09;LVS四种工作模式深度解析 LVS-NAT模式 四台虚拟机 火墙关闭 关闭火墙 systemctl stop firewalldsystemctl disable firewalld关闭开机自启火墙1.clienteth0 IP&#xff1a;172.25.254.1002.lvs eth0ip :172.25.254.200; eth1ip:…

[设计模式]C++单例模式的几种写法以及通用模板

之前在这篇文章中简单的介绍了一下单例模式的作用和应用C中单例模式详解_c单例模式的作用-CSDN博客&#xff0c;今天我将在在本文梳理单例模式从C98到C11及以后的演变过程&#xff0c;探讨其不同实现方式的优劣&#xff0c;并介绍在现代C中的最佳实践。 什么是单例模式&#x…

小架构step系列19:请求和响应

1 概述作为Web程序&#xff0c;通用形式是发起HTTP请求并获取返回的结果&#xff0c;在这个过程中&#xff0c;需要把请求映射到代码的接口上&#xff0c;提供这种接口的类一般称为Controller&#xff0c;也就是需要把请求映射到Controller的接口方法上&#xff0c;把请求的参数…

论文分享 | LABRADOR:响应引导的针对物联网设备的黑盒模糊测试

由于固件仿真以及重托管的技术挑战&#xff0c;部分企业级 IoT 设备只能在黑盒环境下进行模糊测试。分享一篇发表于 2024 年 S&P 会议的论文 Labrador&#xff0c;它利用响应来引导请求变异&#xff0c;实现了针对 IoT 设备的高效黑盒模糊测试。 猴先生说&#xff1a;这篇论…

WPF为启动界面(Splash Screen)添加背景音乐

1. 添加音频文件到项目 将音频文件&#xff08;如.mp3/.wav&#xff09;放入项目文件夹&#xff08;如Resources&#xff09;在解决方案资源管理器中右键文件 → 属性&#xff1a; 生成操作&#xff1a;选择Resource&#xff08;嵌入资源&#xff09;或Content&#xff08;内容…

【Jmeter】报错:An error occured:Unknown arg

问题 调试Jmeter时&#xff0c;报错&#xff1a;‘An error occurred: Unknown arg: l’&#xff0c;脚本如下&#xff1a; $JMETER_PATH -n -t "$target_jmx" -l "$SCENARIO_REPORT_DIR/result_${threads}.jtl" -e -o "$SCENARIO_REPORT_DIR/htm…

vue3使用KeepAlive组件及一些注意事项

目录 一、KeepAlive的作用 二、缓存组件配置 2.1、过滤缓存组件 2.2、最大缓存实例数 三、KeepAlive组件的生命周期 四、错误用法 4.1、缓存v-if包裹的动态组件 4.2、拼写错误 一、KeepAlive组件的作用 首先&#xff0c;keep-alive是一个vue的内置组件&#xff0c;官网…

辛普森悖论

辛普森悖论第一步&#xff1a;概念拆解想象你在比较两个班级的考试成绩&#xff1a;​第一天​&#xff1a;实验组&#xff08;1个学生考了90分&#xff09;&#xff0c;对照组&#xff08;99个学生平均考了80分&#xff09;​第二天​&#xff1a;实验组&#xff08;50个学生平…

有效的括号数据结构oj题(力口20)

目录 目录 题目描述 题目分析解析 解决代码 写题感悟&#xff1a; 题目描述 还有实例 题目分析解析 对于这个题目&#xff0c;我们首先有效字符串需要满足什么&#xff0c;第一个左右括号使用相同类型的括号&#xff0c;这好理解&#xff0c;无非就是小括号和小括号大括号…

Mock 单元测试

作者&#xff1a;小凯 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01; 本文的宗旨在于通过简单干净实践的方式教会读者&#xff0c;如何使用 Mock (opens new window)进行工程的单元测试&#xff0c;以便于验证系统中的独立模块功能的健壮性。 从整个工程所…

MySQL 深度性能优化配置实战指南

🔧 一、硬件与系统层优化:夯实性能基石 ​​硬件选型策略​​ ​​CPU​​:读密集型场景选择多核CPU(如32核);写密集型场景选择高主频CPU(如3.5GHz+)。 ​​内存​​:建议≥64GB,​​缓冲池命中率≥99%​​ 是性能关键指标。 ​​存储​​:​​必用NVMe SSD​​,I…

Visual Studio Code(VSCode)中设置中文界面

在VS Code中设置中文界面主要有两种方法&#xff1a;通过扩展市场安装中文语言包或通过命令面板直接切换语言。‌方法一&#xff1a;通过扩展市场安装中文语言包‌打开VS Code&#xff0c;点击左侧活动栏的"扩展"图标&#xff08;或按CtrlShiftX&#xff09;。在搜索…

叉车机器人如何实现托盘精准定位?这项核心技术的原理和应用是什么?

随着智慧物流和智能制造的加速发展&#xff0c;智能化转型成为提升效率、降低成本的关键路径&#xff0c;叉车机器人&#xff08;AGV/AMR叉车&#xff09;在仓储、制造、零售等行业中的应用日益广泛。 其中&#xff0c;托盘定位技术是实现其高效、稳定作业的核心环节之一&…

NO.6数据结构树|二叉树|满二叉树|完全二叉树|顺序存储|链式存储|先序|中序|后序|层序遍历

树与二叉树的基本知识 树的术语结点&#xff1a; 树中的每个元素都称为结点&#xff0c; 例如上图中的 A,B,C…根结点&#xff1a; 位于树顶部的结点&#xff0c; 它没有父结点,比如 A 结点。父结点&#xff1a; 若一个结点有子结点&#xff0c; 那么这个结点就称为其子结点的父…

数据集下载网站

名称简介链接Kaggle世界上最大的数据科学竞赛平台之一&#xff0c;有大量结构化、图像、文本等数据集可直接下载✅支持一键下载、APIPapers with Code可按任务&#xff08;如图像分类、文本生成等&#xff09;查找模型与数据集&#xff0c;标注 SOTA✅与论文强关联Hugging Face…

Tomcat 生产 40 条军规:容量规划、调优、故障演练与安全加固

&#xff08;一&#xff09;容量规划 6 条 军规 1&#xff1a;线程池公式 maxThreads ((并发峰值 平均 RT) / 1000) 冗余 20 %&#xff1b; 踩坑&#xff1a;压测 2000 QPS、RT 200 ms&#xff0c;理论 maxThreads500&#xff0c;线上却设 150 导致排队。军规 2&#xff1a;…