一、空间数据简介
-
意义:空间数据分析是利用地理信息系统 (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度
共性与注意事项:
- 所有操作均返回新的几何对象,原对象保持不变;
- 适用于点(
Point)、线(LineString)、多边形(Polygon)等所有 Shapely 几何类型;
3. 查询空间几何信息
一、获取坐标信息(了解几何对象的位置)
核心逻辑:
通过几何对象的coords属性获取坐标,返回一个可迭代的坐标序列,需转换为列表(list())方便查看。
不同对象的操作:
- 点(Point) :坐标为单个(x,y)对,通过
point.coords获取:
from shapely.geometry import Point
point = Point(2, 3)
coords = list(point.coords) # [(2.0, 3.0)]
- 线(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)]
- 多边形(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是外围边界的周长。
具体操作:
- 多边形(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)
- 线(LineString) :
长度:
line.length(所有线段的距离之和)
line = LineString([(0, 0), (1, 1), (2, 0)])
length = line.length # 约3.414(√2 + √2)
- 点(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 | 存在任何交集(点、线、面重叠均可) | 判断道路是否穿过河流 |
| 包含 | contains | A 完全包含 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))
| 索引 | id | type | geometry(空间对象) |
|---|---|---|---|
| 0 | 1 | 点 | Point (2, 3)(坐标 (2,3) 的单个点) |
| 1 | 2 | 线 | LineString ([(0,0), (1,1), (2,0)])(三点连接的折线) |
| 2 | 3 | 面 | Polygon ([(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 | 算两个对象的最短直线距离 | 测量点到道路、两个区域的间距 |
所有操作均为 “非破坏性”,原对象保持不变,返回新对象;支持任意几何类型组合,是空间分析中最常用的基础运算