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_terrain_near_route(rts,vertdist,interval=10): l=len(rts) out=[] for idx,rt in enumerate(rts): #print "ord:",rt.a.ordering if rt.dt==None: continue merca=rt.subposa mercb=rt.subposb minstep=2 stepcount=rt.d/float(minstep) if stepcount>100: newstep=rt.d/100.0 if newstep>minstep: minstep=newstep if interval<minstep: interval=minstep df=rt.d if df<1e-3: df=1e-3 along_nm=0.0 #isfirstorlast=(idx==0 or idx==l-1) while True: alongf=float(along_nm)/float(df) end=False if alongf>1.0: alongf=1.0 end=True merc=((1.0-alongf)*merca[0]+(alongf)*mercb[0], (1.0-alongf)*merca[1]+(alongf)*mercb[1]) alt=(1.0-alongf)*rt.startalt+(alongf)*rt.endalt latlon=mapper.merc2latlon(merc,13) elev=get_terrain_elev_in_box_approx(latlon,2*minstep) dist_from_a=mapper.bearing_and_distance(mapper.from_str(rt.a.pos),latlon)[1] dist_from_b=rt.d-dist_from_a if dist_from_b<0: dist_from_b=0 #if isfirstorlast and (along_nm<2.5 or along_nm>d-2.5): # along_nm+=minstep # continue if (alt-elev<vertdist and not (rt.a.stay and dist_from_a<5) and not ((rt.b.stay or idx==l-1) and dist_from_b<5) ): #print "idx",idx,"ord:",rt.a.ordering #print "Terrain warning: ",dict(a=rt.a.waypoint,b=rt.b.waypoint,kind=rt.legpart,startalt=rt.startalt,endalt=rt.endalt,along=alongf,end=end) out.append(dict( name="Terrain warning", pos=mapper.to_str(latlon), elev="%.0f"%(elev,), elevf=elev, dist=0, bearing=0, closestalt=alt, kind='terrain', dist_from_a=dist_from_a, dir_from_a=describe_dir(rt.tt), dist_from_b=dist_from_b, dir_from_b=describe_dir((rt.tt+180.0)%360.0), a=rt.a, b=rt.b, id=rt.a.id)) along_nm+=interval else: along_nm+=minstep if end: break return out
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)