def area_to_tile_list(self, lat, lon, width, height, ground_width, zoom=None): '''return a list of TileInfoScaled objects needed for an area of land, with ground_width in meters, and width/height in pixels. lat/lon is the top left corner. If unspecified, the zoom is automatically chosen to avoid having to grow the tiles ''' pixel_width = ground_width / float(width) ground_height = ground_width * (height/(float(width))) top_right = mp_util.gps_newpos(lat, lon, 90, ground_width) bottom_left = mp_util.gps_newpos(lat, lon, 180, ground_height) bottom_right = mp_util.gps_newpos(bottom_left[0], bottom_left[1], 90, ground_width) # choose a zoom level if not provided if zoom is None: zooms = range(self.min_zoom, self.max_zoom+1) else: zooms = [zoom] for zoom in zooms: tile_min = self.coord_to_tile(lat, lon, zoom) (twidth,theight) = tile_min.size() tile_pixel_width = twidth / float(TILES_WIDTH) scale = pixel_width / tile_pixel_width if scale >= 1.0: break scaled_tile_width = int(TILES_WIDTH / scale) scaled_tile_height = int(TILES_HEIGHT / scale) # work out the bottom right tile tile_max = self.coord_to_tile(bottom_right[0], bottom_right[1], zoom) ofsx = int(tile_min.offsetx / scale) ofsy = int(tile_min.offsety / scale) srcy = ofsy dsty = 0 ret = [] # place the tiles for y in range(tile_min.y, tile_max.y+1): srcx = ofsx dstx = 0 for x in range(tile_min.x, tile_max.x+1): if dstx < width and dsty < height: ret.append(TileInfoScaled((x,y), zoom, scale, (srcx,srcy), (dstx,dsty))) dstx += scaled_tile_width-srcx srcx = 0 dsty += scaled_tile_height-srcy srcy = 0 return ret
def re_center(self, x, y, lat, lon): '''re-center view for pixel x,y''' state = self.state (lat2,lon2) = self.coordinates(x, y) distance = mp_util.gps_distance(lat2, lon2, lat, lon) bearing = mp_util.gps_bearing(lat2, lon2, lat, lon) (state.lat, state.lon) = mp_util.gps_newpos(state.lat, state.lon, bearing, distance)
def on_mouse(self, event): '''handle mouse events''' state = self.state pos = event.GetPosition() if event.Leaving(): self.mouse_pos = None else: self.mouse_pos = pos self.update_position() if event.ButtonIsDown(wx.MOUSE_BTN_ANY) or event.ButtonUp(): # send any event with a mouse button to the parent latlon = self.coordinates(pos.x, pos.y) selected = self.selected_objects(pos) state.event_queue.put(SlipMouseEvent(latlon, event, selected)) if event.LeftDown(): self.mouse_down = pos self.last_click_pos = self.click_pos self.click_pos = self.coordinates(pos.x, pos.y) if event.Dragging() and event.ButtonIsDown(wx.MOUSE_BTN_LEFT): # drag map to new position newpos = pos dx = (self.mouse_down.x - newpos.x) dy = -(self.mouse_down.y - newpos.y) pdist = math.sqrt(dx**2 + dy**2) if pdist > state.drag_step: bearing = math.degrees(math.atan2(dx, dy)) distance = (state.ground_width/float(state.width)) * pdist newlatlon = mp_util.gps_newpos(state.lat, state.lon, bearing, distance) (state.lat, state.lon) = newlatlon self.mouse_down = newpos self.redraw_map()
def on_mouse(self, event): '''handle mouse events''' state = self.state pos = event.GetPosition() if event.Leaving(): self.mouse_pos = None else: self.mouse_pos = pos self.update_position() if event.ButtonIsDown(wx.MOUSE_BTN_ANY) or event.ButtonUp(): # send any event with a mouse button to the parent latlon = self.coordinates(pos.x, pos.y) selected = self.selected_objects(pos) state.event_queue.put(SlipMouseEvent(latlon, event, selected)) if event.LeftDown(): self.mouse_down = pos self.last_click_pos = self.click_pos self.click_pos = self.coordinates(pos.x, pos.y) if event.Dragging() and event.ButtonIsDown(wx.MOUSE_BTN_LEFT): # drag map to new position newpos = pos dx = (self.mouse_down.x - newpos.x) dy = -(self.mouse_down.y - newpos.y) pdist = math.sqrt(dx**2 + dy**2) if pdist > state.drag_step: bearing = math.degrees(math.atan2(dx, dy)) distance = (state.ground_width / float(state.width)) * pdist newlatlon = mp_util.gps_newpos(state.lat, state.lon, bearing, distance) (state.lat, state.lon) = newlatlon self.mouse_down = newpos self.redraw_map()
def re_center(self, x, y, lat, lon): '''re-center view for pixel x,y''' state = self.state if lat is None or lon is None: return (lat2, lon2) = self.coordinates(x, y) distance = mp_util.gps_distance(lat2, lon2, lat, lon) bearing = mp_util.gps_bearing(lat2, lon2, lat, lon) (state.lat, state.lon) = mp_util.gps_newpos(state.lat, state.lon, bearing, distance)
def mavlink_packet(m): '''handle an incoming mavlink packet''' state = mpstate.map_state if m.get_type() == "SIMSTATE": if not mpstate.map_state.have_simstate: mpstate.map_state.have_simstate = True create_blueplane() mpstate.map.set_position('blueplane', (m.lat, m.lng), rotation=math.degrees(m.yaw)) if m.get_type() == "GPS_RAW_INT" and not mpstate.map_state.have_simstate: (lat, lon) = (m.lat*1.0e-7, m.lon*1.0e-7) if state.lat is not None and (mpstate.map_state.have_blueplane or mp_util.gps_distance(lat, lon, state.lat, state.lon) > 10): create_blueplane() mpstate.map.set_position('blueplane', (lat, lon), rotation=m.cog*0.01) if m.get_type() == "NAV_CONTROLLER_OUTPUT": if mpstate.master().flightmode == "AUTO": trajectory = [ (state.lat, state.lon), mp_util.gps_newpos(state.lat, state.lon, m.target_bearing, m.wp_dist) ] mpstate.map.add_object(mp_slipmap.SlipPolygon('trajectory', trajectory, layer='Trajectory', linewidth=2, colour=(255,0,180))) else: mpstate.map.add_object(mp_slipmap.SlipClearLayer('Trajectory')) if m.get_type() == 'GLOBAL_POSITION_INT': (state.lat, state.lon, state.heading) = (m.lat*1.0e-7, m.lon*1.0e-7, m.hdg*0.01) else: return if state.lat != 0 or state.lon != 0: mpstate.map.set_position('plane', (state.lat, state.lon), rotation=state.heading) # if the waypoints have changed, redisplay if state.wp_change_time != mpstate.status.wploader.last_change: state.wp_change_time = mpstate.status.wploader.last_change display_waypoints() # if the fence has changed, redisplay if state.fence_change_time != mpstate.status.fenceloader.last_change: state.fence_change_time = mpstate.status.fenceloader.last_change points = mpstate.status.fenceloader.polygon() if len(points) > 1: mpstate.map.add_object(mp_slipmap.SlipPolygon('fence', points, layer=1, linewidth=2, colour=(0,255,0))) # check for any events from the map mpstate.map.check_events()
max_zoom=opts.max_zoom, elevation=opts.elevation, tile_delay=opts.delay) if opts.boundary: boundary = mp_util.polygon_load(opts.boundary) sm.add_object(SlipPolygon('boundary', boundary, layer=1, linewidth=2, colour=(0,255,0))) if opts.thumbnail: thumb = cv.LoadImage(opts.thumbnail) sm.add_object(SlipThumbnail('thumb', (opts.lat,opts.lon), layer=1, img=thumb, border_width=2, border_colour=(255,0,0))) if opts.icon: icon = cv.LoadImage(opts.icon) sm.add_object(SlipIcon('icon', (opts.lat,opts.lon), icon, layer=3, rotation=90, follow=True)) sm.set_position('icon', mp_util.gps_newpos(opts.lat,opts.lon, 180, 100), rotation=45) sm.add_object(SlipInfoImage('detail', icon)) sm.add_object(SlipInfoText('detail text', 'test text')) for flag in opts.flag: (lat,lon) = flag.split(',') icon = sm.icon('flag.png') sm.add_object(SlipIcon('icon - %s' % str(flag), (float(lat),float(lon)), icon, layer=3, rotation=0, follow=False)) while sm.is_alive(): while sm.event_count() > 0: obj = sm.get_event() if isinstance(obj, SlipMouseEvent): print("Mouse event at %s (X/Y=%u/%u) for %u objects" % (obj.latlon, obj.event.X, obj.event.Y, len(obj.selected)))
def mavlink_packet(m): '''handle an incoming mavlink packet''' state = mpstate.map_state if m.get_type() == "SIMSTATE": if not mpstate.map_state.have_simstate: mpstate.map_state.have_simstate = True create_blueplane() mpstate.map.set_position('blueplane', (m.lat, m.lng), rotation=math.degrees(m.yaw)) if m.get_type() == "GPS_RAW_INT" and not mpstate.map_state.have_simstate: (lat, lon) = (m.lat * 1.0e-7, m.lon * 1.0e-7) if state.lat is not None and ( mpstate.map_state.have_blueplane or mp_util.gps_distance(lat, lon, state.lat, state.lon) > 10): create_blueplane() mpstate.map.set_position('blueplane', (lat, lon), rotation=m.cog * 0.01) if m.get_type() == "NAV_CONTROLLER_OUTPUT": if mpstate.master().flightmode == "AUTO": trajectory = [(state.lat, state.lon), mp_util.gps_newpos(state.lat, state.lon, m.target_bearing, m.wp_dist)] mpstate.map.add_object( mp_slipmap.SlipPolygon('trajectory', trajectory, layer='Trajectory', linewidth=2, colour=(255, 0, 180))) else: mpstate.map.add_object(mp_slipmap.SlipClearLayer('Trajectory')) if m.get_type() == 'GLOBAL_POSITION_INT': (state.lat, state.lon, state.heading) = (m.lat * 1.0e-7, m.lon * 1.0e-7, m.hdg * 0.01) else: return if state.lat != 0 or state.lon != 0: mpstate.map.set_position('plane', (state.lat, state.lon), rotation=state.heading) # if the waypoints have changed, redisplay if state.wp_change_time != mpstate.status.wploader.last_change: state.wp_change_time = mpstate.status.wploader.last_change display_waypoints() # if the fence has changed, redisplay if state.fence_change_time != mpstate.status.fenceloader.last_change: state.fence_change_time = mpstate.status.fenceloader.last_change points = mpstate.status.fenceloader.polygon() if len(points) > 1: mpstate.map.add_object( mp_slipmap.SlipPolygon('fence', points, layer=1, linewidth=2, colour=(0, 255, 0))) # check for any events from the map mpstate.map.check_events()
SlipThumbnail('thumb', (opts.lat, opts.lon), layer=1, img=thumb, border_width=2, border_colour=(255, 0, 0))) if opts.icon: icon = cv.LoadImage(opts.icon) sm.add_object( SlipIcon('icon', (opts.lat, opts.lon), icon, layer=3, rotation=90, follow=True)) sm.set_position('icon', mp_util.gps_newpos(opts.lat, opts.lon, 180, 100), rotation=45) sm.add_object(SlipInfoImage('detail', icon)) sm.add_object(SlipInfoText('detail text', 'test text')) for flag in opts.flag: (lat, lon) = flag.split(',') icon = sm.icon('flag.png') sm.add_object( SlipIcon('icon - %s' % str(flag), (float(lat), float(lon)), icon, layer=3, rotation=0, follow=False)) while sm.is_alive():
def area_to_tile_list(self, lat, lon, width, height, ground_width, zoom=None): '''return a list of TileInfoScaled objects needed for an area of land, with ground_width in meters, and width/height in pixels. lat/lon is the top left corner. If unspecified, the zoom is automatically chosen to avoid having to grow the tiles ''' pixel_width = ground_width / float(width) ground_height = ground_width * (height / (float(width))) top_right = mp_util.gps_newpos(lat, lon, 90, ground_width) bottom_left = mp_util.gps_newpos(lat, lon, 180, ground_height) bottom_right = mp_util.gps_newpos(bottom_left[0], bottom_left[1], 90, ground_width) # choose a zoom level if not provided if zoom is None: zooms = range(self.min_zoom, self.max_zoom + 1) else: zooms = [zoom] for zoom in zooms: tile_min = self.coord_to_tile(lat, lon, zoom) (twidth, theight) = tile_min.size() tile_pixel_width = twidth / float(TILES_WIDTH) scale = pixel_width / tile_pixel_width if scale >= 1.0: break scaled_tile_width = int(TILES_WIDTH / scale) scaled_tile_height = int(TILES_HEIGHT / scale) # work out the bottom right tile tile_max = self.coord_to_tile(bottom_right[0], bottom_right[1], zoom) ofsx = int(tile_min.offsetx / scale) ofsy = int(tile_min.offsety / scale) srcy = ofsy dsty = 0 ret = [] # place the tiles for y in range(tile_min.y, tile_max.y + 1): srcx = ofsx dstx = 0 for x in range(tile_min.x, tile_max.x + 1): if dstx < width and dsty < height: ret.append( TileInfoScaled((x, y), zoom, scale, (srcx, srcy), (dstx, dsty))) dstx += scaled_tile_width - srcx srcx = 0 dsty += scaled_tile_height - srcy srcy = 0 return ret