当前位置: 首页 > news >正文

智能防走失定位工具,核心功能,绑定家人手机,实时查看位置,设置安全区域,如小区,超出区域自动提醒,支持一键求救,应用场景,预防老人痴呆患者走失,家人随时掌握位置,放心又安心。

# 智能防走失定位工具(Python 3.8+)

# 依赖:pip install prettytable

import random

import math

import time

from datetime import datetime

from prettytable import PrettyTable

class SmartAntiLostTool:

def __init__(self):

# 模拟用户数据(主账号+绑定家人)

self.users = {

"master_001": {"name": "家属小王", "bound_members": {}, "safe_zones": {}}

}

# 模拟实时位置存储(user_id: (lat, lon, update_time))

self.location_records = {}

# 地球半径(公里,简化距离计算)

self.EARTH_RADIUS = 6371

def _haversine_distance(self, loc1, loc2):

"""计算两点间球面距离(公里)"""

lat1, lon1 = math.radians(loc1[0]), math.radians(loc1[1])

lat2, lon2 = math.radians(loc2[0]), math.radians(loc2[1])

dlat, dlon = lat2 - lat1, lon2 - lon1

a = math.sin(dlat/2)**2 + math.cos(lat1)*math.cos(lat2)*math.sin(dlon/2)**2

return self.EARTH_RADIUS * 2 * math.asin(math.sqrt(a))

def bind_family_member(self, master_id, member_id, member_name):

"""绑定家人账号(模拟手机号/ID关联)"""

if master_id not in self.users:

return False, "主账号不存在"

if member_id in self.users[master_id]["bound_members"]:

return False, "该成员已绑定"

# 初始化成员数据

self.users[master_id]["bound_members"][member_id] = {

"name": member_name,

"status": "正常",

"last_update": None

}

self.location_records[member_id] = None # 初始无位置

return True, f"成功绑定{member_name}({member_id})"

def update_location(self, user_id, lat, lon):

"""更新用户实时位置(模拟GPS上报)"""

if user_id not in self.location_records:

return False, "用户未注册"

self.location_records[user_id] = (lat, lon, datetime.now())

# 更新绑定关系中的最后上报时间

for master_id in self.users:

if user_id in self.users[master_id]["bound_members"]:

self.users[master_id]["bound_members"][user_id]["last_update"] = datetime.now()

return True, "位置更新成功"

def set_safe_zone(self, master_id, zone_name, center_lat, center_lon, radius_km):

"""设置安全区域(如小区:名称+中心坐标+半径公里)"""

if master_id not in self.users:

return False, "主账号不存在"

self.users[master_id]["safe_zones"][zone_name] = {

"center": (center_lat, center_lon),

"radius": radius_km

}

return True, f"安全区域[{zone_name}]设置完成(半径{radius_km}km)"

def check_zone_safety(self, master_id, member_id):

"""检查成员是否超出安全区域"""

if master_id not in self.users or member_id not in self.users[master_id]["bound_members"]:

return False, "绑定关系不存在"

if member_id not in self.location_records or not self.location_records[member_id]:

return False, "成员位置未更新"

member_loc = self.location_records[member_id][:2]

safe_zones = self.users[master_id]["safe_zones"]

if not safe_zones:

return False, "未设置安全区域"

# 检查所有安全区域(默认第一个区域为主要监控区)

zone_name = list(safe_zones.keys())[0]

zone = safe_zones[zone_name]

distance = self._haversine_distance(member_loc, zone["center"])

if distance > zone["radius"]:

# 超出区域,更新状态并提醒

self.users[master_id]["bound_members"][member_id]["status"] = "超出安全区"

return True, f"警告!{member_id}已超出[{zone_name}](距离{round(distance,2)}km)"

else:

self.users[master_id]["bound_members"][member_id]["status"] = "正常"

return True, f"安全!{member_id}在[{zone_name}]内(距离{round(distance,2)}km)"

def send_sos_signal(self, user_id, message="紧急求助!我迷路了"):

"""一键求救(模拟通知绑定的主账号)"""

if user_id not in self.location_records or not self.location_records[user_id]:

return False, "无法获取位置,求救失败"

# 查找绑定的主账号

master_id = None

for mid in self.users:

if user_id in self.users[mid]["bound_members"]:

master_id = mid

break

if not master_id:

return False, "未绑定家属账号"

loc = self.location_records[user_id]

sos_info = {

"time": datetime.now(),

"location": loc[:2],

"message": message,

"member": self.users[master_id]["bound_members"][user_id]["name"]

}

return True, f"求救已发送至{master_id}:\n{sos_info}"

def display_status(self, master_id):

"""显示所有绑定成员的实时状态"""

if master_id not in self.users:

return "主账号不存在"

table = PrettyTable()

table.field_names = ["成员ID", "姓名", "状态", "最后位置", "更新时间"]

for uid, info in self.users[master_id]["bound_members"].items():

loc = self.location_records.get(uid)

location_str = f"{loc[0]:.4f},{loc[1]:.4f}" if loc else "未更新"

update_time = loc[2].strftime("%m-%d %H:%M") if loc else "无"

table.add_row([uid, info["name"], info["status"], location_str, update_time])

return str(table)

def simulate_elderly_movement(base_lat, base_lon, max_offset=0.01):

"""模拟老人缓慢移动(在基准位置附近随机偏移)"""

return (

base_lat + random.uniform(-max_offset, max_offset),

base_lon + random.uniform(-max_offset, max_offset)

)

def main():

tool = SmartAntiLostTool()

current_user = "master_001" # 模拟主账号登录

# 初始化演示数据:绑定老人账号

tool.bind_family_member(current_user, "elder_001", "张爷爷")

# 设置安全区域(模拟小区:中心坐标+半径1km)

tool.set_safe_zone(current_user, "幸福小区", 39.9087, 116.3975, 1.0)

# 初始位置(小区内)

initial_loc = (39.9087, 116.3975)

tool.update_location("elder_001", *initial_loc)

print("=== 智能防走失定位工具 ===")

print("核心功能:位置监控 | 安全区域 | 一键求救")

print(f"当前账号:{tool.users[current_user]['name']}({current_user})\n")

while True:

print("\n操作选项:")

print("1. 查看成员状态 2. 模拟位置更新 3. 检查安全区域 4. 一键求救 5. 退出")

choice = input("请选择(1-5):")

if choice == "1":

print("\n" + tool.display_status(current_user))

elif choice == "2":

# 模拟老人移动(随机偏移)

new_loc = simulate_elderly_movement(*initial_loc)

success, msg = tool.update_location("elder_001", *new_loc)

print(f"\n位置更新结果:{msg}")

print(f"新位置:{new_loc[0]:.4f}, {new_loc[1]:.4f}")

elif choice == "3":

success, msg = tool.check_zone_safety(current_user, "elder_001")

print(f"\n区域检查结果:{msg}")

elif choice == "4":

success, msg = tool.send_sos_signal("elder_001", "爷爷找不到回家的路了!")

print(f"\n求救结果:{msg}")

elif choice == "5":

print("\n感谢使用防走失工具,祝家人平安!")

break

else:

print("无效选项,请重试")

if __name__ == "__main__":

main()

代码说明(代码块前后解释)

核心功能实现

1. 绑定与位置管理

-

"bind_family_member" 建立主账号与老人账号的绑定关系

-

"update_location" 模拟GPS上报位置(支持手动/自动更新)

- 位置数据存储为

"(纬度, 经度, 更新时间)" 元组

2. 安全区域监控

-

"set_safe_zone" 定义区域(名称+中心坐标+半径公里)

-

"check_zone_safety" 用Haversine公式计算实际距离,超半径则标记"超出安全区"

3. 一键求救机制

-

"send_sos_signal" 模拟向绑定家属发送含位置、时间的求救信息

创新设计元素(源自创新设计梦工场课程)

- 用户场景适配:针对老人操作特点,简化交互(命令行菜单+明确提示)

- 动态位置模拟:

"simulate_elderly_movement" 函数模拟老人缓慢移动(避免位置突变)

- 风险预警闭环:位置更新→区域检查→状态标记→人工提醒的完整链路

- 低门槛技术落地:用标准库实现核心逻辑,降低部署难度(仅需安装prettytable)

使用说明

1. 安装依赖:

"pip install prettytable"

2. 运行程序后通过菜单操作:

- 选项2模拟老人位置变化(随机偏移基准点)

-

选项3检查是否超出预设的"幸福小区"(半径1km)

- 选项4触发求救,模拟通知家属

3. 扩展建议:

- 接入真实GPS API(如高德/百度地图定位)

- 添加短信/推送通知(需集成通信SDK)

- 开发简易GUI(如Tkinter)提升老人操作便利性

代码严格遵循移动端适配(轻量无复杂依赖)、异常处理(如未绑定账号提示)、模块化设计(功能拆分至独立方法),可直接复制运行演示核心场景。

欢迎关注我,有更多编程干货等待你!

http://www.jsqmd.com/news/89654/

相关文章:

  • 【大模型预训练】19-分布式集群架构:GPU、TPU集群的拓扑结构与通信优化
  • 【ZAB协议】
  • 告别单选困境:Layui多选下拉框的优雅解决方案
  • tinySubFinder字幕下载
  • 基于SSM的在线药品销售系统【源码+文档+调试】
  • Mammoth.js实战指南:轻松实现Word转HTML的完整解决方案
  • DOCX.js终极指南:在浏览器中生成Word文档的完整解决方案
  • 两次数字电路模拟程序+课堂测验
  • 深圳|广州|东莞|昆明-茶饮培训课程哪家好|茶饮培训机构怎么选|新中式茶饮培训哪家好|茶饮技术培训|新式茶饮培训|中式茶饮培训课程——圣旺水吧 - 老百姓的口碑
  • 抖音无水印视频下载器:5分钟掌握高清保存技巧
  • 时序数据库
  • 原生 JavaScript 组件化开发:摆脱框架束缚的架构之道
  • 基于SSM的学生信息管理系统【源码+文档+调试】
  • 5分钟精通Windows更新通道自由切换:OfflineInsiderEnroll深度解析
  • Servlet
  • 元宇宙应用的AI测试方案:智能化测试框架与实践策略
  • ComfyUI-Manager跨版本迁移实战指南:5步解决配置兼容难题
  • 飞书文档批量导出终极指南:25分钟搞定700+文档本地备份
  • Umi-OCR技术架构深度解析:插件化引擎与多场景应用实战
  • E-Hentai下载器完整指南:轻松打包图库为ZIP文件
  • 【MySQL XA规范】
  • FF14自动跳过副本动画插件完整使用指南
  • 六音音源修复终极教程:轻松解决洛雪音乐播放难题
  • Shutter Encoder深度解析:从技术架构到实战应用的完整指南
  • VMware云原生转型:传统IT的破局之道
  • LRCGET:离线音乐库批量歌词同步解决方案
  • 10分钟搞定AI语音克隆:GPT-SoVITS零基础完整指南
  • QThread: Destroyed while thread is still running
  • 基于SSM的连锁店管理平台【源码+文档+调试】
  • 20251214周日日记