Sam Carroll
Feb 1, 2021

Analyzing Real-Time Satellite Locations with OmniSci

Try HeavyIQ Conversational Analytics on 400 million tweets

Download HEAVY.AI Free, a full-featured version available for use at no cost.


The International Space Station (ISS) has inspired and seeded curiosity in us since its launch in 1998. 

According to, the modular space station orbits the earth every 90 minutes or 16 times per day. This rapid movement results in spectacular orbits and generates tremendous amounts of data.

We started digging into various satellite data platforms to learn more and stumbled upon n2yo, a website dedicated to tracking the ISS, satellites, and space debris. Their free API is straightforward and easy to query.

In this blog post, we use OmniSci's native JupyterLab integration to stream real-time satellite positions into OmniSci from n2yo, transform the API results into an OmniSci compatible format, and explore the information in Immerse.

Access, Query, and Format Data from n2yo

Before creating stunning visualizations, we must first access, query, and format the n2yo data. Let's start by launching JupyterLab from Immerse.

JupyterLab access in Immerse

We'll import all of the required libraries, query the n2yo API, and convert the results into a format capable of being passed to OmniSci's python adapter (pymapd):

Next, we'll convert the formatted JSON object to a schema we can use in OmniSci and check its data types:

The postimestamp column is a Python integer. We'll need to change it to a datetime64[ns], and while we're at it, convert the int64 and float64 columns to int32 and float32:

Next, we'll create a table in OmniSci to match our new pandas dataframe. We'll use a library called ibis, an API inspired by the pandas toolkit, to interact with OmniSci DB.

We'll send the schema above to OmniSci with the following DDL:

As an extra check, we'll compare the schemas between an existing table and the dataframe:

Stream and Explore n2yo Data with Immerse

We can now start streaming data into OmniSci using our newly defined schema. Let's add the new stream to an existing table that persists historical, location-enabled data from many different satellites:

Next, we'll use OmniSci Immerse to visualize the freshly loaded dataset. The pointmap in the lower-left corner is a fascinating display of historical satellite movements.

The network panel reveals that OmniSci isn't moving vast amounts of data to the client to generate the chart. Instead, it's using the GPU to render a compressed png to overlay on a Mapbox basemap:

The bar chart in the lower-middle of the dashboard is selecting the ISS. OmniSci automatically cross-filters the other charts on the dashboard, making it easy to quickly toggle between enormous historical views and current-day snapshots. Below is an example of the current-day:

In a separate pointmap layer, there is a large, red dot that represents the ISS' current position in Orbit:

To calculate the ISS' location, we use a simple view that joins the table on itself to return the satellite ids and their last known position. This view runs independently of the base table, ensuring we always have the ISS' current location:

OmniSci initiates backend queries that brute force scans the table columns instantaneously anytime a user interacts with a chart. The performance of these queries is astounding, all of which come back in milliseconds

Build your own streaming dashboard!

OmniSci is an excellent solution for historical and real-time exploratory data visualization and analysis. Build connections, run analyses, and share your dashboards or streaming applications with us on LinkedInTwitter, or our Community Forums!

Sam Carroll

Sam Carroll is a Solution Architect on HEAVY.AI's Customer Success team. Sam enjoys solving complex data and systems problems for the customers of HEAVY.AI. Before HEAVY.AI, Sam worked as a Solution Architect for Cisco working with their data virtualization platform.