#include "stdafx.h" #include "ProcessRemodule.h" #include "geo_hash.h" NAMESPACE_POINT_BEGIN(NAMESPACE_POINT) void geo_list::find_near(std::vector&ret,int x,int y,unsigned h,int dist2,unsigned mask,const std::string & card_no) { for(auto it=geo2card.lower_bound(h);it!=geo2card.end();++it) { if((it->first&mask)!=h) break; auto pos=ghash::decode(it->first); int xi=std::get<0>(pos); int yi=std::get<1>(pos); unsigned sn = (xi-x)*(xi-x)+(yi-y)*(yi-y); if(sn > dist2) continue; if (card_no.compare(it->second) == 0) continue; //std::stringstream ss; //ss<<"-----LemonHash---findnear---cardid"<second<<"x:"<second); } } std::vector geo_list::find_near(int x,int y,int dist,const std::string & card_no) { int t=1; while(t r; const int dist2=dist*dist; unsigned mask=~(t*t-1); find_near(r,x,y,ghash::encode(x0-t,y0-t),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0,y0-t),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0+t,y0-t),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0-t,y0),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0,y0),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0+t,y0),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0-t,y0+t),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0,y0+t),dist2,mask,card_no); find_near(r,x,y,ghash::encode(x0+t,y0+t),dist2,mask,card_no); return std::move(r); } //std::vector find_near(const char*card_no,int dist) std::vector geo_list::find_near(const std::string& card_no,int dist) { std::vector r; auto it=card2geo.find(card_no); if(it==card2geo.end()) return std::move(r); auto h=ghash::decode(it->second); return find_near(std::get<0>(h),std::get<1>(h),dist,card_no); } //void update(int x,int y,const char*card_no) void geo_list::update(int x,int y,const std::string card_no) { //std::stringstream ss; unsigned h=ghash::encode(x,y); //ss<<"-----LemonHash--update--"<second=h; for(auto it1=geo2card.begin();it1!=geo2card.end();++it1) { if(it1->second.compare(card_no)==0) { geo2card.erase(it1); break; } } geo2card.insert(std::make_pair(h,card_no)); } } NAMESPACE_POINT_END(NAMESPACE_POINT)