Created
August 11, 2016 14:10
-
-
Save lukecampbell/8c47b3b110a1ed6f08d7cf658d71008e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{"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="content-type" content="text/html; charset=UTF-8" />\n <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.css" />\n <script src="//cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js"></script>\n\n <script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>\n\n <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap.min.css">\n <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/css/bootstrap-theme.min.css">\n <script src="//maxcdn.bootstrapcdn.com/bootstrap/3.2.0/js/bootstrap.min.js"></script>\n\n <link href="//maxcdn.bootstrapcdn.com/font-awesome/4.1.0/css/font-awesome.min.css" rel="stylesheet">\n\n <link rel="stylesheet" href="//rawgit.com/lvoogdt/Leaflet.awesome-markers/2.0/develop/dist/leaflet.awesome-markers.css">\n <script src="//rawgithub.com/lvoogdt/Leaflet.awesome-markers/2.0/develop/dist/leaflet.awesome-markers.js"></script>\n\n\n <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/MarkerCluster.Default.css">\n <link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/MarkerCluster.css">\n <script src="//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/leaflet.markercluster-src.js"></script>\n <script src="//cdnjs.cloudflare.com/ajax/libs/leaflet.markercluster/0.4.0/leaflet.markercluster.js"></script>\n\n <link rel="stylesheet" href="//birdage.github.io/Leaflet.awesome-markers/dist/leaflet.awesome.rotate.css">\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="folium-map" id="folium_b56978a2937344c8b7659c3b8a674a61" style="width: 960px; height: 500px"></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 "Base Layer": 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