Giter Club home page Giter Club logo

isp-2020-zekjakgyndam's Introduction

Airplanes

Project with use of AWS that is used to visualize airplanes that are located in Poland. This branch is used as simplified version of entire project.

Technologies used and data flow

diagram

AWS EC2 instance

AWS EC2 instance is used for running continuous program that send request to Opensky-Api in order to get data such as:

  • ICAO24
  • timestamp
  • latitude
  • longtitude
  • heading
  • information if airplane is on ground
  • velocity

about all airplanes that are currently above geographic bounding box (49.0273953314, 54.8515359564, 14.0745211117, 24.0299857927) (min_latitude, max_latitude, min_longitude, max_latitude) that is based on the extreme geographical points of Poland. These data (together with timestamp of performed request) are then send to Kinesis data stream.

Kinesis data stream

Kinesis data stream gets data about airplanes and distribute them to different shards, that provide them into AWS Lambda.

AWS Lambda

Because data received from Opensky-Api contain data about all airplanes in specified geographic bounding box, then these contains data about airplanes above Poland, and some of neighboring countries. AWS Lambda is then used in order to remove data about airplanes that aren't above Poland. On the end of AWS Lambda function, the most important data are saved into AWS DynamoDB tables.

AWS DynamoDB

AWS DynamoDB is used as storage for historical and last data of airplanes above Poland in two tables.

  • Table for historical data has primary key which is ICAO24 of airplane and sort key which is timestamp of sending request to Opensky-API

  • Table for last data has only primary key which is ICAO24. Lack of sort key enable to overwrite data for each airplane

Each table contain following columns:

  • ICAO24
  • timestamp
  • datetime
  • latitude
  • longitude
  • heading
  • velocity

Local Machine

Local Machine (that is personal computer) is used to repeatedly reading data from DynamoDB table with last airplanes data and visualize them with use of Mapbox.

Exemplary view on airplanes above Poland

diagram

Setup

Create virtual environment:

python -m virtualenv venv
cd venv/Scripts/activate

Setup OpenSky-API

Create account on OpenSky-api: https://opensky-network.org/index.php?option=com_users&view=registration

Setup Mapbox

Create account on Mapbox: https://www.mapbox.com/maps/

EC2

Generate key pairs

  • go to EC2 service
  • go to Network & Security/Key Pairs
  • click Create key pair
  • provide Name (for example key_test)
  • choose File format (ppk)
  • click Create key pair
  • download .ppk file into desired directory

Launch instance

  • go to EC2 service
  • click Launch instance and choose Launch instance
  • Choose Ubuntu Server 20.04 LTS (HVM) AMI and click Select
  • choose it.micro Instance Type and click Review and Launch
  • click Launch
  • check checkbox and click Launch Instances
  • click View Instances
  • copy Public IPv4 DNS of your instance (for example "ec2-18-207-187-224.compute-1.amazonaws.com")

Connect with instance

  • open PuTTY
  • In Category window go to Connection/SSH/Auth and browse for earlier downloaded .ppk key file
  • in Category window go to Session and fill Host Name (or IP address) inputbox (for example "[email protected]")
  • click Open
  • on PuTTY Security Alert popup window choose tak

Instance setup - configure git

  • generate ssh keys:
ssh-keygen -o
  • push enter button for each communicate (3 times)
  • show public key
cat ~/.ssh/id_rsa.pub
  • log in to github service
  • go to Settings
  • go to SSH and GPG keys
  • click New SSH key
  • provide Title (for example "ec2_ubuntu_instance") and Key (showed earlier public key)
  • click Add SSH key

Instance setup - prepeare repository

  • write following commands to create directory for all projects:
mkdir Projects
cd Projects
  • download repository
git clone [email protected]:jwszol-classes/isp-2020-ZekJakGynDam.git
cd isp-2020-ZekJakGynDam/
  • setup repository
source ./ec2_setup.sh

Instance setup - configure AWS

  • open labs.vocareum page
  • click Account Details
  • click show
  • copy showed text
  • paste it into ~/.aws/credentials

Instance setup - create image

  • go to EC2 service
  • click Instances (running)
  • click right mouse button on instance
  • choose Image and templates
  • choose Create image
  • provide Image name (for example "image_airplanes")
  • uncheck Delete on termination checkbox
  • click Create image
  • go to EC2 service
  • go to Images/AMIs
  • wait until Status of your image change into "available" (don't terminate instance until then!!!)

Prepare AWS Services

Kinesis, S3, Lambda, DynamoDB

  • go to ~/Projects/isp-2020-ZekJakGynDam/ on EC2 instance
  • Prepare aws_services_config.json file in main project directory by aws_services_config_default.json and changing each "XxXxxXXxxXxX" into your AWS user id (12 digits) (don't add this file to repository!). You can also change names of each AWS services elements in this file.
  • run following command:
python aws_services_creator.py

Adding Trigger to Lambda function

  • go to Lambda service page
  • choose "lambda_function_airplanes" function
  • click Add trigger
  • select a trigger ("Kinesis")
  • choose Kinesis stream ("kinesis_data_stream_airplanes")
  • click Add

Local machine configuration

Linux Ubuntu

Configuration is similar to the one described in EC2 section

Windows

C:\Users\USER

where "USER" is user name

  • open labs.vocareum page
  • click Account Details
  • click show
  • copy showed text
  • paste it into
C:\Users\USER\.aws\credentials
  • paste following text
[default]
region = us-east-1
output = json

into

C:\Users\USER\.aws\config:
  • run following command in virtual environment
pip install -r requirements.txt

Credentials

Prepare credentials.json file in main project directory by duplicate credentials_default.json and changing its name (don't add this file to repository!). Fill places with your registrations, access tokens data, aws vocareum cookies data etc.

Run

On EC2 instance run to read airplanes data:

python kinesis\producer.py

On local machine run to visualization airplanes:

python visualisation_animation_plotly.py

Open following url link in browser:

http://127.0.0.1:8050/

isp-2020-zekjakgyndam's People

Contributors

damiano-w avatar gynvael515 avatar zekhire avatar

Stargazers

 avatar

Watchers

 avatar  avatar

isp-2020-zekjakgyndam's Issues

Ustawianie środowiska programistycznego

Na samym początku piszemy na naszych komputerach, a nie na AWS, więc wypadałoby żebyście przygotowali sobie pythonowe (wirtualne) środowiska i założyli konto na opensky. Po prostu spójrzcie w README.md i zróbcie wszystko po kolei. Odpalcie sobie ten przykładowy kod na końcu i sprawdźcie czy wam działa.

Niech każdy z was po zrobieniu tych rzeczy napisze w komentarzu, że się udało, żebym mógł zamknąć issue.

Kolejkowanie requestów

Trzeba zabezpieczyć się przez wysyłaniem zbyt wielu wiadomości do określonego serwisu w zbyt krótkim czasie, bo może to grozić blokadą.

W poszukiwaniu nowego samolotowego API

Opensky-API jest fajne, ale brakuje informacji dotyczących miejsca startowego i lądowania, więc nie jesteśmy w stanie estymować opóźnienia.

Poszukiwania nowego dobrego API można zacząć od:
https://www.aerodatabox.com/

Poza tym tutaj jest spis 10 API:
https://geekflare.com/flight-data-api/#anchor-cirium-flight-stats

  1. Aviationstack odpada bo pokazuje 1000 "przypadkowych" samolotów.
  2. FlightAware wymaga podania danych karty kredytowej
  3. Opensky nie daje informacji dotyczących miejsca startowego i lądowania
  4. Aviation Edge nie oferuje już darmowego API

Instalacja basemap na ubuntu

Trzeba znaleźć działający sposób na zainstalowanie basemap na ubuntu. Jako, że to może być dość uciążliwe, bo pewnie trzeba będzie instalować całą masę dodatkowych pakietów, sugeruję, żeby spisywać wszystkie wpisane komendy do jakiegoś notatnika. Pozwoli nam to na szybką instalację wszystkiego co potrzebne poprzez copy/paste bloków komend w konsolę (lub napisanie programu bash'owego, który zrobi to za nas).

Funkcja Lambda

Należy stworzyć odpowiednią funkcję lambda z wykorzystaniem technologii AWS Lambda. Funkcja ta powinna spełniać następujące zadania:

  • przyjmować i dekodować dane o samolocie wepchnięte do stream'a
  • sprawdzenie czy dany samolot leży na obszarze Polski (z wykorzystaniem bounding boxów i geoapify
  • dodanie odpowiedniego wpisu do tabeli w DynamoDB

Wybór kształtu tabel DynamoDB

Postanowiliśmy, że dane o samolotach będziemy zapisywać do bazy danych z wykorzystaniem technologii DynamoDB. Ze względu na specyficzne możliwości tej technologii trzeba dobrze przemyśleć wygląd tabeli/tabel, wybrać odpowiednie klucze i dane do wyboru.

Sprawdzanie czy dany samolot znajduje się nad terenem Polski

Można ograniczyć wywoływanie geoapify w celu sprawdzenia czy dany samolot jest nad terenem Polski. W tym celu należy zdefiniować odpowiednie obszary geograficzne, które na pewno należą do Polski lub na pewno do niej nie należą. Wówczas w pierwszej kolejności sprawdzane jest czy dany samolot znajduje się w którymś z tych obszarów, a jeśli nie, to dopiero wówczas wysłanie odpowiedniego requesta do geoapify.

Wizualizacja samolotów

Można się już zająć rysowaniem samolotów na mapie Polski. Do zrealizowania są następujące rzeczy:

  • Znalezienie odpowiedniej biblioteki graficznej. Możesz sprawdzić czy biblioteka matplotlib umożliwia wklejanie obrazków w wyznaczony punkt, oraz czy można wklepać obrazek jako tło rysunku
  • Wygenerowanie N losowych punktów i aktualizowanie ich współrzędnych w każdej iteracji pętli (na razie po prostu zrób pętlę w której do każdego punktu dodajesz jakieś dx i dy i to wyrysowujesz)
  • Wklepanie na tło obrazka Polski
  • Wklepanie w miejsce punktów obrazków samolotów (na razie z obojętnie jaką orientacją)

Wybór technologii zrównoleglającej działania

Z listy otrzymanych samolotów trzeba wybrać tylko te, które są w/nad Polską. Sprawdzanie musi wykonywać się równolegle dla każdego samolotu, a do tego trzeba wybrać odpowiednią technologię i je jakoś przetestować.
Wstępnie do sprawdzenia są:

  • kinesis
  • kafka

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.