|
@@ -74,7 +74,7 @@ struct location_card
|
|
|
m_p.set(pt);
|
|
|
init_att(pt,time);
|
|
|
}
|
|
|
- bool line_changed(const point &pt,int &df)
|
|
|
+ bool line_changed(const point &pt)//,int &df)
|
|
|
{
|
|
|
if(!is_valid())
|
|
|
return false;
|
|
@@ -89,23 +89,26 @@ struct location_card
|
|
|
//查看路径方向是否改变
|
|
|
bool change_flag=(arg-m_arg > -1e-10 && arg-m_arg<1e-10);
|
|
|
//change_flag为true,标识没有发生变化
|
|
|
- if(change_flag)m_direct_index=0;
|
|
|
+ // if(change_flag)m_direct_index=0;
|
|
|
log_info("his_location:line_changed:%d,%f,m_arg:%f,%s,%f,%f",m_cardid,arg,m_arg, change_flag?"same":"not same",m_arg-arg,dis);
|
|
|
- //if(dis<0.5 && fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
|
|
|
- //判断5次反向才做下一步动作
|
|
|
- if(fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
|
|
|
- {
|
|
|
- if(++m_direct_index<=10)
|
|
|
- {
|
|
|
- df=1;return false;
|
|
|
- }
|
|
|
- }
|
|
|
+ if(dis<0.5 && fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
|
|
|
+ return false;
|
|
|
+ //判断10次反向才做下一步动作
|
|
|
+ // if(fabs(fabs(arg)+fabs(m_arg)-3.141593)< 0.000005)
|
|
|
+ // {
|
|
|
+ // if(++m_direct_index<=10)
|
|
|
+ // {
|
|
|
+ // df=1;return false;
|
|
|
+ // }
|
|
|
+ // }
|
|
|
return !point::eq(arg,m_arg,1e-10);
|
|
|
}
|
|
|
bool is_speed_changed(const point& pt,uint64_t time)
|
|
|
{
|
|
|
bool flag = false;
|
|
|
double v=0.0;
|
|
|
+ point ps=m_d.back().p;
|
|
|
+ if(ps.dist(pt)<0.1)return flag;
|
|
|
if(m_d.size()>=4)
|
|
|
{
|
|
|
mini_data d1 = m_d.front();
|
|
@@ -187,20 +190,23 @@ struct location_card
|
|
|
bool flag=false;
|
|
|
int iflag=0;
|
|
|
//判断是否路径发生了变化
|
|
|
+ //这里现在又判断,如果反向了也会返回true.但是不运作,依然走下面的逻辑就会有问题
|
|
|
+ //比如速度
|
|
|
flag=handle_message(p,timestamp);
|
|
|
if(time_out(p,timestamp))
|
|
|
- if(!flag)iflag=2;
|
|
|
- if(is_speed_changed(p,timestamp))
|
|
|
if(!flag)iflag=1;
|
|
|
+ if(is_speed_changed(p,timestamp))
|
|
|
+ if(!flag)iflag=2;
|
|
|
if(is_area_changed(areaid))
|
|
|
- if(!flag)iflag=1;
|
|
|
+ if(!flag)iflag=3;
|
|
|
if(is_map_changed(mapid))
|
|
|
- if(!flag)iflag=1;
|
|
|
+ if(!flag)iflag=4;
|
|
|
+ log_info("his_location cardid:%d:%d",m_cardid,iflag);
|
|
|
if(iflag)
|
|
|
{
|
|
|
- update(p,timestamp);
|
|
|
+ update(p,timestamp,iflag);
|
|
|
//set_invalid();
|
|
|
- if(iflag==1){
|
|
|
+ if(iflag>1){
|
|
|
set(p,timestamp);
|
|
|
insert();
|
|
|
}
|
|
@@ -216,8 +222,9 @@ struct location_card
|
|
|
log_info("his_location[%d,%lu]:%s",m_cardid,m_timestamp,nsql);
|
|
|
sDBConnPool.PushAsync(nsql);
|
|
|
}
|
|
|
- void update(const point &p,uint64_t timestamp)
|
|
|
+ void update(const point &p,uint64_t timestamp,int flag=0)
|
|
|
{
|
|
|
+ static uint64_t last_timestamp=0;
|
|
|
//std::string tabName=getTabName();
|
|
|
char nsql[512]={0};
|
|
|
const char * sql = "update his_location set last_time='%s',speed=%.2f where obj_id=%d and begin_time='%s' and last_time is null;";
|
|
@@ -225,8 +232,16 @@ struct location_card
|
|
|
double t = (timestamp - m_timestamp)/1000;
|
|
|
double avge_speed= dist/t;
|
|
|
if(std::isnan(avge_speed)|| std::isinf(avge_speed))avge_speed=0;
|
|
|
+ if(last_timestamp != 0)
|
|
|
+ {
|
|
|
+ const char * ss = "update his_location set last_time='%s',speed=%.2f where obj_id=%d and begin_time='%s' and last_time = '%s';";
|
|
|
+ snprintf(nsql,512,ss,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str(),tool_time::to_str(last_timestamp/1000).c_str());
|
|
|
+ }
|
|
|
+ else
|
|
|
+ snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
|
|
|
+ if(flag==1) last_timestamp=timestamp;
|
|
|
+ else last_timestamp=0;
|
|
|
|
|
|
- snprintf(nsql,512,sql,tool_time::to_str(timestamp/1000).c_str(),avge_speed,m_objid,tool_time::to_str(m_timestamp/1000).c_str());
|
|
|
log_info("his_location[%d]:%s[%lu,%lu]",m_cardid,nsql,timestamp,m_timestamp);
|
|
|
sDBConnPool.PushAsync(nsql);
|
|
|
}
|
|
@@ -239,8 +254,8 @@ struct location_card
|
|
|
bool handle_message(const point &p,uint64_t timestamp)
|
|
|
{
|
|
|
bool flag = false;
|
|
|
- int df=0;
|
|
|
- if(line_changed(p,df))
|
|
|
+ //int df=0;
|
|
|
+ if(line_changed(p))//,df))
|
|
|
{
|
|
|
flag = true;
|
|
|
std::vector<point> rc=find_path(m_d.back().p,p);
|
|
@@ -258,7 +273,7 @@ struct location_card
|
|
|
//置m_arg非法
|
|
|
set_invalid();
|
|
|
}
|
|
|
- if(df==1)flag=true;
|
|
|
+ //if(df==1)flag=true;
|
|
|
return flag;
|
|
|
}
|
|
|
bool handle_path(std::vector<point> &rc,uint64_t timestamp,bool flag)
|
|
@@ -286,95 +301,4 @@ struct location_card
|
|
|
}
|
|
|
|
|
|
};
|
|
|
-#if 0
|
|
|
-struct location_staff:location_card
|
|
|
-{
|
|
|
- location_staff(uint32_t id,uint64_t type,uint32_t objid)
|
|
|
- :location_card(id,type,objid)
|
|
|
- {}
|
|
|
- virtual std::string getTabName(){return std::string{"his_location_staff_"};}
|
|
|
- //人员如果运行方向发生变化的话,需要求的拐点。如果有拐点,入拐点。时间大与120s则不做处理。没有拐点,则不求
|
|
|
- virtual bool handle_message(const point &p,uint64_t timestamp)
|
|
|
- {
|
|
|
- bool flag = false;
|
|
|
- if(line_changed(p))
|
|
|
- {
|
|
|
- log_info("his_location:line_changed %d",m_cardid);
|
|
|
- flag=true;
|
|
|
- if(timestamp-m_timestamp>120*1000)
|
|
|
- {
|
|
|
- log_info("his_location:line_changed_timeout %d",m_cardid);
|
|
|
- update(m_d.back().p,m_d.back().time);
|
|
|
- set(p,timestamp);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- log_info("his_location:line_changed_find_path %d,(%.2f,%.2f)-->(%.2f,%.2f)-->(%.2f,%.2f)",m_cardid,m_p.x,m_p.y,m_d.back().p.x,m_d.back().p.y,p.x,p.y);
|
|
|
- if(rc.empty())
|
|
|
- {
|
|
|
- log_info("his_location:line_changed rc.empty() %d",m_cardid);
|
|
|
- update(m_d.back().p,m_d.back().time);
|
|
|
- set(m_d.back().p,m_d.back().time);
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- for(uint32_t i=0;i<rc.size();i++)
|
|
|
- log_info("his_location:find_path..x=%.3lf,y=%.3lf\n",rc[i].x,rc[i].y);
|
|
|
- if(rc.size()==1)
|
|
|
- {
|
|
|
- log_info("his_location:line_changed %d circle point(%.2f,%.2f)",m_cardid,rc[0].x,rc[0].y);
|
|
|
- point tmp(rc[0].x,-rc[0].y);
|
|
|
- update(tmp,m_d.back().time);
|
|
|
- set(tmp,m_d.back().time);
|
|
|
- }
|
|
|
- else if(rc.size()==2)
|
|
|
- {
|
|
|
- point tmp(rc[0].x,-rc[0].y);
|
|
|
- update(tmp,m_d.back().time);
|
|
|
- set(tmp,m_d.back().time);
|
|
|
- //
|
|
|
- tmp.set(rc[1].x,-rc[1].y);
|
|
|
- m_arg=make_arg(tmp,m_p);
|
|
|
- insert();
|
|
|
- //
|
|
|
- update(tmp,timestamp);
|
|
|
- set(tmp,timestamp);
|
|
|
- }
|
|
|
- else//更多的拐点
|
|
|
- {
|
|
|
- point tmp(rc[0].x,-rc[0].y);
|
|
|
- update(tmp,m_d.back().time);
|
|
|
- tmp.set(rc.back().x,-rc.back().y);
|
|
|
- set(tmp,timestamp);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- init_att();
|
|
|
- }
|
|
|
- return flag;
|
|
|
- }
|
|
|
-};
|
|
|
-struct location_vehicle:location_card
|
|
|
-{
|
|
|
- location_vehicle(uint32_t id,uint64_t type,uint32_t objid)
|
|
|
- :location_card(id,type,objid)
|
|
|
- {}
|
|
|
- virtual std::string getTabName(){return std::string{"his_location_vehicle_"};}
|
|
|
- //车辆是有推送拐点的,所以不需要求拐点。如果运行方向发生变化的话,直接更新数据库即可,使用上一个点的时间。同时生成这一次的历史。
|
|
|
- virtual bool handle_message(const point &p,uint64_t timestamp)
|
|
|
- {
|
|
|
- bool flag =false;
|
|
|
- if(line_changed(p))
|
|
|
- {
|
|
|
- flag=true;
|
|
|
- //如果有拐点,说明是丢失信号后,飞跃得过程
|
|
|
-// std::vector<point> rc=card_path::inst().find_path(point(m_d.back().p.x,-m_d.back().p.y),point(p.x,-p.y));
|
|
|
- log_info("his_location:line_changed %d ",m_cardid);
|
|
|
- update(m_d.back().p,m_d.back().time);
|
|
|
- set(m_d.back().p,m_d.back().time);init_att();
|
|
|
- }
|
|
|
- return flag;
|
|
|
- }
|
|
|
-};
|
|
|
-#endif
|
|
|
#endif
|