Spatial Data Analysis(三):点模式分析

news2024/11/25 20:25:47

Spatial Data Analysis(三):点模式分析

---- 1853年伦敦霍乱爆发

在此示例中,我将演示如何使用 John Snow 博士的经典霍乱地图在 Python 中执行 KDE 分析和距离函数。

感谢 Robin Wilson 将所有数据数字化并将其转换为友好的 GIS 格式。 原始数据从这里获得:
http://blog.rtwilson.com/john-snows-known-cholera-analysis-data-in-modern-gis-formats/

具体来说,我们需要这些包来进行分析:

  • rasterio:这是一个用于在 python 中处理栅格数据的包。 我们不使用栅格,但在这里使用它的原因是显示 GeoTiff 图像作为底图,该图像经过校正以与 GIS shapefile 对齐。
  • seaborn:这实际上是一个可视化包; 但是,它们确实具有可用于二维空间数据的 KDE 功能。
  • pointpats:这是一个用于进行 PPA 和最近邻分析的软件包。 我们需要用它来计算例如 G距离函数。

步骤1

导入所有需要的包

import geopandas as gpd
import rasterio
from rasterio.plot import show
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from pointpats import distance_statistics as stats
from pointpats import PointPattern, PoissonPointProcess

第2步

读入两个 shapefile:

  • SnowGIS/Cholera_Deaths.shp 是一个包含所有死亡和位置的点形状文件
  • SnowGIS/Pumps.shp 是包含所有泵的点形状文件

由于它们都是 shapefile,一旦我们使用“gpd.read_file()”将它们读入 python,我们就得到了 GeoDataFrame。

cases = gpd.read_file("https://raw.githubusercontent.com/Ziqi-Li/GEO4162C/main/data/SnowGIS/Cholera_Deaths.shp")

pump = gpd.read_file("https://raw.githubusercontent.com/Ziqi-Li/GEO4162C/main/data/SnowGIS/Pumps.shp")

在我们进行下一步操作之前,最好先检查数据。 例如,您需要执行以下操作:

  • 1.查看数据表,了解GeoDataFrame中的属性
  • 2.检查几何图形,看看是否可以绘制它们
  • 3.检查您读入的shapefile是否具有相同的crs
cases.head() #This returns you the first 5 rows in the GeoDataFrame
IdCountgeometry
003POINT (529308.741 181031.352)
102POINT (529312.164 181025.172)
201POINT (529314.382 181020.294)
301POINT (529317.380 181014.259)
404POINT (529320.675 181007.872)
<script>
  const buttonEl =
    document.querySelector('#df-149da3d4-d8f5-4e15-82d9-0a5e55507ee2 button.colab-df-convert');
  buttonEl.style.display =
    google.colab.kernel.accessAllowed ? 'block' : 'none';

  async function convertToInteractive(key) {
    const element = document.querySelector('#df-149da3d4-d8f5-4e15-82d9-0a5e55507ee2');
    const dataTable =
      await google.colab.kernel.invokeFunction('convertToInteractive',
                                                [key], {});
    if (!dataTable) return;

    const docLinkHtml = 'Like what you see? Visit the ' +
      '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
      + ' to learn more about interactive tables.';
    element.innerHTML = '';
    dataTable['output_type'] = 'display_data';
    await google.colab.output.renderOutput(dataTable, element);
    const docLink = document.createElement('div');
    docLink.innerHTML = docLinkHtml;
    element.appendChild(docLink);
  }
</script>

<svg xmlns=“http://www.w3.org/2000/svg” height="24px"viewBox=“0 0 24 24”
width=“24px”>




cases.crs #This returns you the crs
<Projected CRS: EPSG:27700>
Name: OSGB36 / British National Grid
Axis Info [cartesian]:
- E[east]: Easting (metre)
- N[north]: Northing (metre)
Area of Use:
- name: United Kingdom (UK) - offshore to boundary of UKCS within 49°45'N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore.
- bounds: (-9.01, 49.75, 2.01, 61.01)
Coordinate Operation:
- name: British National Grid
- method: Transverse Mercator
Datum: Ordnance Survey of Great Britain 1936
- Ellipsoid: Airy 1830
- Prime Meridian: Greenwich
cases.plot() #This returns you a map of all the cases
<Axes: >

在这里插入图片描述

pump.crs
<Projected CRS: EPSG:27700>
Name: OSGB36 / British National Grid
Axis Info [cartesian]:
- E[east]: Easting (metre)
- N[north]: Northing (metre)
Area of Use:
- name: United Kingdom (UK) - offshore to boundary of UKCS within 49°45'N to 61°N and 9°W to 2°E; onshore Great Britain (England, Wales and Scotland). Isle of Man onshore.
- bounds: (-9.01, 49.75, 2.01, 61.01)
Coordinate Operation:
- name: British National Grid
- method: Transverse Mercator
Datum: Ordnance Survey of Great Britain 1936
- Ellipsoid: Airy 1830
- Prime Meridian: Greenwich
pump.plot()
<Axes: >

在这里插入图片描述

步骤 3

制作一个简单的地图,覆盖带有泵的案例

ax = cases.plot() #First we need to create an axis

pump.plot(ax=ax,color="orange") #Then plot the pumps using thes previously created axis as a parameter in the `plot()`
<Axes: >

在这里插入图片描述

ax = cases.plot(markersize = 20)
#Check out here for differernt shapes of the markers:
#https://matplotlib.org/api/markers_api.html

pump.plot(ax=ax,markersize=500,marker="*",color="red")
<Axes: >

在这里插入图片描述

步骤4

使用 rasterio 读取 TIF 底图“SnowGIS/SnowMap.tif”

basemap = rasterio.open('https://raw.githubusercontent.com/Ziqi-Li/GEO4162C/main/data/SnowGIS/SnowMap.tiff')

show(basemap)

在这里插入图片描述

<Axes: >

步骤 5

将地图叠加在一起

#First we create a figure with a size of (10,10)
f, ax = plt.subplots(figsize=(10,10))

#Plot each layer, with the same axis `ax`
show(basemap,ax=ax)

cases.plot(ax=ax, markersize = 30, alpha=0.8)
pump.plot(ax=ax,markersize=1000, marker="*",color="red")

<Axes: >

在这里插入图片描述

步骤 6

执行核密度估计(KDE)

函数 sns.kdeplot() 有几个参数:

    1. GeoDataFrame cases
    1. x 和 y 坐标,我们可以从 GeoDataFrame 中提取为 cases.geometry.xcases.geometry.y
    1. bw_method 是 KDE 的带宽。
  • 4.fill参数表示你想要计数图还是填充色图
  • 5.cmap参数表示您要使用的颜色
    1. alpha参数表示透明度的级别。

基本上 4、5、6 是您可以更改的样式参数。

执行 KDE 的代码是:

sns.kdeplot(data=cases,
            x=cases.geometry.x,
            y=cases.geometry.y,
            bw_method=0.5,
            fill=True,
            cmap="coolwarm",
            alpha=0.8)
<Axes: >

在这里插入图片描述

让我们将 kde 覆盖在我们的地图上。 请注意,您需要指定要在与其余地图相同的轴上绘制的 kdeplot。 所以我们需要在sns.kdeplot(ax=ax,...)中添加ax=ax

f, ax = plt.subplots(figsize=(10,10))
show(basemap,ax=ax)
cases.plot(ax=ax, markersize = 50)
pump.plot(ax=ax,markersize=1000,marker="*",color="red")

#4th layer
sns.kdeplot(ax=ax, data=cases,
            x=cases.geometry.x,
            y=cases.geometry.y,
            bw_method=0.5,
            fill=True,
            cmap="coolwarm",
            alpha=0.6)
<Axes: >

在这里插入图片描述

我们可以看到热点中心与中央泵对齐得很好!

sns.kdeplot() 中的另一个重要参数是有一个 weights 参数,您可以使用它根据每个位置的案例数量来权衡您的位置。

  • 首先让我们回顾一下 GeoDataFrame 的情况,我们发现有一列名为“Count”。
  • 然后,让我们使用这个“Count”作为 KDE 中的权重。 为此,请将“weights=cases.Count”添加到现有的 kde 函数中
cases.head()
IdCountgeometry
003POINT (529308.741 181031.352)
102POINT (529312.164 181025.172)
201POINT (529314.382 181020.294)
301POINT (529317.380 181014.259)
404POINT (529320.675 181007.872)
<script>
  const buttonEl =
    document.querySelector('#df-fc93c370-9178-4d6b-a535-1aca6b1bd379 button.colab-df-convert');
  buttonEl.style.display =
    google.colab.kernel.accessAllowed ? 'block' : 'none';

  async function convertToInteractive(key) {
    const element = document.querySelector('#df-fc93c370-9178-4d6b-a535-1aca6b1bd379');
    const dataTable =
      await google.colab.kernel.invokeFunction('convertToInteractive',
                                                [key], {});
    if (!dataTable) return;

    const docLinkHtml = 'Like what you see? Visit the ' +
      '<a target="_blank" href=https://colab.research.google.com/notebooks/data_table.ipynb>data table notebook</a>'
      + ' to learn more about interactive tables.';
    element.innerHTML = '';
    dataTable['output_type'] = 'display_data';
    await google.colab.output.renderOutput(dataTable, element);
    const docLink = document.createElement('div');
    docLink.innerHTML = docLinkHtml;
    element.appendChild(docLink);
  }
</script>

<svg xmlns=“http://www.w3.org/2000/svg” height="24px"viewBox=“0 0 24 24”
width=“24px”>




f, ax = plt.subplots(figsize=(10,10))
show(basemap,ax=ax,adjust=None)
cases.plot(ax=ax, markersize = 50,column="Count")
pump.plot(ax=ax,markersize=1000,marker="*",color="red")

sns.kdeplot(ax=ax,data=cases, x=cases.geometry.x, y=cases.geometry.y, bw_method=0.5, fill=True,
            cmap="coolwarm",alpha=0.8,weights=cases.Count)

plt.tight_layout()

plt.savefig('choloera.png',dpi=600)

在这里插入图片描述

你能找到什么? 基本上 KDE 最热点正好指向中央泵! 如果 John Snow 博士能够进行 KDE,他的生活会变得更轻松吗?

添加底图

在这里,我添加了一小节关于使用“contextily”包将底图添加到绘图中的内容,这在大多数情况下非常有用,当我们没有另一个底图作为参考/提供必要的上下文时。

contextily 在 Google Colab 中不可用,所以我们需要在这里安装它。

pip install -q contextily
import contextily as cx
f, ax = plt.subplots(figsize=(10,10))

cases.plot(ax=ax, markersize = 50, figsize=(9,9))
pump.plot(ax=ax,markersize=1000,marker="*",color="red")
sns.kdeplot(ax=ax,data=cases, x=cases.geometry.x, y=cases.geometry.y, bw_method=0.5, fill=True,
            cmap="coolwarm",alpha=0.8,weights=cases.Count)

#This is the new line of code:
#We need to put a crs into the function.
#The source defines the style of the base map: https://contextily.readthedocs.io/en/latest/providers_deepdive.html
#There are many options available.
cx.add_basemap(ax, source=cx.providers.Stamen.TonerLite, crs=cases.crs) # we need to put a crs into the function.

在这里插入图片描述

步骤 7

最近邻分析

下一节我们将使用距离函数和显着性检验进行最近邻分析。 这可以在很棒的“pointpats”包中轻松完成。

首先,让我们从“cases”GeoDataFrame 中提取 x 和 y 坐标,并将它们作为二维数组。

x = cases.geometry.x.values
y = cases.geometry.y.values

points = np.array(list(zip(x,y)))

其次,让我们使用点创建一个“PointPattern()”类

pp = PointPattern(points)
/usr/local/lib/python3.10/dist-packages/libpysal/cg/shapes.py:1492: FutureWarning: Objects based on the `Geometry` class will deprecated and removed in a future version of libpysal.
  warnings.warn(dep_msg, FutureWarning)
/usr/local/lib/python3.10/dist-packages/libpysal/cg/shapes.py:1208: FutureWarning: Objects based on the `Geometry` class will deprecated and removed in a future version of libpysal.
  warnings.warn(dep_msg, FutureWarning)
pp
<pointpats.pointpattern.PointPattern at 0x7d59d1a5f010>

“knn”函数将返回每个点的最近邻居以及到该邻居的距离。

接下来,让我们生成 100 个 CSR(每个都是泊松过程)作为我们的空基准。 请记住,这将是我们进行显着性检验的置信区间。

CSRs = PoissonPointProcess(pp.window, pp.n, 100, asPP=True) # simulate CSR 100 times
/usr/local/lib/python3.10/dist-packages/libpysal/cg/shapes.py:1923: FutureWarning: Objects based on the `Geometry` class will deprecated and removed in a future version of libpysal.
  warnings.warn(dep_msg, FutureWarning)
/usr/local/lib/python3.10/dist-packages/libpysal/cg/shapes.py:103: FutureWarning: Objects based on the `Geometry` class will deprecated and removed in a future version of libpysal.
  warnings.warn(dep_msg, FutureWarning)

运行 G 距离 stats.Genv() 函数并将其可视化。

它显示 G 曲线高于置信包络线(红色曲线),表明我们在霍乱图中观察到聚集模式。

genv = stats.Genv(pp, realizations=CSRs)

genv.plot()

在这里插入图片描述

您还可以轻松执行 K 或 F 距离函数。 同样,K 曲线高于置信包络线(红色曲线),表明我们在霍乱地图中观察到聚集模式。

kenv = stats.Kenv(pp, realizations=CSRs) # call Fenv for F function
kenv.plot()

在这里插入图片描述

F 曲线低于置信包络线(红色曲线),表明我们在霍乱地图中观察到聚集模式。

import warnings
warnings.filterwarnings('ignore')
fenv = stats.Fenv(pp, realizations=CSRs) # call Fenv for F function
fenv.plot()

在这里插入图片描述

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

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

相关文章

(04730)电路分析基础之电阻、电容及电感元件

04730电子技术基础 语雀&#xff08;完全笔记&#xff09; 电阻元件、电感元件和电容元件的概念、伏安关系&#xff0c;以及功率分析是我们以后分析电 路的基础知识。 电阻元件 电阻及其与温度的关系 电阻 电阻元件是对电流呈现阻碍作用的耗能元件&#xff0c;例如灯泡、…

基于STM32驱动的压力传感器实时监测系统

本文介绍了如何使用STM32驱动压力传感器进行实时监测。首先&#xff0c;我们会介绍压力传感器的工作原理和常见类型。然后&#xff0c;我们将介绍如何选择合适的STM32单片机和压力传感器组合。接下来&#xff0c;我们会详细讲解如何使用STM32驱动压力传感器进行数据采集和实时监…

根文件系统软件运行测试

一. 简介 前面几篇文章学习了制作一个可以在开发板上运行的&#xff0c;简单的根文件系统。 本文在上一篇文章学习的基础上进行的&#xff0c;文章地址如下&#xff1a; 完善根文件系统-CSDN博客 本文对根文件系统软件运行进行测试。 我们使用 Linux 的目的就是运行我们自…

vue3 setup语法糖 多条件搜索(带时间范围)

目录 前言&#xff1a; setup介绍&#xff1a; setup用法&#xff1a; 介绍&#xff1a; 前言&#xff1a; 不管哪个后台管理中都会用到对条件搜索带有时间范围的也不少见接下来就跟着我步入vue的多条件搜索&#xff08;带时间范围&#xff09; 在 Vue 3 中&#xff0c;你…

[JavaScript前端开发及实例教程]计算器井字棋游戏的实现

计算器&#xff08;网页内实现效果&#xff09; HTML部分 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>My Calculator&l…

Unity3D对CSV文件操作(创建、读取、写入、修改)

系列文章目录 Unity工具 文章目录 系列文章目录前言一、Csv是什么&#xff1f;二、创建csv文件2-1、构建表数据2-2、创建表方法2-3、完整的脚本&#xff08;第一种方式&#xff09;2-4、运行结果2-5、完整的脚本&#xff08;第二种方式&#xff09;2-6、运行结果2-7、想用哪种…

基于STM32 HAL库的光电传感器驱动程序实例

本文将使用STM32 HAL库编写一个光电传感器的驱动程序示例。首先&#xff0c;我们会介绍光电传感器的工作原理和应用场景。然后&#xff0c;我们将讲解如何选择合适的STM32芯片和光电传感器组合。接下来&#xff0c;我们会详细介绍使用STM32 HAL库编写光电传感器驱动程序的基本步…

AVFormatContext封装层:理论与实战

文章目录 前言一、封装格式简介1、FFmpeg 中的封装格式2、查看 FFmpeg 支持的封装格式 二、API 介绍三、 实战 1&#xff1a;解封装1、原理讲解2、示例源码 13、运行结果 14、示例源码 25、运行结果 2 三、 实战 2&#xff1a;转封装1、原理讲解2、示例源码3、运行结果 前言 A…

Docker中部署ElasticSearch 和Kibana,用脚本实现对数据库资源的未授权访问

图未保存&#xff0c;不过文章当中的某一步骤可能会帮助到您&#xff0c;那么&#xff1a;感恩&#xff01; 1、docker中拉取镜像 #拉取镜像 docker pull elasticsearch:7.7.0#启动镜像 docker run --name elasticsearch -d -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -e…

删除误提交的 git commit

背景描述 某次的意外 commit 中误将密码写到代码中并且 push 到了 remote repo 里面, 本文将围绕这个场景讨论如何弥补. 模拟误提交操作 在 Gitee 创建一个新的 Repo, clone 到本地 git clone https://gitee.com/lpwm/myrepo.git创建两个文件, commit 后 push 到 remote 作…

JSON 语法详解:轻松掌握数据结构(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

CSS中 设置文字下划线 的几种方法

在网页设计和开发中&#xff0c;我们经常需要对文字进行样式设置&#xff0c;包括字体,颜色&#xff0c;大小等&#xff0c;其中&#xff0c;设置文字下划线是一种常见需求 一 、CSS种使用 text-decoration 属性来设置文字的装饰效果&#xff0c;包括下划线。 常用的取值&…

JFrog----基于Docker方式部署JFrog

文章目录 1 下载镜像2 创建数据挂载目录3 启动 JFrog服务4 浏览器登录5 重置密码6 设置 license7 设置 Base URL8 设置代理9 选择仓库类型10 预览11 查看结果 1 下载镜像 免费版 docker pull docker.bintray.io/jfrog/artifactory-oss体验版&#xff1a; docker pull releas…

【网络奇缘】- 如何自己动手做一个五类|以太网|RJ45|网络电缆

​ ​ &#x1f308;个人主页: Aileen_0v0&#x1f525;系列专栏: 一见倾心,再见倾城 --- 计算机网络~&#x1f4ab;个人格言:"没有罗马,那就自己创造罗马~" 本篇文章关于计算机网络的动手小实验---如何自己动手做一个网线&#xff0c; 也是为后面的物理层学习进…

在cmd下查看当前python的版本

在cmd窗口下运行python --version或者py --version&#xff0c;可以查看当前python的版本。例如&#xff1a;

OpenAI在中国,申请GPT-6、GPT-7商标

根据最新商标信息显示&#xff0c;OpenAI已经在中国提交了GPT-6和GPT-7的商标注册信息&#xff0c;分类是科学仪器和网站服务两大类。申请日期是今年的11月2日&#xff0c;目前处于审核状态。 该申请由知识产权代理公司完成&#xff0c;但申请人的地址正是OpenAI在美国公司的地…

LeetCode437.路径总和III

看完题目我就拿直接用递归写了如下代码&#xff1a; class Solution {private int ans;public int pathSum(TreeNode root, int targetSum) {ans 0;dfs(root, targetSum, 0);return ans;}public void dfs(TreeNode root, int targetSum, int sum){if(root null)return;sum r…

【MATLAB】辛几何模态分解分解+FFT+HHT组合算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~也可转原文链接获取~ 1 基本定义 辛几何模态分解&#xff08;CEEMDAN&#xff09;是一种处理非线性和非平稳信号的适应性信号分解方法。通过在信号中加入白噪声&#xff0c;并多次进行经验模态分解&#xff08;EMD&#…

CSS BFC特性和应用

目录 1&#xff0c;介绍2&#xff0c;BFC布局规则3&#xff0c;创建BFC4&#xff0c;BFC应用1&#xff0c;浮动子元素使父级高度坍塌2&#xff0c;非浮动元素被浮动元素覆盖3&#xff0c;margin 合并1&#xff0c;父子 margin 合并&#xff1a;父级和第1个/最后1个子元素2&…

【matlab程序】matlab画子图的多种样式

【matlab程序】matlab画子图的多种样式