如何在Jupyter中创建标记信息数据库并实现信息检索?
批量生成地图标记的实现方案
以下是从数据库加载数据、在Jupyter中批量生成地图标记的具体步骤,以SQLite数据库+folium地图库为例:
1. 准备数据库与标记数据
首先创建存储标记信息的数据库表,表结构至少包含纬度(latitude)、经度(longitude),还可按需添加标题(title)、描述(description)等字段。
用Python的sqlite3库创建数据库并插入示例数据:
import sqlite3 # 连接数据库(不存在则自动创建) conn = sqlite3.connect('map_markers.db') cursor = conn.cursor() # 创建标记表 cursor.execute(''' CREATE TABLE IF NOT EXISTS markers ( id INTEGER PRIMARY KEY AUTOINCREMENT, latitude REAL NOT NULL, longitude REAL NOT NULL, title TEXT, description TEXT ) ''') # 插入示例标记数据 sample_markers = [ (39.9042, 116.4074, '北京天安门', '中华人民共和国首都地标'), (31.2304, 121.4737, '上海外滩', '上海标志性景观区域'), (23.1291, 113.2644, '广州塔', '广州最高建筑') ] cursor.executemany('INSERT INTO markers (latitude, longitude, title, description) VALUES (?, ?, ?, ?)', sample_markers) # 提交并关闭连接 conn.commit() conn.close()
2. 在Jupyter中读取数据库数据
使用pandas库读取数据库中的标记数据,转换成DataFrame格式便于后续处理:
import pandas as pd import sqlite3 # 连接数据库 conn = sqlite3.connect('map_markers.db') # 读取所有标记数据 markers_df = pd.read_sql_query('SELECT * FROM markers', conn) # 关闭连接 conn.close() # 查看数据(可选) print(markers_df.head())
3. 批量生成地图标记
用folium库初始化地图,然后遍历DataFrame中的每一行数据,批量添加标记:
import folium # 初始化地图(可设置默认中心坐标和缩放级别) m = folium.Map(location=[35.8617, 104.1954], zoom_start=5) # 遍历数据批量添加标记 for idx, row in markers_df.iterrows(): # 创建标记弹窗内容 popup_content = f"<strong>{row['title']}</strong><br>{row['description']}" # 添加标记到地图 folium.Marker( location=[row['latitude'], row['longitude']], popup=folium.Popup(popup_content, max_width=300), tooltip=row['title'] # 鼠标悬停显示的提示文字 ).add_to(m) # 在Jupyter中显示地图 m
4. 大数据量优化方案
如果标记数量超过千级,建议使用folium.plugins.FastMarkerCluster来优化性能,避免地图加载卡顿:
from folium.plugins import FastMarkerCluster # 初始化地图 m = folium.Map(location=[35.8617, 104.1954], zoom_start=5) # 批量生成集群标记 FastMarkerCluster( data=list(zip(markers_df['latitude'], markers_df['longitude'])), popup=folium.Popup(lambda row: f"<strong>{markers_df.iloc[row[0]]['title']}</strong><br>{markers_df.iloc[row[0]]['description']}", max_width=300) ).add_to(m) # 显示地图 m
注意事项
- 确保数据库中的经纬度是数值类型,若为字符串需先转换:
markers_df['latitude'] = pd.to_numeric(markers_df['latitude']) - 若使用其他数据库(如PostgreSQL、MySQL),只需替换连接方式(例如用
psycopg2连接PostgreSQL),读取数据的逻辑基本一致 - 可根据需求自定义标记图标、颜色等样式,参考folium官方文档的Marker参数
内容的提问来源于stack exchange,提问作者White Angel
相关产品推荐
相关产品推荐

