两步移动搜索法(2SFCA)python

实现

两步移动搜索法(Two-Step Floating Catchment Area Method, 2SFCA)是一种广泛应用于地理信息系统(GIS)领域的方法,用于评估设施的空间可达性。以下是基于 Python 和 GeoPandas 的一种实现方式。

准备工作

为了实现 2SFCA 方法,需要准备以下数据集:

  1. 供给点:表示服务提供方的位置及其服务能力。
  2. 需求点:表示潜在使用者的位置及其需求量。
  3. 距离矩阵:描述供给点与需求点之间的距离关系。

这些数据可以通过 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 定义了最大有效距离范围。 

结果解释

该算法的核心在于两次迭代过程:

  1. 第一次迭代:对于每一个供给点,计算其覆盖范围内所有需求点的需求总量,并据此分配供给权重。
  2. 第二次迭代:对于每一个需求点,汇总其覆盖范围内所有供给点的有效供给量,得到最终的可达性评分。

这种方法能够很好地反映实际生活中的资源分布和服务能力差异。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我在北京coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值