{ "cells": [ { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "''' \n", "Access to improved water sources with children and elderly overlay\n", "'''\n", "import os\n", "import rioxarray as rxr\n", "import geopandas as gpd\n", "import pandas as pd\n", "import holoviews as hv\n", "import hvplot.pandas\n", "import hvplot.xarray\n", "import matplotlib.pyplot as plt\n", "import contextily as ctx\n", "import rasterio\n", "from rasterio.plot import show\n", "import rasterio.mask\n", "import matplotlib.pyplot as plt\n", "\n", "os.chdir(r'C:/Users/jtrum/world_bank/data/')" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "'''\n", "aoi = area of interest\n", "hdsl = high resolution population density of children under 5\n", "ihme = mean percent of population with access to improved water source\n", "'''\n", "aoi = gpd.read_file('aoiLuanda.geojson')\n", "hdsl = rxr.open_rasterio('ago_children_under_five_2020.tif')\n", "ihme = rxr.open_rasterio('IHME_LMIC_WASH_2000_2017_W_IMP_PERCENT_MEAN_2017_Y2020M06D02.TIF')\n", "aoi_bound = aoi.geometry\n", "hdsl_clip = hdsl.rio.clip(aoi_bound)\n", "ihme_clip = ihme.rio.clip(aoi_bound)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "\n", "\n" ] } ], "source": [ "print(type(hdsl_clip))\n", "print(type(ihme_clip))\n", "print(type(aoi))\n" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "hdsl_clip2 = hdsl_clip.squeeze()\n", "hdsl_df = hdsl_clip2.to_dataframe(name='percent')\n", "hdsl_df = hdsl_df['percent'].dropna()\n", "ihme_clip2 = ihme_clip.squeeze()\n", "ihme_df = ihme_clip2.to_dataframe(name='percent')\n", "ihme_df = ihme_df[ihme_df.percent != -999999.0]" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "hdsl_df = hdsl_df.reset_index()\n", "hdsl_df = hdsl_df.rename(columns={'x':'lon', 'y':'lat'})\n", "hdsl_gdf = gpd.GeoDataFrame(hdsl_df, geometry=gpd.points_from_xy(hdsl_df.lon, hdsl_df.lat))" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [], "source": [ "ihme_df =ihme_df.reset_index()\n" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
yxbandspatial_refpercent
0-8.68750113.4375161099.396202
1-8.68750113.4791831099.813766
2-8.68750113.5208491096.345879
3-8.72916813.4375161099.989731
4-8.72916813.4791831099.981781
..................
111-9.22916813.1875161033.793404
112-9.27083413.1458491036.304882
113-9.27083413.1875161036.074020
114-9.31250113.1458491037.536205
115-9.31250113.1875161033.094032
\n", "

116 rows × 5 columns

\n", "
" ], "text/plain": [ " y x band spatial_ref percent\n", "0 -8.687501 13.437516 1 0 99.396202\n", "1 -8.687501 13.479183 1 0 99.813766\n", "2 -8.687501 13.520849 1 0 96.345879\n", "3 -8.729168 13.437516 1 0 99.989731\n", "4 -8.729168 13.479183 1 0 99.981781\n", ".. ... ... ... ... ...\n", "111 -9.229168 13.187516 1 0 33.793404\n", "112 -9.270834 13.145849 1 0 36.304882\n", "113 -9.270834 13.187516 1 0 36.074020\n", "114 -9.312501 13.145849 1 0 37.536205\n", "115 -9.312501 13.187516 1 0 33.094032\n", "\n", "[116 rows x 5 columns]" ] }, "execution_count": 24, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ihme_df" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "ihme_df = ihme_df.rename(columns={'x':'lon', 'y':'lat'})" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "ename": "InvalidIndexError", "evalue": "(0 13.437516\n1 13.479183\n2 13.520849\n3 13.437516\n4 13.479183\n ... \n111 13.187516\n112 13.145849\n113 13.187516\n114 13.145849\n115 13.187516\nName: lon, Length: 116, dtype: float64, 0 -8.687501\n1 -8.687501\n2 -8.687501\n3 -8.729168\n4 -8.729168\n ... \n111 -9.229168\n112 -9.270834\n113 -9.270834\n114 -9.312501\n115 -9.312501\nName: lat, Length: 116, dtype: float64)", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\pandas\\core\\indexes\\base.py:3653\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3652\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m-> 3653\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_engine\u001b[39m.\u001b[39;49mget_loc(casted_key)\n\u001b[0;32m 3654\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mKeyError\u001b[39;00m \u001b[39mas\u001b[39;00m err:\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\pandas\\_libs\\index.pyx:147\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\pandas\\_libs\\index.pyx:153\u001b[0m, in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mTypeError\u001b[0m: '(0 13.437516\n1 13.479183\n2 13.520849\n3 13.437516\n4 13.479183\n ... \n111 13.187516\n112 13.145849\n113 13.187516\n114 13.145849\n115 13.187516\nName: lon, Length: 116, dtype: float64, 0 -8.687501\n1 -8.687501\n2 -8.687501\n3 -8.729168\n4 -8.729168\n ... \n111 -9.229168\n112 -9.270834\n113 -9.270834\n114 -9.312501\n115 -9.312501\nName: lat, Length: 116, dtype: float64)' is an invalid key", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mInvalidIndexError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mc:\\Users\\jtrum\\Desktop\\maps\\map_11_water-sources_children-elderly.ipynb Cell 9\u001b[0m line \u001b[0;36m1\n\u001b[1;32m----> 1\u001b[0m ihme_gdf \u001b[39m=\u001b[39m gpd\u001b[39m.\u001b[39;49mGeoDataFrame(ihme_df, geometry\u001b[39m=\u001b[39;49m(ihme_df\u001b[39m.\u001b[39;49mlon, ihme_df\u001b[39m.\u001b[39;49mlat))\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\geopandas\\geodataframe.py:191\u001b[0m, in \u001b[0;36mGeoDataFrame.__init__\u001b[1;34m(self, data, geometry, crs, *args, **kwargs)\u001b[0m\n\u001b[0;32m 183\u001b[0m \u001b[39mif\u001b[39;00m (\n\u001b[0;32m 184\u001b[0m \u001b[39mhasattr\u001b[39m(geometry, \u001b[39m\"\u001b[39m\u001b[39mcrs\u001b[39m\u001b[39m\"\u001b[39m)\n\u001b[0;32m 185\u001b[0m \u001b[39mand\u001b[39;00m geometry\u001b[39m.\u001b[39mcrs\n\u001b[0;32m 186\u001b[0m \u001b[39mand\u001b[39;00m crs\n\u001b[0;32m 187\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mnot\u001b[39;00m geometry\u001b[39m.\u001b[39mcrs \u001b[39m==\u001b[39m crs\n\u001b[0;32m 188\u001b[0m ):\n\u001b[0;32m 189\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(crs_mismatch_error)\n\u001b[1;32m--> 191\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mset_geometry(geometry, inplace\u001b[39m=\u001b[39;49m\u001b[39mTrue\u001b[39;49;00m, crs\u001b[39m=\u001b[39;49mcrs)\n\u001b[0;32m 193\u001b[0m \u001b[39mif\u001b[39;00m geometry \u001b[39mis\u001b[39;00m \u001b[39mNone\u001b[39;00m \u001b[39mand\u001b[39;00m crs:\n\u001b[0;32m 194\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\n\u001b[0;32m 195\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mAssigning CRS to a GeoDataFrame without a geometry column is not \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 196\u001b[0m \u001b[39m\"\u001b[39m\u001b[39msupported. Supply geometry using the \u001b[39m\u001b[39m'\u001b[39m\u001b[39mgeometry=\u001b[39m\u001b[39m'\u001b[39m\u001b[39m keyword argument, \u001b[39m\u001b[39m\"\u001b[39m\n\u001b[0;32m 197\u001b[0m \u001b[39m\"\u001b[39m\u001b[39mor by providing a DataFrame with column name \u001b[39m\u001b[39m'\u001b[39m\u001b[39mgeometry\u001b[39m\u001b[39m'\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m 198\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\geopandas\\geodataframe.py:320\u001b[0m, in \u001b[0;36mGeoDataFrame.set_geometry\u001b[1;34m(self, col, drop, inplace, crs)\u001b[0m\n\u001b[0;32m 318\u001b[0m \u001b[39melse\u001b[39;00m:\n\u001b[0;32m 319\u001b[0m \u001b[39mtry\u001b[39;00m:\n\u001b[1;32m--> 320\u001b[0m level \u001b[39m=\u001b[39m frame[col]\n\u001b[0;32m 321\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mKeyError\u001b[39;00m:\n\u001b[0;32m 322\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mValueError\u001b[39;00m(\u001b[39m\"\u001b[39m\u001b[39mUnknown column \u001b[39m\u001b[39m%s\u001b[39;00m\u001b[39m\"\u001b[39m \u001b[39m%\u001b[39m col)\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\geopandas\\geodataframe.py:1475\u001b[0m, in \u001b[0;36mGeoDataFrame.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 1469\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m__getitem__\u001b[39m(\u001b[39mself\u001b[39m, key):\n\u001b[0;32m 1470\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"\u001b[39;00m\n\u001b[0;32m 1471\u001b[0m \u001b[39m If the result is a column containing only 'geometry', return a\u001b[39;00m\n\u001b[0;32m 1472\u001b[0m \u001b[39m GeoSeries. If it's a DataFrame with any columns of GeometryDtype,\u001b[39;00m\n\u001b[0;32m 1473\u001b[0m \u001b[39m return a GeoDataFrame.\u001b[39;00m\n\u001b[0;32m 1474\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m-> 1475\u001b[0m result \u001b[39m=\u001b[39m \u001b[39msuper\u001b[39;49m()\u001b[39m.\u001b[39;49m\u001b[39m__getitem__\u001b[39;49m(key)\n\u001b[0;32m 1476\u001b[0m \u001b[39m# Custom logic to avoid waiting for pandas GH51895\u001b[39;00m\n\u001b[0;32m 1477\u001b[0m \u001b[39m# result is not geometry dtype for multi-indexes\u001b[39;00m\n\u001b[0;32m 1478\u001b[0m \u001b[39mif\u001b[39;00m (\n\u001b[0;32m 1479\u001b[0m pd\u001b[39m.\u001b[39mapi\u001b[39m.\u001b[39mtypes\u001b[39m.\u001b[39mis_scalar(key)\n\u001b[0;32m 1480\u001b[0m \u001b[39mand\u001b[39;00m key \u001b[39m==\u001b[39m \u001b[39m\"\u001b[39m\u001b[39m\"\u001b[39m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 1483\u001b[0m \u001b[39mand\u001b[39;00m \u001b[39mnot\u001b[39;00m is_geometry_type(result)\n\u001b[0;32m 1484\u001b[0m ):\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\pandas\\core\\frame.py:3761\u001b[0m, in \u001b[0;36mDataFrame.__getitem__\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3759\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39mcolumns\u001b[39m.\u001b[39mnlevels \u001b[39m>\u001b[39m \u001b[39m1\u001b[39m:\n\u001b[0;32m 3760\u001b[0m \u001b[39mreturn\u001b[39;00m \u001b[39mself\u001b[39m\u001b[39m.\u001b[39m_getitem_multilevel(key)\n\u001b[1;32m-> 3761\u001b[0m indexer \u001b[39m=\u001b[39m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49mcolumns\u001b[39m.\u001b[39;49mget_loc(key)\n\u001b[0;32m 3762\u001b[0m \u001b[39mif\u001b[39;00m is_integer(indexer):\n\u001b[0;32m 3763\u001b[0m indexer \u001b[39m=\u001b[39m [indexer]\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\pandas\\core\\indexes\\base.py:3660\u001b[0m, in \u001b[0;36mIndex.get_loc\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 3655\u001b[0m \u001b[39mraise\u001b[39;00m \u001b[39mKeyError\u001b[39;00m(key) \u001b[39mfrom\u001b[39;00m \u001b[39merr\u001b[39;00m\n\u001b[0;32m 3656\u001b[0m \u001b[39mexcept\u001b[39;00m \u001b[39mTypeError\u001b[39;00m:\n\u001b[0;32m 3657\u001b[0m \u001b[39m# If we have a listlike key, _check_indexing_error will raise\u001b[39;00m\n\u001b[0;32m 3658\u001b[0m \u001b[39m# InvalidIndexError. Otherwise we fall through and re-raise\u001b[39;00m\n\u001b[0;32m 3659\u001b[0m \u001b[39m# the TypeError.\u001b[39;00m\n\u001b[1;32m-> 3660\u001b[0m \u001b[39mself\u001b[39;49m\u001b[39m.\u001b[39;49m_check_indexing_error(key)\n\u001b[0;32m 3661\u001b[0m \u001b[39mraise\u001b[39;00m\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\pandas\\core\\indexes\\base.py:5737\u001b[0m, in \u001b[0;36mIndex._check_indexing_error\u001b[1;34m(self, key)\u001b[0m\n\u001b[0;32m 5733\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_check_indexing_error\u001b[39m(\u001b[39mself\u001b[39m, key):\n\u001b[0;32m 5734\u001b[0m \u001b[39mif\u001b[39;00m \u001b[39mnot\u001b[39;00m is_scalar(key):\n\u001b[0;32m 5735\u001b[0m \u001b[39m# if key is not a scalar, directly raise an error (the code below\u001b[39;00m\n\u001b[0;32m 5736\u001b[0m \u001b[39m# would convert to numpy arrays and raise later any way) - GH29926\u001b[39;00m\n\u001b[1;32m-> 5737\u001b[0m \u001b[39mraise\u001b[39;00m InvalidIndexError(key)\n", "\u001b[1;31mInvalidIndexError\u001b[0m: (0 13.437516\n1 13.479183\n2 13.520849\n3 13.437516\n4 13.479183\n ... \n111 13.187516\n112 13.145849\n113 13.187516\n114 13.145849\n115 13.187516\nName: lon, Length: 116, dtype: float64, 0 -8.687501\n1 -8.687501\n2 -8.687501\n3 -8.729168\n4 -8.729168\n ... \n111 -9.229168\n112 -9.270834\n113 -9.270834\n114 -9.312501\n115 -9.312501\nName: lat, Length: 116, dtype: float64)" ] } ], "source": [ "ihme_gdf = gpd.GeoDataFrame(ihme_df, geometry=(ihme_df.lon, ihme_df.lat))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
latlonbandspatial_refpercentgeometry
0-8.68750113.4375161099.396202POINT (13.43752 -8.68750)
1-8.68750113.4791831099.813766POINT (13.47918 -8.68750)
2-8.68750113.5208491096.345879POINT (13.52085 -8.68750)
3-8.72916813.4375161099.989731POINT (13.43752 -8.72917)
4-8.72916813.4791831099.981781POINT (13.47918 -8.72917)
.....................
111-9.22916813.1875161033.793404POINT (13.18752 -9.22917)
112-9.27083413.1458491036.304882POINT (13.14585 -9.27083)
113-9.27083413.1875161036.074020POINT (13.18752 -9.27083)
114-9.31250113.1458491037.536205POINT (13.14585 -9.31250)
115-9.31250113.1875161033.094032POINT (13.18752 -9.31250)
\n", "

116 rows × 6 columns

\n", "
" ], "text/plain": [ " lat lon band spatial_ref percent \\\n", "0 -8.687501 13.437516 1 0 99.396202 \n", "1 -8.687501 13.479183 1 0 99.813766 \n", "2 -8.687501 13.520849 1 0 96.345879 \n", "3 -8.729168 13.437516 1 0 99.989731 \n", "4 -8.729168 13.479183 1 0 99.981781 \n", ".. ... ... ... ... ... \n", "111 -9.229168 13.187516 1 0 33.793404 \n", "112 -9.270834 13.145849 1 0 36.304882 \n", "113 -9.270834 13.187516 1 0 36.074020 \n", "114 -9.312501 13.145849 1 0 37.536205 \n", "115 -9.312501 13.187516 1 0 33.094032 \n", "\n", " geometry \n", "0 POINT (13.43752 -8.68750) \n", "1 POINT (13.47918 -8.68750) \n", "2 POINT (13.52085 -8.68750) \n", "3 POINT (13.43752 -8.72917) \n", "4 POINT (13.47918 -8.72917) \n", ".. ... \n", "111 POINT (13.18752 -9.22917) \n", "112 POINT (13.14585 -9.27083) \n", "113 POINT (13.18752 -9.27083) \n", "114 POINT (13.14585 -9.31250) \n", "115 POINT (13.18752 -9.31250) \n", "\n", "[116 rows x 6 columns]" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "ihme_gdf" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "# Reproject the AOI to match the CRS of the raster datasets\n", "aoi = aoi.to_crs(hdsl.crs)\n", "\n", "# Get the geometry of the AOI\n", "aoi_geometry = aoi.geometry.values[0]\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "# Clip the raster datasets to the AOI\n", "hdsl_clip, hdsl_transform = rasterio.mask.mask(hdsl, shapes=[aoi_geometry], crop=True)\n", "ihme_clip, ihme_transform = rasterio.mask.mask(ihme, shapes=[aoi_geometry], crop=True)" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [], "source": [ "hdsl_clip_dataset = rasterio.open(\n", " 'hdsl_clip.tif',\n", " 'w',\n", " driver='GTiff',\n", " height=hdsl_clip.shape[1],\n", " width=hdsl_clip.shape[2],\n", " count=1,\n", " dtype=str(hdsl_clip.dtype),\n", " crs=hdsl.crs,\n", " transform=hdsl_transform,\n", ")\n", "hdsl_clip_dataset.write(hdsl_clip[0], 1)\n", "hdsl_clip_dataset.close()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Create a new GeoDataFrame for the clipped AOI\n", "aoi_clipped = gpd.GeoDataFrame({'geometry': [aoi_geometry]}, crs=hdsl.crs)" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "# Manually set CRS for GeoDataFrame\n", "aoi_clipped = aoi_clipped.to_crs(epsg=3857)" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "ename": "CRSError", "evalue": "The WKT could not be parsed. OGR Error code 6", "output_type": "error", "traceback": [ "\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[1;31mCPLE_BaseError\u001b[0m Traceback (most recent call last)", "File \u001b[1;32mrasterio\\\\crs.pyx:775\u001b[0m, in \u001b[0;36mrasterio.crs.CRS.from_user_input\u001b[1;34m()\u001b[0m\n", "File \u001b[1;32mrasterio\\\\_err.pyx:209\u001b[0m, in \u001b[0;36mrasterio._err.exc_wrap_ogrerr\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mCPLE_BaseError\u001b[0m: OGR Error code 6", "\nDuring handling of the above exception, another exception occurred:\n", "\u001b[1;31mCRSError\u001b[0m Traceback (most recent call last)", "\u001b[1;32mc:\\Users\\jtrum\\Desktop\\maps\\map_11_water-sources_children-elderly.ipynb Cell 11\u001b[0m line \u001b[0;36m5\n\u001b[0;32m 1\u001b[0m ax \u001b[39m=\u001b[39m aoi\u001b[39m.\u001b[39mplot(facecolor\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mnone\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m 2\u001b[0m edgecolor\u001b[39m=\u001b[39m\u001b[39m\"\u001b[39m\u001b[39mred\u001b[39m\u001b[39m\"\u001b[39m,\n\u001b[0;32m 3\u001b[0m linewidth\u001b[39m=\u001b[39m\u001b[39m2\u001b[39m\n\u001b[0;32m 4\u001b[0m )\n\u001b[1;32m----> 5\u001b[0m ctx\u001b[39m.\u001b[39;49madd_basemap(ax,\n\u001b[0;32m 6\u001b[0m crs\u001b[39m=\u001b[39;49maoi\u001b[39m.\u001b[39;49mcrs\u001b[39m.\u001b[39;49mto_string(),\n\u001b[0;32m 7\u001b[0m source\u001b[39m=\u001b[39;49mctx\u001b[39m.\u001b[39;49mproviders\u001b[39m.\u001b[39;49mCartoDB\u001b[39m.\u001b[39;49mVoyager\n\u001b[0;32m 8\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\contextily\\plotting.py:125\u001b[0m, in \u001b[0;36madd_basemap\u001b[1;34m(ax, zoom, source, interpolation, attribution, attribution_size, reset_extent, crs, resampling, **extra_imshow_args)\u001b[0m\n\u001b[0;32m 123\u001b[0m \u001b[39m# Convert extent from `crs` into WM for tile query\u001b[39;00m\n\u001b[0;32m 124\u001b[0m \u001b[39mif\u001b[39;00m crs \u001b[39mis\u001b[39;00m \u001b[39mnot\u001b[39;00m \u001b[39mNone\u001b[39;00m:\n\u001b[1;32m--> 125\u001b[0m left, right, bottom, top \u001b[39m=\u001b[39m _reproj_bb(\n\u001b[0;32m 126\u001b[0m left, right, bottom, top, crs, \u001b[39m\"\u001b[39;49m\u001b[39mepsg:3857\u001b[39;49m\u001b[39m\"\u001b[39;49m\n\u001b[0;32m 127\u001b[0m )\n\u001b[0;32m 128\u001b[0m \u001b[39m# Download image\u001b[39;00m\n\u001b[0;32m 129\u001b[0m image, extent \u001b[39m=\u001b[39m bounds2img(\n\u001b[0;32m 130\u001b[0m left, bottom, right, top, zoom\u001b[39m=\u001b[39mzoom, source\u001b[39m=\u001b[39msource, ll\u001b[39m=\u001b[39m\u001b[39mFalse\u001b[39;00m\n\u001b[0;32m 131\u001b[0m )\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\contextily\\plotting.py:215\u001b[0m, in \u001b[0;36m_reproj_bb\u001b[1;34m(left, right, bottom, top, s_crs, t_crs)\u001b[0m\n\u001b[0;32m 214\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39m_reproj_bb\u001b[39m(left, right, bottom, top, s_crs, t_crs):\n\u001b[1;32m--> 215\u001b[0m n_l, n_b, n_r, n_t \u001b[39m=\u001b[39m transform_bounds(s_crs, t_crs, left, bottom, right, top)\n\u001b[0;32m 216\u001b[0m \u001b[39mreturn\u001b[39;00m n_l, n_r, n_b, n_t\n", "File \u001b[1;32mc:\\Users\\jtrum\\miniconda3\\envs\\wash\\lib\\site-packages\\rasterio\\warp.py:147\u001b[0m, in \u001b[0;36mtransform_bounds\u001b[1;34m(src_crs, dst_crs, left, bottom, right, top, densify_pts)\u001b[0m\n\u001b[0;32m 113\u001b[0m \u001b[39mdef\u001b[39;00m \u001b[39mtransform_bounds\u001b[39m(\n\u001b[0;32m 114\u001b[0m src_crs,\n\u001b[0;32m 115\u001b[0m dst_crs,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 119\u001b[0m top,\n\u001b[0;32m 120\u001b[0m densify_pts\u001b[39m=\u001b[39m\u001b[39m21\u001b[39m):\n\u001b[0;32m 121\u001b[0m \u001b[39m \u001b[39m\u001b[39m\"\"\"Transform bounds from src_crs to dst_crs.\u001b[39;00m\n\u001b[0;32m 122\u001b[0m \n\u001b[0;32m 123\u001b[0m \u001b[39m Optionally densifying the edges (to account for nonlinear transformations\u001b[39;00m\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 145\u001b[0m \u001b[39m Outermost coordinates in target coordinate reference system.\u001b[39;00m\n\u001b[0;32m 146\u001b[0m \u001b[39m \"\"\"\u001b[39;00m\n\u001b[1;32m--> 147\u001b[0m src_crs \u001b[39m=\u001b[39m CRS\u001b[39m.\u001b[39;49mfrom_user_input(src_crs)\n\u001b[0;32m 148\u001b[0m dst_crs \u001b[39m=\u001b[39m CRS\u001b[39m.\u001b[39mfrom_user_input(dst_crs)\n\u001b[0;32m 149\u001b[0m \u001b[39mreturn\u001b[39;00m _transform_bounds(\n\u001b[0;32m 150\u001b[0m src_crs,\n\u001b[0;32m 151\u001b[0m dst_crs,\n\u001b[1;32m (...)\u001b[0m\n\u001b[0;32m 156\u001b[0m densify_pts,\n\u001b[0;32m 157\u001b[0m )\n", "File \u001b[1;32mrasterio\\\\crs.pyx:777\u001b[0m, in \u001b[0;36mrasterio.crs.CRS.from_user_input\u001b[1;34m()\u001b[0m\n", "\u001b[1;31mCRSError\u001b[0m: The WKT could not be parsed. OGR Error code 6" ] }, { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ax = aoi.plot(facecolor=\"none\",\n", " edgecolor=\"red\",\n", " linewidth=2\n", " )\n", "ctx.add_basemap(ax,\n", " crs=aoi.crs.to_string(),\n", " source=ctx.providers.CartoDB.Voyager\n", " )" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "wash", "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.8.18" } }, "nbformat": 4, "nbformat_minor": 2 }