def test_line_closest(): l=Line(Vertex(0,0),Vertex(10,0)) assert l.approx_closest(Vertex(5,0))==Vertex(5,0) assert l.approx_closest(Vertex(-5,0))==Vertex(0,0) assert l.approx_closest(Vertex(15,0))==Vertex(10,0) assert l.approx_closest(Vertex(5,5))==Vertex(5,0) assert abs(l.approx_dist(Vertex(5,5))-5)<1e-5 l=Line(Vertex(1127808,639680),Vertex(1120704,642752)) p=Vertex(1141685,587443) dist=l.approx_dist(p) print "Dist: ",dist assert abs(dist)<1141685
def get_stuff_near_route(rts,items,dist,vertdist): for item in items: try: itemmerc=mapper.latlon2merc(mapper.from_str(item['pos']),13) except Exception: print "Bad coord:",item['pos'] continue itemv=Vertex(int(itemmerc[0]),int(itemmerc[1])) onenm=mapper.approx_scale(itemmerc,13,1.0) for rt in rts: if rt.dt==None: continue #print "=========================================" av=Vertex(int(rt.subposa[0]),int(rt.subposa[1])) bv=Vertex(int(rt.subposb[0]),int(rt.subposb[1])) l=Line(av,bv) linelen=(bv-av).approxlength() actualclosest=l.approx_closest(itemv) #print item['name'],"A: ",av,"B: ",bv,"clo:",actualclosest actualdist=(actualclosest-itemv).approxlength()/onenm #print "Actualdist: ",actualdist ls=(actualclosest-av).approxlength() #print "Length from start:",ls #print "Linelen:",linelen if linelen>1e-3: along=ls/linelen else: along=0 #print "Along:",along #print "Startalt:",rt.startalt," endalt: ",rt.endalt alongnm=rt.d*along alongnm_a=rt.relstartd+alongnm #print "NM from ",rt.a.waypoint," is ",alongnm_a closealt=rt.startalt+(rt.endalt-rt.startalt)*along #print "Altitude at point: ",closealt, " before: ",rt.a.waypoint,rt.b.waypoint altmargin=0 if 'elev' in item: itemalt=mapper.parse_elev(item['elev']) altmargin=closealt-itemalt else: itemalt=None altmargin=0 if actualdist<dist and altmargin<vertdist: bear=mapper.approx_bearing_vec(actualclosest,itemv) d=dict(item) #print "Yielding." d['name']=d['kind']+': ' +d['name'] d['dist_from_a']=alongnm_a d['dist_from_b']=rt.outer_d-alongnm_a d['dir_from_a']=describe_dir(rt.tt) d['dir_from_b']=describe_dir((rt.tt+180.0)%360.0) d['dist']=actualdist d['bearing']=bear d['elevf']=itemalt if itemalt!=None: d['vertmargin']=altmargin d['closestalt']=closealt d['a']=rt.a d['b']=rt.b d['id']=rt.a.id yield d
def get_notampoints_on_line(latlon1,latlon2,dist_nm): zoomlevel=13 distmax=mapper.approx_scale(mapper.latlon2merc(latlon1,zoomlevel),zoomlevel,dist_nm) px1,py1=mapper.latlon2merc(latlon1,zoomlevel) px2,py2=mapper.latlon2merc(latlon2,zoomlevel) a=Vertex(int(px1),int(py1)) b=Vertex(int(px2),int(py2)) line=Line(a,b) crosses=[] for kind,items in get_notam_objs_cached().items(): if kind!="areas": for item in items: x,y=mapper.latlon2merc(mapper.from_str(item['pos']),zoomlevel) d=line.approx_dist(Vertex(int(x),int(y))) clo=line.approx_closest(Vertex(int(x),int(y))) alongd=(clo-a).approxlength() totd=(a-b).approxlength() #print "AlongD: %s, totd: %s"%(alongd,totd) #print "Line: %s, notam coord: %s, closest: %s"%((a,b),(x,y),clo) #print "Item %s, d: %s, distmax: %s"%(item,d,distmax) if totd<1e-6: perc=0 else: perc=alongd/totd if d<distmax: #print "Yielding item." yield dict(item=item,alongperc=perc)
def gen_cands(): for partnum,part in enumerate(parts): for idx,(a,b) in enumerate(izip(part,chain(part[1:],part[0:1]))): av=Vertex(int(a[0]),int(a[1])) bv=Vertex(int(b[0]),int(b[1])) l=Line(av,bv) clo=l.approx_closest(pointv) actualdist=(clo-pointv).approxlength() yield partnum,actualdist,(clo.get_x(),clo.get_y()),idx
def gen_cands(): for partnum, part in enumerate(parts): for idx, (a, b) in enumerate(izip(part, chain(part[1:], part[0:1]))): av = Vertex(int(a[0]), int(a[1])) bv = Vertex(int(b[0]), int(b[1])) l = Line(av, bv) clo = l.approx_closest(pointv) actualdist = (clo - pointv).approxlength() yield partnum, actualdist, (clo.get_x(), clo.get_y()), idx
def get_obstacle_free_height_on_line(pos1, pos2): minimum_distance = 2.0 merc1 = mapper.latlon2merc(pos1, 13) merc2 = mapper.latlon2merc(pos2, 13) onenm = mapper.approx_scale(merc1, 13, 1.0) av = Vertex(int(merc1[0]), int(merc1[1])) bv = Vertex(int(merc2[0]), int(merc2[1])) linelen = (av - bv).approxlength() l = Line(av, bv) bb = BoundingBox(min(merc1[0], merc2[0]), min(merc1[1], merc2[1]), max(merc1[0], merc2[0]), max(merc1[1], merc2[1])).expanded(onenm * minimum_distance * 1.5) obstacles = [0] for item in chain(notam_geo_search.get_notam_objs_cached()['obstacles'], extracted_cache.get_obstacles_in_bb(bb)): if not 'pos' in item: continue if not 'elev' in item: continue try: itemmerc = mapper.latlon2merc(mapper.from_str(item['pos']), 13) except Exception: print "Bad coord:", item['pos'] continue itemv = Vertex(int(itemmerc[0]), int(itemmerc[1])) onenm = mapper.approx_scale(itemmerc, 13, 1.0) actualclosest = l.approx_closest(itemv) actualdist = (actualclosest - itemv).approxlength() / onenm if actualdist < minimum_distance: itemalt = mapper.parse_elev(item['elev']) obstacles.append(itemalt) minstep = 2 * onenm stepcount = linelen / float(minstep) if stepcount > 100: newstep = linelen / 100.0 if newstep > minstep: minstep = newstep if linelen < 1e-3: linelen = 1e-3 along = 0.0 #isfirstorlast=(idx==0 or idx==l-1) while True: alongf = float(along) / float(linelen) end = False if alongf > 1.0: alongf = 1.0 end = True merc = ((1.0 - alongf) * merc1[0] + (alongf) * merc2[0], (1.0 - alongf) * merc1[1] + (alongf) * merc2[1]) latlon = mapper.merc2latlon(merc, 13) elev = get_terrain_elev_in_box_approx(latlon, 2.0 * minstep / onenm) obstacles.append(elev) along += minstep if end: break return max(obstacles)
def get_obstacle_free_height_on_line(pos1,pos2): minimum_distance=2.0 merc1=mapper.latlon2merc(pos1,13) merc2=mapper.latlon2merc(pos2,13) onenm=mapper.approx_scale(merc1,13,1.0) av=Vertex(int(merc1[0]),int(merc1[1])) bv=Vertex(int(merc2[0]),int(merc2[1])) linelen=(av-bv).approxlength() l=Line(av,bv) bb=BoundingBox(min(merc1[0],merc2[0]), min(merc1[1],merc2[1]), max(merc1[0],merc2[0]), max(merc1[1],merc2[1])).expanded(onenm*minimum_distance*1.5) obstacles=[0] for item in chain(notam_geo_search.get_notam_objs_cached()['obstacles'], extracted_cache.get_obstacles_in_bb(bb)): if not 'pos' in item: continue if not 'elev' in item: continue try: itemmerc=mapper.latlon2merc(mapper.from_str(item['pos']),13) except Exception: print "Bad coord:",item['pos'] continue itemv=Vertex(int(itemmerc[0]),int(itemmerc[1])) onenm=mapper.approx_scale(itemmerc,13,1.0) actualclosest=l.approx_closest(itemv) actualdist=(actualclosest-itemv).approxlength()/onenm if actualdist<minimum_distance: itemalt=mapper.parse_elev(item['elev']) obstacles.append(itemalt) minstep=2*onenm stepcount=linelen/float(minstep) if stepcount>100: newstep=linelen/100.0 if newstep>minstep: minstep=newstep if linelen<1e-3: linelen=1e-3 along=0.0 #isfirstorlast=(idx==0 or idx==l-1) while True: alongf=float(along)/float(linelen) end=False if alongf>1.0: alongf=1.0 end=True merc=((1.0-alongf)*merc1[0]+(alongf)*merc2[0], (1.0-alongf)*merc1[1]+(alongf)*merc2[1]) latlon=mapper.merc2latlon(merc,13) elev=get_terrain_elev_in_box_approx(latlon,2.0*minstep/onenm) obstacles.append(elev) along+=minstep if end: break return max(obstacles)