Created
June 27, 2018 19:33
-
-
Save andy-esch/5859a8557d65de70ac81bcc0ef4b98fb to your computer and use it in GitHub Desktop.
branca experiments
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
{ | |
"cells": [ | |
{ | |
"cell_type": "code", | |
"execution_count": 2, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"from branca.element import Figure, Element" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 3, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"f = Figure()" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 4, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<branca.element.Element at 0x10ea1d198>" | |
] | |
}, | |
"execution_count": 4, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# setup head contents\n", | |
"f.header.add_child(Element('<title>CARTO VL + CARTOframes</title>'))\n", | |
"f.header.add_child(Element('<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">'))\n", | |
"f.header.add_child(Element('<meta charset=\"UTF-8\">'))\n", | |
"f.header.add_child(Element('<!-- Include CARTO VL JS -->'))\n", | |
"f.header.add_child(Element('<script src=\"https://cartodb.github.io/carto-vl/dist/carto-vl.js\"></script>'))\n", | |
"f.header.add_child(Element('<!-- Include Mapbox GL JS -->'))\n", | |
"f.header.add_child(Element('<script src=\"https://cartodb-libs.global.ssl.fastly.net/mapbox-gl/v0.45.0-carto1/mapbox-gl.js\"></script>'))\n", | |
"f.header.add_child(Element('<!-- Include Mapbox GL CSS -->'))\n", | |
"f.header.add_child(Element('<link href=\"https://cartodb-libs.global.ssl.fastly.net/mapbox-gl/v0.45.0-carto1/mapbox-gl.css\" rel=\"stylesheet\" />'))\n", | |
"f.header.add_child(Element('<link rel=\"stylesheet\" type=\"text/css\" href=\"https://cartodb.github.io/carto-vl/examples/style.css\">'))\n", | |
"f.header.add_child(Element('''<style>\n", | |
" body {\n", | |
" margin: 0;\n", | |
" padding: 0;\n", | |
" }\n", | |
" #map {\n", | |
" position: absolute;\n", | |
" height: 100%;\n", | |
" width: 100%;\n", | |
" }\n", | |
" </style>'''))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 5, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<branca.element.Element at 0x10ea1da58>" | |
] | |
}, | |
"execution_count": 5, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"# setup body contents\n", | |
"f.html.add_child(Element('<div id=\"map\"></div>'))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 6, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"<branca.element.Element at 0x11187a860>" | |
] | |
}, | |
"execution_count": 6, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"f.script.add_child(Element('''\n", | |
" const BASEMAPS = {\n", | |
" DarkMatter: 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json',\n", | |
" Voyager: 'https://basemaps.cartocdn.com/gl/voyager-gl-style/style.json',\n", | |
" Positron: 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json',\n", | |
" };\n", | |
" const map = new mapboxgl.Map({\n", | |
" container: 'map',\n", | |
" style: BASEMAPS['DarkMatter'] || BASEMAPS['Voyager'],\n", | |
" zoom: 9,\n", | |
" dragRotate: false\n", | |
" });\n", | |
"\n", | |
" let credentials = {\"user\": \"eschbacher\", \"api_key\": \"31f8d5a6030efc139e6d8b143c3d51cc095d016f\"};\n", | |
" carto.setDefaultAuth({\n", | |
" user: credentials['user'],\n", | |
" apiKey: credentials['api_key'] || 'default_public'\n", | |
" });\n", | |
" var sources = [{\n", | |
" \"is_local\": false,\n", | |
" \"styling\": `@mag: $mag\n", | |
" @depth: $depth\n", | |
" width: 20\n", | |
" strokeWidth: 0`,\n", | |
" \"source\": \"SELECT * FROM all_month_3\",\n", | |
" \"interactivity\": {\n", | |
" \"event\": \"hover\",\n", | |
" \"header\": '<img src=\\\"https://media1.tenor.com/images/2fe585a89061ff43a1c95f065804f779/tenor.gif?itemid=5120447\\\" />'\n", | |
" }\n", | |
" },\n", | |
" {\n", | |
" \"is_local\": false,\n", | |
" \"styling\": `@mag: $mag\n", | |
" @depth: $depth\n", | |
" color: blue\n", | |
" width: 20\n", | |
" strokeWidth: 0`,\n", | |
" \"source\": \"SELECT * FROM all_month\",\n", | |
" \"interactivity\": {\"event\": \"hover\", \"header\": null}\n", | |
" }];\n", | |
"\n", | |
" map.fitBounds([[-179.9737, -65.6681], [179.97, 86.1559]], {animate: false});\n", | |
"\n", | |
" sources.forEach((elem, idx) => {\n", | |
" let temp_source = null;\n", | |
" if (elem.is_local) {\n", | |
" let local_json = JSON.parse(elem.source);\n", | |
" temp_source = new carto.source.GeoJSON(local_json);\n", | |
" } else {\n", | |
" temp_source = new carto.source.SQL(elem.source);\n", | |
" }\n", | |
" let temp = new carto.Layer(\n", | |
" 'layer' + idx,\n", | |
" temp_source,\n", | |
" new carto.Viz(elem['styling'])\n", | |
" );\n", | |
" var last_source = idx === 0 ? 'watername_ocean' : 'layer' + (idx - 1);\n", | |
" temp.addTo(map, last_source);\n", | |
" if (elem.interactivity) {\n", | |
" let interactivity = new carto.Interactivity(temp);\n", | |
" let tempPopup = new mapboxgl.Popup({\n", | |
" closeButton: false,\n", | |
" closeOnClick: false\n", | |
" });\n", | |
" if (elem.interactivity.event == 'click') {\n", | |
" setPopupsClick(tempPopup, interactivity, elem.interactivity.header);\n", | |
" } else if (elem.interactivity.event == 'hover') {\n", | |
" setPopupsHover(tempPopup, interactivity, elem.interactivity.header);\n", | |
" }\n", | |
" }\n", | |
" });\n", | |
" function setPopupsClick(tempPopup, intera, popupHeader) {\n", | |
" intera.off('featureHover', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader)\n", | |
" });\n", | |
" intera.on('featureClick', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader, popupHeader)\n", | |
" });\n", | |
" }\n", | |
" function setPopupsHover(tempPopup, intera, popupHeader) {\n", | |
" intera.off('featureClick', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader)\n", | |
" });\n", | |
" intera.on('featureHover', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader)\n", | |
" });\n", | |
" }\n", | |
" function updatePopup(layer_popup, event, popupHeader) {\n", | |
" if (event.features.length > 0) {\n", | |
" const vars = event.features[0].variables;\n", | |
" let popupHTML = popupHeader ? `<h1>${popupHeader}</h1>` : ``;\n", | |
" Object.keys(vars).forEach((varName) => {\n", | |
" popupHTML += `\n", | |
" <h3 class=\"h3\">${varName}</h3>\n", | |
" <p class=\"description open-sans\">${vars[varName].value}</p>\n", | |
" `;\n", | |
" });\n", | |
" layer_popup.setLngLat([event.coordinates.lng, event.coordinates.lat])\n", | |
" .setHTML(`<div>${popupHTML}</div>`);\n", | |
" if (!layer_popup.isOpen()) {\n", | |
" layer_popup.addTo(map);\n", | |
" }\n", | |
" } else {\n", | |
" layer_popup.remove();\n", | |
" }\n", | |
" }\n", | |
"'''))" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 8, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/html": [ | |
"<div style=\"width:100%;\"><div style=\"position:relative;width:100%;height:0;padding-bottom:60%;\"><iframe src=\"data:text/html;charset=utf-8;base64,PCFET0NUWVBFIGh0bWw+CjxoZWFkPiAgICAKICAgIDxtZXRhIGh0dHAtZXF1aXY9ImNvbnRlbnQtdHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PVVURi04IiAvPgogICAgPHRpdGxlPkNBUlRPIFZMICsgQ0FSVE9mcmFtZXM8L3RpdGxlPgogICAgPG1ldGEgbmFtZT0idmlld3BvcnQiIGNvbnRlbnQ9IndpZHRoPWRldmljZS13aWR0aCwgaW5pdGlhbC1zY2FsZT0xLjAiPgogICAgPG1ldGEgY2hhcnNldD0iVVRGLTgiPgogICAgPCEtLSBJbmNsdWRlIENBUlRPIFZMIEpTIC0tPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2FydG9kYi5naXRodWIuaW8vY2FydG8tdmwvZGlzdC9jYXJ0by12bC5qcyI+PC9zY3JpcHQ+CiAgICA8IS0tIEluY2x1ZGUgTWFwYm94IEdMIEpTIC0tPgogICAgPHNjcmlwdCBzcmM9Imh0dHBzOi8vY2FydG9kYi1saWJzLmdsb2JhbC5zc2wuZmFzdGx5Lm5ldC9tYXBib3gtZ2wvdjAuNDUuMC1jYXJ0bzEvbWFwYm94LWdsLmpzIj48L3NjcmlwdD4KICAgIDwhLS0gSW5jbHVkZSBNYXBib3ggR0wgQ1NTIC0tPgogICAgPGxpbmsgaHJlZj0iaHR0cHM6Ly9jYXJ0b2RiLWxpYnMuZ2xvYmFsLnNzbC5mYXN0bHkubmV0L21hcGJveC1nbC92MC40NS4wLWNhcnRvMS9tYXBib3gtZ2wuY3NzIiByZWw9InN0eWxlc2hlZXQiIC8+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSJodHRwczovL2NhcnRvZGIuZ2l0aHViLmlvL2NhcnRvLXZsL2V4YW1wbGVzL3N0eWxlLmNzcyI+CiAgICA8c3R5bGU+CiAgICBib2R5IHsKICAgICAgbWFyZ2luOiAwOwogICAgICBwYWRkaW5nOiAwOwogICAgfQogICAgI21hcCB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KICA8L3N0eWxlPgo8L2hlYWQ+Cjxib2R5PiAgICAKICAgIDxkaXYgaWQ9Im1hcCI+PC9kaXY+CjwvYm9keT4KPHNjcmlwdD4gICAgCiAgICAKICAgIGNvbnN0IEJBU0VNQVBTID0gewogICAgICAgIERhcmtNYXR0ZXI6ICdodHRwczovL2Jhc2VtYXBzLmNhcnRvY2RuLmNvbS9nbC9kYXJrLW1hdHRlci1nbC1zdHlsZS9zdHlsZS5qc29uJywKICAgICAgICBWb3lhZ2VyOiAnaHR0cHM6Ly9iYXNlbWFwcy5jYXJ0b2Nkbi5jb20vZ2wvdm95YWdlci1nbC1zdHlsZS9zdHlsZS5qc29uJywKICAgICAgICBQb3NpdHJvbjogJ2h0dHBzOi8vYmFzZW1hcHMuY2FydG9jZG4uY29tL2dsL3Bvc2l0cm9uLWdsLXN0eWxlL3N0eWxlLmpzb24nLAogICAgfTsKICAgIGNvbnN0IG1hcCA9IG5ldyBtYXBib3hnbC5NYXAoewogICAgICBjb250YWluZXI6ICdtYXAnLAogICAgICBzdHlsZTogQkFTRU1BUFNbJ0RhcmtNYXR0ZXInXSB8fCBCQVNFTUFQU1snVm95YWdlciddLAogICAgICB6b29tOiA5LAogICAgICBkcmFnUm90YXRlOiBmYWxzZQogICAgICB9KTsKCiAgICBsZXQgY3JlZGVudGlhbHMgPSB7InVzZXIiOiAiZXNjaGJhY2hlciIsICJhcGlfa2V5IjogIjMxZjhkNWE2MDMwZWZjMTM5ZTZkOGIxNDNjM2Q1MWNjMDk1ZDAxNmYifTsKICAgIGNhcnRvLnNldERlZmF1bHRBdXRoKHsKICAgICAgdXNlcjogY3JlZGVudGlhbHNbJ3VzZXInXSwKICAgICAgYXBpS2V5OiBjcmVkZW50aWFsc1snYXBpX2tleSddIHx8ICdkZWZhdWx0X3B1YmxpYycKICAgIH0pOwogICAgdmFyIHNvdXJjZXMgPSBbewogICAgICAgICAgICAiaXNfbG9jYWwiOiBmYWxzZSwKICAgICAgICAgICAgInN0eWxpbmciOiBgQG1hZzogJG1hZwogICAgICAgICAgICBAZGVwdGg6ICRkZXB0aAogICAgICAgICAgICB3aWR0aDogMjAKICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDBgLAogICAgICAgICAgICAic291cmNlIjogIlNFTEVDVCAqIEZST00gYWxsX21vbnRoXzMiLAogICAgICAgICAgICAiaW50ZXJhY3Rpdml0eSI6IHsKICAgICAgICAgICAgICAgICJldmVudCI6ICJob3ZlciIsCiAgICAgICAgICAgICAgICAiaGVhZGVyIjogJzxpbWcgc3JjPSJodHRwczovL21lZGlhMS50ZW5vci5jb20vaW1hZ2VzLzJmZTU4NWE4OTA2MWZmNDNhMWM5NWYwNjU4MDRmNzc5L3Rlbm9yLmdpZj9pdGVtaWQ9NTEyMDQ0NyIgLz4nCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICAiaXNfbG9jYWwiOiBmYWxzZSwKICAgICAgICAgICAgInN0eWxpbmciOiBgQG1hZzogJG1hZwogICAgICAgICAgICBAZGVwdGg6ICRkZXB0aAogICAgICAgICAgICBjb2xvcjogYmx1ZQogICAgICAgICAgICB3aWR0aDogMjAKICAgICAgICAgICAgc3Ryb2tlV2lkdGg6IDBgLAogICAgICAgICAgICAic291cmNlIjogIlNFTEVDVCAqIEZST00gYWxsX21vbnRoIiwKICAgICAgICAgICAgImludGVyYWN0aXZpdHkiOiB7ImV2ZW50IjogImhvdmVyIiwgImhlYWRlciI6IG51bGx9CiAgICAgICAgfV07CgogICAgbWFwLmZpdEJvdW5kcyhbWy0xNzkuOTczNywgLTY1LjY2ODFdLCBbMTc5Ljk3LCA4Ni4xNTU5XV0sIHthbmltYXRlOiBmYWxzZX0pOwoKICAgIHNvdXJjZXMuZm9yRWFjaCgoZWxlbSwgaWR4KSA9PiB7CiAgICAgIGxldCB0ZW1wX3NvdXJjZSA9IG51bGw7CiAgICAgIGlmIChlbGVtLmlzX2xvY2FsKSB7CiAgICAgICAgbGV0IGxvY2FsX2pzb24gPSBKU09OLnBhcnNlKGVsZW0uc291cmNlKTsKICAgICAgICB0ZW1wX3NvdXJjZSA9IG5ldyBjYXJ0by5zb3VyY2UuR2VvSlNPTihsb2NhbF9qc29uKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0ZW1wX3NvdXJjZSA9IG5ldyBjYXJ0by5zb3VyY2UuU1FMKGVsZW0uc291cmNlKTsKICAgICAgfQogICAgICBsZXQgdGVtcCA9IG5ldyBjYXJ0by5MYXllcigKICAgICAgICAgICdsYXllcicgKyBpZHgsCiAgICAgICAgICB0ZW1wX3NvdXJjZSwKICAgICAgICAgIG5ldyBjYXJ0by5WaXooZWxlbVsnc3R5bGluZyddKQogICAgICApOwogICAgICB2YXIgbGFzdF9zb3VyY2UgPSBpZHggPT09IDAgPyAnd2F0ZXJuYW1lX29jZWFuJyA6ICdsYXllcicgKyAoaWR4IC0gMSk7CiAgICAgIHRlbXAuYWRkVG8obWFwLCBsYXN0X3NvdXJjZSk7CiAgICAgIGlmIChlbGVtLmludGVyYWN0aXZpdHkpIHsKICAgICAgICBsZXQgaW50ZXJhY3Rpdml0eSA9IG5ldyBjYXJ0by5JbnRlcmFjdGl2aXR5KHRlbXApOwogICAgICAgIGxldCB0ZW1wUG9wdXAgPSBuZXcgbWFwYm94Z2wuUG9wdXAoewogICAgICAgICAgICAgICAgICBjbG9zZUJ1dHRvbjogZmFsc2UsCiAgICAgICAgICAgICAgICAgIGNsb3NlT25DbGljazogZmFsc2UKICAgICAgICAgICAgICAgIH0pOwogICAgICAgIGlmIChlbGVtLmludGVyYWN0aXZpdHkuZXZlbnQgPT0gJ2NsaWNrJykgewogICAgICAgICAgc2V0UG9wdXBzQ2xpY2sodGVtcFBvcHVwLCBpbnRlcmFjdGl2aXR5LCBlbGVtLmludGVyYWN0aXZpdHkuaGVhZGVyKTsKICAgICAgICB9IGVsc2UgaWYgKGVsZW0uaW50ZXJhY3Rpdml0eS5ldmVudCA9PSAnaG92ZXInKSB7CiAgICAgICAgICBzZXRQb3B1cHNIb3Zlcih0ZW1wUG9wdXAsIGludGVyYWN0aXZpdHksIGVsZW0uaW50ZXJhY3Rpdml0eS5oZWFkZXIpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CiAgICBmdW5jdGlvbiBzZXRQb3B1cHNDbGljayh0ZW1wUG9wdXAsIGludGVyYSwgcG9wdXBIZWFkZXIpIHsKICAgICAgaW50ZXJhLm9mZignZmVhdHVyZUhvdmVyJywgKGV2ZW50KSA9PiB7CiAgICAgICAgICB1cGRhdGVQb3B1cCh0ZW1wUG9wdXAsIGV2ZW50LCBwb3B1cEhlYWRlcikKICAgICAgfSk7CiAgICAgIGludGVyYS5vbignZmVhdHVyZUNsaWNrJywgKGV2ZW50KSA9PiB7CiAgICAgICAgICB1cGRhdGVQb3B1cCh0ZW1wUG9wdXAsIGV2ZW50LCBwb3B1cEhlYWRlciwgcG9wdXBIZWFkZXIpCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gc2V0UG9wdXBzSG92ZXIodGVtcFBvcHVwLCBpbnRlcmEsIHBvcHVwSGVhZGVyKSB7CiAgICAgIGludGVyYS5vZmYoJ2ZlYXR1cmVDbGljaycsIChldmVudCkgPT4gewogICAgICAgICAgdXBkYXRlUG9wdXAodGVtcFBvcHVwLCBldmVudCwgcG9wdXBIZWFkZXIpCiAgICAgIH0pOwogICAgICBpbnRlcmEub24oJ2ZlYXR1cmVIb3ZlcicsIChldmVudCkgPT4gewogICAgICAgICAgdXBkYXRlUG9wdXAodGVtcFBvcHVwLCBldmVudCwgcG9wdXBIZWFkZXIpCiAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlUG9wdXAobGF5ZXJfcG9wdXAsIGV2ZW50LCBwb3B1cEhlYWRlcikgewogICAgICBpZiAoZXZlbnQuZmVhdHVyZXMubGVuZ3RoID4gMCkgewogICAgICAgIGNvbnN0IHZhcnMgPSBldmVudC5mZWF0dXJlc1swXS52YXJpYWJsZXM7CiAgICAgICAgbGV0IHBvcHVwSFRNTCA9IHBvcHVwSGVhZGVyID8gYDxoMT4ke3BvcHVwSGVhZGVyfTwvaDE+YCA6IGBgOwogICAgICAgIE9iamVjdC5rZXlzKHZhcnMpLmZvckVhY2goKHZhck5hbWUpID0+IHsKICAgICAgICAgICAgcG9wdXBIVE1MICs9IGAKICAgICAgICAgICAgICAgIDxoMyBjbGFzcz0iaDMiPiR7dmFyTmFtZX08L2gzPgogICAgICAgICAgICAgICAgPHAgY2xhc3M9ImRlc2NyaXB0aW9uIG9wZW4tc2FucyI+JHt2YXJzW3Zhck5hbWVdLnZhbHVlfTwvcD4KICAgICAgICAgICAgYDsKICAgICAgICB9KTsKICAgICAgICBsYXllcl9wb3B1cC5zZXRMbmdMYXQoW2V2ZW50LmNvb3JkaW5hdGVzLmxuZywgZXZlbnQuY29vcmRpbmF0ZXMubGF0XSkKICAgICAgICAgICAgIC5zZXRIVE1MKGA8ZGl2PiR7cG9wdXBIVE1MfTwvZGl2PmApOwogICAgICAgIGlmICghbGF5ZXJfcG9wdXAuaXNPcGVuKCkpIHsKICAgICAgICAgIGxheWVyX3BvcHVwLmFkZFRvKG1hcCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGxheWVyX3BvcHVwLnJlbW92ZSgpOwogICAgICB9CiAgICB9Cjwvc2NyaXB0Pg==\" style=\"position:absolute;width:100%;height:100%;left:0;top:0;border:none !important;\" allowfullscreen webkitallowfullscreen mozallowfullscreen></iframe></div></div>" | |
], | |
"text/plain": [ | |
"<branca.element.Figure at 0x10ea1d048>" | |
] | |
}, | |
"execution_count": 8, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"f" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 80, | |
"metadata": { | |
"scrolled": false | |
}, | |
"outputs": [ | |
{ | |
"name": "stdout", | |
"output_type": "stream", | |
"text": [ | |
"<!DOCTYPE html>\n", | |
"<head> \n", | |
" <meta http-equiv=\"content-type\" content=\"text/html; charset=UTF-8\" />\n", | |
" <title>CARTO VL + CARTOframes</title>\n", | |
" <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n", | |
" <meta charset=\"UTF-8\">\n", | |
" <!-- Include CARTO VL JS -->\n", | |
" <script src=\"https://cartodb.github.io/carto-vl/dist/carto-vl.js\"></script>\n", | |
" <!-- Include Mapbox GL JS -->\n", | |
" <script src=\"https://cartodb-libs.global.ssl.fastly.net/mapbox-gl/v0.45.0-carto1/mapbox-gl.js\"></script>\n", | |
" <!-- Include Mapbox GL CSS -->\n", | |
" <link href=\"https://cartodb-libs.global.ssl.fastly.net/mapbox-gl/v0.45.0-carto1/mapbox-gl.css\" rel=\"stylesheet\" />\n", | |
" <link rel=\"stylesheet\" type=\"text/css\" href=\"https://cartodb.github.io/carto-vl/examples/style.css\">\n", | |
" <style>\n", | |
" body {\n", | |
" margin: 0;\n", | |
" padding: 0;\n", | |
" }\n", | |
" #map {\n", | |
" position: absolute;\n", | |
" height: 100%;\n", | |
" width: 100%;\n", | |
" }\n", | |
" </style>\n", | |
"</head>\n", | |
"<body> \n", | |
" <div id=\"map\"></div>\n", | |
"</body>\n", | |
"<script> \n", | |
" \n", | |
" const BASEMAPS = {\n", | |
" DarkMatter: 'https://basemaps.cartocdn.com/gl/dark-matter-gl-style/style.json',\n", | |
" Voyager: 'https://basemaps.cartocdn.com/gl/voyager-gl-style/style.json',\n", | |
" Positron: 'https://basemaps.cartocdn.com/gl/positron-gl-style/style.json',\n", | |
" };\n", | |
" const map = new mapboxgl.Map({\n", | |
" container: 'map',\n", | |
" style: BASEMAPS['DarkMatter'] || BASEMAPS['Voyager'],\n", | |
" zoom: 9,\n", | |
" dragRotate: false\n", | |
" });\n", | |
"\n", | |
" let credentials = {\"user\": \"eschbacher\", \"api_key\": \"31f8d5a6030efc139e6d8b143c3d51cc095d016f\"};\n", | |
" carto.setDefaultAuth({\n", | |
" user: credentials['user'],\n", | |
" apiKey: credentials['api_key'] || 'default_public'\n", | |
" });\n", | |
" var sources = [{\n", | |
" \"is_local\": false,\n", | |
" \"styling\": `@mag: $mag\n", | |
" @depth: $depth\n", | |
" width: 20\n", | |
" strokeWidth: 0`,\n", | |
" \"source\": \"SELECT * FROM all_month_3\",\n", | |
" \"interactivity\": {\n", | |
" \"event\": \"hover\",\n", | |
" \"header\": '<img src=\"https://media1.tenor.com/images/2fe585a89061ff43a1c95f065804f779/tenor.gif?itemid=5120447\" />'\n", | |
" }\n", | |
" },\n", | |
" {\n", | |
" \"is_local\": false,\n", | |
" \"styling\": `@mag: $mag\n", | |
" @depth: $depth\n", | |
" color: blue\n", | |
" width: 20\n", | |
" strokeWidth: 0`,\n", | |
" \"source\": \"SELECT * FROM all_month\",\n", | |
" \"interactivity\": {\"event\": \"hover\", \"header\": null}\n", | |
" }];\n", | |
"\n", | |
" map.fitBounds([[-179.9737, -65.6681], [179.97, 86.1559]], {animate: false});\n", | |
"\n", | |
" sources.forEach((elem, idx) => {\n", | |
" let temp_source = null;\n", | |
" if (elem.is_local) {\n", | |
" let local_json = JSON.parse(elem.source);\n", | |
" temp_source = new carto.source.GeoJSON(local_json);\n", | |
" } else {\n", | |
" temp_source = new carto.source.SQL(elem.source);\n", | |
" }\n", | |
" let temp = new carto.Layer(\n", | |
" 'layer' + idx,\n", | |
" temp_source,\n", | |
" new carto.Viz(elem['styling'])\n", | |
" );\n", | |
" var last_source = idx === 0 ? 'watername_ocean' : 'layer' + (idx - 1);\n", | |
" temp.addTo(map, last_source);\n", | |
" if (elem.interactivity) {\n", | |
" let interactivity = new carto.Interactivity(temp);\n", | |
" let tempPopup = new mapboxgl.Popup({\n", | |
" closeButton: false,\n", | |
" closeOnClick: false\n", | |
" });\n", | |
" if (elem.interactivity.event == 'click') {\n", | |
" setPopupsClick(tempPopup, interactivity, elem.interactivity.header);\n", | |
" } else if (elem.interactivity.event == 'hover') {\n", | |
" setPopupsHover(tempPopup, interactivity, elem.interactivity.header);\n", | |
" }\n", | |
" }\n", | |
" });\n", | |
" function setPopupsClick(tempPopup, intera, popupHeader) {\n", | |
" intera.off('featureHover', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader)\n", | |
" });\n", | |
" intera.on('featureClick', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader, popupHeader)\n", | |
" });\n", | |
" }\n", | |
" function setPopupsHover(tempPopup, intera, popupHeader) {\n", | |
" intera.off('featureClick', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader)\n", | |
" });\n", | |
" intera.on('featureHover', (event) => {\n", | |
" updatePopup(tempPopup, event, popupHeader)\n", | |
" });\n", | |
" }\n", | |
" function updatePopup(layer_popup, event, popupHeader) {\n", | |
" if (event.features.length > 0) {\n", | |
" const vars = event.features[0].variables;\n", | |
" let popupHTML = popupHeader ? `<h1>${popupHeader}</h1>` : ``;\n", | |
" Object.keys(vars).forEach((varName) => {\n", | |
" popupHTML += `\n", | |
" <h3 class=\"h3\">${varName}</h3>\n", | |
" <p class=\"description open-sans\">${vars[varName].value}</p>\n", | |
" `;\n", | |
" });\n", | |
" layer_popup.setLngLat([event.coordinates.lng, event.coordinates.lat])\n", | |
" .setHTML(`<div>${popupHTML}</div>`);\n", | |
" if (!layer_popup.isOpen()) {\n", | |
" layer_popup.addTo(map);\n", | |
" }\n", | |
" } else {\n", | |
" layer_popup.remove();\n", | |
" }\n", | |
" }\n", | |
"</script>\n" | |
] | |
} | |
], | |
"source": [ | |
"print(f.render())" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 81, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"import json" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 82, | |
"metadata": {}, | |
"outputs": [], | |
"source": [ | |
"a = {\n", | |
" 'name': 'andy',\n", | |
" 'son': 'cody',\n", | |
" 'spouse': 'corinne',\n", | |
" 'lifestory': '''\n", | |
" This is a really long life story.\n", | |
" It is all about growing up in Missouri an moving on from there.\n", | |
" Having a son, and living in NYC.\n", | |
" '''\n", | |
"}" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"execution_count": 55, | |
"metadata": {}, | |
"outputs": [ | |
{ | |
"data": { | |
"text/plain": [ | |
"'{\"name\": \"andy\", \"son\": \"cody\", \"spouse\": \"corinne\", \"lifestory\": \"\\\\n This is a really long life story.\\\\n It is all about growing up in Missouri an moving on from there.\\\\n Having a son, and living in NYC.\\\\n \"}'" | |
] | |
}, | |
"execution_count": 55, | |
"metadata": {}, | |
"output_type": "execute_result" | |
} | |
], | |
"source": [ | |
"json.dumps(a)" | |
] | |
} | |
], | |
"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.5" | |
} | |
}, | |
"nbformat": 4, | |
"nbformat_minor": 2 | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment