class MapViewApp(App): def build(self): self.current_lat = 0 self.current_lon = 0 self.init_gps() self.start_gps() self.mapview = MapView(zoom=24, lat=self.current_lat, lon=self.current_lon) self.label = Label(text='Locations are supposed to be printed here.') self.layout = GridLayout(rows=2) self.layout.add_widget(self.mapview) self.layout.add_widget(self.label) return self.layout def request_android_permissions(self): def callback(permissions, results): if all([res for res in results]): print("callback. All permissions granted.") else: print("callback. Some permissions refused.") request_permissions([ Permission.INTERNET, Permission.ACCESS_COARSE_LOCATION, Permission.ACCESS_FINE_LOCATION ], callback) def init_gps(self): try: gps.configure(on_location=self.on_location, on_status=self.on_status) except NotImplementedError: traceback.print_exc() self.gps_status = 'GPS is not implemented for your platform' if platform == "android": print("gps.py: Android detected. Requesting permissions") self.request_android_permissions() def start_gps(self): gps.start(1000, 1) def stop_gps(self): gps.stop() @mainthread def on_location(self, **kwargs): self.current_lat = kwargs['lat'] self.current_lon = kwargs['lon'] self.mapview.center_on(self.current_lat, self.current_lon) marker = MapMarker(lat=self.current_lat, lon=self.current_lon) self.mapview.add_marker(marker) self.label.text = '\n'.join([f'{k} : {v}' for k, v in kwargs.items()]) print(self.current_lat, self.current_lon) @mainthread def on_status(self, stype, status): pass
class ShowMap(BoxLayout): def __init__(self, *args, **kwargs): super(ShowMap, self).__init__(**kwargs) points = JsonStore("points_of_interest.json") self.view = MapView(lat=points["center"]['lat'], lon=points["center"]['lon'], zoom=15, cache_dir="cache") # Add Route layer = GeoJsonMapLayer(source="route.json") self.view.add_layer(layer) # Add User user_marker = MapMarker(lat=points["center"]['lat'], lon=points["center"]['lon'], source='assets/icon_user.png') self.view.add_widget(user_marker) # Add Icons self.icons = MapIcons(width='60sp') def zoom_in(instance): print('Zoom In:', self.view.zoom) if self.view.zoom == 19: return self.view.zoom += 1 self.icons.btn_zoom_in.bind(on_press=zoom_in) def zoom_out(instance): print('Zoom Out:', self.view.zoom) if self.view.zoom == 1: return self.view.zoom -= 1 self.icons.btn_zoom_out.bind(on_press=zoom_out) def center_on(instance): print('Center On:', user_marker.lat, user_marker.lon) self.view.center_on(user_marker.lat, user_marker.lon) self.icons.btn_center_on.bind(on_press=center_on) self.view.add_widget(self.icons) for point in points["list"]: bubble = Bubble(orientation='vertical', background_image=point['image']) map_marker = MapMarkerPopup(id="marker", lat=point['lat'], lon=point['lon'], source='assets/icon_marker.png') map_marker.add_widget(bubble) self.view.add_marker(map_marker) self.add_widget(self.view) ### Begin Close Bubble ### def close_bubbles(arg, touch): for c in self.view.children: for cc in c.children: if cc.id == 'marker': if len(cc.children) and cc.is_open: cc.is_open = False cc.refresh_open_status() self.view.children[-1].bind(on_touch_up=close_bubbles) ### End Close Bubble ### def on_size(self, *args): if self.view: self.icons.pos = (self.width - self.icons.width, (self.height - self.icons.height)/2.)
class PokeVyApp(App): mapview = ObjectProperty(None) location = ListProperty(None) cells = {} inventory = {} player_marker = ObjectProperty(None) pokemons = {} forts = {} bubbles = ListProperty([]) def build(self): self.mapview = MapView(zoom=20, lat=45.47375, lon=9.17489, map_source="thunderforest-landscape") mml = MarkerMapLayer() self.mapview.add_layer(mml) self.player_marker = MapMarker(lat=45.47375, lon=9.17489) self.mapview.add_marker(self.player_marker) self.update_map() Clock.schedule_once(lambda *args: self.mapview.center_on(*self.location)) Clock.schedule_interval(self.update_map, 1) Clock.schedule_interval(lambda *a: mml.reposition(), 0.1) root = FloatLayout() root.add_widget(self.mapview) return root def update_map(self, *args): try: with open(config.location_file, "r") as f: loc = json.load(f) lat = loc["lat"] lon = loc["lng"] self.location = [lat, lon] anim = Animation(lat=lat, lon=lon, d=1) #t="in_out_cubic", anim.start(self.player_marker) if self.player_marker.x < self.root.x or self.player_marker.right > self.root.right or \ self.player_marker.y < self.root.y or self.player_marker.top > self.root.top: centerer = MapCenterer(lon=self.mapview.lon, lat=self.mapview.lat, mapview=self.mapview) anim = Animation(lat=lat, lon=lon, t="in_out_cubic", d=0.5) anim.start(centerer) with open(config.cells_file, "r") as f: self.cells = json.load(f) # print "CELLS", len(self.cells) self.add_remove_markers(self.cells) except: import traceback; traceback.print_exc(); def add_remove_markers(self, cells): ids = [] for cell in cells: if "forts" in cell: for fort in cell["forts"]: ids.append(fort["id"]) if fort["id"] not in self.forts and "latitude" in fort and "longitude" in fort and "type" in fort: marker = FortMarker(fort=fort) self.forts[fort["id"]] = marker self.mapview.add_marker(marker) # print "ADD MARKER fort", fort["type"] elif fort["id"] in self.forts: self.forts[fort["id"]].fort = fort if "catchable_pokemons" in cell: for pokemon in cell["catchable_pokemons"]: ids.append(pokemon["encounter_id"]) if pokemon["encounter_id"] not in self.pokemons and "latitude" in pokemon and "longitude" in pokemon: marker = PokemonMarker(pokemon=pokemon) self.pokemons[pokemon["encounter_id"]] = marker self.mapview.add_marker(marker) print "ADD MARKER", pokemon["pokemon_id"] elif pokemon["encounter_id"] in self.pokemons: self.pokemons[pokemon["encounter_id"]].pokemon = pokemon # print "IDS", ids for marker in self.forts.keys() + self.pokemons.keys(): if marker not in ids: if marker in self.pokemons: m = self.pokemons.pop(marker) else: m = self.forts.pop(marker) self.mapview.remove_marker(m)
class Main(App): height = 720 width = (height/16) * 9 Window.size = (width,height) def build(self): self.itu_lat = 55.6593807 self.itu_lon = 12.5910774 self.obs_dic = None self.old_time = 0.0 self.weatherbox = AnchorLayout(anchor_x = 'center', anchor_y = 'bottom') self.Layout = RelativeLayout() self.mapview = MapView(zoom=11, lat=self.itu_lat, lon=self.itu_lon) mapview = self.mapview self.Layout.add_widget(mapview) # add map layer self.jsonmap = GeoJsonMapLayer(source='5_mile_airport.json') self.mapview.add_layer(self.jsonmap) self.overlay = AnchorLayout(anchor_x='right', anchor_y='top') lowerLeft = AnchorLayout(anchor_x='left', anchor_y='bottom') self.lowerLeftStack = StackLayout(orientation='lr-bt',size_hint=(0.15,0.15)) lowerLeft.add_widget(self.lowerLeftStack) btnre = Button(background_normal='refocus_normal.png', background_down='refocus_down.png', size_hint = (2,1)) btnre.bind(on_press=self.resetloc) btnnf = ToggleButton(background_normal='nofly_normal.png', background_down='nofly_down.png',size_hint = (2,1)) btnnf.bind(on_press=self.nofly) self.lowerLeftStack.add_widget(btnre) self.lowerLeftStack.add_widget(btnnf) btn = ToggleButton(background_normal='Settings B.png', background_down="Settings G.png") btn.bind(on_press= self.show_dropdown) self.settings = StackLayout(size_hint=(0.2,0.2)) self.settings.add_widget(btn) self.overlay.add_widget(self.settings) self.Layout.add_widget(lowerLeft) self.Layout.add_widget(self.overlay) marker = MapMarker(anchor_x = 0.5, anchor_y = 0.5, lat=self.itu_lat, lon=self.itu_lon) self.mapview.add_marker(marker) return self.Layout def resetloc(self,instance): self.mapview.center_on(self.itu_lat,self.itu_lon) def nofly(self,instance): if instance.state == 'down': self.mapview.remove_layer(self.jsonmap) else: self.mapview.add_layer(self.jsonmap) def show_dropdown(self,instance): if instance.state == 'down': size = (1,0.5) btn1 = ToggleButton(text='Weather', size_hint = size) btn2 = Button(text='Level',size_hint = size) btn3 = Button(text='Nearby\nusers', size_hint = size) btn1.bind(on_press = self.show_weather_data) self.settings.add_widget(btn1) self.settings.add_widget(btn2) self.settings.add_widget(btn3) else: for child in self.settings.children[:]: if child.text != "": self.settings.remove_widget(child) def show_weather_data(self,instance): weatherbox = self.weatherbox if instance.state == 'down': layout = BoxLayout(orientation='vertical', size_hint = (0.2,0.1) ) clat = self.mapview.lat clon = self.mapview.lon ctime = time.time() if(self.obs_dic == None or ctime > (self.old_time + 0.5)): self.old_time = ctime self.obs_dic = api.loc_weather(clat,clon) weList = self.obs_dic['weather'] we = weList[0] wi = self.obs_dic['wind'] l1 = Label(text = 'Current weather: ' + we['main'], color = (0.,0.,0.,1)) main = self.obs_dic['main'] k = main['temp'] #Conversion from imperial to metric temp = k-273.15 l2 = Label(text = 'temp: ' + str(temp) + ' ' + u'\u00B0' + 'C', color = (0.,0.,0.,1)) hu = main['humidity'] l3 = Label(text = 'humidity: ' + str(hu) + '%', color = (0.,0.,0.,1)) pre = main['pressure'] l4 = Label(text = 'pressure' + str(pre) + ' hPa', color = (0.,0.,0.,1)) wispeed = wi['speed'] widir = wi['deg'] l5 = Label(text = 'wind speed: ' + str(wispeed) + 'm/s', color = (0.,0.,0.,1)) l6 = Label(text = 'wind direction '+ str(widir) + u'\u00B0', color = (0.,0.,0.,1)) Tdp = temp - ((100-hu)/5) l7 = Label(text = 'dew point: ' + str(Tdp) + ' ' + u'\u00B0' + 'C', color = (0.,0.,0.,1)) layout.add_widget(l1) layout.add_widget(l2) layout.add_widget(l3) layout.add_widget(l4) layout.add_widget(l5) layout.add_widget(l6) layout.add_widget(l7) weatherbox.add_widget(layout) weatherbox.add_widget self.Layout.add_widget(weatherbox) else: for c in self.weatherbox.children[:]: for child in c.children[:]: c.remove_widget(child) self.weatherbox.remove_widget(c) self.overlay.remove_widget(weatherbox)
class NavigationScreen(Screen): def __init__(self, **kwargs): super(NavigationScreen, self).__init__(**kwargs) #self.size=(800, 480) self.Background = Image(source='Images/BG_Empty.png', pos=(0, 0), size_hint=(None, None), size=(800, 480)) self.Map = MapView(zoom=1, lat=42.8982149, lon=-78.8672276, pos=(10, 10), size_hint=(None, None), size=(780, 415)) self.Destination = TextInput(text='Destination', multiline=False, pos=(130, 430), size_hint=(None, None), size=(500, 40)) self.Destination.bind(on_text_validate=self.SearchDestination) self.Destination.bind(on_double_tap=self.ClearDestination) self.SearchButton = Button(text='->', pos=(630, 430), size_hint=(None, None), size=(40, 40), background_color=(0.0, 0.9, 0.0, 0.75)) self.SearchButton.bind(on_press=self.SearchDestination) self.ExitButton = Button(text='Exit', pos=(690, 430), size_hint=(None, None), size=(100, 40), background_color= (0.9, 0.0, 0.0, 0.75)) self.ExitButton.bind(on_press=self.exitApplication) self.BackButton = Button(text='Back', pos=(10, 430), size_hint= (None, None), size=(100, 40), background_color=(0.18, 0.38, 0.70, 0.75)) self.BackButton.bind(on_press= self.BackToMenu) self.ZoomInButton = Button(text='+', pos=(10,50), size_hint=(None, None), size=(40, 40), background_color=(0, 0, 0.90, 1)) self.ZoomInButton.bind(on_press= self.ZoomIn) self.ZoomOutButton = Button(text='-', pos=(10,10), size_hint=(None, None), size=(40, 40), background_color=(0, 0, 0.90, 1)) self.ZoomOutButton.bind(on_press= self.ZoomOut) self.GetLocationButton = Button(text='(@)', pos=(50, 10), size_hint=(None, None), size=(40, 40), background_color=(0, 0, 0.90, 1)) self.GetLocationButton.bind(on_press= self.ZoomToCurrentLocation) self.PlaceNewMarkerButton = Button(text='^', pos=(90,10), size_hint=(None, None), size=(40, 40), background_color=(0, 0, 0.90, 1)) self.PlaceNewMarkerButton.bind(on_press= self.PlaceMarker) #POPUP ERRORS self.popup_location_error = Popup(title='Location Error', content=Label(text='-Invalid location- \n Please try again!'), size_hint=(None, None), size=(500, 100)) self.popup_bluetooth_error = Popup(title='Bluetooth Error', content=Label(text='-Could not connect to ODBII Device- \n Please Reconnect and try again!'), size_hint=(None, None), size=(500, 100)) self.popup_gps_error = Popup(title='GPS Error', content=Label(text='-Invalid location- \n Please try again!'), size_hint=(None, None), size=(500, 100)) #LOCATION DATA self.MyCurrentLocation = (42.8982149, -78.8672276) self.PlaceNewMarker = False #Add location lock for synchronization #MAP MARKERS LIST self.MapMarkers = [] #Add Objects to the Screen self.add_widget(self.Background) self.add_widget(self.Map) self.add_widget(self.Destination) self.add_widget(self.SearchButton) self.add_widget(self.ExitButton) self.add_widget(self.BackButton) self.add_widget(self.ZoomInButton) self.add_widget(self.ZoomOutButton) self.add_widget(self.GetLocationButton) self.add_widget(self.PlaceNewMarkerButton) def BackToMenu(self, *args): sm.current = 'menu' def exitApplication(self, *args): App.get_running_app().stop() def PlaceMarker(self, *args): x = self.Map.width/2 y = self.Map.height/2 newLoc = self.Map.get_latlon_at(x,y) CurMarker = MapMarker(lat=newLoc[0], lon=newLoc[1]) self.MapMarkers.append(CurMarker) self.Map.add_marker(CurMarker) def SearchDestination(self, *args): location_text = self.Destination.text g = geocoder.google(location_text) if(g.status=='OK'): print(g.json) print(g.latlng) self.Map.center_on(g.latlng[0],g.latlng[1]) self.Destination.text = '' self.Map.zoom = 16 self.ClearAllMapMarkers() CurMarker = MapMarker(lat=g.latlng[0], lon=g.latlng[1]) self.MapMarkers.append(CurMarker) self.Map.add_marker(CurMarker) #self.SetPlaceText(g) else: self.popup_location_error.open() def ClearDestination(self, *args): self.Destination.text = '' def ClearAllMapMarkers(self, *args): for marker in self.MapMarkers: self.Map.remove_marker(marker) def ZoomOut(self, *args): if(self.Map.zoom>0): self.Map.zoom-=1 print('Map Zoom Level: ' + str(self.Map.zoom)) def ZoomIn(self, *args): if(self.Map.zoom<19): self.Map.zoom+=1 print('Map Zoom Level: ' + str(self.Map.zoom)) def ZoomToCurrentLocation(self, *args): newloc = self.MyCurrentLocation self.Map.center_on(newloc[0],newloc[1]) self.ClearAllMapMarkers() self.Map.zoom = 16 CurMarker = MapMarker(lat=newloc[0], lon=newloc[1]) self.MapMarkers.append(CurMarker) self.Map.add_marker(CurMarker) def GetCurrentLocation(self, *args): #Define Mechanism to grab GPS coordinates from USB device lat = 42.8982149 lon = -78.8672276 #AQUIRE LOCK WHEN IMPLEMENTED self.MyCurrentLocation = (lat, lon) #RELEASE LOCK #ERASE LAST MARKER #ADD NEW MARKER print(self.MyCurrentLocation)