上次博客已经大概完成了map_service.py的主体,但仍存在问题

1.USERKEY_PLAT_NOMATCH的原因

这个错误 USERKEY_PLAT_NOMATCH 的意思是“Key 与平台不匹配”,第一次在高德开放平台申请 Key 的时候,选择的是“Web 端”,但在 Python 代码里调用的是“Web 服务 API”,于是删掉原先申请的Key,重新新建一个Web服务类型的Key,发现已经可以成功找到关键词“地铁站”的相关信息。

2.KeyError: 'code'

对于此处报错的原因我不是很清楚,好像是由于IP 不匹配,高德就会拒绝服务,导致高德 API 返回了错误信息,我决定改用“距离测量 API”,便于估算时间。

现在已经基本实现了POI以及通勤信息获取功能。

3.优化数据存储

为了满足任务 2.4 的评分需求,我们需要建立清晰的“房源-配套-通勤”关系。

  1. 引入 house_id:所有的 POI 和通勤数据,都必须绑定一个 house_id(房源 ID)。
  2. 存储通勤数据:将计算出的通勤时间写入 commute_data 表。
  3. 优化 POI 存储:在 poi_data 表中增加 house_id 字段,表明这是“该房源”周边的配套。
    class MapService:
        def __init__(self, db_name="house_data.db"):
            """
            初始化:连接数据库并建表
            """
            self.conn = sqlite3.connect(db_name)
            self.create_tables()
    
        def create_tables(self):
            """
            【重构重点】
            1. POI 表增加 house_id:用于区分不同房源的周边数据
            2. 确保通勤表存在
            """
            cursor = self.conn.cursor()
    
            # --- 1. 房源表 (新增:为了关联数据,我们需要一个简单的房源表) ---
            # 在实际爬虫项目中,这个表通常由爬虫主程序创建
            # 这里我们为了完整性加上,如果已存在则忽略
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS house_info (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    title TEXT,
                    longitude TEXT,
                    latitude TEXT
                )
            ''')
    
            # --- 2. POI 配套表 (增加 house_id 字段) ---
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS poi_data (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    house_id INTEGER,          -- 关联的房源ID
                    name TEXT NOT NULL,        -- 配套名称(如:万达广场)
                    type TEXT,                 -- 类型(如:购物、地铁)
                    distance REAL,             -- 距离(米)
                    address TEXT,
                    FOREIGN KEY(house_id) REFERENCES house_info(id)
                )
            ''')
    
            # --- 3. 通勤表 ---
            cursor.execute('''
                CREATE TABLE IF NOT EXISTS commute_data (
                    id INTEGER PRIMARY KEY AUTOINCREMENT,
                    house_id INTEGER,          -- 关联的房源ID
                    destination_name TEXT,     -- 目的地名称(如:高新万达)
                    duration_min REAL,         -- 耗时(分钟)
                    distance_m REAL,           -- 距离(米)
                    FOREIGN KEY(house_id) REFERENCES house_info(id)
                )
            ''')
    
            self.conn.commit()
    

    修改优化建表函数,新增房源表house_info,并且将主键idhouse_id加入POI表和通勤表中

4.测试优化过后的存储功能

编写测试代码

if __name__ == "__main__":
    print("=== 开始测试地图服务 (含存储) ===")
    ms = MapService()

    # 模拟数据库里已经有了一个房源,ID 为 1
    # 在实际爬虫中,这里会是 insert into house_info ... returning id
    current_house_id = 1
    my_location = "117.120729,36.683369"  # 房源坐标
    target_location = "117.032434,36.667890"  # 公司坐标

    # 1. 测试:搜索周边并存库
    print(f"\n[1/2] 正在搜索并存储房源 {current_house_id} 的周边地铁...")
    ms.search_poi_around(
        house_id=current_house_id,
        location=my_location,
        keyword="地铁站"
    )
    print("周边数据已存入 poi_data 表 (带 house_id)")

    # 2. 测试:计算通勤并存库
    print(f"\n[2/2] 正在计算并存储通勤...")
    duration, distance = ms.calculate_and_save_commute(
        house_id=current_house_id,
        origin_loc=my_location,
        dest_name="高新万达",
        dest_loc=target_location
    )

    if duration > 0:
        print(f"通勤数据已存入 commute_data 表: {duration}分钟, {distance}米")

    print("\n=== 测试结束 ===")
    print("请打开 SQLite Viewer 查看 house_data.db 文件。")
    print("你会看到 poi_data 和 commute_data 表中都有了 house_id=1 的数据。")

结果符合情况,在插件SQLite Viewer中可查看

5.小总结

map_service.py暂告段落,等到合并时再做完善工作,下次博客准备开始编写scoring_model.py

更多推荐