Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save lukecampbell/8c47b3b110a1ed6f08d7cf658d71008e to your computer and use it in GitHub Desktop.
Save lukecampbell/8c47b3b110a1ed6f08d7cf658d71008e to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{"nbformat_minor": 0, "cells": [{"source": "I have a simple python package that makes plotting easier, and it has some folium wrappers that render folium nicely.", "cell_type": "markdown", "metadata": {}}, {"execution_count": 1, "cell_type": "code", "source": "import sys\nsys.path.append('toolkit')", "outputs": [], "metadata": {"collapsed": true, "trusted": true}}, {"execution_count": 2, "cell_type": "code", "source": "from oceansmap import plotting", "outputs": [{"output_type": "stream", "name": "stderr", "text": "/Users/lcampbell/.virtualenvs/work/lib/python2.7/site-packages/numexpr/cpuinfo.py:76: UserWarning: [Errno 2] No such file or directory\n stacklevel=stacklevel + 1):\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "All of the deployment information can be found from our deployment API", "cell_type": "markdown", "metadata": {}}, {"execution_count": 3, "cell_type": "code", "source": "import requests\n\nglider_deployments_url = 'http://data.ioos.us/gliders/providers/api/deployment'\nresponse = requests.get(glider_deployments_url)\nresponse.status_code", "outputs": [{"execution_count": 3, "output_type": "execute_result", "data": {"text/plain": "200"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "GliderDAC just returns deployment information, it doesn't actually have a GIS search engine or anything fancy like that.", "cell_type": "markdown", "metadata": {}}, {"source": "Here we can use Shapely to filter deployments based on a search box", "cell_type": "markdown", "metadata": {}}, {"execution_count": 9, "cell_type": "code", "source": "from shapely.geometry import LineString\n\ndef parse_geometry(geometry):\n '''\n Filters out potentially bad coordinate pairs as returned from\n GliderDAC. Returns a safe geometry object.\n\n :param dict geometry: A GeoJSON Geometry object\n '''\n coords = []\n for lon, lat in geometry['coordinates']:\n if lon is None or lat is None:\n continue\n coords.append([lon, lat])\n return {'coordinates': coords}\n\ndef fetch_trajectory(deployment):\n '''\n Downloads the track as GeoJSON from GliderDAC\n\n :param dict deployment: The deployment object as returned from GliderDAC\n '''\n track_url = 'http://data.ioos.us/gliders/status/api/track/' + deployment['deployment_dir']\n response = requests.get(track_url)\n if response.status_code != 200:\n raise IOError(\"Failed to get Glider Track for %s\" % deployment['deployment_dir'])\n geometry = parse_geometry(response.json())\n coords = LineString(geometry['coordinates'])\n return coords\n", "outputs": [], "metadata": {"collapsed": true, "trusted": true}}, {"source": "Here's where we're searching", "cell_type": "markdown", "metadata": {}}, {"execution_count": 10, "cell_type": "code", "source": "bbox = [[-125.72, 32.60], [-117.57, 36.93]]\nfol_map = plotting.get_map((34.75, -121.66))\nplotting.build_box(fol_map, bbox)\nplotting.inline_map(fol_map)", "outputs": [{"execution_count": 10, "output_type": "execute_result", "data": {"text/plain": "<IPython.core.display.HTML object>", "text/html": "<iframe srcdoc=\"<!DOCTYPE html>\n<head>\n <meta http-equiv=&quot;content-type&quot; content=&quot;text/html; charset=UTF-8&quot; />\n <link rel=&quot;stylesheet&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css&quot; />\n <script src=&quot;//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js&quot;></script>\n\n <script src=&quot;//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js&quot;></script>\n\n <link rel=&quot;stylesheet&quot; href=&quot;//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css&quot;>\n <link rel=&quot;stylesheet&quot; href=&quot;//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css&quot;>\n <script src=&quot;//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js&quot;></script>\n\n <link href=&quot;//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css&quot; rel=&quot;stylesheet&quot;>\n\n <link rel=&quot;stylesheet&quot; href=&quot;//rawgit.com/lvoogdt/Leaflet.awesome-markers/2.0/develop/dist/leaflet.awesome-markers.css&quot;>\n <script src=&quot;//rawgithub.com/lvoogdt/Leaflet.awesome-markers/2.0/develop/dist/leaflet.awesome-markers.js&quot;></script>\n\n\n <link rel=&quot;stylesheet&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/MarkerCluster.Default.css&quot;>\n <link rel=&quot;stylesheet&quot; href=&quot;//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/MarkerCluster.css&quot;>\n <script src=&quot;//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/leaflet.markercluster-src.js&quot;></script>\n <script src=&quot;//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/leaflet.markercluster.js&quot;></script>\n\n <link rel=&quot;stylesheet&quot; href=&quot;//birdage.github.io/Leaflet.awesome-markers/dist/leaflet.awesome.rotate.css&quot;>\n\n \n \n \n \n\n <style>\n\n html, body {\n width: 100%;\n height: 100%;\n margin: 0;\n padding: 0;\n }\n\n #map {\n position:absolute;\n top:0;\n bottom:0;\n right:0;\n left:0;\n }\n\n </style>\n</head>\n\n<body>\n\n <div class=&quot;folium-map&quot; id=&quot;folium_b56978a2937344c8b7659c3b8a674a61&quot; style=&quot;width: 960px; height: 500px&quot;></div>\n\n <script>\n\n \n\n var base_tile = L.tileLayer('http://services.arcgisonline.com/ArcGIS/rest/services/Ocean_Basemap/MapServer/tile/{z}/{y}/{x}.jpg', {\n maxZoom: 18,\n minZoom: 1,\n attribution: 'Sources: Esri, GEBCO, NOAA, National Geographic, DeLorme, HERE, Geonames.org, and other contributors'\n });\n\n var baseLayer = {\n &quot;Base Layer&quot;: base_tile\n };\n\n /*\n addition of the wms layers\n */\n\n \n\n /*\n addition of the tile layers\n */\n \n\n /*\n list of layers to be added\n */\n var layer_list = {\n \n };\n\n /*\n Bounding box.\n */\n var southWest = L.latLng(-90, -180),\n northEast = L.latLng(90, 180),\n bounds = L.latLngBounds(southWest, northEast);\n\n /*\n Creates the map and adds the selected layers\n */\n var map = L.map('folium_b56978a2937344c8b7659c3b8a674a61', {\n center:[34.75, -121.66],\n zoom: 7,\n maxBounds: bounds,\n layers: [base_tile]\n });\n\n L.control.layers(baseLayer, layer_list).addTo(map);\n\n //cluster group\n var clusteredmarkers = L.markerClusterGroup();\n //section for adding clustered markers\n \n //add the clustered markers to the group anyway\n map.addLayer(clusteredmarkers);\n\n \n\n \n\n \n var latLngs = [ [32.6, -125.72], [32.6, -117.57], [36.93, -117.57], [36.93, -125.72], [32.6, -125.72], ];\nvar line_1 = L.polyline(latLngs,{\ncolor: '#FF0000',\nweight: 5,\n\n});\n map.addLayer(line_1);\n \n\n \n\n \n\n \n\n </script>\n\n</body>\" style=\"width: 100%; height: 510px; border: none\"></iframe>"}, "metadata": {}}], "metadata": {"collapsed": false, "trusted": true}}, {"execution_count": 12, "cell_type": "code", "source": "from shapely.geometry import box\nimport json\nsearch_box = box(bbox[0][0], bbox[0][1], bbox[1][0], bbox[1][1])\n\nfor deployment in response.json()['results']:\n try:\n coords = fetch_trajectory(deployment)\n except IOError:\n continue\n if search_box.intersects(coords):\n print deployment['deployment_dir']", "outputs": [{"output_type": "stream", "name": "stdout", "text": "drudnick/sp025-20150108T1921\ndrudnick/sp030-20150109T2113\ndrudnick/sp039-20150122T1750\ndrudnick/sp048-20150127T1824\ndrudnick/sp035-20150331T1646\ndrudnick/sp040-20150409T1841\ndrudnick/sp030-20150714T1840\ndrudnick/sp028-20150716T2019\ndrudnick/sp052-20150728T1703\ndrudnick/sp025-20150813T1746\ndrudnick/sp011-20150427T1749\ndrudnick/sp047-20150827T1720\ndrudnick/sp011-20151105T1727\ndrudnick/sp064-20151030T1759\ndrudnick/sp028-20151124T1741\ndrudnick/sp063-20160203T1915\ndrudnick/sp030-20160218T1746\ndrudnick/sp039-20160218T1748\ndrudnick/sp025-20160310T1858\ndrudnick/sp054-20160317T1738\ndrudnick/sp049-20160405T1844\ndrudnick/sp064-20160517T1813\ndrudnick/sp011-20160602T1624\ndrudnick/sp028-20160628T1737\nrutgers/ru22-20140804T1632\nrutgers/ru22-20140825T1505\ndrudnick/sp011-20140501T0000\ndrudnick/sp025-20140611T184300\ndrudnick/sp028-20140605T170300\ndrudnick/sp048-20140116T181300\ndrudnick/sp047-20140623T2230\ndrudnick/sp030-20140813T1713\ndrudnick/sp052-20140814T1805\ndrudnick/sp063-20140915T1905\ndrudnick/sp011-20140923T0000\ndrudnick/sp051-20141112T1933\ndrudnick/sp025-20141125T1730\ndrudnick/sp028-20141210T1741\nmbari/UCSC260-20150520T0000\nmbari/UCSC294-20150430T2218\n"}], "metadata": {"collapsed": false, "trusted": true}}, {"source": "Those are all of the deployments that intersect that box", "cell_type": "markdown", "metadata": {}}], "nbformat": 4, "metadata": {"kernelspec": {"display_name": "Python 2", "name": "python2", "language": "python"}, "language_info": {"mimetype": "text/x-python", "nbconvert_exporter": "python", "version": "2.7.10", "name": "python", "file_extension": ".py", "pygments_lexer": "ipython2", "codemirror_mode": {"version": 2, "name": "ipython"}}}}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment