基于Python的geopandas库处理矢量几何的教程

news2024/11/27 14:50:22

前言

在许多工作中中,我使用 ArcGIS 平台从事过许多与地理空间相关的项目,我非常喜欢这个平台。 这意味着我可以在具有尖端地理空间技术的项目中进行咨询,例如多维栅格、深度学习和空间物联网自动化。 考虑到这一点,我总是试图跟踪如何在没有 Esri 精心制作的系统的情况下执行我正在处理的相同操作。

此处的计划是执行完整的地理处理和遥感例程,而无需求助于任何 GIS 桌面软件。 我们从一个图层开始,该图层包含一些我们感兴趣的地块,以及一个包含适用特殊法规的保护区的图层。

一、教程内容

  • 检查 parcels geojson 图层是否存在无效的几何图形并进行更正;

  • 计算每个地块的面积(以公顷为单位);

  • 验证每个地块是否与任何保护区相交;

  • 计算每个地块的交叉面积,并将保护区的名称插入地块的属性;

二、geopandas的简单使用

我们必须导入其中存储了地块的 geojson 文件。 为此,我们将使用 geopandas 库。 如果您不熟悉它,我的建议是熟悉它。 Geopandas 基本上模拟了我们在 python 中使用的经典 GIS 桌面软件(GRASS、GDAL、ArcGIS、QGIS……)中的功能,其方式与 pandas(数据科学家中非常流行的工具)一致,以允许对几何类型进行空间操作。

import pandas as pd
import geopandas as gpd

polygonspath = "./test.GeoJSON"

polygons = gpd.read_file(polygonspath)

polygons.geometry.is_valid

为了导入我们的geojson,我们首先要注意的是geopandas中的数据类型。 基本上,当我们运行 .read_file 方法时,我们将地理数据框类型分配给多边形变量。 在每个 geodataframe 中总会有一个 geoseries ,我们可以通过 .geometry 方法访问它。 一旦我们找到 geoseries ,我们就可以使用 .isvalid 方法,它为我们系列中的每条记录生成一个 True/False 值列表。

当然,我们的数据集中存在无效的几何图形。 那么,我们该如何解决呢? 也许习惯于运行 ArcGIS 或 QGIS 中提供的出色的无效几何检查工具,这些工具甚至会生成一份报告,说明表格中每条记录的问题所在。 但是我们无法访问 geopandas 中的那些。 相反,我们将通过对所有几何图形应用 0 米缓冲区来做一些小技巧来更正几何图形。

clean = polygons.geometry.buffer(0)

clean.plot()

现在我们终于可以通过使用 .plot 方法来查看我们的多边形了,它实际上是从 geopandas 中的 matplotlib 组件继承而来的。

这是一种快速且有用的方法,可以快速了解我们的数据在空间上的样子,但它与地图不同。

三、面积计算

由于我们想知道每个地块的面积(以公顷为单位),因此我们需要确保我们的地理数据框位于投影坐标系中。 如果您不熟悉坐标参考系统 (CRS),您至少需要知道地理坐标系统以度数(如纬度和经度)计算,而投影坐标系统以距离计算,使我们能够使用 公制。 从我们刚刚创建的绘图图中,我们可以看到多边形可能是根据纬度和经度绘制的,大约在 -15.7°、-47.7° 左右。 如果我们运行 print(polygons.crs),我们将得到 epsg:4326 作为响应。 有许多可用的坐标系,因此 EPSG 系统是跟踪它们的一种很好的方法; 4326 意味着我们的地理数据框在 WGS84 坐标系中(确实是一个地理坐标系)。

所以我们确实需要转换地理数据框的坐标系。 为此,我们必须首先决定将其转换成哪个系统。 在这一点上,我非常习惯从一个系统转换到另一个系统,但如果你有点迷茫,选择投影坐标系的一个好方法就是使用 WGS84 系统的墨卡托投影的通用横轴。 因此,您所要做的就是找出您的数据位于哪个 UTM 区域,这样您就知道这是您的数据区域失真最小的区域。 这个小 Web 应用程序是一个很好的方法。(https://mangomap.com/robertyoung/maps/69585/what-utm-zone-am-i-in-#)

我们知道我们的数据位于 [-15.7°, -47.7°] 坐标附近,所以现在我们知道它相当于 23S UTM 区。

所以剩下的就是访问 EPSG 权威网站并检查我们选择的投影的 EPSG 代码。 接下来,我们需要使用 .to_crs 方法定义一个新的地理数据框变量。

我们现在终于可以在那个新地理数据框中创建一个新列,我将其命名为 area_ha 并计算面积(以米为单位,因为我们使用的是 UTM 投影),我们必须除以 10,000 才能得到以公顷为单位的面积。

print(polygons.crs)

projetado = polygons.to_crs({'init':'epsg:31983'})

projetado["area_ha"] = projetado['geometry'].area/10**4

projetado.head(2)

这是我们新地理数据框。 现在填充 area_ha 字段的值在正确的范围内。

四、检查多边形相交

我们现在可以导入提供给我们的第二层,该层包含所有保护区(UC,或 Unidades de Conservação),这些保护区可能代表我们正在分析的地块中对农业用途的法律限制。 我们将像之前的 geojson 一样导入它。 这次的主要区别在于,这条数据实际上有更多的字段,有保护区的名称以及创建日期和更多合法的东西。用 geopanda 的 .head 方法绘制如下图所示。

我们有兴趣将所有这些丰富的信息放入与给定保护区相交的地块的属性表中。 Geopandas 使用overlay方法实际上使这很容易做到。 它完全符合我们的要求。 在我们的例子中,它将创建一个新的地理数据框,每个地块的每个相交部分都有一个记录,以及它相交的保护区的信息。 有了它,我们可以像以前一样计算交叉面积的新字段(以公顷为单位)。

ucspath = "./layer_UCs.GeoJSON"

ucsraw = gpd.read_file(ucspath)

ucs = ucsraw.to_crs({'init':'epsg:31983'})
ucs

merged = gpd.overlay(projetado, ucs, how='intersection')

merged["area_intersect"] = merged['geometry'].area/10**4
merged
merged.plot()

它看起来像以前的地块,但现在我们的地块如果与任何保护区相交,就会被分成更小的部分。 此外,它们现在包含更多有用的信息。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/153440.html

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

相关文章

openstack增加一个计算节点

1.前言 由于资源有限,所以直接在存储节点(block)部署 由于存储节点最初只设计了一块网卡,所以需要增加一块网卡,名称为eth1,IP:192.168.200.30编辑ifcfg-eth1,然后重启网络systemct…

【优化】windows双网叠加 多网叠加 网速叠加 教程

【优化】windows双网叠加 多网叠加 网速叠加 教程 1 连接两个以上的网络, 网络不能是同一个 例如 网线-A wifi-B 2 控制面板\所有控制面板项\网络连接 最后 确定保存 同理 修改wifi-B的接口活跃点数为 25 并保存 如果没有生效 可以将两个网络连接禁用 再启用 通过命…

4656. 技能升级

4656. 技能升级 https://www.acwing.com/problem/content/4659/ 第十三届蓝桥杯省赛CC组 算法标签:贪心;多路归并;二分 思路 如果暴力来做的话,会将所有数放到一个集合里面排序,取前 mmm 项之和即可,但时…

Vue3——第六章(侦听器:watch、watchEffect)

一、watch 基本使用 在组合式 API 中,我们可以使用 watch 函数在每次响应式状态发生变化时触发回调函数: 二、侦听数据源类型 watch 的第一个参数可以是不同形式的“数据源”:它可以是一个 ref (包括计算属性)、一个响应式对象、一个 get…

5.2、运输层端口号、复用与分用的概念

1、端口号 运行在计算机上的进程使用进程标识符PID\color{red}进程标识符 PID进程标识符PID来标志。 因特网上的计算机并不是使用统一的操作系统 不同的操作系统(windows,Linux,Mac OS)又使用不同格式的进程标识符\color{red}不同格式的进程标识符不同…

ThreadLocal 实战应用

1 什么是 ThreadLocal?ThreadLocal 是一个关于创建线程局部变量的类。通常情况下,我们创建的变量是可以被任何一个线程访问并修改的。而使用 ThreadLocal 创建的变量只能被当前线程访问,其他线程则无法访问和修改。ThreadLocal 在设计之初就是…

CDN简单介绍

CDN 介绍 CDN (全称 Content Delivery Network),即内容分发网络,服务器的静态资源存在CDN服务器上,用户在最近的CDN服务器上获取资源。 从功能上看,典型的 CDN 系统由分发服务系统、负载均衡系统和运营管理系统组成。分发服务系…

我利用 ChatGPT 提高工作效率的 5 种方式

技术应该是我们的朋友,而不是我们的敌人ChatGPT 在 11 月的发布改变了世界。学校阻止该计划,程序员对他们工作中新发现的效率赞不绝口,而创意人员则怀疑他们的工作是否受到威胁。每个人都在想同一个问题:ChatGPT 的未来会是什么样…

IPS+ESPC联动实现安全中心接管

目录 一、IPS介绍 原理 功能 缺陷 二、ESPC介绍 原理 功能 三、NIPSESPC联动 实验目的 实验过程 一、IPS介绍 原理 如今内部威胁增多,外部攻击剧增,防火墙存在着一定的局限性,如:部署在边界处,更多的是对一些…

环境搭建(python+pycharm(anconda可选)

python下载 python下载,由于网站服务器在国外,所以打开可能有点慢,也可以使用国内的镜像网站(因为我没有试过,有兴趣的可以去尝试下,此文章的后面部分会有临时换源的操作) 电脑位数的查看 …

1277:【例9.21】方格取数——数字三角形模型

【题目描述】 设有NN的方格图,我们在其中的某些方格中填入正整数,而其它的方格中则放入数字0。如下图所示: 某人从图中的左上角A出发,可以向下行走,也可以向右行走,直到到达右下角的B点。在走过的路上&…

如何实现同一IP的不同端口访问不同的网站

一,要求 1, 基于同一IP的不同端口访问不同的网站(可以通过域名去访问) ipport1 -> 对应一个域名 ipport2 -> 对应一个域名 使用域名1我应该访问到 ipport1对应的内容 使用域名2我应该访问到 ipport2对应的内容 2. …

阳了怎么居家办公?这4款远程办公软件你得知道!

疫情高峰期尚未过去,可是临近年底,各公司各部门都到了算绩效、追回款、清退结算的时候,大家都忙得根本脱不开身!居家远程办公也不得不架起电脑回消息! 本文给大家推荐4款超好用的远程办公软件,高效省事&am…

【机器学习 - 1】:knn算法

文章目录机器学习的概念和基础knn算法的实现过程封装knn算法总结机器学习的概念和基础 机器学习可以两类任务: 分类任务和回归任务 以机器学习本身来进行分类可分为: 监督学习 非监督学习 半监督学习 增强学习 监督学习:给机器的训练数据 有标…

android架构拆分方案-结构相关方案与技术

很纯、很生硬的架构技术归纳blog上上文https://blog.csdn.net/dongyi1988/article/details/128617738接上文https://blog.csdn.net/dongyi1988/article/details/128629011android架构官网地址https://source.android.google.cn/docs/core/architecture?hlzh-cnGKI(…

VBO、VAO、EBO学习记录

在这里要先了解一下OpenGL的一个幕后大致运作流程,可以直接阅读OPENGL CN 我自己大概总结了一下就是,OpenGL本身就是一个巨大的状态机,我们通过更改状态变量(上下文)来告诉OpenGL如何去绘制图像。一般通过设置选项,修改缓冲来更改…

【网络与系统安全】国科大《网络与系统安全》复习大纲整理 + 考试记忆版

国科大《网络与系统安全》复习整理笔记 重在理解概念考试不算太难 文章目录一、新形势安全面临挑战和安全保障能力提升二、网络与系统安全的需求与目标三、自主与强制访问控制1.访问控制的基本概念2.访问控制的要素3.访问控制3种基本类型4.访问控制矩阵、访问控制列表、访问控制…

【Linux修炼】13.缓冲区

每一个不曾起舞的日子,都是对生命的辜负。 缓冲区的理解一. C接口打印两次的现象二. 理解缓冲区问题为什么要有缓冲区缓冲区刷新策略的问题所说的缓冲区在哪里?指的是什么缓冲区?三. 解释打印两次的现象四. 模拟实现五. 缓冲区与OS的关系一. …

ThinkPHP 表单验证使用

对前端或表单请求的数据,一定要做校验,而使用ThinkPHP 验证器则可以事半功倍。 可以使用validate助手函数(或者封装验证方法)进行验证。TP版本6.1。 目录 验证场景 验证器 创建验证器 定义规则和提示 数据验证 独立验证&…

Arbotix使用

内容学自赵虚左的视频及资料 需求描述: 控制机器人模型在 rviz 中做圆周运动 1.安装 Arbotix 方式1:命令行调用 sudo apt-get install ros-<<VersionName()>>-arbotix <<VsersionName()>> 替换成当前 ROS 版本名称 添加 arbotix 所需配置文件 # …