Skip to content

Instantly share code, notes, and snippets.

@benbovy
Created October 7, 2021 08:13
Show Gist options
  • Save benbovy/22cee018af3df32bd009914cb84cbad3 to your computer and use it in GitHub Desktop.
Save benbovy/22cee018af3df32bd009914cb84cbad3 to your computer and use it in GitHub Desktop.
Export Xarray raster mask as point shapefile
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Export Xarray raster mask as point shapefile\n",
"\n",
"Using geopandas:\n",
"\n",
"```\n",
"$ mamba install geopandas\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"import numpy as np\n",
"import geopandas as gpd\n",
"import xarray as xr\n"
]
},
{
"cell_type": "code",
"execution_count": 44,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div><svg style=\"position: absolute; width: 0; height: 0; overflow: hidden\">\n",
"<defs>\n",
"<symbol id=\"icon-database\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M16 0c-8.837 0-16 2.239-16 5v4c0 2.761 7.163 5 16 5s16-2.239 16-5v-4c0-2.761-7.163-5-16-5z\"></path>\n",
"<path d=\"M16 17c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"<path d=\"M16 26c-8.837 0-16-2.239-16-5v6c0 2.761 7.163 5 16 5s16-2.239 16-5v-6c0 2.761-7.163 5-16 5z\"></path>\n",
"</symbol>\n",
"<symbol id=\"icon-file-text2\" viewBox=\"0 0 32 32\">\n",
"<path d=\"M28.681 7.159c-0.694-0.947-1.662-2.053-2.724-3.116s-2.169-2.030-3.116-2.724c-1.612-1.182-2.393-1.319-2.841-1.319h-15.5c-1.378 0-2.5 1.121-2.5 2.5v27c0 1.378 1.122 2.5 2.5 2.5h23c1.378 0 2.5-1.122 2.5-2.5v-19.5c0-0.448-0.137-1.23-1.319-2.841zM24.543 5.457c0.959 0.959 1.712 1.825 2.268 2.543h-4.811v-4.811c0.718 0.556 1.584 1.309 2.543 2.268zM28 29.5c0 0.271-0.229 0.5-0.5 0.5h-23c-0.271 0-0.5-0.229-0.5-0.5v-27c0-0.271 0.229-0.5 0.5-0.5 0 0 15.499-0 15.5 0v7c0 0.552 0.448 1 1 1h7v19.5z\"></path>\n",
"<path d=\"M23 26h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 22h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"<path d=\"M23 18h-14c-0.552 0-1-0.448-1-1s0.448-1 1-1h14c0.552 0 1 0.448 1 1s-0.448 1-1 1z\"></path>\n",
"</symbol>\n",
"</defs>\n",
"</svg>\n",
"<style>/* CSS stylesheet for displaying xarray objects in jupyterlab.\n",
" *\n",
" */\n",
"\n",
":root {\n",
" --xr-font-color0: var(--jp-content-font-color0, rgba(0, 0, 0, 1));\n",
" --xr-font-color2: var(--jp-content-font-color2, rgba(0, 0, 0, 0.54));\n",
" --xr-font-color3: var(--jp-content-font-color3, rgba(0, 0, 0, 0.38));\n",
" --xr-border-color: var(--jp-border-color2, #e0e0e0);\n",
" --xr-disabled-color: var(--jp-layout-color3, #bdbdbd);\n",
" --xr-background-color: var(--jp-layout-color0, white);\n",
" --xr-background-color-row-even: var(--jp-layout-color1, white);\n",
" --xr-background-color-row-odd: var(--jp-layout-color2, #eeeeee);\n",
"}\n",
"\n",
"html[theme=dark],\n",
"body.vscode-dark {\n",
" --xr-font-color0: rgba(255, 255, 255, 1);\n",
" --xr-font-color2: rgba(255, 255, 255, 0.54);\n",
" --xr-font-color3: rgba(255, 255, 255, 0.38);\n",
" --xr-border-color: #1F1F1F;\n",
" --xr-disabled-color: #515151;\n",
" --xr-background-color: #111111;\n",
" --xr-background-color-row-even: #111111;\n",
" --xr-background-color-row-odd: #313131;\n",
"}\n",
"\n",
".xr-wrap {\n",
" display: block;\n",
" min-width: 300px;\n",
" max-width: 700px;\n",
"}\n",
"\n",
".xr-text-repr-fallback {\n",
" /* fallback to plain text repr when CSS is not injected (untrusted notebook) */\n",
" display: none;\n",
"}\n",
"\n",
".xr-header {\n",
" padding-top: 6px;\n",
" padding-bottom: 6px;\n",
" margin-bottom: 4px;\n",
" border-bottom: solid 1px var(--xr-border-color);\n",
"}\n",
"\n",
".xr-header > div,\n",
".xr-header > ul {\n",
" display: inline;\n",
" margin-top: 0;\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-obj-type,\n",
".xr-array-name {\n",
" margin-left: 2px;\n",
" margin-right: 10px;\n",
"}\n",
"\n",
".xr-obj-type {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-sections {\n",
" padding-left: 0 !important;\n",
" display: grid;\n",
" grid-template-columns: 150px auto auto 1fr 20px 20px;\n",
"}\n",
"\n",
".xr-section-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-section-item input {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-item input + label {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label {\n",
" cursor: pointer;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-item input:enabled + label:hover {\n",
" color: var(--xr-font-color0);\n",
"}\n",
"\n",
".xr-section-summary {\n",
" grid-column: 1;\n",
" color: var(--xr-font-color2);\n",
" font-weight: 500;\n",
"}\n",
"\n",
".xr-section-summary > span {\n",
" display: inline-block;\n",
" padding-left: 0.5em;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label {\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-section-summary-in + label:before {\n",
" display: inline-block;\n",
" content: '►';\n",
" font-size: 11px;\n",
" width: 15px;\n",
" text-align: center;\n",
"}\n",
"\n",
".xr-section-summary-in:disabled + label:before {\n",
" color: var(--xr-disabled-color);\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label:before {\n",
" content: '▼';\n",
"}\n",
"\n",
".xr-section-summary-in:checked + label > span {\n",
" display: none;\n",
"}\n",
"\n",
".xr-section-summary,\n",
".xr-section-inline-details {\n",
" padding-top: 4px;\n",
" padding-bottom: 4px;\n",
"}\n",
"\n",
".xr-section-inline-details {\n",
" grid-column: 2 / -1;\n",
"}\n",
"\n",
".xr-section-details {\n",
" display: none;\n",
" grid-column: 1 / -1;\n",
" margin-bottom: 5px;\n",
"}\n",
"\n",
".xr-section-summary-in:checked ~ .xr-section-details {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-array-wrap {\n",
" grid-column: 1 / -1;\n",
" display: grid;\n",
" grid-template-columns: 20px auto;\n",
"}\n",
"\n",
".xr-array-wrap > label {\n",
" grid-column: 1;\n",
" vertical-align: top;\n",
"}\n",
"\n",
".xr-preview {\n",
" color: var(--xr-font-color3);\n",
"}\n",
"\n",
".xr-array-preview,\n",
".xr-array-data {\n",
" padding: 0 5px !important;\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-array-data,\n",
".xr-array-in:checked ~ .xr-array-preview {\n",
" display: none;\n",
"}\n",
"\n",
".xr-array-in:checked ~ .xr-array-data,\n",
".xr-array-preview {\n",
" display: inline-block;\n",
"}\n",
"\n",
".xr-dim-list {\n",
" display: inline-block !important;\n",
" list-style: none;\n",
" padding: 0 !important;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list li {\n",
" display: inline-block;\n",
" padding: 0;\n",
" margin: 0;\n",
"}\n",
"\n",
".xr-dim-list:before {\n",
" content: '(';\n",
"}\n",
"\n",
".xr-dim-list:after {\n",
" content: ')';\n",
"}\n",
"\n",
".xr-dim-list li:not(:last-child):after {\n",
" content: ',';\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-has-index {\n",
" font-weight: bold;\n",
"}\n",
"\n",
".xr-var-list,\n",
".xr-var-item {\n",
" display: contents;\n",
"}\n",
"\n",
".xr-var-item > div,\n",
".xr-var-item label,\n",
".xr-var-item > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-even);\n",
" margin-bottom: 0;\n",
"}\n",
"\n",
".xr-var-item > .xr-var-name:hover span {\n",
" padding-right: 5px;\n",
"}\n",
"\n",
".xr-var-list > li:nth-child(odd) > div,\n",
".xr-var-list > li:nth-child(odd) > label,\n",
".xr-var-list > li:nth-child(odd) > .xr-var-name span {\n",
" background-color: var(--xr-background-color-row-odd);\n",
"}\n",
"\n",
".xr-var-name {\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-var-dims {\n",
" grid-column: 2;\n",
"}\n",
"\n",
".xr-var-dtype {\n",
" grid-column: 3;\n",
" text-align: right;\n",
" color: var(--xr-font-color2);\n",
"}\n",
"\n",
".xr-var-preview {\n",
" grid-column: 4;\n",
"}\n",
"\n",
".xr-var-name,\n",
".xr-var-dims,\n",
".xr-var-dtype,\n",
".xr-preview,\n",
".xr-attrs dt {\n",
" white-space: nowrap;\n",
" overflow: hidden;\n",
" text-overflow: ellipsis;\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-var-name:hover,\n",
".xr-var-dims:hover,\n",
".xr-var-dtype:hover,\n",
".xr-attrs dt:hover {\n",
" overflow: visible;\n",
" width: auto;\n",
" z-index: 1;\n",
"}\n",
"\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" display: none;\n",
" background-color: var(--xr-background-color) !important;\n",
" padding-bottom: 5px !important;\n",
"}\n",
"\n",
".xr-var-attrs-in:checked ~ .xr-var-attrs,\n",
".xr-var-data-in:checked ~ .xr-var-data {\n",
" display: block;\n",
"}\n",
"\n",
".xr-var-data > table {\n",
" float: right;\n",
"}\n",
"\n",
".xr-var-name span,\n",
".xr-var-data,\n",
".xr-attrs {\n",
" padding-left: 25px !important;\n",
"}\n",
"\n",
".xr-attrs,\n",
".xr-var-attrs,\n",
".xr-var-data {\n",
" grid-column: 1 / -1;\n",
"}\n",
"\n",
"dl.xr-attrs {\n",
" padding: 0;\n",
" margin: 0;\n",
" display: grid;\n",
" grid-template-columns: 125px auto;\n",
"}\n",
"\n",
".xr-attrs dt,\n",
".xr-attrs dd {\n",
" padding: 0;\n",
" margin: 0;\n",
" float: left;\n",
" padding-right: 10px;\n",
" width: auto;\n",
"}\n",
"\n",
".xr-attrs dt {\n",
" font-weight: normal;\n",
" grid-column: 1;\n",
"}\n",
"\n",
".xr-attrs dt:hover span {\n",
" display: inline-block;\n",
" background: var(--xr-background-color);\n",
" padding-right: 10px;\n",
"}\n",
"\n",
".xr-attrs dd {\n",
" grid-column: 2;\n",
" white-space: pre-wrap;\n",
" word-break: break-all;\n",
"}\n",
"\n",
".xr-icon-database,\n",
".xr-icon-file-text2 {\n",
" display: inline-block;\n",
" vertical-align: middle;\n",
" width: 1em;\n",
" height: 1.5em !important;\n",
" stroke-width: 0;\n",
" stroke: currentColor;\n",
" fill: currentColor;\n",
"}\n",
"</style><pre class='xr-text-repr-fallback'>&lt;xarray.Dataset&gt;\n",
"Dimensions: (y: 100, x: 100)\n",
"Coordinates:\n",
" * x (x) int64 0 1 2 3 4 5 6 7 8 9 10 ... 90 91 92 93 94 95 96 97 98 99\n",
" * y (y) int64 0 1 2 3 4 5 6 7 8 9 10 ... 90 91 92 93 94 95 96 97 98 99\n",
"Data variables:\n",
" stations (y, x) int64 -10 -7 0 -7 -8 -9 -8 0 -2 ... 0 -1 -1 -9 -7 -3 -7 -6</pre><div class='xr-wrap' hidden><div class='xr-header'><div class='xr-obj-type'>xarray.Dataset</div></div><ul class='xr-sections'><li class='xr-section-item'><input id='section-3d273686-0124-4152-bd2e-3e71ddf7ba62' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-3d273686-0124-4152-bd2e-3e71ddf7ba62' class='xr-section-summary' title='Expand/collapse section'>Dimensions:</label><div class='xr-section-inline-details'><ul class='xr-dim-list'><li><span class='xr-has-index'>y</span>: 100</li><li><span class='xr-has-index'>x</span>: 100</li></ul></div><div class='xr-section-details'></div></li><li class='xr-section-item'><input id='section-99640834-130c-478f-bb95-0b5a5243242b' class='xr-section-summary-in' type='checkbox' checked><label for='section-99640834-130c-478f-bb95-0b5a5243242b' class='xr-section-summary' >Coordinates: <span>(2)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>x</span></div><div class='xr-var-dims'>(x)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>0 1 2 3 4 5 6 ... 94 95 96 97 98 99</div><input id='attrs-dea02f16-c5ff-4e09-87dc-4fe773f2cea5' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-dea02f16-c5ff-4e09-87dc-4fe773f2cea5' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-85eefcbf-c158-4d42-ad6c-2f377747205e' class='xr-var-data-in' type='checkbox'><label for='data-85eefcbf-c158-4d42-ad6c-2f377747205e' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
" 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
" 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
" 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
" 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,\n",
" 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])</pre></div></li><li class='xr-var-item'><div class='xr-var-name'><span class='xr-has-index'>y</span></div><div class='xr-var-dims'>(y)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>0 1 2 3 4 5 6 ... 94 95 96 97 98 99</div><input id='attrs-05e22369-83c0-4010-8123-4387da26e45b' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-05e22369-83c0-4010-8123-4387da26e45b' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-4e5fe050-0318-4c5d-8bb6-a71c69c72794' class='xr-var-data-in' type='checkbox'><label for='data-4e5fe050-0318-4c5d-8bb6-a71c69c72794' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,\n",
" 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,\n",
" 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53,\n",
" 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71,\n",
" 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,\n",
" 90, 91, 92, 93, 94, 95, 96, 97, 98, 99])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-cd1046e1-7375-48eb-acd3-b68666d08e03' class='xr-section-summary-in' type='checkbox' checked><label for='section-cd1046e1-7375-48eb-acd3-b68666d08e03' class='xr-section-summary' >Data variables: <span>(1)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><ul class='xr-var-list'><li class='xr-var-item'><div class='xr-var-name'><span>stations</span></div><div class='xr-var-dims'>(y, x)</div><div class='xr-var-dtype'>int64</div><div class='xr-var-preview xr-preview'>-10 -7 0 -7 -8 ... -9 -7 -3 -7 -6</div><input id='attrs-34f7ecf4-71c5-42d3-9c01-9ea71b8b69d2' class='xr-var-attrs-in' type='checkbox' disabled><label for='attrs-34f7ecf4-71c5-42d3-9c01-9ea71b8b69d2' title='Show/Hide attributes'><svg class='icon xr-icon-file-text2'><use xlink:href='#icon-file-text2'></use></svg></label><input id='data-729703cc-e697-4843-8197-f49879cda8a1' class='xr-var-data-in' type='checkbox'><label for='data-729703cc-e697-4843-8197-f49879cda8a1' title='Show/Hide data repr'><svg class='icon xr-icon-database'><use xlink:href='#icon-database'></use></svg></label><div class='xr-var-attrs'><dl class='xr-attrs'></dl></div><div class='xr-var-data'><pre>array([[-10, -7, 0, ..., -6, -7, -9],\n",
" [ 1, -9, -4, ..., 0, -9, 1],\n",
" [ -1, -8, -3, ..., -5, 0, -7],\n",
" ...,\n",
" [ 1, -10, -4, ..., -3, -2, -10],\n",
" [ -5, -5, -6, ..., -10, 0, -5],\n",
" [ -4, 1, -5, ..., -3, -7, -6]])</pre></div></li></ul></div></li><li class='xr-section-item'><input id='section-962af363-dac3-401f-a871-a6ad6cb62e5b' class='xr-section-summary-in' type='checkbox' disabled ><label for='section-962af363-dac3-401f-a871-a6ad6cb62e5b' class='xr-section-summary' title='Expand/collapse section'>Attributes: <span>(0)</span></label><div class='xr-section-inline-details'></div><div class='xr-section-details'><dl class='xr-attrs'></dl></div></li></ul></div></div>"
],
"text/plain": [
"<xarray.Dataset>\n",
"Dimensions: (y: 100, x: 100)\n",
"Coordinates:\n",
" * x (x) int64 0 1 2 3 4 5 6 7 8 9 10 ... 90 91 92 93 94 95 96 97 98 99\n",
" * y (y) int64 0 1 2 3 4 5 6 7 8 9 10 ... 90 91 92 93 94 95 96 97 98 99\n",
"Data variables:\n",
" stations (y, x) int64 -10 -7 0 -7 -8 -9 -8 0 -2 ... 0 -1 -1 -9 -7 -3 -7 -6"
]
},
"execution_count": 44,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# create fake mask (random points)\n",
"\n",
"ds = xr.Dataset(\n",
" data_vars={\n",
" \"stations\": ((\"y\", \"x\"), np.random.randint(-10, 2, size=(100, 100)))\n",
" },\n",
" coords={\n",
" \"x\": np.arange(100),\n",
" \"y\": np.arange(100)\n",
" }\n",
")\n",
"\n",
"ds"
]
},
{
"cell_type": "code",
"execution_count": 45,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>y</th>\n",
" <th>x</th>\n",
" <th>stations</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>18</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>22</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>28</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>34</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>830</th>\n",
" <td>99</td>\n",
" <td>36</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>831</th>\n",
" <td>99</td>\n",
" <td>43</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>832</th>\n",
" <td>99</td>\n",
" <td>56</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>833</th>\n",
" <td>99</td>\n",
" <td>70</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>834</th>\n",
" <td>99</td>\n",
" <td>78</td>\n",
" <td>1.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>835 rows × 3 columns</p>\n",
"</div>"
],
"text/plain": [
" y x stations\n",
"0 0 18 1.0\n",
"1 0 22 1.0\n",
"2 0 28 1.0\n",
"3 0 33 1.0\n",
"4 0 34 1.0\n",
".. .. .. ...\n",
"830 99 36 1.0\n",
"831 99 43 1.0\n",
"832 99 56 1.0\n",
"833 99 70 1.0\n",
"834 99 78 1.0\n",
"\n",
"[835 rows x 3 columns]"
]
},
"execution_count": 45,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# convert to a pandas dataframe with x and y coordinates\n",
"\n",
"df = (ds\n",
" .where(ds.stations > 0)\n",
" .stack(nodes=[\"y\", \"x\"])\n",
" .dropna(\"nodes\")\n",
" .to_dataframe()\n",
" .reset_index()\n",
")\n",
"\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 49,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 432x288 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"df.plot.scatter(\"x\", \"y\");"
]
},
{
"cell_type": "code",
"execution_count": 47,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>y</th>\n",
" <th>x</th>\n",
" <th>stations</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>0</td>\n",
" <td>18</td>\n",
" <td>1.0</td>\n",
" <td>POINT (18.000 0.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>0</td>\n",
" <td>22</td>\n",
" <td>1.0</td>\n",
" <td>POINT (22.000 0.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>0</td>\n",
" <td>28</td>\n",
" <td>1.0</td>\n",
" <td>POINT (28.000 0.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>0</td>\n",
" <td>33</td>\n",
" <td>1.0</td>\n",
" <td>POINT (33.000 0.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>0</td>\n",
" <td>34</td>\n",
" <td>1.0</td>\n",
" <td>POINT (34.000 0.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>...</th>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" <td>...</td>\n",
" </tr>\n",
" <tr>\n",
" <th>830</th>\n",
" <td>99</td>\n",
" <td>36</td>\n",
" <td>1.0</td>\n",
" <td>POINT (36.000 99.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>831</th>\n",
" <td>99</td>\n",
" <td>43</td>\n",
" <td>1.0</td>\n",
" <td>POINT (43.000 99.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>832</th>\n",
" <td>99</td>\n",
" <td>56</td>\n",
" <td>1.0</td>\n",
" <td>POINT (56.000 99.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>833</th>\n",
" <td>99</td>\n",
" <td>70</td>\n",
" <td>1.0</td>\n",
" <td>POINT (70.000 99.000)</td>\n",
" </tr>\n",
" <tr>\n",
" <th>834</th>\n",
" <td>99</td>\n",
" <td>78</td>\n",
" <td>1.0</td>\n",
" <td>POINT (78.000 99.000)</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"<p>835 rows × 4 columns</p>\n",
"</div>"
],
"text/plain": [
" y x stations geometry\n",
"0 0 18 1.0 POINT (18.000 0.000)\n",
"1 0 22 1.0 POINT (22.000 0.000)\n",
"2 0 28 1.0 POINT (28.000 0.000)\n",
"3 0 33 1.0 POINT (33.000 0.000)\n",
"4 0 34 1.0 POINT (34.000 0.000)\n",
".. .. .. ... ...\n",
"830 99 36 1.0 POINT (36.000 99.000)\n",
"831 99 43 1.0 POINT (43.000 99.000)\n",
"832 99 56 1.0 POINT (56.000 99.000)\n",
"833 99 70 1.0 POINT (70.000 99.000)\n",
"834 99 78 1.0 POINT (78.000 99.000)\n",
"\n",
"[835 rows x 4 columns]"
]
},
"execution_count": 47,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# convert to a geodataframe with point geometry\n",
"\n",
"geometry = gpd.points_from_xy(df.x, df.y)\n",
"gdf = gpd.GeoDataFrame(df, geometry=geometry)\n",
"gdf"
]
},
{
"cell_type": "code",
"execution_count": 48,
"metadata": {},
"outputs": [],
"source": [
"# export to shapefile\n",
"\n",
"gdf.to_file(\"stations.shp\")"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python [conda env:geo]",
"language": "python",
"name": "conda-env-geo-py"
},
"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.9.7"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment