py数据科学学习笔记day4-空间数据统计分析与可视化(1)

4 阅读15分钟

一、空间数据简介

  • 意义:空间数据分析是利用地理信息系统 (GIS) 和地理数据进行有关地理位置的问题的研究和解决的过程。它在许多领域都有广泛的应用,包括城市规划、环境科学、物流管理等。空间数据分析可以帮助我们理解地理数据的空间分布、趋势和关联,从而支持数据驱动的决策制定。空间数据分析可以帮助我们理解地理数据的空间分布、趋势和关联,从而支持数据驱动的决策制定

  • 空间数据内容:空间数据是与地理空间或地理位置相关的数据,它描述了地球表面的特定地点或区域的属性和特征。空间数据通常包含以下内容:

l  地理坐标:地理数据的核心是地理坐标,它表示地球表面上的点的位置。地理坐标通常使用经度(longitude)和纬度(latitude)来描述,或者使用投影坐标系中的X和Y坐标。

l  几何对象:空间数据可以包括各种几何对象,如点、线、多边形、多点、多线等。这些几何对象表示地球表面上的地理特征,如城市、河流、国界、山脉等。

l  属性信息:与每个几何对象关联的属性信息描述了地理特征的性质。这些属性可以包括地名、人口数量、海拔高度、土地用途、温度等各种信息。

l  地理关系:地理数据通常描述了几何对象之间的地理关系。这些关系可以包括点是否位于多边形内、线是否相交、多边形之间的拓扑关系等。

l  地理空间索引:为了高效地查询和分析地理数据,通常需要使用地理空间索引,如R树或四叉树,以便快速定位和检索空间对象。

l  地图投影和坐标系:地球表面是一个三维球体,但地图通常以二维平面的形式呈现。因此,地理空间数据还包括地图投影和坐标系信息,以便正确表示地球上的地理特征。

l  时间信息:一些空间数据也包括时间维度,以描述地理特征随时间变化的情况,如气象数据、移动设备轨迹等。

  • 空间数据处理工具和库:Python具有丰富的库和工具,用于处理、分析和可视化空间数据。一些主要的库包括GeoPandas、Shapely、Matplotlib等。  GeoPandas是一个特别强大的库,它将地理空间数据和Pandas数据框结合在一起,提供了处理地理数据的便捷方法。

二、空间数据基础操作

1. 基本几何要素

Shapely 库中,点(Point)、线(LineString)、多边形(Polygon)是空间数据的三种基本几何要素,分别用于表示不同类型的地理现象,核心用法总结如下:

(一)点(Point):最基础的空间要素

核心定义:

由唯一坐标对(x, y)表示,是空间数据的最小单元,可表示具体位置(如城市、地标)。

关键属性:
  • x:点的水平坐标;
  • y:点的垂直坐标。
基础用法:
from shapely.geometry import Point  
# 创建点(坐标为(2, 3))  
point = Point(2, 3)  
# 获取坐标  
x = point.x  # 2  
y = point.y  # 3  

(二)线(LineString):有序点连接的线状要素

核心定义:

由一系列有序点依次连接而成,可表示线状地理要素(如道路、河流、铁路)。

关键属性:
  • length:线的总长度(所有线段距离之和)。
基础用法:
from shapely.geometry import LineString  
# 创建线(由点(0,0)→(1,1)→(2,0)连接而成)  
line = LineString([(0, 0), (1, 1), (2, 0)])  
# 获取长度  
length = line.length  # 计算结果≈3.414(√2 + √2)  

(三)多边形(Polygon):闭合的面状要素

核心定义:

由至少 3 个点组成的闭合图形(起点与终点需重合,或自动闭合),可表示面状地理要素(如国家、湖泊、区域)。

关键属性:
  • area:多边形的面积;
  • centroid:多边形的中心点(几何中心);
  • exterior:多边形的外围边界(外部环)。
基础用法:
from shapely.geometry import Polygon  
# 创建多边形(由点(0,0)→(1,0)→(1,1)→(0,1)闭合而成,即边长为1的正方形)  
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])  # 自动闭合,无需重复起点  
# 获取属性  
area = polygon.area  # 1.0(面积=1×1)  
centroid = polygon.centroid  # 中心点坐标(0.5, 0.5)  
exterior = polygon.exterior  # 外围边界(由原始点连接成的闭合线)  

2. 空间数据的基本操作

(1)创建空间几何对象

一、 点(Point)对象创建

作用:表示单个空间位置(如城市坐标、地标点)。用法:调用Point类,传入坐标对(x, y)  即可。示例:

point = Point(2, 3)  # 创建坐标为(2, 3)的点

#二、线(LineString)对象创建

作用:表示由多个点依次连接的线状要素(如道路、河流)。用法:调用LineString类,传入坐标点列表(点按顺序连接成线)。示例:

line = LineString([(0, 0), (1, 1), (2, 0)])  # 由(0,0)→(1,1)→(2,0)连接成的折线
三、 多边形(Polygon)对象创建

作用:表示闭合的面状要素(如国家边界、湖泊区域)。用法:调用Polygon类,传入闭合的坐标点列表(起点与终点需重合,或 Shapely 自动闭合)。示例:

polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1), (0, 0)])  # 由5个点闭合形成的正方形

(2)编辑空间几何对象

Shapely 库中对地理几何对象(点、线、多边形等)的缩放、平移、旋转操作,核心是通过特定方法 / 函数改变对象的尺寸、位置或角度,返回新的几何对象(不修改原对象)。以下是三者的用法总结:

一、缩放(改变尺寸)
核心作用:

按比例放大或缩小几何对象的大小(x 轴、y 轴方向可单独设置比例)。

关键要素:
  • 所需导入:直接使用几何对象(如Polygon)的内置方法,无需额外导入工具函数

    from shapely.geometry import Polygon  # 以多边形为例,点、线同理
    
  • 函数 / 方法几何对象.scale(x_scale, y_scale)
  • 参数

    • x_scale:x 轴方向的缩放系数(>1 放大,0 < 值 < 1 缩小,负数值反转方向);
    • y_scale:y 轴方向的缩放系数(规则同上)。
  • 示例

    polygon = Polygon([(0,0), (1,0), (1,1), (0,1)])  # 原正方形(边长1)
    scaled_polygon = polygon.scale(2, 2)  # x、y轴均放大2倍→新正方形(边长2)
    
二、平移(改变位置)
核心作用:

沿 x 轴(水平)和 y 轴(垂直)移动几何对象,改变其空间位置。

关键要素:
  • 所需导入:需从shapely.affinity导入translate函数

    from shapely.geometry import Polygon
    from shapely.affinity import translate
    
  • 函数translate(几何对象, xoff, yoff)
  • 参数

    • xoff:x 轴方向偏移量(正数右移,负数左移);
    • yoff:y 轴方向偏移量(正数上移,负数下移)。
  • 示例

    polygon = Polygon([(0,0), (1,0), (1,1), (0,1)])  # 原正方形(原点附近)
    translated_polygon = translate(polygon, xoff=1, yoff=1)  # 右移1、上移1→新位置
    
三、旋转(改变角度)
核心作用:

绕指定点(默认原点)旋转几何对象,改变其朝向。

关键要素:
  • 所需导入:需从shapely.affinity导入rotate函数

    from shapely.geometry import Polygon
    from shapely.affinity import rotate
    
  • 函数rotate(几何对象, angle, origin='center')
  • 参数

    • angle:旋转角度(单位:弧度,正数为逆时针,负数为顺时针;若用角度需先转换为弧度,如45°→45×π/180);
    • origin:旋转中心(默认'center'为对象中心,也可指定点坐标如(0,0))。
  • 示例

    polygon = Polygon([(0,0), (1,0), (1,1), (0,1)])  # 原正方形
    angle = 45 * (3.141592653589793 / 180)  # 45度转换为弧度
    rotated_polygon = rotate(polygon, angle)  # 绕中心逆时针旋转45度
    
共性与注意事项:
  1. 所有操作均返回新的几何对象,原对象保持不变;
  2. 适用于点(Point)、线(LineString)、多边形(Polygon)等所有 Shapely 几何类型;

3. 查询空间几何信息

一、获取坐标信息(了解几何对象的位置)

核心逻辑:

通过几何对象的coords属性获取坐标,返回一个可迭代的坐标序列,需转换为列表(list())方便查看。

不同对象的操作:
  1. 点(Point) :坐标为单个(x,y)对,通过

point.coords 获取:

from shapely.geometry import Point  
point = Point(2, 3)  
coords = list(point.coords)  # [(2.0, 3.0)]  
  1. 线(LineString) :坐标为有序点的列表,通过

line.coords

获取所有顶点坐标:

from shapely.geometry import LineString  
line = LineString([(0, 0), (1, 1), (2, 0)])  
coords = list(line.coords)  # [(0.0, 0.0), (1.0, 1.0), (2.0, 0.0)]  
  1. 多边形(Polygon) :坐标为外围边界的闭合点列表,

通过polygon.exterior.coords获取:

from shapely.geometry import Polygon  
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])  
coords = list(polygon.exterior.coords)  # [(0.0, 0.0), (1.0, 0.0), (1.0, 1.0), (0.0, 1.0), (0.0, 0.0)](自动闭合)  

二、获取面积和周长(量化几何对象的属性)

核心逻辑:
  • 面积:仅面状对象(如 Polygon)有area属性,返回区域大小;
  • 周长 / 长度:线(LineString)的length是总长度,多边形(Polygon)的length是外围边界的周长。
具体操作:
  1. 多边形(Polygon)

面积:polygon.area

周长:polygon.length(即外围边界的总长度)

from shapely.geometry import Polygon  
polygon = Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])  # 边长为1的正方形  
area = polygon.area  # 1.0(面积=1×1)  
perimeter = polygon.length  # 4.0(周长=4×1)  
  1. 线(LineString)

长度:line.length(所有线段的距离之和)

line = LineString([(0, 0), (1, 1), (2, 0)])  
length = line.length  # 约3.414(√2 + √2)
  1. 点(Point) :无面积和长度(面积 = 0,长度 = 0),一般无需获取。

总结

  • 坐标获取:通过coords属性(点 / 线)或exterior.coords(多边形),转换为列表即可查看具体坐标;
  • 面积:仅多边形等面状对象用area属性;
  • 长度 / 周长:线用length表示总长度,多边形用length表示周长。

4. 空间关系分析

一、相交关系(intersects

作用:

判断两个几何对象是否在空间上存在任何交集(包括点接触、部分重叠、完全重合等,只要有共同部分即返回 True)。

方法:

对象A.intersects(对象B) → 返回 True(相交)或 False(不相交)。

示例:
  • 点与点:仅当坐标完全相同时相交(如Point(1,1)Point(1,1)相交);
  • 点与线:点在线上时相交;
  • 线与多边形:线穿过多边形内部或边界时相交。
from shapely.geometry import Point  
point1 = Point(1, 1)  
point2 = Point(2, 2)  
print(point1.intersects(point2))  # False(两点坐标不同,无交集)

二、包含关系(contains

作用:

判断一个几何对象(A)是否完全包含另一个几何对象(B)(B 的所有部分都在 A 内部,且 B 的边界不超出 A 的边界)。

方法:

对象A.contains(对象B) → 返回 True(A 包含 B)或 False(A 不包含 B)。

示例:
  • 多边形包含点:点的坐标在多边形内部或边界上;
  • 大多边形包含小多边形:小多边形完全在大多边形内部。
from shapely.geometry import Polygon, Point  
polygon = Polygon([(0,0), (2,0), (2,2), (0,2)])  # 边长为2的正方形  
point = Point(1, 1)  # 点在正方形内部  
print(polygon.contains(point))  # True(多边形包含点)

三、重叠关系(overlaps

作用:

判断两个几何对象是否部分重叠(有共同区域,但都不完全包含对方,且重叠部分不是单点或单条线)。

方法:

对象A.overlaps(对象B) → 返回 True(部分重叠)或 False(不重叠 / 完全包含)。

示例:
  • 两个多边形交叉(如Polygon([(0,0),(2,0),(2,2),(0,2)])Polygon([(1,1),(3,1),(3,3),(1,3)])部分重叠);
  • 线与线交叉(非完全重合,且交叉点不是端点)。
from shapely.geometry import Polygon  
polygon1 = Polygon([(0,0),(2,0),(2,2),(0,2)])  
polygon2 = Polygon([(1,1),(3,1),(3,3),(1,3)])  
print(polygon1.overlaps(polygon2))  # True(两多边形部分重叠)

四、补充:相邻关系(touches

(注:用户示例中 “相邻关系” 误用了overlaps,实际相邻需用touches

作用:

判断两个几何对象是否仅边界接触(有共同的边界点或线,但内部无重叠)。

方法:

对象A.touches(对象B) → 返回 True(相邻)或 False(不相邻)。

示例:
  • 两个多边形共享一条边界线(但不交叉);
  • 线的端点与多边形的边界点重合。
from shapely.geometry import Polygon  
polygon1 = Polygon([(0,0),(2,0),(2,2),(0,2)])  
polygon2 = Polygon([(2,0),(4,0),(4,2),(2,2)])  # 与polygon1共享右边线  
print(polygon1.touches(polygon2))  # True(仅边界接触,无内部重叠)

核心总结

空间关系方法核心判断逻辑典型场景
相交intersects存在任何交集(点、线、面重叠均可)判断道路是否穿过河流
包含containsA 完全包含 B(B 所有部分在 A 内)判断点是否在城市范围内
重叠overlaps部分重叠,且互不完全包含判断两个区域是否交叉覆盖
相邻touches仅边界接触,内部无重叠判断两个国家是否接壤

5. GeoDataFrame中的操作

GeoDataFrame 是 Geopandas 库中融合 “表格数据” 与 “空间几何对象” 的核心结构,既能像 Pandas DataFrame 一样处理属性信息,又能直接对几何对象进行空间分析,用法总结如下:

一、核心特点

  • 本质:在 Pandas DataFrame 基础上增加了 geometry列,专门存储点、线、多边形等空间几何对象(来自 Shapely 库);
  • 优势:同时管理 “属性数据”(如 id、名称等)和 “空间几何”,支持表格操作 + 空间分析结合。

二、基础用法

1. 创建 GeoDataFrame

需指定 **geometry列 **(存储空间对象)和其他属性列(如 id、类型等),通过字典传入数据:

import geopandas as gpd
from shapely.geometry import Point, LineString, Polygon

# 1. 准备数据:几何对象列表 + 属性列表
geometries = [
    Point(2, 3),  # 点
    LineString([(0, 0), (1, 1), (2, 0)]),  # 线
    Polygon([(0, 0), (1, 0), (1, 1), (0, 1)])  # 多边形
]
ids = [1, 2, 3]  # 属性数据

# 2. 创建GeoDataFrame:键为列名,'geometry'列必须存在
gdf = gpd.GeoDataFrame({'geometry': geometries, 'id': ids})
2. 访问属性与几何对象
  • 访问属性列:同 Pandas DataFrame,通过列名直接获取(如gdf['id']);
  • 访问几何列:通过gdf['geometry']获取所有空间对象,支持按行索引(如gdf['geometry'][0]获取第一个点)。
# 访问属性列
print(gdf['id'])  # 输出:0    1\n1    2\n2    3(id列数据)

# 访问几何对象
first_geom = gdf['geometry'][0]  # 获取第一个几何对象(Point(2,3))
索引idtypegeometry(空间对象)
01Point (2, 3)(坐标 (2,3) 的单个点)
12线LineString ([(0,0), (1,1), (2,0)])(三点连接的折线)
23Polygon ([(0,0), (1,0), (1,1), (0,1)])(边长 1 的正方形)
3. 空间操作(以缓冲区分析为例)

GeoDataFrame 的geometry列支持直接调用 Shapely 的空间方法(如缓冲区、面积计算、空间关系判断等),对所有几何对象批量操作:

python

运行

# 对所有几何对象做缓冲区分析(向外扩展0.2单位)
buffered_geoms = gdf['geometry'].buffer(0.2)  
# 结果:点→半径0.2的圆,线→宽度0.4的缓冲区带,多边形→向外扩展0.2的新多边形

三、核心价值

  • 统一管理 “属性数据” 和 “空间几何”,避免表格与空间对象分离的麻烦;
  • 支持批量空间操作(如批量计算面积、批量判断包含关系),简化多对象分析流程;
  • 是 GIS 数据处理(如读取 shapefile、地图可视化)的基础结构,兼容 Geopandas 的其他功能(如投影转换、空间索引)。

6. 其他操作

一、空间裁剪(intersection):取两个对象的交集

核心作用:

获取两个几何对象重叠的部分,相当于 “用一个对象当模板,裁剪出另一个对象在模板内的部分”。

关键用法:

方法:对象A.intersection(对象B) → 返回 A 和 B 的交集几何对象(无交集则返回空对象);

  • 适用对象:点、线、多边形任意组合(如多边形裁剪多边形、线裁剪多边形等);

  • 示例(多边形裁剪):

    from shapely.geometry import Polygon
    polygon1 = Polygon([(0,0), (2,0), (2,2), (0,2)])  # 左下正方形
    polygon2 = Polygon([(1,1), (3,1), (3,3), (1,3)])  # 右上正方形
    clipped = polygon1.intersection(polygon2)  # 交集是边长为1的小正方形((1,1)→(2,1)→(2,2)→(1,2))
    

二、几何融合(union):合并多个对象为一个

核心作用:

将两个或多个几何对象合并成一个整体几何体,无论是否相邻(相邻则融合为连续图形,不相邻则为多部分图形)。

关键用法:
  • 方法:对象A.union(对象B) → 返回合并后的新几何对象;
  • 适用对象:点、线、多边形(常用多边形合并);

  • 示例(多边形融合):

    from shapely.geometry import Polygon
    polygon1 = Polygon([(0,0), (1,0), (1,1), (0,1)])  # 左正方形
    polygon2 = Polygon([(1,0), (2,0), (2,1), (1,1)])  # 右正方形(与左正方形相邻)
    merged = polygon1.union(polygon2)  # 融合为一个长2、宽1的长方形
    

三、计算距离(distance):算两个对象的最短距离

核心作用:

计算两个几何对象之间的最短直线距离,数值为非负数(无单位,取决于坐标单位)。

关键用法:
  • 方法:对象A.distance(对象B) → 返回最短距离数值;
  • 适用对象:所有几何组合(点 - 点、点 - 线、点 - 多边形、线 - 多边形等);

  • 距离规则:

    • 点与点:两点间直线距离;
    • 点与线:点到直线的垂直距离;
    • 点与多边形:点到多边形边界 / 内部的最短距离(点在内部则距离为 0);
  • 示例:

    from shapely.geometry import Point, LineString, Polygon
    point = Point(1, 1)
    line = LineString([(0,0), (2,2), (2,0)])
    polygon = Polygon([(0,0), (1,0), (1,1), (0,1)])
    
    point_to_line = point.distance(line)  # 点到线的最短距离≈0.0(点在线上)
    point_to_poly = point.distance(polygon)  # 点在多边形内,距离=0.0
    

核心总结

操作方法核心逻辑典型场景
空间裁剪intersection取两个对象的重叠部分提取某区域内的道路 / 地块
几何融合union合并多个对象为一个整体合并相邻的行政区域
计算距离distance算两个对象的最短直线距离测量点到道路、两个区域的间距

所有操作均为 “非破坏性”,原对象保持不变,返回新对象;支持任意几何类型组合,是空间分析中最常用的基础运算