{ "cells": [ { "cell_type": "markdown", "id": "742c3393", "metadata": {}, "source": [ "# Collect Observations\n", "\n", "This example demonstrates how to use direct function calls of the low-level TAT-C library to collect observations of a surface point. Observations show when a satellite-based instrument can observe the point based on spatial and operational constraints." ] }, { "cell_type": "markdown", "id": "bf0fbfcc", "metadata": {}, "source": [ "First we define the satellites for a mission. In this example we define one satellite (NOAA-20) with a single instrument (Visual/Infrared Imager Radiometer Suite, VIIRS) and an orbit derived from a known two-line element set (TLE). The TLE defines the orbital state at an instant in time which can be used to determine future positions of the satellite. The example TLE below for NOAA-20 was collected from [CelesTrak](https://celestrak.org/) around July 2022." ] }, { "cell_type": "code", "execution_count": 1, "id": "1d35caa8-d57f-4a4a-91c0-54b59d4665d6", "metadata": {}, "outputs": [], "source": [ "noaa20_tle = [\n", " \"1 43013U 17073A 22195.78278435 .00000038 00000+0 38919-4 0 9996\",\n", " \"2 43013 98.7169 133.9110 0001202 63.8768 296.2532 14.19561306241107\",\n", "]" ] }, { "cell_type": "markdown", "id": "613e9918-8227-4c1a-a350-ea12a38a4cc2", "metadata": {}, "source": [ "TAT-C allows several types of orbit specifications, one of which being the `TwoLineElements` specification which requires the TLE as an argument." ] }, { "cell_type": "code", "execution_count": 2, "id": "63634767-5bd9-4765-a4ff-f1f21f705baa", "metadata": {}, "outputs": [], "source": [ "from tatc.schemas import TwoLineElements\n", "\n", "noaa20_orbit = TwoLineElements(tle=noaa20_tle)" ] }, { "cell_type": "markdown", "id": "dcafe351-d25c-469d-992c-7989e92cada0", "metadata": {}, "source": [ "Next, we define an instrument to perform observations. The most important parameter is the _field of regard_ which sets the view angle from the satellite to the Earth's surface. The TAT-C `utils` package contains a function to calculate the field of regard from an instrument's altitude (834 km) and swath width (3000 km)." ] }, { "cell_type": "code", "execution_count": 3, "id": "93cce855-971e-4aae-8688-61a205979b62", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "computed field of regard: 111.6 degrees\n" ] } ], "source": [ "from tatc import utils\n", "\n", "viirs_for = utils.swath_width_to_field_of_regard(834e3, 3000e3)\n", "print(f\"computed field of regard: {viirs_for:.1f} degrees\")" ] }, { "cell_type": "markdown", "id": "cd6803d8-b03c-48b2-81ab-84b121ce5f85", "metadata": {}, "source": [ "We can pass the field of regard to create an instrument model of VIIRS." ] }, { "cell_type": "code", "execution_count": 4, "id": "1ec7796a-d1eb-4f1e-bdbe-603fc2db8868", "metadata": {}, "outputs": [], "source": [ "from tatc.schemas import Instrument\n", "\n", "viirs = Instrument(name=\"VIIRS\", field_of_regard=viirs_for)" ] }, { "cell_type": "markdown", "id": "83bd97d1-0de8-4d61-a63d-0a1aa09d4307", "metadata": {}, "source": [ "Finally, we can combine the orbit and instrument to define a new satellite." ] }, { "cell_type": "code", "execution_count": 5, "id": "5bbab563-7c29-4797-b9dd-0b697d431edf", "metadata": {}, "outputs": [], "source": [ "from tatc.schemas import Satellite\n", "\n", "noaa20 = Satellite(name=\"NOAA 20\", orbit=noaa20_orbit, instruments=[viirs])" ] }, { "cell_type": "markdown", "id": "a7c70867", "metadata": {}, "source": [ "Next, we define the point of interest to observe using geodetic coordinates." ] }, { "cell_type": "code", "execution_count": 6, "id": "bd5d2afb-089b-4901-b9b0-14ed5cc2c435", "metadata": {}, "outputs": [], "source": [ "from tatc.schemas import Point\n", "\n", "hoboken = Point(id=0, latitude=40.74259, longitude=-74.02686)" ] }, { "cell_type": "markdown", "id": "8bc4850c-97ff-4099-aaa3-c54e19bf83e1", "metadata": {}, "source": [ "Next, we can identify the starting and ending time of a sample mission period. The starting time is noon UTC on July 14, 2022 and the ending time is 30 days later (noon UTC on August 13, 2022)." ] }, { "cell_type": "code", "execution_count": 7, "id": "1ea162ff-52e4-4852-a48f-6545b3bd89dd", "metadata": {}, "outputs": [], "source": [ "from datetime import datetime, timedelta, timezone\n", "\n", "start = datetime(year=2022, month=7, day=14, hour=12, tzinfo=timezone.utc)\n", "end = start + timedelta(days=30)" ] }, { "cell_type": "markdown", "id": "8ea52795-c3f3-4d0c-ab4d-f4ad2fc38918", "metadata": {}, "source": [ "The `collect_observations` analysis function identifies all of the observation opportunities of a point by a satellite instrument between the starting and ending time. Results are formatted as a flat GeoDataFrame which is similar to a regular pandas DataFrame with a geospatial column labeled `geometry`. Other columns:\n", " * `start`: observation rise time (or mission start for first observation)\n", " * `end`: observation set time (or mission end for last observation)\n", " * `epoch`: observation midpoint\n", " * `sat_alt`: satellite altitude angle (degrees) at epoch\n", " * `sat_az`: satellite azimuth angle (degrees) at epoch" ] }, { "cell_type": "code", "execution_count": 8, "id": "6d41f563-cdbc-4d5b-acd7-635c250c39b7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
point_idgeometrysatelliteinstrumentstartendepochsat_altsat_az
00POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-07-14 17:14:31.310369+00:002022-07-14 17:21:09.157255+00:002022-07-14 17:17:50.233812+00:0045.83241369.766369
10POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-07-14 18:56:58.849666+00:002022-07-14 18:59:29.309441+00:002022-07-14 18:58:14.079553500+00:0022.556721266.369724
20POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-07-15 07:12:52.951632+00:002022-07-15 07:19:53.364882+00:002022-07-15 07:16:23.158257+00:0054.469247288.828497
30POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-07-15 16:56:31.366398+00:002022-07-15 17:01:47.933741+00:002022-07-15 16:59:09.650069500+00:0031.73111966.726221
40POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-07-15 18:36:30.433195+00:002022-07-15 18:42:04.442407+00:002022-07-15 18:39:17.437801+00:0033.133927263.486527
..............................
750POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-08-11 16:50:18.188008+00:002022-08-11 16:54:52.763667+00:002022-08-11 16:52:35.475837500+00:0028.09850665.027713
760POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-08-11 18:29:34.474832+00:002022-08-11 18:35:40.954880+00:002022-08-11 18:32:37.714856+00:0037.899973263.363098
770POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-08-12 06:47:16.593473+00:002022-08-12 06:54:45.463780+00:002022-08-12 06:51:01.028626500+00:0089.184043156.518247
780POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-08-12 18:10:11.765146+00:002022-08-12 18:17:18.069412+00:002022-08-12 18:13:44.917279+00:0056.535506261.467055
790POINT Z (-74.02686 40.74259 0)NOAA 20VIIRS2022-08-13 06:28:34.773044+00:002022-08-13 06:35:48.839408+00:002022-08-13 06:32:11.806226+00:0061.217019102.685206
\n", "

80 rows × 9 columns

\n", "
" ], "text/plain": [ " point_id geometry satellite instrument \\\n", "0 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "1 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "2 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "3 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "4 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", ".. ... ... ... ... \n", "75 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "76 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "77 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "78 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "79 0 POINT Z (-74.02686 40.74259 0) NOAA 20 VIIRS \n", "\n", " start end \\\n", "0 2022-07-14 17:14:31.310369+00:00 2022-07-14 17:21:09.157255+00:00 \n", "1 2022-07-14 18:56:58.849666+00:00 2022-07-14 18:59:29.309441+00:00 \n", "2 2022-07-15 07:12:52.951632+00:00 2022-07-15 07:19:53.364882+00:00 \n", "3 2022-07-15 16:56:31.366398+00:00 2022-07-15 17:01:47.933741+00:00 \n", "4 2022-07-15 18:36:30.433195+00:00 2022-07-15 18:42:04.442407+00:00 \n", ".. ... ... \n", "75 2022-08-11 16:50:18.188008+00:00 2022-08-11 16:54:52.763667+00:00 \n", "76 2022-08-11 18:29:34.474832+00:00 2022-08-11 18:35:40.954880+00:00 \n", "77 2022-08-12 06:47:16.593473+00:00 2022-08-12 06:54:45.463780+00:00 \n", "78 2022-08-12 18:10:11.765146+00:00 2022-08-12 18:17:18.069412+00:00 \n", "79 2022-08-13 06:28:34.773044+00:00 2022-08-13 06:35:48.839408+00:00 \n", "\n", " epoch sat_alt sat_az \n", "0 2022-07-14 17:17:50.233812+00:00 45.832413 69.766369 \n", "1 2022-07-14 18:58:14.079553500+00:00 22.556721 266.369724 \n", "2 2022-07-15 07:16:23.158257+00:00 54.469247 288.828497 \n", "3 2022-07-15 16:59:09.650069500+00:00 31.731119 66.726221 \n", "4 2022-07-15 18:39:17.437801+00:00 33.133927 263.486527 \n", ".. ... ... ... \n", "75 2022-08-11 16:52:35.475837500+00:00 28.098506 65.027713 \n", "76 2022-08-11 18:32:37.714856+00:00 37.899973 263.363098 \n", "77 2022-08-12 06:51:01.028626500+00:00 89.184043 156.518247 \n", "78 2022-08-12 18:13:44.917279+00:00 56.535506 261.467055 \n", "79 2022-08-13 06:32:11.806226+00:00 61.217019 102.685206 \n", "\n", "[80 rows x 9 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tatc.analysis import collect_observations\n", "\n", "results = collect_observations(hoboken, noaa20, start, end)\n", "display(results)" ] }, { "cell_type": "markdown", "id": "0b1c3c5b-a27f-4bf4-927d-22956e290687", "metadata": {}, "source": [ "The `aggregate_observations` function groups observations of points to compute metrics like access and revisit.\n", " * `access`: duration of an observation\n", " * `revisit`: duration since the prior observation (note: the first observation has `NaT` for missing data" ] }, { "cell_type": "code", "execution_count": 9, "id": "b3c10bfb-3ebe-48e7-8299-f9ba86ead594", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
geometrypoint_idsatelliteinstrumentstartepochendaccessrevisit
0POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-07-14 17:14:31.310369+00:002022-07-14 17:17:50.233811968+00:002022-07-14 17:21:09.157255+00:000 days 00:06:37.846886NaT
1POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-07-14 18:56:58.849666+00:002022-07-14 18:58:14.079553536+00:002022-07-14 18:59:29.309441+00:000 days 00:02:30.4597750 days 01:35:49.692411
2POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-07-15 07:12:52.951632+00:002022-07-15 07:16:23.158256896+00:002022-07-15 07:19:53.364882+00:000 days 00:07:00.4132500 days 12:13:23.642191
3POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-07-15 16:56:31.366398+00:002022-07-15 16:59:09.650069504+00:002022-07-15 17:01:47.933741+00:000 days 00:05:16.5673430 days 09:36:38.001516
4POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-07-15 18:36:30.433195+00:002022-07-15 18:39:17.437800960+00:002022-07-15 18:42:04.442407+00:000 days 00:05:34.0092120 days 01:34:42.499454
..............................
75POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-08-11 16:50:18.188008+00:002022-08-11 16:52:35.475837440+00:002022-08-11 16:54:52.763667+00:000 days 00:04:34.5756590 days 09:36:54.523333
76POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-08-11 18:29:34.474832+00:002022-08-11 18:32:37.714855936+00:002022-08-11 18:35:40.954880+00:000 days 00:06:06.4800480 days 01:34:41.711165
77POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-08-12 06:47:16.593473+00:002022-08-12 06:51:01.028626432+00:002022-08-12 06:54:45.463780+00:000 days 00:07:28.8703070 days 12:11:35.638593
78POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-08-12 18:10:11.765146+00:002022-08-12 18:13:44.917278976+00:002022-08-12 18:17:18.069412+00:000 days 00:07:06.3042660 days 11:15:26.301366
79POINT Z (-74.02686 40.74259 0)0NOAA 20VIIRS2022-08-13 06:28:34.773044+00:002022-08-13 06:32:11.806225920+00:002022-08-13 06:35:48.839408+00:000 days 00:07:14.0663640 days 12:11:16.703632
\n", "

80 rows × 9 columns

\n", "
" ], "text/plain": [ " geometry point_id satellite instrument \\\n", "0 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "1 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "2 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "3 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "4 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", ".. ... ... ... ... \n", "75 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "76 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "77 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "78 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "79 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 VIIRS \n", "\n", " start epoch \\\n", "0 2022-07-14 17:14:31.310369+00:00 2022-07-14 17:17:50.233811968+00:00 \n", "1 2022-07-14 18:56:58.849666+00:00 2022-07-14 18:58:14.079553536+00:00 \n", "2 2022-07-15 07:12:52.951632+00:00 2022-07-15 07:16:23.158256896+00:00 \n", "3 2022-07-15 16:56:31.366398+00:00 2022-07-15 16:59:09.650069504+00:00 \n", "4 2022-07-15 18:36:30.433195+00:00 2022-07-15 18:39:17.437800960+00:00 \n", ".. ... ... \n", "75 2022-08-11 16:50:18.188008+00:00 2022-08-11 16:52:35.475837440+00:00 \n", "76 2022-08-11 18:29:34.474832+00:00 2022-08-11 18:32:37.714855936+00:00 \n", "77 2022-08-12 06:47:16.593473+00:00 2022-08-12 06:51:01.028626432+00:00 \n", "78 2022-08-12 18:10:11.765146+00:00 2022-08-12 18:13:44.917278976+00:00 \n", "79 2022-08-13 06:28:34.773044+00:00 2022-08-13 06:32:11.806225920+00:00 \n", "\n", " end access \\\n", "0 2022-07-14 17:21:09.157255+00:00 0 days 00:06:37.846886 \n", "1 2022-07-14 18:59:29.309441+00:00 0 days 00:02:30.459775 \n", "2 2022-07-15 07:19:53.364882+00:00 0 days 00:07:00.413250 \n", "3 2022-07-15 17:01:47.933741+00:00 0 days 00:05:16.567343 \n", "4 2022-07-15 18:42:04.442407+00:00 0 days 00:05:34.009212 \n", ".. ... ... \n", "75 2022-08-11 16:54:52.763667+00:00 0 days 00:04:34.575659 \n", "76 2022-08-11 18:35:40.954880+00:00 0 days 00:06:06.480048 \n", "77 2022-08-12 06:54:45.463780+00:00 0 days 00:07:28.870307 \n", "78 2022-08-12 18:17:18.069412+00:00 0 days 00:07:06.304266 \n", "79 2022-08-13 06:35:48.839408+00:00 0 days 00:07:14.066364 \n", "\n", " revisit \n", "0 NaT \n", "1 0 days 01:35:49.692411 \n", "2 0 days 12:13:23.642191 \n", "3 0 days 09:36:38.001516 \n", "4 0 days 01:34:42.499454 \n", ".. ... \n", "75 0 days 09:36:54.523333 \n", "76 0 days 01:34:41.711165 \n", "77 0 days 12:11:35.638593 \n", "78 0 days 11:15:26.301366 \n", "79 0 days 12:11:16.703632 \n", "\n", "[80 rows x 9 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tatc.analysis import aggregate_observations\n", "\n", "aggregated_results = aggregate_observations(results)\n", "display(aggregated_results)" ] }, { "cell_type": "markdown", "id": "529b44f5-26a8-4828-b848-43749d3bd7d8", "metadata": {}, "source": [ "Finally, TAT-C includes a supplemental method `reduce_observations` to compute descriptive statistics." ] }, { "cell_type": "code", "execution_count": 10, "id": "06182408-dd57-4824-819b-4115520a07e7", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
point_idgeometryaccessrevisitsamples
00POINT Z (-74.02686 40.74259 0)0 days 00:05:55.4911480 days 08:52:45.04097880
\n", "
" ], "text/plain": [ " point_id geometry access \\\n", "0 0 POINT Z (-74.02686 40.74259 0) 0 days 00:05:55.491148 \n", "\n", " revisit samples \n", "0 0 days 08:52:45.040978 80 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tatc.analysis import reduce_observations\n", "\n", "reduced_results = reduce_observations(aggregated_results)\n", "display(reduced_results)" ] }, { "cell_type": "markdown", "id": "4bc6eb4a-942c-4467-a89b-28a6ef8fad03", "metadata": {}, "source": [ "The same sequence of operations can be repeated for satellite constellations. For example, the following constellation starts with NOAA-20 as a \"template\" and arranges 3 satellites in 3 orbital planes following a Walker star geometry." ] }, { "cell_type": "code", "execution_count": 11, "id": "ba6f1632-f334-4482-bad1-f0dfdf0fa7df", "metadata": {}, "outputs": [], "source": [ "from tatc.schemas import WalkerConstellation\n", "\n", "const = WalkerConstellation(\n", " name=\"NOAA 20\",\n", " orbit=noaa20_orbit,\n", " instruments=[viirs],\n", " number_satellites=3,\n", " number_planes=3,\n", " configuration=\"star\",\n", ")" ] }, { "cell_type": "markdown", "id": "fbd888a1-7013-4e6b-a597-17cf5bbd2036", "metadata": {}, "source": [ "When using constellations or lists of satellites, use the `collect_multi_observations` function call. Note that it will collect observations for all defined instruments." ] }, { "cell_type": "code", "execution_count": 12, "id": "fa4ca60d-7bb8-4fa1-abd7-914efc9d146c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
point_idgeometrysatelliteinstrumentstartendepochsat_altsat_az
00POINT Z (-74.02686 40.74259 0)NOAA 20 3VIIRS2022-07-14 14:18:41.843832+00:002022-07-14 14:25:32.984712+00:002022-07-14 14:22:07.414272+00:0049.13476499.453987
10POINT Z (-74.02686 40.74259 0)NOAA 20 3VIIRS2022-07-14 16:00:48.305713+00:002022-07-14 16:03:09.455300+00:002022-07-14 16:01:58.880506500+00:0022.391592296.411261
20POINT Z (-74.02686 40.74259 0)NOAA 20 1VIIRS2022-07-14 17:14:31.310369+00:002022-07-14 17:21:09.157255+00:002022-07-14 17:17:50.233812+00:0045.83241369.766369
30POINT Z (-74.02686 40.74259 0)NOAA 20 1VIIRS2022-07-14 18:56:58.849666+00:002022-07-14 18:59:29.309441+00:002022-07-14 18:58:14.079553500+00:0022.556721266.369724
40POINT Z (-74.02686 40.74259 0)NOAA 20 2VIIRS2022-07-14 20:40:17.146080+00:002022-07-14 20:42:53.973151+00:002022-07-14 20:41:35.559615500+00:0022.80140163.710155
..............................
2370POINT Z (-74.02686 40.74259 0)NOAA 20 3VIIRS2022-08-13 00:58:07.584550+00:002022-08-13 01:03:35.190820+00:002022-08-13 01:00:51.387685+00:0032.87065366.168331
2380POINT Z (-74.02686 40.74259 0)NOAA 20 3VIIRS2022-08-13 02:38:19.726352+00:002022-08-13 02:43:41.909195+00:002022-08-13 02:41:00.817773500+00:0031.910221264.638645
2390POINT Z (-74.02686 40.74259 0)NOAA 20 1VIIRS2022-08-13 06:28:34.773044+00:002022-08-13 06:35:48.839408+00:002022-08-13 06:32:11.806226+00:0061.217019102.685206
2400POINT Z (-74.02686 40.74259 0)NOAA 20 2VIIRS2022-08-13 09:53:07.157574+00:002022-08-13 09:57:51.075326+00:002022-08-13 09:55:29.116450+00:0028.41687496.047271
2410POINT Z (-74.02686 40.74259 0)NOAA 20 2VIIRS2022-08-13 11:32:45.365663+00:002022-08-13 11:38:40.975563+00:002022-08-13 11:35:43.170613+00:0036.746860291.210499
\n", "

242 rows × 9 columns

\n", "
" ], "text/plain": [ " point_id geometry satellite instrument \\\n", "0 0 POINT Z (-74.02686 40.74259 0) NOAA 20 3 VIIRS \n", "1 0 POINT Z (-74.02686 40.74259 0) NOAA 20 3 VIIRS \n", "2 0 POINT Z (-74.02686 40.74259 0) NOAA 20 1 VIIRS \n", "3 0 POINT Z (-74.02686 40.74259 0) NOAA 20 1 VIIRS \n", "4 0 POINT Z (-74.02686 40.74259 0) NOAA 20 2 VIIRS \n", ".. ... ... ... ... \n", "237 0 POINT Z (-74.02686 40.74259 0) NOAA 20 3 VIIRS \n", "238 0 POINT Z (-74.02686 40.74259 0) NOAA 20 3 VIIRS \n", "239 0 POINT Z (-74.02686 40.74259 0) NOAA 20 1 VIIRS \n", "240 0 POINT Z (-74.02686 40.74259 0) NOAA 20 2 VIIRS \n", "241 0 POINT Z (-74.02686 40.74259 0) NOAA 20 2 VIIRS \n", "\n", " start end \\\n", "0 2022-07-14 14:18:41.843832+00:00 2022-07-14 14:25:32.984712+00:00 \n", "1 2022-07-14 16:00:48.305713+00:00 2022-07-14 16:03:09.455300+00:00 \n", "2 2022-07-14 17:14:31.310369+00:00 2022-07-14 17:21:09.157255+00:00 \n", "3 2022-07-14 18:56:58.849666+00:00 2022-07-14 18:59:29.309441+00:00 \n", "4 2022-07-14 20:40:17.146080+00:00 2022-07-14 20:42:53.973151+00:00 \n", ".. ... ... \n", "237 2022-08-13 00:58:07.584550+00:00 2022-08-13 01:03:35.190820+00:00 \n", "238 2022-08-13 02:38:19.726352+00:00 2022-08-13 02:43:41.909195+00:00 \n", "239 2022-08-13 06:28:34.773044+00:00 2022-08-13 06:35:48.839408+00:00 \n", "240 2022-08-13 09:53:07.157574+00:00 2022-08-13 09:57:51.075326+00:00 \n", "241 2022-08-13 11:32:45.365663+00:00 2022-08-13 11:38:40.975563+00:00 \n", "\n", " epoch sat_alt sat_az \n", "0 2022-07-14 14:22:07.414272+00:00 49.134764 99.453987 \n", "1 2022-07-14 16:01:58.880506500+00:00 22.391592 296.411261 \n", "2 2022-07-14 17:17:50.233812+00:00 45.832413 69.766369 \n", "3 2022-07-14 18:58:14.079553500+00:00 22.556721 266.369724 \n", "4 2022-07-14 20:41:35.559615500+00:00 22.801401 63.710155 \n", ".. ... ... ... \n", "237 2022-08-13 01:00:51.387685+00:00 32.870653 66.168331 \n", "238 2022-08-13 02:41:00.817773500+00:00 31.910221 264.638645 \n", "239 2022-08-13 06:32:11.806226+00:00 61.217019 102.685206 \n", "240 2022-08-13 09:55:29.116450+00:00 28.416874 96.047271 \n", "241 2022-08-13 11:35:43.170613+00:00 36.746860 291.210499 \n", "\n", "[242 rows x 9 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from tatc.analysis import collect_multi_observations\n", "\n", "results = collect_multi_observations(hoboken, const, start, end)\n", "display(results)" ] }, { "cell_type": "markdown", "id": "e6c7f0f3-995b-4d73-a257-c0dfe4030f7a", "metadata": {}, "source": [ "Similar to the single-satellite case, `aggregate_observations` adds access and revisit information; however, these metrics are now computed for the aggregate constellation." ] }, { "cell_type": "code", "execution_count": 13, "id": "e886c08b-e5ac-4276-8623-a3cf94063ba2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
geometrypoint_idsatelliteinstrumentstartepochendaccessrevisit
0POINT Z (-74.02686 40.74259 0)0NOAA 20 3VIIRS2022-07-14 14:18:41.843832+00:002022-07-14 14:22:07.414272+00:002022-07-14 14:25:32.984712+00:000 days 00:06:51.140880NaT
1POINT Z (-74.02686 40.74259 0)0NOAA 20 3VIIRS2022-07-14 16:00:48.305713+00:002022-07-14 16:01:58.880506624+00:002022-07-14 16:03:09.455300+00:000 days 00:02:21.1495870 days 01:35:15.321001
2POINT Z (-74.02686 40.74259 0)0NOAA 20 1VIIRS2022-07-14 17:14:31.310369+00:002022-07-14 17:17:50.233811968+00:002022-07-14 17:21:09.157255+00:000 days 00:06:37.8468860 days 01:11:21.855069
3POINT Z (-74.02686 40.74259 0)0NOAA 20 1VIIRS2022-07-14 18:56:58.849666+00:002022-07-14 18:58:14.079553536+00:002022-07-14 18:59:29.309441+00:000 days 00:02:30.4597750 days 01:35:49.692411
4POINT Z (-74.02686 40.74259 0)0NOAA 20 2VIIRS2022-07-14 20:40:17.146080+00:002022-07-14 20:41:35.559615488+00:002022-07-14 20:42:53.973151+00:000 days 00:02:36.8270710 days 01:40:47.836639
..............................
237POINT Z (-74.02686 40.74259 0)0NOAA 20 3VIIRS2022-08-13 00:58:07.584550+00:002022-08-13 01:00:51.387685120+00:002022-08-13 01:03:35.190820+00:000 days 00:05:27.6062700 days 03:17:15.434013
238POINT Z (-74.02686 40.74259 0)0NOAA 20 3VIIRS2022-08-13 02:38:19.726352+00:002022-08-13 02:41:00.817773568+00:002022-08-13 02:43:41.909195+00:000 days 00:05:22.1828430 days 01:34:44.535532
239POINT Z (-74.02686 40.74259 0)0NOAA 20 1VIIRS2022-08-13 06:28:34.773044+00:002022-08-13 06:32:11.806225920+00:002022-08-13 06:35:48.839408+00:000 days 00:07:14.0663640 days 03:44:52.863849
240POINT Z (-74.02686 40.74259 0)0NOAA 20 2VIIRS2022-08-13 09:53:07.157574+00:002022-08-13 09:55:29.116450048+00:002022-08-13 09:57:51.075326+00:000 days 00:04:43.9177520 days 03:17:18.318166
241POINT Z (-74.02686 40.74259 0)0NOAA 20 2VIIRS2022-08-13 11:32:45.365663+00:002022-08-13 11:35:43.170612992+00:002022-08-13 11:38:40.975563+00:000 days 00:05:55.6099000 days 01:34:54.290337
\n", "

242 rows × 9 columns

\n", "
" ], "text/plain": [ " geometry point_id satellite instrument \\\n", "0 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 3 VIIRS \n", "1 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 3 VIIRS \n", "2 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 1 VIIRS \n", "3 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 1 VIIRS \n", "4 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 2 VIIRS \n", ".. ... ... ... ... \n", "237 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 3 VIIRS \n", "238 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 3 VIIRS \n", "239 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 1 VIIRS \n", "240 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 2 VIIRS \n", "241 POINT Z (-74.02686 40.74259 0) 0 NOAA 20 2 VIIRS \n", "\n", " start epoch \\\n", "0 2022-07-14 14:18:41.843832+00:00 2022-07-14 14:22:07.414272+00:00 \n", "1 2022-07-14 16:00:48.305713+00:00 2022-07-14 16:01:58.880506624+00:00 \n", "2 2022-07-14 17:14:31.310369+00:00 2022-07-14 17:17:50.233811968+00:00 \n", "3 2022-07-14 18:56:58.849666+00:00 2022-07-14 18:58:14.079553536+00:00 \n", "4 2022-07-14 20:40:17.146080+00:00 2022-07-14 20:41:35.559615488+00:00 \n", ".. ... ... \n", "237 2022-08-13 00:58:07.584550+00:00 2022-08-13 01:00:51.387685120+00:00 \n", "238 2022-08-13 02:38:19.726352+00:00 2022-08-13 02:41:00.817773568+00:00 \n", "239 2022-08-13 06:28:34.773044+00:00 2022-08-13 06:32:11.806225920+00:00 \n", "240 2022-08-13 09:53:07.157574+00:00 2022-08-13 09:55:29.116450048+00:00 \n", "241 2022-08-13 11:32:45.365663+00:00 2022-08-13 11:35:43.170612992+00:00 \n", "\n", " end access \\\n", "0 2022-07-14 14:25:32.984712+00:00 0 days 00:06:51.140880 \n", "1 2022-07-14 16:03:09.455300+00:00 0 days 00:02:21.149587 \n", "2 2022-07-14 17:21:09.157255+00:00 0 days 00:06:37.846886 \n", "3 2022-07-14 18:59:29.309441+00:00 0 days 00:02:30.459775 \n", "4 2022-07-14 20:42:53.973151+00:00 0 days 00:02:36.827071 \n", ".. ... ... \n", "237 2022-08-13 01:03:35.190820+00:00 0 days 00:05:27.606270 \n", "238 2022-08-13 02:43:41.909195+00:00 0 days 00:05:22.182843 \n", "239 2022-08-13 06:35:48.839408+00:00 0 days 00:07:14.066364 \n", "240 2022-08-13 09:57:51.075326+00:00 0 days 00:04:43.917752 \n", "241 2022-08-13 11:38:40.975563+00:00 0 days 00:05:55.609900 \n", "\n", " revisit \n", "0 NaT \n", "1 0 days 01:35:15.321001 \n", "2 0 days 01:11:21.855069 \n", "3 0 days 01:35:49.692411 \n", "4 0 days 01:40:47.836639 \n", ".. ... \n", "237 0 days 03:17:15.434013 \n", "238 0 days 01:34:44.535532 \n", "239 0 days 03:44:52.863849 \n", "240 0 days 03:17:18.318166 \n", "241 0 days 01:34:54.290337 \n", "\n", "[242 rows x 9 columns]" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "aggregated_results = aggregate_observations(results)\n", "display(aggregated_results)" ] }, { "cell_type": "markdown", "id": "095768c9-a87d-4e80-9f5a-d10534e4f462", "metadata": {}, "source": [ "Finally, the `reduce_observations` function computes descriptive statistics for the constellation." ] }, { "cell_type": "code", "execution_count": 14, "id": "339198d4-0e32-4b32-96c9-32c006ec3d81", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
point_idgeometryaccessrevisitsamples
00POINT Z (-74.02686 40.74259 0)0 days 00:05:55.5208300 days 02:52:38.353074242
\n", "
" ], "text/plain": [ " point_id geometry access \\\n", "0 0 POINT Z (-74.02686 40.74259 0) 0 days 00:05:55.520830 \n", "\n", " revisit samples \n", "0 0 days 02:52:38.353074 242 " ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "reduced_results = reduce_observations(aggregated_results)\n", "display(reduced_results)" ] }, { "cell_type": "markdown", "id": "c647e94c-80c2-4399-b18b-033e87447b7e", "metadata": {}, "source": [ "The workflow can enable sensitivity analyses, for example, determining how the number of satellites in a Walker star constellation affect mean revisit time." ] }, { "cell_type": "code", "execution_count": 15, "id": "d504861d-2c2d-4123-99cf-4686a82c7c50", "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import numpy as np\n", "\n", "n = np.arange(1, 7)\n", "revisit = [\n", " reduce_observations(\n", " aggregate_observations(\n", " collect_multi_observations(\n", " hoboken,\n", " WalkerConstellation(\n", " name=\"NOAA 20\",\n", " orbit=noaa20_orbit,\n", " instruments=[viirs],\n", " number_satellites=i,\n", " number_planes=i,\n", " configuration=\"star\",\n", " ),\n", " start,\n", " end,\n", " )\n", " )\n", " )\n", " .iloc[0]\n", " .revisit\n", " / timedelta(hours=1)\n", " for i in n\n", "]\n", "\n", "import matplotlib.pyplot as plt\n", "\n", "plt.figure()\n", "plt.plot(n, revisit, \".-\")\n", "plt.xlabel(\"Number Satellites/Planes (Walker Star)\")\n", "plt.ylabel(\"Mean Revisit (hr)\")\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "tatc", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.14" } }, "nbformat": 4, "nbformat_minor": 5 }