Projekt konceptualny

1. Sformułowanie zadania projektowego

Projekt dotyczy zbierania i dystrybucji danych GPS. Zródlami danych GPS są różne urządzenia, które opierają swoją transmicje o protokół NMEA. Protokół ten operuje na stosie TCP/IP który jest niewygody w zastosowaniach webowych.

Celem projektu jest przeniesienie komunikacji TCP/IP z warstwy serwara do warstwy ciękiego klienta jakim jest współczesna przeglądarka.

Koncepcja rozwiązania opiera się o wykorzystanie biblioteki CometSession do asynchronicznego wysylania obiektów do klienta GWT. W związku z tym że każdy strumień możemy parsować i budować z niego proste obiekty POJO wyżej wymienione rozwiązanie nadaje sie idealnie do postawionego problemu.

Mimo że projekt rozwiązuje problem sledzenia pojazdów nadających wspołrzędne GPS można go zastosować również w innych sytacjach gdy potrzebne jest transmitowanie danych w trybie rzeczywistym do przeglądarki ze żródła nadającego w protokole TCP/IP.

2. Analiza stanu wyjściowego

Istniejące rozwiązania oferują firmy takie jak Leica Geosystems czy Trimble. Są to jednak systemy drogie i wymagają jeszcze droższego sprzętu tychże firm. Programy takie jak:

służą do inteligentnego zbierania danych z różnych sensorów. Dodatkowo opensource'owy projekt NTrip przedstawia rozwiązanie podstawowych problemów lecz nic nie wnosi do świata Web2.0.

Rozwiązaniami tego typu mogą być zainteresowani głównie grupy specjalistów oraz ich specyficzni klienci.

Model biznesowy tych organizacji opiera się na silnym monopolu na rynku gdy rozmawiamy o samych urządzeniach. Ponieważ ich sprzęt jest bezkonkurencyjny każdy również korzysta z ich oprogramowania. Niekiedy jednak tak zaawansowane rozwiązania nie są potrzebne.

Siła tych rozwiązań skupia się wokół jakości proponowanych usług i ich niezawodności. Ponieważ cechy te są najistotniejsze dla obecnego rynku zbytu właśnie tutaj zamierzamy skupić swoją uwagę.

Obecnie istniejące aplikacje facebooka wykorzystują google maps API lub podobne rozwiązania dają następujące ciekawe możliwości:

Jednak żadna z tych aplikacji nie daje możliwości śledzenia urządzeń w czasie rzeczywistym. Pozwala jedynie na sztywne wprowadzenie do bazy interesujących informacji. Jednak dzięki zgrabnemu interfejsowi i integracji z portalem Facebook są bardzo popularne.

3. Analiza wymagań użytkownika (wstępna)

  • rejestracja użytkownika, logowanie
  • wybór linii autobusowych lub tramwajowych, które mają być śledzone (wyświetlone na mapie)
  • personalizacja listy obserwowanych linii autobusowych lub tramwajowych
  • możliwość dodawania, usuwania linii z listy obserwowanych
  • możliwość wybrania wielu linii do obserwowania
  • możliwość zaznaczenia obszaru na mapie
  • możliwość wyświetlenie wszystkich linii znajdujących się zaznaczonym obszarze na mapie
  • możliwość obserwowania linii znajdujących się w zadanym promieniu od wskazanego na mapie punktu

4. Identyfikacja funkcji

Podstawowe funkcje realizowane w bazie danych to:

  • zapis współrzędnych punktów na mapie (w czasie rzeczywistym - pozycje pojazdu w danej chwili)
  • wyszukiwanie wszystkich punktów znajdujących się w zadanym obszarze
  • wyszukiwanie wszystkich punktów znajdujących się zadanym promieniu od zadanego punktu na mapie

5. Wybór encji (obiektów) i ich atrybutów

@Entity
@Table(name = "busLine")
@SequenceGenerator(name = "busLineGen", sequenceName="busLine_id_seq")
public class BusLineEntity implements Serializable{
 
	private static final long serialVersionUID = -7466374287424528286L;
 
	private Long id;
	private String name;
 
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy=GenerationType.AUTO,generator="busLineGen")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
 
	@Column(name = "name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}
 
@Entity
@Table(name = "busLineRouteGPSPoint")
@SequenceGenerator(name = "busLineRouteGPSPointGen", sequenceName="busLineRouteGPSPoint_id_seq")
public class BusLineRouteGPSPointEntity implements Serializable{
 
	private static final long serialVersionUID = -6621739069147136425L;
 
	private Long id;
	private GPSDeviceEntity gpsDeviceId;
	private BusLineEntity busLineId;
	private Point coordinates;
	private Timestamp createDate;
	private BusStopEntity busStopId;
 
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy=GenerationType.AUTO,generator="busLineRouteGPSPointGen")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
 
	@ManyToOne
	@JoinColumn(name = "gpsDeviceId")
	public GPSDeviceEntity getGpsDeviceId() {
		return gpsDeviceId;
	}
	public void setGpsDeviceId(GPSDeviceEntity gpsDeviceId) {
		this.gpsDeviceId = gpsDeviceId;
	}
 
	@ManyToOne
	@JoinColumn(name = "busLineId")
	public BusLineEntity getBusLineId() {
		return busLineId;
	}
	public void setBusLineId(BusLineEntity busLineId) {
		this.busLineId = busLineId;
	}
 
	@Type(type = "org.hibernatespatial.GeometryUserType")
	@Column(name = "coordinates",columnDefinition="GEOMETRY")
	public Point getCoordinates() {
		return coordinates;
	}
	public void setCoordinates(Point coordinates) {
		this.coordinates = coordinates;
	}
 
	@Column(name = "createDate")
	public Timestamp getCreateDate() {
		return createDate;
	}
	public void setCreateDate(Timestamp createDate) {
		this.createDate = createDate;
	}
 
	@ManyToOne
	@JoinColumn(name = "busStopId")
	public BusStopEntity getBusStopId() {
		return busStopId;
	}
	public void setBusStopId(BusStopEntity busStopId) {
		this.busStopId = busStopId;
	}	
}
 
@Entity
@Table(name = "busStop")
@SequenceGenerator(name = "busStopGen", sequenceName="busStop_id_seq")
public class BusStopEntity implements Serializable{
 
	private static final long serialVersionUID = 7541692595724436572L;
 
	private Long id;
	private String name;
	private Point coordinates;
 
 
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy=GenerationType.AUTO,generator="busStopGen")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
 
	@Column(name = "name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
 
	@Type(type = "org.hibernatespatial.GeometryUserType")
	@Column(name = "coordinates",columnDefinition="GEOMETRY")
	public Point getCoordinates() {
		return coordinates;
	}
	public void setCoordinates(Point coordinates) {
		this.coordinates = coordinates;
	}
 
}
 
@Entity
@Table(name = "gpsDevice")
@SequenceGenerator(name = "gpsDeviceGen", sequenceName="gpsDevice_id_seq")
public class GPSDeviceEntity implements Serializable{
 
	private static final long serialVersionUID = 4418364605229822507L;
 
	private Long id;
	private String name;
 
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy=GenerationType.AUTO,generator="gpsDeviceGen")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
 
	@Column(name = "name")
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
 
}
 
@Entity
@Table(name = "linesWatchedByUser")
@SequenceGenerator(name = "linesWatchedByUserGen", sequenceName="linesWatchedByUser_id_seq")
public class LinesWatchedByUserEntity implements Serializable{
 
	private static final long serialVersionUID = 8397536731208675190L;
 
	private Long id;
	private UserEntity userId;
	private BusLineEntity busLineId;
 
 
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy=GenerationType.AUTO,generator="linesWatchedByUserGen")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
	@ManyToOne
	@JoinColumn(name = "userId")
	public UserEntity getUserId() {
		return userId;
	}
	public void setUserId(UserEntity userId) {
		this.userId = userId;
	}
 
	@ManyToOne
	@JoinColumn(name = "busLineId")
	public BusLineEntity getBusLineId() {
		return busLineId;
	}
	public void setBusLineId(BusLineEntity busLineId) {
		this.busLineId = busLineId;
	}	
 
}
 
 
@Entity
@Table(name = "users")
@SequenceGenerator(name = "userGen", sequenceName="user_id_seq")
public class UserEntity implements Serializable{
 
	private static final long serialVersionUID = -5223729813826331322L;
 
	private Long id;
	private String login;
	private String password;
 
	@Id
	@Column(name = "id")
	@GeneratedValue(strategy=GenerationType.AUTO,generator="userGen")
	public Long getId() {
		return id;
	}
	public void setId(Long id) {
		this.id = id;
	}
 
	@Column(name = "login")
	public String getLogin() {
		return login;
	}
	public void setLogin(String login) {
		this.login = login;
	}
 
	@Column(name = "password")
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
 
}

6. Projektowanie powiązań (relacji) pomiędzy encjami

Literatura:
pl/dydaktyka/ztb/2010/projekty/gpsstream/start.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0