实现
两步移动搜索法(Two-Step Floating Catchment Area Method, 2SFCA)是一种广泛应用于地理信息系统(GIS)领域的方法,用于评估设施的空间可达性。以下是基于 Python 和 GeoPandas 的一种实现方式。
准备工作
为了实现 2SFCA 方法,需要准备以下数据集:
- 供给点:表示服务提供方的位置及其服务能力。
- 需求点:表示潜在使用者的位置及其需求量。
- 距离矩阵:描述供给点与需求点之间的距离关系。
这些数据可以通过 GIS 工具生成,或者通过网络 API 获得。在此基础上,可以利用 pandas
或 geopandas
来处理和存储数据。
完整代码实现
import pandas as pd
from collections import defaultdict
def calculate_2sfca(supply_df, demand_df, distance_matrix, d0=2.5):
"""
使用两步移动搜索法计算空间可达性
参数:
supply_df (pd.DataFrame): 供给点 DataFrame,包含 'id' 和 'supply'
demand_df (pd.DataFrame): 需求点 DataFrame,包含 'id' 和 'demand'
distance_matrix (pd.DataFrame): 距离矩阵 DataFrame,索引为供应点 ID,
列为需求点 ID,值为两者间的距离
d0 (float): 距离衰减阈值,默认为 2.5 km
返回:
pd.Series: 各需求点的可达性得分
"""
# 初始化供给权重
supply_weights = {}
for _, row in supply_df.iterrows():
total_demand_in_range = sum(
demand_df.loc[demand_id, 'demand'] * max(0, 1 - dist / d0)
for demand_id, dist in distance_matrix[row['id']].items()
if dist <= d0
)
supply_weights[row['id']] = row['supply'] / (total_demand_in_range or 1)
# 计算各需求点的可达性
accessibility_scores = []
for _, demand_row in demand_df.iterrows():
score = sum(
supply_weights[supply_id] * max(0, 1 - dist / d0)
for supply_id, dist in distance_matrix.T[demand_row['id']].items()
if dist <= d0
)
accessibility_scores.append(score)
return pd.Series(accessibility_scores, index=demand_df.index)
# 示例数据
if __name__ == "__main__":
# 创建供给点 DataFrame
supply_data = {'id': ['s1', 's2'], 'supply': [100, 200]}
supply_df = pd.DataFrame(supply_data).set_index('id')
# 创建需求点 DataFrame
demand_data = {'id': ['d1', 'd2'], 'demand': [50, 70]}
demand_df = pd.DataFrame(demand_data).set_index('id')
# 创建距离矩阵
distance_matrix = {
's1': {'d1': 1.0, 'd2': 3.0},
's2': {'d1': 2.5, 'd2': 1.5}
}
distance_matrix = pd.DataFrame(distance_matrix).T.fillna(float('inf'))
# 执行 2SFCA 计算
result = calculate_2sfca(supply_df, demand_df, distance_matrix)
print(result)
上述代码实现了基本的 2SFCA 流程,并考虑了距离衰减效应。其中,distance_matrix 是供给点与需求点之间距离的关系表;d0 定义了最大有效距离范围。
结果解释
该算法的核心在于两次迭代过程:
- 第一次迭代:对于每一个供给点,计算其覆盖范围内所有需求点的需求总量,并据此分配供给权重。
- 第二次迭代:对于每一个需求点,汇总其覆盖范围内所有供给点的有效供给量,得到最终的可达性评分。
这种方法能够很好地反映实际生活中的资源分布和服务能力差异。