|
|
{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "%matplotlib inline\n", "\n", "from collections import namedtuple\n", "from math import degrees\n", "\n", "import cartopy.crs as ccrs\n", "import cartopy.feature as cfeature\n", "import ephem\n", "import matplotlib.pyplot as plt\n", "\n", "\n", "philly = ephem.Observer()\n", "philly.lon, philly.lat = '-75.16961', '39.92435'\n", "\n", "portland = ephem.Observer()\n", "portland.lon, portland.lat = '-122.68092', '45.50901'\n", "\n", "fo_29 = ephem.readtle(\n", " \"JAS-2 (FO-29)\",\n", " \"1 24278U 96046B 19132.42991715 .00000011 00000-0 48833-4 0 9994\",\n", " \"2 24278 98.5319 290.9039 0349934 336.8182 21.7496 13.53090691122769\",\n", ")\n", "\n", "lakes = cfeature.NaturalEarthFeature('physical', 'lakes', '50m', facecolor=\"none\")\n", "countries = cfeature.NaturalEarthFeature('cultural', 'admin_0_countries', '50m', facecolor=\"none\")\n", "states = cfeature.NaturalEarthFeature('cultural', 'admin_1_states_provinces_lines', '50m', facecolor=\"none\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "philly.date = '2019/5/12'\n", "portland.date = '2019/5/12'\n", "\n", "def next_n_passses(location, sat, n):\n", " passes = []\n", " for i in range(n):\n", " info = location.next_pass(sat)\n", " passes.append((info[0], info[4], info[3]))\n", " location.date = info[4] + 0.01\n", " return passes\n", "\n", "philly_passes = next_n_passses(philly, fo_29, 20)\n", "portland_passes = next_n_passses(portland, fo_29, 20)\n", "\n", "best_overlap = {\"score\": 10000}\n", "for o_rise, o_set, o_max in philly_passes:\n", " for t_rise, t_set, t_max in portland_passes:\n", " if t_rise < o_set and t_set > o_rise:\n", " score = abs(o_max - t_max)\n", " if best_overlap[\"score\"] > score:\n", " best_overlap = {\n", " \"score\": score,\n", " \"rise\": o_rise\n", " }" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "Point = namedtuple('Point', 'lats lons')\n", "ground_track = Point([], [])\n", "for i in range(300):\n", " t = best_overlap['rise'] - 0.01 + i/10000.0\n", " fo_29.compute(t)\n", " ground_track.lats.append(degrees(fo_29.sublat))\n", " ground_track.lons.append(degrees(fo_29.sublong))\n", "\n", "begin = best_overlap['rise'] - 0.01\n", "philly.date = begin\n", "philly_pass = philly.next_pass(fo_29)\n", "fo_29.compute(philly_pass[0])\n", "philly_aos = Point(degrees(fo_29.sublat), degrees(fo_29.sublong))\n", "\n", "fo_29.compute(philly_pass[2])\n", "philly_max = Point(degrees(fo_29.sublat), degrees(fo_29.sublong))\n", "\n", "fo_29.compute(philly_pass[4])\n", "philly_los = Point(degrees(fo_29.sublat), degrees(fo_29.sublong))\n", "\n", "\n", "portland.date = begin\n", "portland_pass = portland.next_pass(fo_29)\n", "fo_29.compute(portland_pass[0])\n", "portland_aos = Point(degrees(fo_29.sublat), degrees(fo_29.sublong))\n", "\n", "fo_29.compute(portland_pass[2])\n", "portland_max = Point(degrees(fo_29.sublat), degrees(fo_29.sublong))\n", "\n", "fo_29.compute(portland_pass[4])\n", "portland_los = Point(degrees(fo_29.sublat), degrees(fo_29.sublong))" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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 "text/plain": [ "<Figure size 792x612 with 1 Axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "proj = ccrs.AzimuthalEquidistant(\n", " central_longitude=-95,\n", " central_latitude=35,\n", ")\n", "geodetic = ccrs.Geodetic()\n", "\n", "fig = plt.figure(figsize=(11, 8.5))\n", "ax = fig.add_axes([0.1, 0.1, 0.9, 0.9], projection=proj)\n", "ax.set_extent([-140, -50, 5, 85], ccrs.Geodetic())\n", "ax.coastlines(resolution='50m', color=\"grey\", linewidth=0.5, alpha=0.5)\n", "ax.add_feature(lakes, edgecolor=\"grey\", linewidth=0.5, alpha=0.5)\n", "ax.add_feature(states, edgecolor=\"grey\", linewidth=0.5, alpha=0.3, dashes='--')\n", "ax.add_feature(countries, edgecolor=\"grey\", linewidth=0.5, alpha=0.4, dashes='--')\n", "\n", "\n", "ax.plot(ground_track.lons, ground_track.lats, 'k', lw=1, alpha=1, transform=geodetic)\n", "ax.plot([degrees(philly.lon), philly_aos.lons], [degrees(philly.lat), philly_aos.lats], 'k--', lw=0.5, transform=geodetic)\n", "ax.plot([degrees(philly.lon), philly_max.lons], [degrees(philly.lat), philly_max.lats], transform=geodetic)\n", "ax.plot([degrees(philly.lon), philly_los.lons], [degrees(philly.lat), philly_los.lats], 'k--', lw=0.5, transform=geodetic)\n", "\n", "ax.plot([degrees(portland.lon), portland_aos.lons], [degrees(portland.lat), portland_aos.lats], 'k--', lw=0.5, transform=geodetic)\n", "ax.plot([degrees(portland.lon), portland_max.lons], [degrees(portland.lat), portland_max.lats], transform=geodetic)\n", "ax.plot([degrees(portland.lon), portland_los.lons], [degrees(portland.lat), portland_los.lats], 'k--', lw=0.5, transform=geodetic)\n", "\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }
|