pico-tracker/sim/geofence/geofence_telemetry_positive...

464 wiersze
917 KiB
Plaintext
Czysty Zwykły widok Historia

{
"metadata": {
"name": ""
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Import other notebooks\n",
"import io\n",
"from IPython.nbformat import current\n",
"\n",
"def execute_notebook(nbfile):\n",
" with io.open(nbfile) as f:\n",
" nb = current.read(f, 'json')\n",
" \n",
" ip = get_ipython()\n",
" for cell in nb.worksheets[0].cells:\n",
" if cell.cell_type != 'code':\n",
" continue\n",
" ip.run_cell(cell.input)\n",
"\n",
"execute_notebook(\"country_excludes.ipynb\")\n",
"execute_notebook(\"geofence_lib.ipynb\")\n",
"execute_notebook(\"header_files.ipynb\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Load in the json we built with the other geofence notebook"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import json\n",
"json_data = open(\"countries_world.json\").read()\n",
"countries = json.loads(json_data)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### geofence_telemetry_positive\n",
"\n",
"The purpose of this notebook is to create a geofence for areas where UHF telemetry is explicitly required. We should include countries where APRS is not permitted airbourne, and choice areas where there is significant coverage on UHF."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Print countries where data is required\n",
"print \"UHF telemetry required in:\"\n",
"for isocode in aprs_tx_exclude:\n",
" for c in countries:\n",
" if c['isocode'] == isocode and isocode not in telemetry_exclude:\n",
" print \"-\", c['name']"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"UHF telemetry required in:\n",
"- United Kingdom\n",
"- Isle of Man\n",
"- Jersey\n",
"- Guernsey\n",
"- Belgium\n",
"- Luxembourg\n",
"- Portugal\n",
"- France\n",
"- Albania\n",
"- Bosnia and Herz.\n",
"- Croatia\n",
"- Finland\n",
"- Hungary\n",
"- Italy\n",
"- Macedonia\n",
"- Moldova\n",
"- Montenegro\n",
"- Norway\n",
"- Romania\n",
"- Slovakia\n",
"- Sweden\n",
"- Mexico\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"telemetry_required = [c['isocode'] for c in countries\n",
" if c['isocode'] in aprs_tx_exclude and c['isocode'] not in telemetry_exclude]\n",
"\n",
"# Additional countries where telemetry might be recieved\n",
"telemetry_required.append(\"LV\")\n",
"telemetry_required.append(\"IE\")\n",
"\n",
"# Remove portugal, france and italy. Cuts overseas areas, keep main areas later\n",
"telemetry_required.remove(\"PT\")\n",
"telemetry_required.remove(\"FR\")\n",
"telemetry_required.remove(\"IT\")"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 5
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Collect outlines for areas where telemetry_required areas"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"lrange_telemetry_simple_outlines_collection = [c['simple_outlines'] for c in countries if c['isocode'] in telemetry_required]\n",
"lrange_telemetry_simple_outlines = [outline for outlines in lrange_telemetry_simple_outlines_collection for outline in outlines]\n",
"\n",
"# Add other areas where telemetry might be recieved\n",
"spain_portugal = [[-9, 43],[-9, 37],[-1, 37],[4, 43],[-9, 43]] # mainland\n",
"lrange_telemetry_simple_outlines.append(spain_portugal)\n",
"los_angeles = [[-118.25, 34.05],[-118.251, 34.05],[-118.25, 34.051]] # the arko exception\n",
"lrange_telemetry_simple_outlines.append(los_angeles)\n",
"\n",
"for c in countries:\n",
" if c['isocode'] == \"US\":\n",
" us_outlines = c['simple_outlines']\n",
" conus = sorted(us_outlines, key=len, reverse=True)[0]\n",
" lrange_telemetry_simple_outlines.append(conus)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Additional areas for telemetry"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Additional telemetry areas\n",
"additional_telemetry = [\"JP\", \"IS\"] # Japan, Iceland\n",
"\n",
"additional_telemetry_simple_outlines_collection = [c['simple_outlines'] for c in countries if c['isocode'] in additional_telemetry]\n",
"additional_telemetry_simple_outlines = [outline for outlines in additional_telemetry_simple_outlines_collection for outline in outlines]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 7
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"m = Basemap(projection='mill')\n",
" \n",
"m.fillcontinents(color='0.96')\n",
"m.drawcoastlines()\n",
"\n",
"draw_outlines(m, lrange_telemetry_simple_outlines, '#ff0000')\n",
"draw_outlines(m, additional_telemetry_simple_outlines, '#0000ff')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAABGoAAANACAYAAABzJ4vYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xd8jef/x/FXQoIkdkiMICJqRGLEiL1ixm7N+todvnZr\n06KqVI3qoBQtWq1VSmLvLWLUXjGSCAmJhETmOb8/zs/5SglBEO37+XjcjzPudd23JHLeua7PZWE0\nGo2IiIiIiIiIiMhrZ/m6GyAiIiIiIiIiIiYKakREREREREREMggFNSIiIiIiIiIiGYSCGhERERER\nERGRDEJBjYiIiIiIiIhIBqGgRkREREREREQkg8j8pJUWFhavqh0iIiIiIiIiIv8aRqPxse8/Mah5\n0o4iIiIiIiIiIvLsntQxRkOfREREREREREQyCAU1IiIiIiIiIiIZhIIaEREREREREZEMQkGNiIiI\niIiIiEgGoaBGRERERERERCSDUFAjIiIiIiIiIpJBKKgREREREREREckgFNSIiIiIiIiIiGQQCmpE\nRERERERERDIIBTUiIiIiIiIiIhmEghoRERERERERkQxCQY2IiIiIiIiISAahoEZEREREREREJINQ\nUCMiIiIiIiIikkEoqBERERERERERySAU1IiIiIiIiIiIZBAKakREREREREREMggFNSIiIiIiIiIi\nGYSCGhERERERERGRDEJBjYiIiIiIiIhIBqGgRkREREREREQkg1BQIyIiIiIiIiKSQSioERERERER\nERHJIBTUiIiIiIiIiIhkEApqREREREREREQyCAU1IiIiIiIiIiIZhIIaEREREREREZEMQkGNiIiI\niIiIiEgGoaBGRERERERERCSDUFAjIiIiIiIiIpJBKKgREREREREREckgFNSIiIiIiIiIiGQQCmpE\nRERERERERDIIBTUiIiIiIiIiIhmEghoRERERERERkQxCQY2IiIiIiIiISAahoEZEREREREREJINQ\nUCMiIiIiIiIikkEoqBERERERERERySAU1IiIiIiIiIiIZBAKakREREREREREMggFNSIiIiIiIiIi\nGYSCGhERERERERGRDEJBjYiIiIiIiIhIBqGgRkREREREREQkg1BQIyIiIiIiIiKSQSioERERERER\nERHJIBTUiIiIiIiIiIhkEApqREREREREREQyCAU1IiIiIiIiIiIZhIIaEREREREREZEMQkGNiIiI\n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\nRUVx6tQpoqOjadKkSZra+zyM
"text": [
"<matplotlib.figure.Figure at 0x7fe351390450>"
]
}
],
"prompt_number": 8
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Expand and Union"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Generate grids\n",
"lrange_telemetry_grids = lonlat_to_ea_grid(lrange_telemetry_simple_outlines)\n",
"additional_telemetry_grids = lonlat_to_ea_grid(additional_telemetry_simple_outlines)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Now expand and union\n",
"telemetry_shifted_grids = []\n",
"\n",
"# Offset the grids by 500 km for telemetry_required areas\n",
"for grid in lrange_telemetry_grids:\n",
" pc = pyclipper.PyclipperOffset() \n",
" \n",
" if grid:\n",
" pc.AddPath(grid, pyclipper.JT_ROUND, pyclipper.ET_OPENROUND)\n",
" shifted_grid = [(point[0], point[1]) for point in pc.Execute(500*1000)[0]]\n",
" \n",
" telemetry_shifted_grids.append(shifted_grid) \n",
" \n",
"# Offset the grids by 50 km for additional telemetry areas\n",
"for grid in additional_telemetry_grids:\n",
" pc = pyclipper.PyclipperOffset() \n",
" \n",
" if grid:\n",
" pc.AddPath(grid, pyclipper.JT_ROUND, pyclipper.ET_OPENROUND)\n",
" shifted_grid = [(point[0], point[1]) for point in pc.Execute(50*1000)[0]]\n",
" \n",
" telemetry_shifted_grids.append(shifted_grid) \n",
" \n",
"# Union\n",
"pc = pyclipper.Pyclipper()\n",
"pc.AddPaths(telemetry_shifted_grids, pyclipper.PT_SUBJECT, True)\n",
" \n",
"unions = pc.Execute(pyclipper.CT_UNION, pyclipper.PFT_POSITIVE, pyclipper.PFT_POSITIVE)\n",
"telemetry_shifted_grids = [[(point[0], point[1]) for point in union] for union in unions]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 10
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def prepare_simple_grids(grids, tolerance=10*1000): # 10km tolerance\n",
" simple = [simplify_points(points, tolerance) for points in grids]\n",
" return [s for s in simple if len(s) > 2]"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 11
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Simplify\n",
"telemetry_simple_grids = prepare_simple_grids(telemetry_shifted_grids, tolerance=20*1000) # 20km tolerance"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 12
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Back to outlines\n",
"telemetry_shifted_outlines = fix_antiprime_outlines(ea_grid_to_lonlat(telemetry_simple_grids))"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 13
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"telemetry_filtered_outlines = []\n",
"for outline in telemetry_shifted_outlines:\n",
" if (len(outline) > 0):\n",
" telemetry_filtered_outlines.append(outline)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 14
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Map\n",
"m = Basemap(projection='mill')\n",
" \n",
"m.fillcontinents(color='0.96')\n",
"m.drawcoastlines()\n",
"\n",
"draw_outlines(m, telemetry_filtered_outlines, '#ff0000')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "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\nZd8KIYQQ77nc8hZZ+iSE+E9Z
"text": [
"<matplotlib.figure.Figure at 0x7fe351390150>"
]
}
],
"prompt_number": 15
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Map - try an equal area projection\n",
"m = Basemap(projection='cea') # Cylindrial Equal-Area Projection\n",
" \n",
"m.fillcontinents(color='0.96')\n",
"m.drawcoastlines()\n",
"\n",
"draw_outlines(m, telemetry_shifted_outlines, '#ff0000')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAABGoAAAFxCAYAAAArnk75AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXd8FGX+x99JdrPZlE0nvXcSSighQOhVEUQvyIF6ICqK\nBeV+etjOdurZUSxY0dOz00FBeq8BAgRISEJI732T7GbL/P7IzZglCYQSmvN+vZ7XzE59ts088y2f\nr5UgCAIyMjIyMjIyMjIyMjIyMjIyMlcd66vdARkZGRkZGRkZGRkZGRkZGRmZFmRDjYyMjIyMjIyM\njIyMjIyMjMw1gmyokZGRkZGRkZGRkZGRkZGRkblGkA01MjIyMjIyMjIyMjIyMjIyMtcIsqFGRkZG\nRkZGRkZGRkZGRkZG5hpBNtTIyMjIyMjIyMjIyMjIyMjIXCMozrXSysrqSvVDRkZGRkZGRkZGRkZG\nRkZG5k+DIAjtLj+noeZcO8rIyPw5SE5OZunSpefdzt3dHbVajYODA2q1GpVKxb59+65AD7uOsLAw\nnnvuOeCPa6EgCDQ3N7NhwwY0Gg2urq7Y2dlhbW1NWloaK1euvJpdtsDf3x+FQsGZM2c6tX1QUBBx\ncXFYW1tbtPz8fE6cOIG9vT1OTk44ODgAYDQaMRqNGAwGjEYj+fn57R73tttuk7YzmUzSfme3Y8eO\nXa63zquvvorJZMJkMqFWq/Hz88PHxwc7OzuL+5ogCPz++++8+uqrl+3cNxpKYD+wGcjw8+PTLVsg\nJAQU5x1CXBpVVZCYCE8+Cfff37XnAvjqK/juO1i+HJycLulQJpMJg8Eg/Tf0ej11dXVSq6+vZ/z4\n8dja2lJVVYW1tTUuLi6SgywjI4P6+np8fHzw9PTEZDLx2muvYTQacXd3x9nZGYDa2lpOnz6NnZ0d\nKpUKGxsbzGYzJpOJgIAA4uLiaGpqIj09HTc3N5ydnWlubrZogiCgUqmwtraW9jWbzSgUCu6++25s\nbW0v+aO9bCxb1vI9rV59tXsiI9MGs9mMwWCgublZmnZmXq/Xo9Fo0Gg0NDU1YTAYUKlUqNVq1Go1\n7u7ueHt7X+23JyMj0wWcKzDGSjiHJcbKyko21MjIXGOUl5fTrVu3826nUChwdHSUmoODgzTv6elJ\nbGwssbGxdO/enYCAAKyt28+EvJEi67p3746DgwP29vY4ODjw22+/XbZje3h4UFFRcd7tFAoFNjY2\nKBQKlEolCoUChUJBXV0djY2NnT5fcHAwt9xyCyUlJTz++OOSscPGxoZ+/fp1+H22RhAEmpqaqK2t\npampidDQ0E6fX+biEQSB8vJyNBoNSqUSGxubNtsYjUamTZtGeXk53bt3JyYmhpCQEOm/LLaqqipy\nc3O58847L6lPQ4cOZe7cuZJxTqFQ4OLigqurK4GffIL69GlsVq+GK309OHUKhgyBH36AkSO79lyb\nNsErr8CWLRd9iIKCAgICAi5jp64uu3btYtCgQVe7G3/w1FNgbw/PP3+1eyIjY8GmTZsYPXp0lx0/\nMzOTEydOcOrUKTIyMsjMzOTUqVMUFxdjY2NDcHAw1dXVVFdXIwgCdnZ2uLi4SO3dd99l4MCBXdY/\nGRmZi+Nc9hbZUCPzp0Ov11NaWkpJSYnUioqKKC0tRa/XYzAYKCoqIicnBzs7O0JCQqisrESj0ZCf\nn09eXh6NjY0EBgZy8uRJbG1tUVyEZ1kQBOrq6igvL6esrAw3NzciIyM79YD9+++/s379eiorK/nP\nf/7TZr2NjQ0mk6nTfVGr1aSnp+Pu7i5FSwBUVVXx+OOP4+LiQkhICJ6enlhZWZGRkYFKpUKlUvHD\nDz9QXFyMQqHoMKKiNba2tjQ3NwPg6uqKq6sr3bp1Y+/evZ3u79XmnnvuYeHChVhZWWFlZcWoUaO6\npP933HEH8+bNw9PTEw8PD5RK5WU/h8z1R0FBAVlZWezbt4+XX365U/t4e3tz77338sorr1zYyXbv\nhr/8BVJTwcvrInp7GdiyBf76V9i+HaKiuu48p07BTTdBdvYlHaa+vp6ioiLy8/MpKCiQ7hvZ2dnk\n5ubS0NBAaWnpBR2zW7du9O3bl7y8PDIzM/Hx8cHb21vyyDc2Nkr3r+bmZqytrVmyZAl+fn6SEVeM\nZhOjzERjn729Pfb29tfH9WXkSPjHP2D8+Kvdk+ses9mMTqejqamJxsZGGhsb28xXVlZy++23o9Fo\nrnZ3rwv0er30mTY1NVnMt25msxlBENo0aBkbilFtgiBgZWWFvb0906dPv2z9/Pvf/46dnR0lJSX4\n+vry6KOPShGoZ18rWs+bzWZcXFzw8PDAxcWlU+NVGRmZcyMbamT+tBQWFuLv73/FzhcbG4u7u7tk\ngNBoNJIHXLyhxcXFsXDhQjZs2NBmf1dXVwYMGEB8fDwajUYKZz948CAVFRXY2dlx4MABkpOTeeON\nN9rtg8Fg4KGHHuLIkSMUFxdTUFBwzj6r1WoMBgPdunWjtraWnj17kpCQQGJiIr179yYmJuaiPgu1\nWk1TU9NF7Xs1uOmmmy5bhI0gCGzfvp3hw4df0nFcXV1JTExEoVDQ1NREQ0MDjY2N0rSxsRFra2sp\nMkepVGJra4tSqUSpVKJSqfDw8MDT07PD5u7uflGGRpmrx7hx49i5c+cF79ejRw+OHj3a+R20Wujd\nG95+GyZPvuDzXVa+/BLefBNOnoSuejhoagJXV2hs7Lpz/A+TycQzzzzDoUOHOH36NKdPn7ZYr1Ao\nCAoKQq/X4+3tTXx8PH379iU+Pp4ePXqgVqu7tH/XJGZzy/dz+jS4u1/t3lw2TCYTtbW11NfXU19f\nb5EeJ05ra2vbLBO3KykpoaysrMv6d/z4cbp3795lx78WMJlM6PX6S2q7du1i+fLlFsd1d3enR48e\nQMu4YNu2bdK6mTNntjHmiPNpaWkd9tXa2prk5GTCwsIsoqbF5uTkRHl5OX/5y186/f5dXV0lp6MY\nUWljYyNF/4pTaEm3rKyspL6+vl2H4GOPPcZ7773X6XP/mThx4gSvv/463t7e6HQ6yVFbV1eHq6ur\nxdisW7duVFdXk5aWRlZWFkqlEnt7e9atWwe0pOZPnDgRjUaDra2tRVo5wPz586UUWZlrG9lQI3PD\n89lnn3HixAnCw8NRKpXSxUqr1bJ06VJsbGyk/F8vLy9cXV1RKpWYzWaMRiMuLi5ERkbi5+eHi4sL\nBoMBrVZ7zYaJPvvssx16xhsaGnB0dOz0sdzc3KT0G61WS11dnbSuoqIC91YD4traWvLz89Hr9ZJh\nQEzdELUO1q5dy/fff09GRgaBgYGcOHHi4t/oJaBUKiUPUHv89a9/5bPPPkOlUqFUKq9YipdWq6W6\nupqqqiqqqqqkfHQxT/2///0vBw4c4Nlnn6Vnz57odDqam5uldK2zveCCIFjkxLdujY2NVFRUUFZW\n1qaJA4Tq6mqcnZ2prKy06OcLL7zAP/7xjyvymcj8gehBPR+tI9/Ox0svvcTzF5Mq8uCDoNe3aIJc\nCwQGtkTXhIV13Tm6dYOjR0HWg7j2OHkSJk6ErKyr3ZOLxmAwUFlZSWFhIe+++y5Go5Gff/7ZYpvA\nwEBqa2vx9/fn+PHjANjb2+Pm5oZOp6O+vh69Xt/m2KKeidjs7Ows5u3t7aVIKtGhZG9vj52dXYct\nICDghtRG8fT0bJOqrFKpJOeYra2tFDV89uv25m1tbSksLGxjqPnss8/w8/OTXu/Zs4dXXnmFBx98\nkJ49e0rfUWs9GvF4RUVFZGRkoNPpeOSRR65IxFtTUxM1NTXU1NRQW1tLTU0NeXl5VFZWUllZKY1d\nTCYTTU1N7N69u80xnn76aV577bUu7+v1yBdffMH97eitXWgUfGfYtm0bQ4cOvazHlOkaZEONzA2N\nIAgoFAqLB/J7771XiiwQjRCiV6ChoUG6EZ3drKysJC0XBwcHFAoF2dnZkrfKyckJjUaDg4MDGo2G\nadOm0dzczJEjR6iurqaurk4y
"text": [
"<matplotlib.figure.Figure at 0x7fe3513903d0>"
]
}
],
"prompt_number": 16
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"ll_lon=15\n",
"ur_lon=35\n",
"ll_lat=45\n",
"ur_lat=70\n",
"\n",
"# Draw map\n",
"m = Basemap(projection='mill',\n",
" lat_0=(ll_lat+ur_lat)/2, lon_0=0,\n",
" resolution = 'i', area_thresh = 20.0,\n",
" llcrnrlon=ll_lon, llcrnrlat=ll_lat,\n",
" urcrnrlon=ur_lon, urcrnrlat=ur_lat)\n",
"\n",
"m.fillcontinents(color='0.96')\n",
"m.drawcoastlines()\n",
"\n",
"draw_outlines(m, telemetry_shifted_outlines, '#ff0000')"
],
"language": "python",
"metadata": {},
"outputs": [
{
"metadata": {},
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAfYAAAOLCAYAAACiyKGKAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzsnXdcj+v/+J+pVLSUJgmhnR1ZycjKSMiq7H0Oxx7HiuyV\nmZFzJKt0JIRjZ5ZSiUqDUilUKtrj/fvDz/t7+ljZ634+Hj08et/3dV2v69b7fl3X63oNCZFIJEJA\nQEBAQEDgp6DStxZAQEBAQEBA4PMhKHYBAQEBAYGfCEGxCwgICAgI/EQIil1AQEBAQOAnQlDsAgIC\nAgICPxGCYhcQEBAQEPiJkHrXRQkJia8lh4CAgICAgMAH8LZo9Xcq9nc1FPg8lJaWEhkZybRp07Cy\nsiI/P5+dO3eipKRESEhIhRdXIpEIkUjElStXCA8PJzU1lbi4OAICAlBVVaVr166sWbOG7Oxs+vbt\nS+PGjdm2bdtb+7lz5w7dunWjsLAQT09Punbt+s7x7927R9u2bQkICKBWrVoAhIWF0bp1a3r16kXV\nqlXp2rUrjo6O5Ofno6Ojw+XLl9HV1X2tr7KyMnr27ImjoyPDhw9/43gJCQm0bNmSOXPmoKamxpAh\nQxg/fjxr1qyp0PP6GDIzM5k5cyYHDhxg5syZJCYmcv/+fXbt2oWfnx9BQUFkZmbSvXt3hg8fjpKS\n0heTReDXITMzk8jISO7cucPChQs5f/48zZs3/9ZifXaKi4s5deoU1apVo1mzZsjKyn5rkb5r3qUb\n3qvYBb4skpKS/P3331SpUoXg4GDOnj2LoqIirq6uH2QxkZCQIDY2lj59+tC3b1+ePXvG7du3UVdX\nZ8KECYwdO5bHjx9ja2uLpaUlGzZseGM/48ePJy4ujoiICFavXo2qqiqjRo0iPDwcVVXVt46vr6/P\nnDlzsLS0ZO3atTx+/Bh3d3cUFRXx8/MD4MGDBzg6OnLq1CmkpaVJS0ujVq1ar82zUqVK/PHHH8yd\nO5dhw4a98TksXboUSUlJlJWVuXLlCgBVq1at8PP6UEJCQmjXrp34902bNjF9+nQ2bNiAoqIiU6dO\n/WJjC/zaSEhIEBoayq5duzA2NqZx48bfWqQvwpEjR5g6dSqFhYW0aNGCgoICUlNTWblyJTY2Nt9a\nvB8KiXdlnpOQkBB27F8BQ0ND6tWrx6xZs6hduzaVK1dGXl7+g/spLCxEU1MTRUVFrK2tGTZsGK1a\ntRIrxn79+mFiYsLKlSvfqCzv3r1Ly5YtefHiBS4uLkyZMgWAWbNmkZqaire3t7hdWVkZ7u7upKam\nkp+fT15eHiYmJujr6zNs2DDy8/PJyckhLy8PXV1d/vjjD5ycnFBWViYnJ4fu3btz9epVDAwMGD16\nNGPHji0nk0gkolWrVnTp0gUnJyeMjIzKXR89ejQ1a9ZkxowZiEQiwsLC0NDQQFtb+4OfW0VYsmQJ\n27dv5/Tp01y8eJHBgwdTrVq1LzKWgABAaGgoGzZs4PDhw+LPfvvtNxo3bkxgYCCurq4cPnyY3Nxc\n5OXl0dTUpH379lSq9GO6Ttnb22NoaIiMjAyJiYl06NABKSkppk+fjrm5ORs3bkRdXf1bi/nd8C79\nLCj2b0xCQgLx8fH4+Pjg7e2Njo4OEyZMwM7ODhkZmQ/qa82aNaxYsYJFixYxadKkctdCQkIYPHgw\nsbGxbzVx2djY0KZNG+bMmYOdnR0eHh4AFBQU0Lx5c3bs2EHHjh0B2Lt3L8uWLaNXr15UqVKFHTt2\n0KlTJ+Li4nj8+DFOTk54e3tjYWHB1q1bEYlE5Obmkpuby4sXL9DX16dbt25Ur16datWqsWzZstcW\nG9HR0ezcuRN/f38kJSXp2bMngwYNomXLlgQHB9O/f38iIiJ+2BeZgMCbEIlExMfH07RpU0pKSuja\ntSutWrUiLCwMY2Njrl27RllZGdWrV+fw4cM4OTnx4sUL7t27h6SkJD4+PtStW1fcV2JiIjk5OeTk\n5FBWVkbbtm2/S/+pVatWsWnTJurWrcvx48eRlJQEIC8vDxcXF/bt28fQoUPR1tamadOmtG/f/ruc\nx9dCUOzfKeHh4VhbW1NWVoZIJEJFRYW6detSVlZGeHg4CxYseOsZ8/+yf/9+pk2bRsOGDTl58mS5\nP/iSkhL69etH7969mThx4hvbBwQE4OjoSGhoKLVq1eLFixfk5uYCLxV7/fr1uXXrFrq6uhQUFGBg\nYMD27dtp27Yt586dY9KkSUhKSjJq1ChsbW2xtbWlZcuWbNu2DTk5OdTU1MjPz0dBQYGsrCwKCgrY\ntGkTI0aMeO/cXp35+/v7s2PHDpYvX46TkxMdOnQgPT0dJycn7O3t33lUICDwo/DfI6URI0bg6ur6\n2uI1KioKa2trCgoKePr0KfByIdy0aVN0dHR4+PAhAHPmzGHXrl1oamoiLy/Po0ePaNu2LZ6enl9v\nQh9Aeno6DRo0YPv27fTo0aPctfDwcM6ePcuTJ084c+YMCgoKzJ07l969e/+Si/t36edf72l8R9y5\nc4fGjRtz/vx5xo0bh42NDYGBgWhoaODl5cX69etZu3bte/s5c+YMM2bMEO+Ef//9d/r160ebNm3Q\n09NDVVWVzMxMRo0aVa6dSCRi4sSJhIWFMWPGDBYsWICMjAyHDh3it99+E9/n7+9Pw4YNxY5u27Zt\nw8jIiLZt2wKgq6tLYWEhRkZG7Nmzh1OnTlFQUICfnx9qamoUFRVhZmbG8uXLOXnyJFWrVqVFixbc\nvn27Qs9JQkICU1NTZs2ahb+/P3/++Sfm5uZcvHiRvLw8ZsyYgYGBAVlZWRV99AIC3y0bN27E1taW\nuXPnsnHjxjcqrTt37qCurl5uEVCnTh1Gjx5NUlISQUFBREZGsmPHDnx9ffH19eXGjRs8fPiQffv2\nYW9v/11s2jIyMigpKRH/vn79ep49e0Z+fv5r9zZs2JBp06axcuVKgoODmTZtGkuXLsXExIRDhw59\nTbG/e4Qd+zfk1ep07dq12NvbExERQWpqKpcvX8bDwwNFRUUeP37M+PHjWbRo0Wtmp6dPn+Lu7o6b\nmxszZswgKioKbW1tatSogba2Ntra2igoKJCRkQFA69aty7XfuXMnY8aMYcWKFRw8eJDLly+/8SXS\nt29fBg8ejKOjIwDz58/n4cOHYq/6Bw8eMGnSJOLi4ujatSuurq5kZ2djYWGBnp6e2Ay4efNmdu/e\njZ+fHwYGBvj6+n7ULjs7Oxt/f3/xQmXIkCHMmzfvjR72AgI/I0OHDuXIkSNoamoSHx8PvFyo/9c3\nR11dnaFDh5Kbm8vw4cPp3bs3jo6OGBsb4+zszJ9//sm9e/c4d+4cFhYWPHnyBBUVFczMzOjZsyc1\natT4onM4fvw4Q4YMQVZWlgEDBjB06FDMzc0JCAigX79+BAQEvPc7LRKJWLt2LV5eXty5c+eLyvu9\nIZjivyFpaWkEBQXRq1cv4GVIx4YNG7hx4wZhYWG0a9eOK1euEBcXVy5c6/79++Tl5TF//nxCQkKw\ns7Ojbdu2ZGRkkJmZSXx8PCdOnKBv375MmzYNDQ0NoqKiiIyM5O7du0RFRREVFUVmZia6urpkZ2eT\nkpIiluuV2a5q1aooKSmxbt068fn5f0lNTaVZs2YkJyeLdwepqamYmpryxx9/cPToUWJiYlBWVqZx\n48Z4eHggKSlJWVkZ/fr1o27duly9epXbt2+TlJTEjh07OHfuHIcPH/7kcDAnJycSExN5/vw5qqqq\nLFy48LXFi4DAz0ZJSQmNGzcmOTmZlStXMmbMGOClQ+uqVatYsmQJAIMHD2bVqlWYmpoSFBRUzrF0\nwYIFrF27lrFjx9KzZ0+uXbvGsmXL6NChA+fPnwdg9uzZGBsbk5SUhJSUFO3atcPc3JwnT56goaHx\nSXPIz89HQ0MDPz8/VFVV8fLy4tChQ5SVlTFp0iQKCwvx9/fnxIkT7zWz79q1i6VLlzJ79mzGjx+P\nnJwcQUFBhIWFoa+vj4GBAerq
"text": [
"<matplotlib.figure.Figure at 0x7fe34e6d9e90>"
]
}
],
"prompt_number": 17
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"So telemetry will only be active for about 20% of the northern hemisphere. This should help reduce the power usage."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"n_points = 0\n",
"\n",
"for outline in telemetry_shifted_outlines:\n",
" n_points = n_points + len(outline)\n",
" \n",
"print \"Total number of points {}\".format(n_points)\n",
"print \"Across {} outlines\".format(len(telemetry_shifted_outlines))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Total number of points 243\n",
"Across 14 outlines\n"
]
}
],
"prompt_number": 18
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Write to header file"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"write_telemetry_outlines(telemetry_shifted_outlines)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 19
}
],
"metadata": {}
}
]
}