Aplikacja sieciowa wykorzystująca google maps api oraz bazę danych mysql

0

Witam,
bardzo proszę o nakierowanie na odpowiednią ścieżkę myślenia jeżeli chodzi o realizację zadania które sobie postawiłem.
W jaki sposób podejść do tematu napisania aplikacji sieciowej która by wyświetlała aktualne położenie użytkownika telefonu komórkowego.
Założenia:
1.Aplikacja na telefonie wysyła na bieżąco współrzędne do bazy danych na serwerze.Dane te są magazynowane w celu ewentualnego późniejszego ich wykorzystania np odtworzenia całej trasy.
2.Aplikacja sieciowa (koniecznie w javie (jsp etc) ) łączy się z tą samą bazą danych i pobiera ostatnio dodane wartości(ostatnie wartości szerokości i długości geograficznej) z określoną częstotliwością( przykładowo co 5s) i prezentuje je z użyciem google maps jako znacznik.Każdy użytkownik to 1 znacznik tak więc w momencie aktualizacji położenia stary znacznik by znikał i pojawiałby się nowy.

Zależy mi jedynie na pomocy przy drugiej części tak więc prezentacji danych z bazy.Czy pobieranie z taką częstotliwością danych z bazy i ich wyświetlanie jest dobrym pomysłem? Chodzi tu o stworzenie tak jakby symulacji/wizualizacji tego ruchu.Jak zmienia się to gdy zaplanujemy że jednocześnie chcemy wyświetlać i aktualizować położenie 50-200 użytkowników.Czy w dalszym ciągu mogłoby to spełniać swoje zadanie?

W jaki sposób powinny być składowane takie dane w bazie pamiętając o tym iż będą dość często pobierane.Czy zwykła tabela z id klienta i kolumnami szerokosz/dlugosc geograficzna będzie odpowiednia,czy należałoby operować na łatwo przyswajalnych przez google maps api plikach xml/kml?

Z góry dziękuję za cenne wskazówki.

Pozdrawiam
Kamil

0

ad.2. moim zdaniem wygodniej byłoby to zrobić na zasadzie listenera - aplikacja mobilna nie łączy się bezpośrednio z bazą (co zresztą byłoby niebezpieczne, bo aplikacja na telefonie musiałaby mieć informacje o adresie, loginie i haśle do bazy!) a z aplikacją serwerową (np. przez webservice) i tam wysyła dane lokalizacyjne. Aplikacja serwerowa aktualizuje wpisy w bazie, a oprócz tego informuje mapkę że należy coś zmienić. Czyli taki klasyczny MVP.

0

Aplikacja mobilna łączy się z serwerem gdzie znajduje się baza danych.Aplikacja na serwerze przetwarza otrzymane dane( klient-serwer TCP/IP) tak więc do autoryzacji dochodzi podczas łączenia aplikacji mobilnej z serwerem.Później połączenie jest utrzymywane i aplikacja na serwerze zapisuje dane do bazy, tak więc aplikacja mobilna nie łączy się bezpośrednio z bazą.Tak więc projekt składał by się z 3 części.
Aplikacja mobilna do wysyłania współrzędnych do serwera.
Aplikacja serwerowa do przetwarzania tych danych i umieszczania ich w bazie danych.
Aplikacja sieciowa do pobierania danych z bazy i ich prezentacji.
Skupić się teraz chcę na zaprojektowaniu bazy danych oraz aplikacji do prezentacji danych.
Ze względu na fakt iż chciałbym mieć możliwość przeglądania przebytych tras(użytkownik wybiera moment kiedy aplikacja zaczyna rejestrować dane i kiedy kończy) chciałbym tak zaprojektować bazę żeby później łatwo można było odczytywać te dane na podstawie odpowiedniego zapytania do bazy.

Tabela nr 1 posiadałaby kolumny:
ID- tu dla danej trasy trzymany byłby jej numer identyfikacyjny (autoinkrementacja od 1 dla każdego nowego dnia)
DATA- czas pobrania danych (długość i szerokość geograficzna) rok, miesiąc, dzień ,godzina,minuta,sekunda
LATITUDE , LONGITUDE - dla każdej z dwóch wartości
LOGIN/ID_KLIENTA - w celu identyfikacji od kogo zostały przesłane te wartości.

Wówczas wybierając z bazy wartośći LATITUDE i LONGITUDE dla danego ID trasy i ID_KLIENTA oraz danego dnia otrzymałbym zbiór punktów który dotyczyłby danej trasy z danego dnia,danego użytkownika.
Wydaje mi się jednak że lepiej będzie trzymać dane w kilku tabelach,niestety nie wiem jak je podzielić żeby to miało "ręce i nogi". W tej formie którą napisałem w bazie byłby straszny nieporządek,tak mi się wydaje:/, dlatego prosiłbym o pomoc w jej zaprojektowaniu.

0

Ale jak niby chciałbyś to rozbić na inne tabele? Taka tabela jest ok, ale nie bardzo rozumiem pomysł z tym ID, szczególnie że nie widzę tutaj klucza głównego tabeli jeśli z tym id coś zmajstrujesz.

0

Właśnie pomysł z kilkoma tabelami przyszedł mi do głowy żeby miało to ręce i nogi,ale skoro piszesz że tak może zostać będę się tego trzymał.
Jeżeli chodzi o ID o które pytałeś opiszę to na przykładzie.
Mam komórkę z zainstalowaną aplikacją o której pisałem wcześniej.Uruchamiam ją i naciskam "START". Aplikacja zaczyna odbierać sygnał gps i wysyła współrzędne do serwera.Aplikacja na serwerze umieszcza te dane w bazie danych. Przykładowy rekord wprowadzony do bazy to np.

LOGIN : jacek_p
DATA : 29-09-2012 16:01
ID_TRASY : 1
SZEROKOSC: 55.12453
DLUGOSC: 33.11474

ID_TRASY to kolejny numer trasy dla danego użytkownika.Jeżeli użytkownik naciśnie stop,kolejne naciśnięcie przycisku START do rejestrowania punktów będzie miało już liczbę 2. Wówczas na podstawie odpowiedniego zapytania do bazy będę mógł odtworzyć daną trasę. W związku z tym aktualnie moje pytanie brzmi:
Jak wprowadzać dane do bazy aby po odebraniu wiadomości "panować" nad ID_TRASY.
Aplikacja na telefonie nie powinna się tym zajmować.Chciałbym aby to pole w bazie wypełniały się automatycznie.Autoinkrementacja sprawdziłaby się gdyby każdy rekord miał kolejne ID.A w tym przypadku będzie wiele punktów o tym samym ID i nie wiem jak to ugryźć.
Dodatkowo chciałbym aby to pole numerowane od 1 wzwyż dla każdego dnia.Czyli jeżeli w poniedziałek ID_TRASY przyjmie wartosc np.12 to we wtorek pole to będzie numerowane od początku.

0

Cudów nie ma, żeby tak zrobić będziesz musiał zrobić select na bazie i sprawdzić jakie nowe ID ma przydzielić. Samo resetowanie sekwencji można zrobić triggerem, ale to nie rozwiązuje problemu wielu takich samych id dla różnych userów.

0

Pierwsze co mi przyszło do głowy to właśnie sprawdzić aktualne ID które jest dla danego użytkownika.Tylko jak rozdzielić fakt iż jest to aktualna trasa i ma być to samo ID ,albo jest już nowa.Czyżbym musiał trzymać gdzieś dodatkową zmienną która przyjmowałaby odpowiednią wartość (true/false) gdy aplikacja ma połączenie z serwerem i na tej podstawie numerować kolejne ID?
Druga sprawa to numerowanie od początku gdy mamy kolejny dzień.Tu też póki co nie wiem jak się za to zabrać.

0

Nie nie. Proponuje zrobić tak jak ma endomondo, tzn że user musi kliknąć "stop" w aplikacji mobilnej i dopiero wtedy zapisuje się koniec trasy.

0

Czyli podczas uruchamiania pobierania punktów(nowa trasa) sprawdzana jest ID ostatnio zapisanej trasy w bazie i wszystkie kolejne punkty wysyłane do serwera mają ID o 1 większy.Numer ten trzymany jest w aplikacji mobilnej aż do naciśnięcia przycisku STOP.
Za każdym uruchomieniem sprawdzam również datę,jeżeli jest późniejsza niż ostatnia wartość w bazie... zaczynam numerować od 1 ID TRASY.
To chyba wydaje się być logiczne rozwiązanie i osiągnę to co planowałem na początku czyli autoinkrementację pola ID_TRASY dla każdego dnia od 1 :)

0

Z tą datą to bym uważał. Co jak user zaczyna się bawić w nocy i w trakcie zabawy mija północ? ;)

0

W nocy się nie biega:P Rzeczywiście będzie to problem.Jeżeli aplikacja zostanie uruchomiona przed północą wówczas kolejna trasa będzie miała kolejne ID i zrobi się zamieszanie....Mógłbym dać unikalne ID_TRASY dla każdego użytkownika... ale wówczas przy próbie pobrania punktów danej trasy i zawężeniu ich do DATY pokaże tylko jej część.Można bawić się w sprawdzanie czy w następnym dniu nie ma tego samego ID_TRASY i w razie czego uwzględnić resztę punktów ale myślę że uda się znaleźć lepsze rozwiązanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1