├── CNAME
├── requirements.txt
├── logo.png
├── images
├── yt_logo.png
└── fa-rocket.svg
├── .gitignore
├── Makefile
├── LICENSE
├── introduction.md
├── _config.yml
├── README.md
├── _toc.yml
├── references.bib
└── notebooks
├── geopandas_extract_from_excel.ipynb
├── xarray_mosaic_and_clip.ipynb
├── xarray_create_raster.ipynb
└── openai_mapping_news_articles.ipynb
/CNAME:
--------------------------------------------------------------------------------
1 | www.geopythontutorials.com
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | jupyter-book
2 | ghp-import
3 |
--------------------------------------------------------------------------------
/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spatialthoughts/geopython-tutorials/HEAD/logo.png
--------------------------------------------------------------------------------
/images/yt_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/spatialthoughts/geopython-tutorials/HEAD/images/yt_logo.png
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | _build/
2 | notebooks/.ipynb_checkpoints
3 | .DS_Store
4 | notebooks/data
5 | notebooks/output
6 | .ipynb_checkpoints
7 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | github:
2 | git add .
3 | git commit -a -m 'update'; git push origin main
4 |
5 | html:
6 | rm -rf _build/
7 | jupyter-book build .
8 | cp CNAME _build/html
9 |
10 | gh-pages: github html
11 | ghp-import -n -p -f _build/html
--------------------------------------------------------------------------------
/images/fa-rocket.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2025 Ujaval Gandhi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/introduction.md:
--------------------------------------------------------------------------------
1 | # Geospatial Python Tutorials
2 |
3 | Welcome to Spatial Analysis and Remote Sensing Tutorials by Spatial Thoughts. These tutorials complement our Python courses and are suitable for learners who want to advance their skills.
4 |
5 | We highly recommend completing the following courses before diving into these tutorials. All our courses are open-access and freely available for self-study.
6 |
7 |
8 | * Python Foundation for Spatial Analysis ↗
9 | * Mapping and Data Visualization with Python ↗
10 |
11 | ## Before you begin
12 |
13 | Each tutorial is in the form of a self-contained notebook and comes with step-by-step explanation and datasets. Many tutorials also have an accompanying video walkthrough as well. The preferred way to run each notebook is using [Google Colab](https://colab.research.google.com/). Click the icon located at the top of each tutorial to open it on Colab.
14 |
15 | > If you are new to Colab, see our Hello Colab ↗ video.
16 |
17 | ## Tutorials
18 |
19 | ```{tableofcontents}
20 | ```
21 |
--------------------------------------------------------------------------------
/_config.yml:
--------------------------------------------------------------------------------
1 | # Book settings
2 | # Learn more at https://jupyterbook.org/customize/config.html
3 |
4 | title: Geospatial Python Tutorials
5 | author: Ujaval Gandhi
6 | logo: logo.png
7 | copyright: "2025"
8 |
9 | # Force re-execution of notebooks on each build.
10 | # See https://jupyterbook.org/content/execute.html
11 | execute:
12 | execute_notebooks: off
13 |
14 | # Define the name of the latex output file for PDF builds
15 | latex:
16 | latex_documents:
17 | targetname: book.tex
18 |
19 | # Add a bibtex file so that we can create citations
20 | bibtex_bibfiles:
21 | - references.bib
22 |
23 | # Information about where the book exists on the web
24 | repository:
25 | url: https://github.com/spatialthoughts/geopython-tutorials
26 | branch: main # Which branch of the repository should be used when creating links (optional)
27 |
28 | # Add GitHub buttons to your book
29 | # See https://jupyterbook.org/customize/config.html#add-a-link-to-your-repository
30 | html:
31 | use_issues_button: true
32 | use_repository_button: true
33 | analytics:
34 | google_analytics_id: G-CSFQ69LBRL
35 | extra_footer : |
36 |
38 | This work is licensed under a CC BY 4.0 license.
39 |
\n"
33 | ]
34 | },
35 | {
36 | "cell_type": "markdown",
37 | "metadata": {
38 | "id": "JepwzAj2U5L5"
39 | },
40 | "source": [
41 | "## Setup and Data Download\n",
42 | "\n",
43 | "The following blocks of code will install the required packages and download the datasets to your Colab environment."
44 | ]
45 | },
46 | {
47 | "cell_type": "code",
48 | "execution_count": 1,
49 | "metadata": {
50 | "id": "uQovPAjjU5L6"
51 | },
52 | "outputs": [],
53 | "source": [
54 | "import os\n",
55 | "import pandas as pd\n",
56 | "import geopandas as gpd\n",
57 | "import zipfile"
58 | ]
59 | },
60 | {
61 | "cell_type": "code",
62 | "execution_count": 2,
63 | "metadata": {
64 | "id": "-Zndcd8KU5L6"
65 | },
66 | "outputs": [],
67 | "source": [
68 | "data_folder = 'data'\n",
69 | "output_folder = 'output'\n",
70 | "\n",
71 | "if not os.path.exists(data_folder):\n",
72 | " os.mkdir(data_folder)\n",
73 | "if not os.path.exists(output_folder):\n",
74 | " os.mkdir(output_folder)"
75 | ]
76 | },
77 | {
78 | "cell_type": "code",
79 | "execution_count": 3,
80 | "metadata": {
81 | "id": "N9cAjPXSU5L6"
82 | },
83 | "outputs": [
84 | {
85 | "name": "stdout",
86 | "output_type": "stream",
87 | "text": [
88 | "Downloaded data/sf_parcels.zip\n",
89 | "Downloaded data/parcels_to_export.xlsx\n"
90 | ]
91 | }
92 | ],
93 | "source": [
94 | "def download(url):\n",
95 | " filename = os.path.join(data_folder, os.path.basename(url))\n",
96 | " if not os.path.exists(filename):\n",
97 | " from urllib.request import urlretrieve\n",
98 | " local, _ = urlretrieve(url, filename)\n",
99 | " print('Downloaded ' + local)\n",
100 | "\n",
101 | "data_url = 'https://github.com/spatialthoughts/geopython-tutorials/releases/download/data/'\n",
102 | "\n",
103 | "download(data_url + 'sf_parcels.zip')\n",
104 | "download(data_url + 'parcels_to_export.xlsx')"
105 | ]
106 | },
107 | {
108 | "cell_type": "markdown",
109 | "metadata": {
110 | "id": "-D-U34cbYkrC"
111 | },
112 | "source": [
113 | "## Procedure"
114 | ]
115 | },
116 | {
117 | "cell_type": "markdown",
118 | "metadata": {
119 | "id": "gE90KEg9Z9BU"
120 | },
121 | "source": [
122 | "We first unzip the `sf_parcels.zip` archive and extract the shapefile contained inside. Then we can read it using GeoPandas.\n",
123 | "\n",
124 | "> GeoPandas can read zipped files directly using the `zip://` prefix as described in [Reading and Writing Files](https://geopandas.org/en/stable/docs/user_guide/io.html) section of the documentation. `gpd.read_file('zip:///data/sf_parcels.zip')`. But it was much slower than unzipping and reading the shapefile."
125 | ]
126 | },
127 | {
128 | "cell_type": "code",
129 | "execution_count": 4,
130 | "metadata": {
131 | "id": "QWwnTyVyoFMr"
132 | },
133 | "outputs": [],
134 | "source": [
135 | "parcels_filepath = os.path.join(data_folder, 'sf_parcels.zip')"
136 | ]
137 | },
138 | {
139 | "cell_type": "markdown",
140 | "metadata": {
141 | "id": "NWqvtTRPb27L"
142 | },
143 | "source": [
144 | "We use Python's built-in `zipfile` module to extract the files in the data directory."
145 | ]
146 | },
147 | {
148 | "cell_type": "code",
149 | "execution_count": 5,
150 | "metadata": {
151 | "id": "zIxrmIW0Y9By"
152 | },
153 | "outputs": [],
154 | "source": [
155 | "with zipfile.ZipFile(parcels_filepath) as zf:\n",
156 | " zf.extractall(data_folder)"
157 | ]
158 | },
159 | {
160 | "cell_type": "markdown",
161 | "metadata": {
162 | "id": "XoHkIBvzb-6z"
163 | },
164 | "source": [
165 | "Once unzipped, we can read the parcels shapefile using GeoPandas."
166 | ]
167 | },
168 | {
169 | "cell_type": "code",
170 | "execution_count": 6,
171 | "metadata": {
172 | "id": "0kv8x2JCoMFG"
173 | },
174 | "outputs": [],
175 | "source": [
176 | "parcels_shp = os.path.join(data_folder, 'sf_parcels.shp')\n",
177 | "parcels_gdf = gpd.read_file(parcels_shp)"
178 | ]
179 | },
180 | {
181 | "cell_type": "markdown",
182 | "metadata": {
183 | "id": "X-la_03PcLth"
184 | },
185 | "source": [
186 | "Preview the resulting GeoDataFrame. The parcel ids are contained in the `mapblklot` column."
187 | ]
188 | },
189 | {
190 | "cell_type": "code",
191 | "execution_count": 10,
192 | "metadata": {
193 | "id": "Kz-zLg_ucLAh"
194 | },
195 | "outputs": [
196 | {
197 | "data": {
198 | "text/html": [
199 | "| \n", 217 | " | mapblklot | \n", 218 | "blklot | \n", 219 | "block_num | \n", 220 | "lot_num | \n", 221 | "from_addre | \n", 222 | "
|---|---|---|---|---|---|
| 0 | \n", 227 | "0001001 | \n", 228 | "0001001 | \n", 229 | "0001 | \n", 230 | "001 | \n", 231 | "0 | \n", 232 | "
| 1 | \n", 235 | "0002001 | \n", 236 | "0002001 | \n", 237 | "0002 | \n", 238 | "001 | \n", 239 | "0 | \n", 240 | "
| 2 | \n", 243 | "0004002 | \n", 244 | "0004002 | \n", 245 | "0004 | \n", 246 | "002 | \n", 247 | "160 | \n", 248 | "
| 3 | \n", 251 | "0005001 | \n", 252 | "0005001 | \n", 253 | "0005 | \n", 254 | "001 | \n", 255 | "206 | \n", 256 | "
| 4 | \n", 259 | "0006001 | \n", 260 | "0006001 | \n", 261 | "0006 | \n", 262 | "001 | \n", 263 | "350 | \n", 264 | "
| \n", 344 | " | mapblklot | \n", 345 | "blklot | \n", 346 | "block_num | \n", 347 | "lot_num | \n", 348 | "
|---|---|---|---|---|
| 0 | \n", 353 | "0478013 | \n", 354 | "0478013 | \n", 355 | "478 | \n", 356 | "013 | \n", 357 | "
| 1 | \n", 360 | "0478001 | \n", 361 | "0478001 | \n", 362 | "478 | \n", 363 | "001 | \n", 364 | "
| 2 | \n", 367 | "0478001B | \n", 368 | "0478001B | \n", 369 | "478 | \n", 370 | "001B | \n", 371 | "
| 3 | \n", 374 | "0478001C | \n", 375 | "0478001C | \n", 376 | "478 | \n", 377 | "001C | \n", 378 | "
| 4 | \n", 381 | "0478002A | \n", 382 | "0478002A | \n", 383 | "478 | \n", 384 | "002A | \n", 385 | "
| ... | \n", 388 | "... | \n", 389 | "... | \n", 390 | "... | \n", 391 | "... | \n", 392 | "
| 84 | \n", 395 | "0499036 | \n", 396 | "0499037 | \n", 397 | "499 | \n", 398 | "037 | \n", 399 | "
| 85 | \n", 402 | "0499036 | \n", 403 | "0499038 | \n", 404 | "499 | \n", 405 | "038 | \n", 406 | "
| 86 | \n", 409 | "0499036 | \n", 410 | "0499039 | \n", 411 | "499 | \n", 412 | "039 | \n", 413 | "
| 87 | \n", 416 | "0499036 | \n", 417 | "0499040 | \n", 418 | "499 | \n", 419 | "040 | \n", 420 | "
| 88 | \n", 423 | "0499036 | \n", 424 | "0499041 | \n", 425 | "499 | \n", 426 | "041 | \n", 427 | "
89 rows × 4 columns
\n", 431 | "| \n", 545 | " | mapblklot | \n", 546 | "blklot | \n", 547 | "block_num | \n", 548 | "lot_num | \n", 549 | "from_addre | \n", 550 | "
|---|---|---|---|---|---|
| 21103 | \n", 555 | "0478013 | \n", 556 | "0478013 | \n", 557 | "0478 | \n", 558 | "013 | \n", 559 | "2940 | \n", 560 | "
| 21119 | \n", 563 | "0478001 | \n", 564 | "0478001 | \n", 565 | "0478 | \n", 566 | "001 | \n", 567 | "1101 | \n", 568 | "
| 21120 | \n", 571 | "0478001B | \n", 572 | "0478001B | \n", 573 | "0478 | \n", 574 | "001B | \n", 575 | "2855 | \n", 576 | "
| 21121 | \n", 579 | "0478001C | \n", 580 | "0478001C | \n", 581 | "0478 | \n", 582 | "001C | \n", 583 | "2845 | \n", 584 | "
| 21122 | \n", 587 | "0478002A | \n", 588 | "0478002A | \n", 589 | "0478 | \n", 590 | "002A | \n", 591 | "2821 | \n", 592 | "
"
42 | ]
43 | },
44 | {
45 | "cell_type": "markdown",
46 | "id": "85dbaeb4-655e-4743-809f-823bc75400c4",
47 | "metadata": {
48 | "id": "85dbaeb4-655e-4743-809f-823bc75400c4",
49 | "tags": []
50 | },
51 | "source": [
52 | "## Setup and Data Download\n",
53 | "\n",
54 | "The following blocks of code will install the required packages and download the datasets to your Colab environment."
55 | ]
56 | },
57 | {
58 | "cell_type": "code",
59 | "execution_count": null,
60 | "id": "27ab242e-e140-4afe-a6e8-c9f044bec425",
61 | "metadata": {
62 | "id": "27ab242e-e140-4afe-a6e8-c9f044bec425"
63 | },
64 | "outputs": [],
65 | "source": [
66 | "%%capture\n",
67 | "if 'google.colab' in str(get_ipython()):\n",
68 | " !pip install rioxarray"
69 | ]
70 | },
71 | {
72 | "cell_type": "code",
73 | "execution_count": null,
74 | "id": "3decd0de-ae44-4d80-80b6-51223cc36ffe",
75 | "metadata": {
76 | "id": "3decd0de-ae44-4d80-80b6-51223cc36ffe"
77 | },
78 | "outputs": [],
79 | "source": [
80 | "import geopandas as gpd\n",
81 | "import matplotlib.pyplot as plt\n",
82 | "import os\n",
83 | "import rioxarray as rxr\n",
84 | "from rioxarray.merge import merge_arrays\n",
85 | "import shapely\n",
86 | "import xarray as xr"
87 | ]
88 | },
89 | {
90 | "cell_type": "code",
91 | "execution_count": null,
92 | "id": "e1c0ed63-39db-4689-9a65-f6eb7de98f19",
93 | "metadata": {
94 | "id": "e1c0ed63-39db-4689-9a65-f6eb7de98f19"
95 | },
96 | "outputs": [],
97 | "source": [
98 | "data_folder = 'data'\n",
99 | "output_folder = 'output'\n",
100 | "\n",
101 | "if not os.path.exists(data_folder):\n",
102 | " os.mkdir(data_folder)\n",
103 | "if not os.path.exists(output_folder):\n",
104 | " os.mkdir(output_folder)"
105 | ]
106 | },
107 | {
108 | "cell_type": "code",
109 | "execution_count": null,
110 | "id": "782466e6-1f57-437f-a564-dda8caeb87db",
111 | "metadata": {
112 | "id": "782466e6-1f57-437f-a564-dda8caeb87db"
113 | },
114 | "outputs": [],
115 | "source": [
116 | "def download(url):\n",
117 | " filename = os.path.join(data_folder, os.path.basename(url))\n",
118 | " if not os.path.exists(filename):\n",
119 | " from urllib.request import urlretrieve\n",
120 | " local, _ = urlretrieve(url, filename)\n",
121 | " print('Downloaded ' + local)\n",
122 | "\n",
123 | "srtm_tiles = [\n",
124 | " 'N05E080.SRTMGL1.hgt.zip',\n",
125 | " 'N06E079.SRTMGL1.hgt.zip',\n",
126 | " 'N06E080.SRTMGL1.hgt.zip',\n",
127 | " 'N06E081.SRTMGL1.hgt.zip',\n",
128 | " 'N07E079.SRTMGL1.hgt.zip',\n",
129 | " 'N07E080.SRTMGL1.hgt.zip',\n",
130 | " 'N07E081.SRTMGL1.hgt.zip',\n",
131 | " 'N08E079.SRTMGL1.hgt.zip',\n",
132 | " 'N08E080.SRTMGL1.hgt.zip',\n",
133 | " 'N08E081.SRTMGL1.hgt.zip',\n",
134 | " 'N09E080.SRTMGL1.hgt.zip',\n",
135 | " 'N09E079.SRTMGL1.hgt.zip'\n",
136 | "]\n",
137 | "\n",
138 | "shapefile = 'ne_10m_admin_0_countries_ind.zip'\n",
139 | "\n",
140 | "data_url = 'https://github.com/spatialthoughts/geopython-tutorials/releases/download/data/'\n",
141 | "\n",
142 | "for tile in srtm_tiles:\n",
143 | " url = '{}/{}'.format(data_url, tile)\n",
144 | " download(url)\n",
145 | "\n",
146 | "download('{}/{}'.format(data_url,shapefile))"
147 | ]
148 | },
149 | {
150 | "cell_type": "markdown",
151 | "id": "31760f89-975f-42df-9599-13466772da61",
152 | "metadata": {
153 | "id": "31760f89-975f-42df-9599-13466772da61"
154 | },
155 | "source": [
156 | "## Procedure"
157 | ]
158 | },
159 | {
160 | "cell_type": "markdown",
161 | "id": "WaBA4q4FFupB",
162 | "metadata": {
163 | "id": "WaBA4q4FFupB"
164 | },
165 | "source": [
166 | "For this tutorial, we want to mosaic the source tiles and clip them to the boundary of Sri Lanka. We read the Natural Earth administrative regions shapefile."
167 | ]
168 | },
169 | {
170 | "cell_type": "code",
171 | "execution_count": null,
172 | "id": "HbDnBfLpGH4Q",
173 | "metadata": {
174 | "id": "HbDnBfLpGH4Q"
175 | },
176 | "outputs": [],
177 | "source": [
178 | "shapefile_path = os.path.join(data_folder, shapefile)\n",
179 | "boundaries_gdf = gpd.read_file(shapefile_path)"
180 | ]
181 | },
182 | {
183 | "cell_type": "markdown",
184 | "id": "CV7AAgNuGR4R",
185 | "metadata": {
186 | "id": "CV7AAgNuGR4R"
187 | },
188 | "source": [
189 | "We filter the dataframe using the ADM0_A3 column and extract the geometry."
190 | ]
191 | },
192 | {
193 | "cell_type": "code",
194 | "execution_count": null,
195 | "id": "81gdSJcYGQ7i",
196 | "metadata": {
197 | "id": "81gdSJcYGQ7i"
198 | },
199 | "outputs": [],
200 | "source": [
201 | "filtered_gdf = boundaries_gdf[boundaries_gdf['ADM0_A3'] == 'LKA']\n",
202 | "geometry = filtered_gdf.geometry\n",
203 | "geometry"
204 | ]
205 | },
206 | {
207 | "cell_type": "markdown",
208 | "id": "36a7fe8d-e3a9-4137-a3f1-87898c4b6301",
209 | "metadata": {
210 | "id": "36a7fe8d-e3a9-4137-a3f1-87898c4b6301"
211 | },
212 | "source": [
213 | "Next, we read the zipped SRTM tiles using rioxarray. rioxarray uses GDAL to read raster datasets, and can read zipped SRTM files directly. We also specify `mask_and_scale=False` so the nodata values from the input rasters is preserved and not set to NaN."
214 | ]
215 | },
216 | {
217 | "cell_type": "code",
218 | "execution_count": null,
219 | "id": "e6428cb4-0d19-4ffd-bea4-e3109dae33d3",
220 | "metadata": {
221 | "id": "e6428cb4-0d19-4ffd-bea4-e3109dae33d3"
222 | },
223 | "outputs": [],
224 | "source": [
225 | "datasets = []\n",
226 | "for tile in srtm_tiles:\n",
227 | " zipfile = os.path.join(data_folder, tile)\n",
228 | " ds = rxr.open_rasterio(zipfile, mask_and_scale=False)\n",
229 | " datasets.append(ds)"
230 | ]
231 | },
232 | {
233 | "cell_type": "markdown",
234 | "id": "5gRXiB8s8XpP",
235 | "metadata": {
236 | "id": "5gRXiB8s8XpP"
237 | },
238 | "source": [
239 | "We can get the bounding box of each image and create a GeoDataFrame to visualize the extent of the coverage along with the chosen region."
240 | ]
241 | },
242 | {
243 | "cell_type": "code",
244 | "execution_count": null,
245 | "id": "kXbQ-J5o7PmN",
246 | "metadata": {
247 | "id": "kXbQ-J5o7PmN"
248 | },
249 | "outputs": [],
250 | "source": [
251 | "bboxes = []\n",
252 | "for ds in datasets:\n",
253 | " bounds = ds.rio.bounds()\n",
254 | " bbox = shapely.box(*bounds) # Create a shapely box object\n",
255 | " bboxes.append(bbox)\n",
256 | "\n",
257 | "gdf = gpd.GeoDataFrame(geometry=bboxes, crs=datasets[0].rio.crs)"
258 | ]
259 | },
260 | {
261 | "cell_type": "markdown",
262 | "id": "z0AQ-fkI9MWg",
263 | "metadata": {
264 | "id": "z0AQ-fkI9MWg"
265 | },
266 | "source": [
267 | "Plot the bounding boxes and the chosen admin boundary."
268 | ]
269 | },
270 | {
271 | "cell_type": "code",
272 | "execution_count": null,
273 | "id": "3EfywFl39UFt",
274 | "metadata": {
275 | "colab": {
276 | "base_uri": "https://localhost:8080/",
277 | "height": 422
278 | },
279 | "id": "3EfywFl39UFt",
280 | "outputId": "dbf93e5a-ae27-4e40-a5d9-a2e050da1ff9"
281 | },
282 | "outputs": [
283 | {
284 | "data": {
285 | "image/png": "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",
286 | "text/plain": [
287 | "<xarray.DataArray (y: 4, x: 4)> Size: 16B\n", 593 | "array([[0, 0, 1, 1],\n", 594 | " [0, 0, 1, 1],\n", 595 | " [0, 2, 2, 2],\n", 596 | " [2, 2, 3, 3]], dtype=uint8)\n", 597 | "Coordinates:\n", 598 | " * y (y) uint64 32B 1432187 1431187 1430187 1429187\n", 599 | " * x (x) uint64 32B 780850 781850 782850 783850
<xarray.DataArray (y: 4, x: 4)> Size: 16B\n", 1030 | "array([[0, 0, 1, 1],\n", 1031 | " [0, 0, 1, 1],\n", 1032 | " [0, 2, 2, 2],\n", 1033 | " [2, 2, 3, 3]], dtype=uint8)\n", 1034 | "Coordinates:\n", 1035 | " * y (y) uint64 32B 1432187 1431187 1430187 1429187\n", 1036 | " * x (x) uint64 32B 780850 781850 782850 783850\n", 1037 | " spatial_ref int64 8B 0
| \n", 364 | " | location | \n", 365 | "num_killed | \n", 366 | "summary | \n", 367 | "
|---|---|---|---|
| 0 | \n", 372 | "Dhenkanal, Odisha | \n", 373 | "2 | \n", 374 | "2 persons trampled to death by elephants in 2 ... | \n", 375 | "
| 1 | \n", 378 | "Jharkhand's Latehar district | \n", 379 | "3 | \n", 380 | "Three members of a family, including a 3-year-... | \n", 381 | "
| 2 | \n", 384 | "Perumugai in the T.N. Palayam block | \n", 385 | "1 | \n", 386 | "Wild elephant Karuppan trampled a 48-year-old ... | \n", 387 | "
| \n", 736 | " | geocoded | \n", 737 | "
|---|---|
| 0 | \n", 742 | "(Dhenkanal, Odisha, India, (20.6504753, 85.598... | \n", 743 | "
| 1 | \n", 746 | "(Latehar, Jharkhand, India, (23.7555791, 84.35... | \n", 747 | "
| 2 | \n", 750 | "(Perumugai, Tamil Nadu 632009, India, (12.9376... | \n", 751 | "
| \n", 821 | " | location | \n", 822 | "num_killed | \n", 823 | "summary | \n", 824 | "latitude | \n", 825 | "longitude | \n", 826 | "
|---|---|---|---|---|---|
| 0 | \n", 831 | "Dhenkanal, Odisha | \n", 832 | "2 | \n", 833 | "2 persons trampled to death by elephants in 2 ... | \n", 834 | "20.650475 | \n", 835 | "85.598122 | \n", 836 | "
| 1 | \n", 839 | "Jharkhand's Latehar district | \n", 840 | "3 | \n", 841 | "Three members of a family, including a 3-year-... | \n", 842 | "23.755579 | \n", 843 | "84.354205 | \n", 844 | "
| 2 | \n", 847 | "Perumugai in the T.N. Palayam block | \n", 848 | "1 | \n", 849 | "Wild elephant Karuppan trampled a 48-year-old ... | \n", 850 | "12.937608 | \n", 851 | "79.185825 | \n", 852 | "