Exemple #1
0
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
Exemple #2
0
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.)
Exemple #3
0
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)
Exemple #4
0
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)
Exemple #5
0
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)