kopia lustrzana https://github.com/bristol-seds/pico-tracker
733 wiersze
1.2 MiB
Plaintext
733 wiersze
1.2 MiB
Plaintext
![]() |
{
|
||
|
"metadata": {
|
||
|
"name": ""
|
||
|
},
|
||
|
"nbformat": 3,
|
||
|
"nbformat_minor": 0,
|
||
|
"worksheets": [
|
||
|
{
|
||
|
"cells": [
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Load in the json we build 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": 97
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Make a list of the countries to exclude telemetry from"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# North Korea, Yemen, China???\n",
|
||
|
"telemetry_tx_exclude = ['KP', 'YE', 'CN']\n",
|
||
|
"\n",
|
||
|
"# Print back countries\n",
|
||
|
"print \"No Telemetry in:\"\n",
|
||
|
"for isocode in telemetry_tx_exclude:\n",
|
||
|
" for c in countries:\n",
|
||
|
" if c['isocode'] == isocode:\n",
|
||
|
" print \"-\", c['name']"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"output_type": "stream",
|
||
|
"stream": "stdout",
|
||
|
"text": [
|
||
|
"No Telemetry in:\n",
|
||
|
"- N. Korea\n",
|
||
|
"- Yemen\n",
|
||
|
"- China\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 98
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"It's going to make more sense to have a region where we *don't* do telemetry.\n",
|
||
|
"\n",
|
||
|
"This is going to be above the oceans, poles and the countries about.\n",
|
||
|
"\n",
|
||
|
"We should have a region that covers everywhere, subtract all expanded countries from it, and then add the countries above"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# We'll need basemap and friends\n",
|
||
|
"\n",
|
||
|
"import numpy as np\n",
|
||
|
"import matplotlib.pyplot as plt\n",
|
||
|
"import pylab\n",
|
||
|
"from datetime import datetime\n",
|
||
|
"from mpl_toolkits.basemap import Basemap, addcyclic\n",
|
||
|
"\n",
|
||
|
"%matplotlib inline\n",
|
||
|
"pylab.rcParams['figure.figsize'] = (20.0, 16.0)"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 99
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# And a handy functions for drawing outlines\n",
|
||
|
"def draw_outlines(m, outlines, color='#ff0000'):\n",
|
||
|
" \n",
|
||
|
" for outline in outlines:\n",
|
||
|
" if len(outline) > 2:\n",
|
||
|
" \n",
|
||
|
" lon = [point[0] for point in outline]\n",
|
||
|
" lat = [point[1] for point in outline]\n",
|
||
|
" \n",
|
||
|
" m.plot(lon, lat, alpha=1, c=color, latlon=True)"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 100
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# Draw map of current country outlines we already have\n",
|
||
|
"m = Basemap(projection='mill')\n",
|
||
|
" \n",
|
||
|
"m.fillcontinents(color='0.96')\n",
|
||
|
"m.drawcoastlines()\n",
|
||
|
"\n",
|
||
|
"for c in countries:\n",
|
||
|
" draw_outlines(m, c['simple_outlines'], '#'+c['colour'][2:])"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data",
|
||
|
"png": "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\nGRlkZGTQoUMHrFYrhw8fPmao
|
||
|
"text": [
|
||
|
"<matplotlib.figure.Figure at 0x7fcb7b4db650>"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 101
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Simplify"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# \n",
|
||
|
"# from http://mappinghacks.com/code/dp.py.txt\n",
|
||
|
"#\n",
|
||
|
"\n",
|
||
|
"# pure-Python Douglas-Peucker line simplification/generalization\n",
|
||
|
"#\n",
|
||
|
"# this code was written by Schuyler Erle <schuyler@nocat.net> and is\n",
|
||
|
"# made available in the public domain.\n",
|
||
|
"#\n",
|
||
|
"# the code was ported from a freely-licensed example at\n",
|
||
|
"# http://www.3dsoftware.com/Cartography/Programming/PolyLineReduction/\n",
|
||
|
"#\n",
|
||
|
"# the original page is no longer available, but is mirrored at\n",
|
||
|
"# http://www.mappinghacks.com/code/PolyLineReduction/\n",
|
||
|
"\n",
|
||
|
"\"\"\"\n",
|
||
|
"\n",
|
||
|
">>> line = [(0,0),(1,0),(2,0),(2,1),(2,2),(1,2),(0,2),(0,1),(0,0)]\n",
|
||
|
">>> simplify_points(line, 1.0)\n",
|
||
|
"[(0, 0), (2, 0), (2, 2), (0, 2), (0, 0)]\n",
|
||
|
"\n",
|
||
|
">>> line = [(0,0),(0.5,0.5),(1,0),(1.25,-0.25),(1.5,.5)]\n",
|
||
|
">>> simplify_points(line, 0.25)\n",
|
||
|
"[(0, 0), (0.5, 0.5), (1.25, -0.25), (1.5, 0.5)]\n",
|
||
|
"\n",
|
||
|
"\"\"\"\n",
|
||
|
"\n",
|
||
|
"import math\n",
|
||
|
" \n",
|
||
|
"def simplify_points (pts, tolerance): \n",
|
||
|
" anchor = 0\n",
|
||
|
" floater = len(pts) - 1\n",
|
||
|
" stack = []\n",
|
||
|
" keep = set()\n",
|
||
|
"\n",
|
||
|
" stack.append((anchor, floater)) \n",
|
||
|
" while stack:\n",
|
||
|
" anchor, floater = stack.pop()\n",
|
||
|
" \n",
|
||
|
" # initialize line segment\n",
|
||
|
" if pts[floater] != pts[anchor]:\n",
|
||
|
" anchorX = float(pts[floater][0] - pts[anchor][0])\n",
|
||
|
" anchorY = float(pts[floater][1] - pts[anchor][1])\n",
|
||
|
" seg_len = math.sqrt(anchorX ** 2 + anchorY ** 2)\n",
|
||
|
" # get the unit vector\n",
|
||
|
" anchorX /= seg_len\n",
|
||
|
" anchorY /= seg_len\n",
|
||
|
" else:\n",
|
||
|
" anchorX = anchorY = seg_len = 0.0\n",
|
||
|
" \n",
|
||
|
" # inner loop:\n",
|
||
|
" max_dist = 0.0\n",
|
||
|
" farthest = anchor + 1\n",
|
||
|
" for i in range(anchor + 1, floater):\n",
|
||
|
" dist_to_seg = 0.0\n",
|
||
|
" # compare to anchor\n",
|
||
|
" vecX = float(pts[i][0] - pts[anchor][0])\n",
|
||
|
" vecY = float(pts[i][1] - pts[anchor][1])\n",
|
||
|
" seg_len = math.sqrt( vecX ** 2 + vecY ** 2 )\n",
|
||
|
" # dot product:\n",
|
||
|
" proj = vecX * anchorX + vecY * anchorY\n",
|
||
|
" if proj < 0.0:\n",
|
||
|
" dist_to_seg = seg_len\n",
|
||
|
" else: \n",
|
||
|
" # compare to floater\n",
|
||
|
" vecX = float(pts[i][0] - pts[floater][0])\n",
|
||
|
" vecY = float(pts[i][1] - pts[floater][1])\n",
|
||
|
" seg_len = math.sqrt( vecX ** 2 + vecY ** 2 )\n",
|
||
|
" # dot product:\n",
|
||
|
" proj = vecX * (-anchorX) + vecY * (-anchorY)\n",
|
||
|
" if proj < 0.0:\n",
|
||
|
" dist_to_seg = seg_len\n",
|
||
|
" else: # calculate perpendicular distance to line (pythagorean theorem):\n",
|
||
|
" dist_to_seg = math.sqrt(abs(seg_len ** 2 - proj ** 2))\n",
|
||
|
" if max_dist < dist_to_seg:\n",
|
||
|
" max_dist = dist_to_seg\n",
|
||
|
" farthest = i\n",
|
||
|
"\n",
|
||
|
" if max_dist <= tolerance: # use line segment\n",
|
||
|
" keep.add(anchor)\n",
|
||
|
" keep.add(floater)\n",
|
||
|
" else:\n",
|
||
|
" stack.append((anchor, farthest))\n",
|
||
|
" stack.append((farthest, floater))\n",
|
||
|
"\n",
|
||
|
" keep = list(keep)\n",
|
||
|
" keep.sort()\n",
|
||
|
" return [pts[i] for i in keep]"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 102
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"def prepare_simple_grids(grids, tolerance=2*8000): # Approx 8km\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": 103
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# We'll need a utility function for splitting outlines that cross the antiprime meridian\n",
|
||
|
"def fix_antiprime_outlines(outlines):\n",
|
||
|
" new_outlines = []\n",
|
||
|
" \n",
|
||
|
" for outline in outlines:\n",
|
||
|
" \n",
|
||
|
" last_lon = 0\n",
|
||
|
" last_lat = 0\n",
|
||
|
" a_outline = []\n",
|
||
|
" b_outline = []\n",
|
||
|
" b_side = False\n",
|
||
|
" \n",
|
||
|
" for point in outline:\n",
|
||
|
" \n",
|
||
|
" # Possibly change sides\n",
|
||
|
" if abs(last_lon - point[0]) > 180: # If we just jumped more than 180\u02da of longitude\n",
|
||
|
" interpolate_lat = point[1]\n",
|
||
|
" \n",
|
||
|
" if b_side:\n",
|
||
|
" b_outline.append((180 if last_lon > 0 else -180, interpolate_lat))\n",
|
||
|
" else:\n",
|
||
|
" a_outline.append((180 if last_lon > 0 else -180, interpolate_lat))\n",
|
||
|
" \n",
|
||
|
" b_side = not b_side\n",
|
||
|
" print \"Swap!\"\n",
|
||
|
" \n",
|
||
|
" if b_side:\n",
|
||
|
" b_outline.append((180 if point[0] > 0 else -180, interpolate_lat))\n",
|
||
|
" else:\n",
|
||
|
" a_outline.append((180 if point[0] > 0 else -180, interpolate_lat))\n",
|
||
|
" \n",
|
||
|
" if b_side:\n",
|
||
|
" b_outline.append(point)\n",
|
||
|
" else:\n",
|
||
|
" a_outline.append(point)\n",
|
||
|
" \n",
|
||
|
" last_lon = point[0]\n",
|
||
|
" last_lat = point[1]\n",
|
||
|
" \n",
|
||
|
" new_outlines.append(a_outline)\n",
|
||
|
" new_outlines.append(b_outline)\n",
|
||
|
" \n",
|
||
|
" \n",
|
||
|
" return new_outlines"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 104
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Init pyclipper"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# We'll use pyclipper to offset / union / difference our grids\n",
|
||
|
"import pyclipper"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 105
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# Define functions for translating to/from grids\n",
|
||
|
"import mpl_toolkits.basemap.pyproj as pyproj # Import the pyproj module\n",
|
||
|
" \n",
|
||
|
"wgs84=pyproj.Proj(proj='merc', ellps='WGS84') # LatLon with WGS84 datum\n",
|
||
|
"\n",
|
||
|
"# lon/lat to x/y grid\n",
|
||
|
"def lonlat_to_ea_grid(outlines):\n",
|
||
|
" return [[wgs84(point[0], point[1]) for point in outline] for outline in outlines]\n",
|
||
|
" \n",
|
||
|
"# x/y grid to lon/lat\n",
|
||
|
"def ea_grid_to_lonlat(outlines):\n",
|
||
|
" return [[wgs84(point[0], point[1], inverse=True) for point in outline] for outline in outlines]"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 106
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"##Build up a grid of mid-ocean zones"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# Union the grids of all countries\n",
|
||
|
"all_countries_grids = []\n",
|
||
|
" \n",
|
||
|
"# Gather the simple grids for all the countries\n",
|
||
|
"for c in countries:\n",
|
||
|
" all_countries_grids = all_countries_grids + c['simple_grids']"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 107
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# Now expand and union\n",
|
||
|
"all_countries_shifted_grids = []\n",
|
||
|
"\n",
|
||
|
"# Offset the grids by ~600km\n",
|
||
|
"for grid in all_countries_grids:\n",
|
||
|
" pc = pyclipper.PyclipperOffset() \n",
|
||
|
" \n",
|
||
|
" pc.AddPath(grid, pyclipper.JT_ROUND, pyclipper.ET_OPENROUND)\n",
|
||
|
" shifted_grid = [(point[0], point[1]) for point in pc.Execute(600 *2*1000)[0]]\n",
|
||
|
" \n",
|
||
|
" all_countries_shifted_grids.append(shifted_grid) \n",
|
||
|
" \n",
|
||
|
"# Union\n",
|
||
|
"pc = pyclipper.Pyclipper()\n",
|
||
|
"pc.AddPaths(all_countries_shifted_grids, pyclipper.PT_SUBJECT, True)\n",
|
||
|
" \n",
|
||
|
"unions = pc.Execute(pyclipper.CT_UNION, pyclipper.PFT_POSITIVE, pyclipper.PFT_POSITIVE)\n",
|
||
|
"all_countries_shifted_grids = [[(point[0], point[1]) for point in union] for union in unions]"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 108
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"all_countries_simple_grids = prepare_simple_grids(all_countries_shifted_grids, tolerance=2* 50000) # Approx 50km\n",
|
||
|
"print len(all_countries_simple_grids)\n",
|
||
|
"print sum([len(g) for g in all_countries_simple_grids])\n",
|
||
|
"\n",
|
||
|
"all_countries_outlines = ea_grid_to_lonlat(all_countries_simple_grids)\n",
|
||
|
"aco_fix= fix_antiprime_outlines(all_countries_outlines)"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"output_type": "stream",
|
||
|
"stream": "stdout",
|
||
|
"text": [
|
||
|
"4\n",
|
||
|
"253\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n",
|
||
|
"Swap!\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 109
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# Draw map all_countries_simple_grids\n",
|
||
|
"m = Basemap(projection='mill')\n",
|
||
|
" \n",
|
||
|
"m.fillcontinents(color='0.96')\n",
|
||
|
"m.drawcoastlines()\n",
|
||
|
"\n",
|
||
|
"draw_outlines(m, aco_fix, '#ff0000')"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data",
|
||
|
"png": "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\nDh3yfNzTp08zf/58NBoN33zz
|
||
|
"text": [
|
||
|
"<matplotlib.figure.Figure at 0x7fcb5909a990>"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 110
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"This isn't quite right yet, let's forget about this for now"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"##Build up no telemetry grids"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"no_telem_grids = []\n",
|
||
|
" \n",
|
||
|
"# Gather the simple grids for all the countries in this zone\n",
|
||
|
"for c in countries:\n",
|
||
|
" if c['isocode'] in telemetry_tx_exclude:\n",
|
||
|
" no_telem_grids = no_telem_grids + c['shifted_grids']\n",
|
||
|
" \n",
|
||
|
"# Union\n",
|
||
|
"pc = pyclipper.Pyclipper()\n",
|
||
|
"pc.AddPaths(no_telem_grids, pyclipper.PT_SUBJECT, True)\n",
|
||
|
" \n",
|
||
|
"unions = pc.Execute(pyclipper.CT_UNION, pyclipper.PFT_POSITIVE, pyclipper.PFT_POSITIVE)\n",
|
||
|
"combined_grids = [[(point[0], point[1]) for point in union] for union in unions]\n",
|
||
|
" \n",
|
||
|
"combined_grids = prepare_simple_grids(combined_grids, tolerance=2*10000) # Approx 10km\n",
|
||
|
"print len(combined_grids)\n",
|
||
|
"print sum([len(g) for g in combined_grids])\n",
|
||
|
" \n",
|
||
|
"no_telem_grids = combined_grids\n",
|
||
|
"no_telem_outlines = [o for o in fix_antiprime_outlines(ea_grid_to_lonlat(no_telem_grids)) if o]\n",
|
||
|
"print\n",
|
||
|
"print len(no_telem_outlines)"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"output_type": "stream",
|
||
|
"stream": "stdout",
|
||
|
"text": [
|
||
|
"6\n",
|
||
|
"285\n",
|
||
|
"\n",
|
||
|
"6\n"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 119
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"# Draw map of no telem outlines\n",
|
||
|
"m = Basemap(projection='mill')\n",
|
||
|
" \n",
|
||
|
"m.fillcontinents(color='0.96')\n",
|
||
|
"m.drawcoastlines()\n",
|
||
|
"\n",
|
||
|
"draw_outlines(m, no_telem_outlines, '#ff0000')"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data",
|
||
|
"png": "iVBORw0KGgoAAAANSUhEUgAABGoAAANACAYAAABzJ4vYAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3XlYjenjBvC7UtKGFmVpk6wpS1IiZBIq+zaMsYQxxm4s\nzWgsY6xfSRj72MfYGUqbrbIUpRQqSdo37aXldN7fH37OpckuOmPuz3U91znnXZ/3nXE65z7PIiMI\nggAiIiIiIiIiIqp1srVdASIiIiIiIiIieo5BDRERERERERGRlGBQQ0REREREREQkJRjUEBERERER\nERFJCQY1RERERERERERSgkENEREREREREZGUqPOmlTIyMp+rHkRERERERERE/xmCILxy+RuDmjft\nSERERERERERE7+9NDWPY9YmIiIiIiIiISEowqCEiIiIiIiIikhIMaoiIiIiIiIiIpASDGiIiIiIi\nIiIiKcGghoiIiIiIiIhISjCoISIiIiIiIiKSEgxqiIiIiIiIiIikBIMaIiIiIiIiIiIpwaCGiIiI\niIiIiEhKMKghIiIiIiIiIpISDGqIiIiIiIiIiKQEgxoiIiIiIiIiIinBoIaIiIiIiIiISEowqCEi\nIiIiIiIikhIMaoiIiIiIiIiIpASDGiIiIiIiIiIiKcGghoiIiIiIiIhISjCoISIiIiIiIiKSEgxq\niIiIiIiIiIikBIMaIiIiIiIiIiIpwaCGiIiIiIiIiEhKMKghIiIiIiIiIpISDGqIiIiIiIiIiKQE\ngxoiIiIiIiIiIinBoIaIiIiIiIiISEowqCEiIiIiIiIikhIMaoiIiIiIiIiIpASDGiIiIiIiIiIi\nKcGghoiIiIiIiIhISjCoISIiIiIiIiKSEgxqiIiIiIiIiIikBIMaIiIiIiIiIiIpwaCGiIiIiIiI\niEhKMKghIiIiIiIiIpISDGqIiIiIiIiIiKQEgxoiIiIiIiIiIinBoIaIiIiIiIiISEowqCEiIiIi\nIiIikhIMaoiIiIiIiIiIpASDGiIiIiIiIiIiKcGghoiIiIiIiIhISjCoISIiIiIiIiKSEgxqiIiI\niIiIiIikBIMaIiIiIiIiIiIpwaCGiIiIiIiIiEhKMKghIiIiIiIiIpISDGqIiIiIiIiIiKQEgxoi\nIiIiIiIiIinBoIaIiIiIiIiISEowqCEiIiIiIiIikhIMaoiIiIiIiIiIpASDGiIiIiIiIiIiKcGg\n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\n16/fO9X3QwiCgLCwMBQXF0NG
|
||
|
"text": [
|
||
|
"<matplotlib.figure.Figure at 0x7fcb597b3990>"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 120
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"Let's have a closer look at China"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"ll_lon=104\n",
|
||
|
"ur_lon=142\n",
|
||
|
"ll_lat=26\n",
|
||
|
"ur_lat=50\n",
|
||
|
"\n",
|
||
|
"# Draw map\n",
|
||
|
"m = Basemap(projection='mill',\n",
|
||
|
" lat_0=(ll_lat+ur_lat)/2, lon_0=(ll_lon+ur_lon)/2,\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, no_telem_outlines, '#ff0000')"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [
|
||
|
{
|
||
|
"metadata": {},
|
||
|
"output_type": "display_data",
|
||
|
"png": "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\npyfLly/HaDTqHemJpKgRQggd
|
||
|
"text": [
|
||
|
"<matplotlib.figure.Figure at 0x7fcb597b3410>"
|
||
|
]
|
||
|
}
|
||
|
],
|
||
|
"prompt_number": 121
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "markdown",
|
||
|
"metadata": {},
|
||
|
"source": [
|
||
|
"## This looks good enough for now\n",
|
||
|
"\n",
|
||
|
"Export to header file"
|
||
|
]
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"def file_header_telemetry(f):\n",
|
||
|
" print >>f, \"/**\"\n",
|
||
|
" print >>f, \" * Autogenerated telemetry zone structures. See sim/geofence\"\n",
|
||
|
" print >>f, \" */\"\n",
|
||
|
" print >>f, \"\"\n",
|
||
|
" \n",
|
||
|
"def header_h_telemetry(header, no_telem_outlines):\n",
|
||
|
" print >>header, \"#ifndef GEOFENCE_TELEMETRY_H\"\n",
|
||
|
" print >>header, \"#define GEOFENCE_TELEMETRY_H\"\n",
|
||
|
" print >>header, \"\"\n",
|
||
|
" print >>header, \"\"\n",
|
||
|
" print >>header, \"#include <stdbool.h>\"\n",
|
||
|
" print >>header, \"\"\n",
|
||
|
" print >>header, \"#include \\\"samd20.h\\\"\"\n",
|
||
|
" print >>header, \"\"\n",
|
||
|
" print >>header, \"const int32_t* no_telem_outlines[{0}];\".format(len(no_telem_outlines))\n",
|
||
|
" print >>header, \"const uint32_t no_telem_outline_lengths[{0}];\".format(len(no_telem_outlines))\n",
|
||
|
" print >>header, \"\"\n",
|
||
|
" print >>header, \"#endif /* GEOFENCE_APRS_H */\""
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 122
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"def print_telemetry(f, no_telem_outlines):\n",
|
||
|
" \n",
|
||
|
" # Print each array of points\n",
|
||
|
" for o in range(len(no_telem_outlines)): # foreach of the countries outlines\n",
|
||
|
" \n",
|
||
|
" outline = no_telem_outlines[o]\n",
|
||
|
" \n",
|
||
|
" print >>f, \"const int32_t no_telemetry_outline_{0}[] = {{\".format(o+1)\n",
|
||
|
" for point in outline:\n",
|
||
|
" # We express locations in \u00b5degrees\n",
|
||
|
" ulon = int(round(point[0]*1e6))\n",
|
||
|
" ulat = int(round(point[1]*1e6))\n",
|
||
|
" \n",
|
||
|
" print >>f, \" {: 10d}, {: 9d},\".format(ulon, ulat)\n",
|
||
|
" print >>f, \"};\"\n",
|
||
|
"\n",
|
||
|
" \n",
|
||
|
" print >>f, \"\"\n",
|
||
|
" \n",
|
||
|
" # Print an array of outlines\n",
|
||
|
" print >>f, \"const int32_t* no_telem_outlines[] = {\"\n",
|
||
|
" for o in range(len(no_telem_outlines)): # foreach of the outlines\n",
|
||
|
" print >>f, \" no_telemetry_outline_{0},\".format(o+1)\n",
|
||
|
" print >>f, \"};\"\n",
|
||
|
" \n",
|
||
|
" # Print an array of their lengths\n",
|
||
|
" print >>f, \"const uint32_t no_telem_outline_lengths[] = {\"\n",
|
||
|
" for outline in no_telem_outlines: # foreach of the outlines\n",
|
||
|
" print >>f, \" {0},\".format(len(outline))\n",
|
||
|
" print >>f, \"};\"\n",
|
||
|
" print >>f, \"\"\n",
|
||
|
" print >>f, \"\""
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 123
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"def write_telemetry_zones():\n",
|
||
|
" # header\n",
|
||
|
" header = open('../../firmware/inc/geofence_telemetry.h','w')\n",
|
||
|
"\n",
|
||
|
" file_header_telemetry(header)\n",
|
||
|
" header_h_telemetry(header, no_telem_outlines)\n",
|
||
|
"\n",
|
||
|
" # source\n",
|
||
|
" source = open('../../firmware/src/geofence_telemetry.c', 'w')\n",
|
||
|
"\n",
|
||
|
" file_header_telemetry(source)\n",
|
||
|
" print >>source, \"\"\n",
|
||
|
" print >>source, \"#include <stdbool.h>\"\n",
|
||
|
" print >>source, \"\"\n",
|
||
|
" print >>source, \"#include \\\"samd20.h\\\"\"\n",
|
||
|
" print >>source, \"#include \\\"geofence_telemetry.h\\\"\"\n",
|
||
|
" print >>source, \"\"\n",
|
||
|
" print >>source, \"\"\n",
|
||
|
" print >>source, \"/* Longitude, Latitude */\"\n",
|
||
|
" print >>source\n",
|
||
|
" print_telemetry(source, no_telem_outlines)\n",
|
||
|
"\n",
|
||
|
" header.close()\n",
|
||
|
" source.close()"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 124
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [
|
||
|
"write_telemetry_zones()"
|
||
|
],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 125
|
||
|
},
|
||
|
{
|
||
|
"cell_type": "code",
|
||
|
"collapsed": false,
|
||
|
"input": [],
|
||
|
"language": "python",
|
||
|
"metadata": {},
|
||
|
"outputs": [],
|
||
|
"prompt_number": 117
|
||
|
}
|
||
|
],
|
||
|
"metadata": {}
|
||
|
}
|
||
|
]
|
||
|
}
|