Commit 8e7f8eb4 authored by Nicolas Garcia Ospina's avatar Nicolas Garcia Ospina
Browse files

Included external datasets management

parent 6830f645
Pipeline #20242 passed with stage
in 4 minutes and 10 seconds
...@@ -3,7 +3,7 @@ image: debian:bullseye-slim ...@@ -3,7 +3,7 @@ image: debian:bullseye-slim
# Make pip cache the installed dependencies # Make pip cache the installed dependencies
variables: variables:
PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
OBMGAPANALYSIS_BASE_PATH: "$CI_PROJECT_DIR/tests/data" TEST_BASE_PATH: "$CI_PROJECT_DIR/tests/data"
cache: cache:
paths: paths:
- .cache/pip - .cache/pip
......
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Processing of a cell\n",
"\n",
"\n",
"The `obmgapanalysis` package intends to process [QuadTiles](https://wiki.openstreetmap.org/wiki/QuadTiles) together with an input settlement `DataSource`. This is normally done by introducing parameters in a `config.yml` file which is parsed by the main program. Here is a graphic example of how the program processes a single tile as well as how can it be used with Python.\n",
"\n",
"First of all, import the `obmgapanalysis` parts and other libraries. I also defined a function that allows to plot shapely polygons in a quick way."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"#Import the core parts of obmgapanalysis\n",
"from obmgapanalysis.tile import Tile\n",
"from obmgapanalysis.datasource import DataSource\n",
"from obmgapanalysis.processor import TileProcessor\n",
"from obmgapanalysis.database import Database\n",
"\n",
"# Import some extra utilities, mainly for plots\n",
"import matplotlib.pyplot as plt\n",
"import matplotlib as mpl\n",
"from pprint import pprint\n",
"import geopandas\n",
"import rasterio.plot\n",
"import warnings\n",
"warnings.filterwarnings(\"ignore\")\n",
"\n",
"\n",
"def plot_polygon(polygon, axes, **kwargs):\n",
" \"\"\"\n",
" Plot a (multi)polygon in a matplotlib.axes.Axes instance.\n",
" \"\"\"\n",
" # Use **kwargs as in matplotlib.axes.Axes.fill\n",
" if polygon.geom_type == 'MultiPolygon':\n",
" for geom in polygon.geoms: \n",
" xs, ys = geom.exterior.xy \n",
" ax.fill(xs, ys, **kwargs)\n",
" elif polygon.geom_type == 'Polygon':\n",
" xs, ys = polygon.exterior.xy \n",
" ax.fill(xs, ys, **kwargs)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 1: Create a DataSource instance\n",
"\n",
"By using the `DataSource` class within `obmgapanalysis.datasource`, a settlement layer can be described for the program to be used. A deeper explanation on how to prepare a the data files can be found in [02_Input_datasets.md](./02_Input_datasets.md). \n",
"\n",
"In this example a small test dataset located in the `../tests/data/` is being used. This one is a subset of the original [GHSL-BUILT](https://ghsl.jrc.ec.europa.eu/download.php) dataset. Carefully insert all the arguments. `built_pixel_values` is a unique list dependent on the specification of the dataset.\n",
"\n",
"By printing the `DataSource` object it can be seen that the `raster_files_index` is ready to point to any specified file."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'built_pixel_values': [6, 5, 4, 3],\n",
" 'crs': 'epsg:3857',\n",
" 'pathname': '../tests/data/',\n",
" 'raster_files_index': location geometry\n",
"0 30x150000/149/102.tif POLYGON ((2250000.000 4800000.000, 2400000.000...\n",
"1 30x150000/149/103.tif POLYGON ((2250000.000 4650000.000, 2400000.000...\n",
"2 30x150000/149/104.tif POLYGON ((2250000.000 4500000.000, 2400000.000...\n",
"3 30x150000/150/102.tif POLYGON ((2400000.000 4800000.000, 2550000.000...\n",
"4 30x150000/150/103.tif POLYGON ((2400000.000 4650000.000, 2550000.000...\n",
"5 30x150000/150/104.tif POLYGON ((2400000.000 4500000.000, 2550000.000...\n",
"6 30x150000/151/102.tif POLYGON ((2550000.000 4800000.000, 2700000.000...\n",
"7 30x150000/151/103.tif POLYGON ((2550000.000 4650000.000, 2700000.000...\n",
"8 30x150000/151/104.tif POLYGON ((2550000.000 4500000.000, 2700000.000...\n",
"9 30x150000/152/102.tif POLYGON ((2700000.000 4800000.000, 2850000.000...\n",
"10 30x150000/152/103.tif POLYGON ((2700000.000 4650000.000, 2850000.000...\n",
"11 30x150000/152/104.tif POLYGON ((2700000.000 4500000.000, 2850000.000...}\n"
]
}
],
"source": [
"datasource = DataSource(\n",
" crs=\"epsg:3857\",\n",
" pathname=\"../tests/data/\",\n",
" raster_files_index=\"GHS_TEST_INDEX.shp\",\n",
" built_pixel_values=[6, 5, 4, 3],\n",
")\n",
"\n",
"pprint(vars(datasource))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 2: Create a Tile instance\n",
"\n",
"By using the `Tile` class within `obmgapanalysis.tile`, a tile can be created using its quadkey and a desired coordinate system to be used (check [EPSG](https://en.wikipedia.org/wiki/EPSG_Geodetic_Parameter_Dataset)). By printing its attributes. The `tile` has given a spatial characteristic in `geometry`. Afterwards, the geometry can be plotted to verify if the coordinates are right."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"{'crs': 'epsg:3857',\n",
" 'geometry': <shapely.geometry.polygon.Polygon object at 0x7f63c8f34df0>,\n",
" 'quadkey': '122100200320321022'}\n"
]
}
],
"source": [
"tile = Tile(quadkey = \"122100200320321022\", crs = \"epsg:3857\")\n",
"pprint(vars(tile))"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0.98, 'Footprint of tile 122100200320321022 \\n with crs=epsg:3857')"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAFgCAYAAABAEzndAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAwS0lEQVR4nO3de5xd873/8debkcQtCFFyqdxTCUkwUtpyggbVluPSSuW0VE+pKq22lOM45VRaR/vj6FFVRavqUhRR90tbpz11mwQlIYQgkwQjROoWiXx+f3y/M1kz2XsuySQzlvfz8diP7P39ru93fdbek89e+7vW+i5FBGZmVi7rdHUAZmbW+ZzczcxKyMndzKyEnNzNzErIyd3MrISc3M3MSsjJvWQkXSjptLW0rg9J+l9J/5D0/9rZZoakCfn56ZJ+uyZjNPugcnJfRZKek/S2pDcKj36r2WdIGrY6fUTE1yLiB+1c368lnbkaqzsKeAXoHRHfaU//ETE6Iv68Guts7PsbkuokLZH06xZ1u0i6S9KrkhokXStp60L9iZIez19KcySd2KL9DyQ9JmmZpNMrrPswSc9LelPSjZL6FOp6SrpU0mJJL0r6dqFuhKSpOaZXJd0haWSLvk/I7V7P/fQs1PWRdENe7/OSDivUjcrvx2v5cbekUR3Y5kGS/iTpLUlPSvpkoW6P/H4skrQwx9C/UP8TSU/nvp+U9KUWfV8kaZak5ZKOqPB+Vtzm/F5ekrf1H5IelvSp9n7OH3RO7qvnsxGxUeExvyuDkbTuWl7lNsDM6Jor4eYDZwKXVqjbDLgIGESK8R/Arwr1Ar6Ul9sX+IakSYX62cBJwC0tO5Y0GvgF8EXgQ8BbwAWFRU4Hhuf17gGcJGnfXLcpcBMwMrd9EJha6Hsf4GRgrxz7EOCMQt8/A97NbScDP8/xNL4fhwB9gC3yeq7uwDZfBTwMbA6cClwnqW+umwnsExGbAv2Ap4GfF9q+CXwW2AQ4HDhP0scK9Y8CXwem00Ib21wDzAX+Kfd9GnCNpEG5vq3P+YMtIvxYhQfwHPDJCuU9gf8m/Webn5/3LNR/lZQ8XiX9B+yXy/8XCNJ/lDeAQ4EJQD3wb6Q95OeAyYW+fk36T3ZrbvfJXHZmrm9s/x3gZWAB8OVcdxSwlJQs3gD+UGU7PwY8BLye//1YYd3F9p9s0a5i/8X3jZQIf1toswvwN2ARKSFMaMfncCbw6zaW2RH4Ryv1PwX+p0L5b4HTW5T9ELiy8Hpo3saN8+t5wN6F+h8AV1dZb5/8mW+eX18J/LBQvxfwYn6+YV7PiEL95cBZFfqtAY4F3mrPNgMjgCWN25DL/gJ8rcrf949IX+rV+r4J+E6F8r8CR7Qoq7rNVfr+O3DwqnzOH7SH99w736mkJDUOGAuMB/4dQNKepP8Ynwe2Bp4n711FxO65/dhIvwJ+l19vRdoT60/aK7qoxU/5w4ApwMak/zwtbUXa6+kPfAX4maTNIuIi4Arg7Ly+z7ZsmIcbbiElgs2Bc4BbJG0eEUe0aH93sW17+m+xrv55XWeSkt53gd8X9h5Xx+7AjCrrFbBbtfoKRpO+eACIiGfISVfSZqQ920cLyz+a21SL68WIWFip7/z8Q5I2JyXg9yLiqdb6lrQIeAf4H9IX0UoqbPNo4NmI+Ee1viV9OPf9NumzObtK3+sDO7OK7yfNt7ll3x8ivQ/V+q76OX8QObmvnhvzOOQiSTfmssnAf0bEyxHRQPqJ+cVC3aURMT0ilgCnALsWfmZWc1pELImIe0kJ8POFuqkR8X8RsTwi3qnQdmmOZ2lE3Eraix5ZYblKPg08HRGXR8SyiLgKeJL0E7yz/Qtwa0TcmrflLqAO2G91OpU0BvgP4MQqi5xO+n/Q3p/zG5F+xRS9Tvpy3ajwumVdy7gGkIZZvl0obtl34/ONK9RV7DvS0MkmwDdIwyyVnE7zbW6z74h4Ife9BWln5ckqfV9IStB3VKlvqbVtbiJpPdLOwmURsdK62/E5f+DUdHUA73P/3HKPlbTn9nzh9fO5rLGuadwxIt6QtJC0V/1clXW8FhFvVukP0phkaxZGxLLC67dYkYTa0nJbGtffv8Kyq2sb4HOSil8c6wF/WtUOlQ5O3wZ8MyL+UqH+G6Rx6N3yl217vAH0blHWmzTe+0bh9Tst6orr7QvcCVyQvzCr9d34/B8V6ir2DRARb0q6EGiQtG1EvFxYd6Vt7kjfr0q6DHhUUv/i35akHwPbAXtEHidph9a2ubHfdUhDUO+SvrSaaetz/qDynnvnm09KVI0+nMtWqpO0IWm4Y14r/W2Wl6vUH6Qx21XVVtuW29K4/tbi7Uj/RXOByyNi08Jjw4g4qwN9NJG0DXA38IOIuLxC/ZHkA3kRUd+BrmeQhtsa+xlCGod+KiJeIx3XGFtYfiyFoYI8dHMncFNETGmt7/z8pTxs8xRQI2l4tb5bWAfYgMIXcSvbPAMYIqm4t9xa3zXAlhSSsqQzgE+RjjcsrtKukta2uXEI6RLSQeSDI2JpsXFbn/MHmZN757sK+HdJfSVtQfqp2Hgu95XAlyWNy6d7/RB4ICKey/Uvkc4WaOkMST0k7QZ8Bri2k2Kttr5Gt5LGkg+TVCPpUGAUcHMn9V/0W+CzkvaRtK6kXpIm5OGLleR4egHrAo3L1+S6/sAfgZ9FxIUV2k4mvfcTI+LZCvXr5b7XISXUXoUzka7Ice6Wv3T/E7i+MF79G9Lnv5mkj5AOoP8699ubNFzxfxFxcoXN+g3wFaXTGjcjDX/8GtLeOHA98J+SNpT0ceAA0h4tkiZK2iG/d71Jx0deA55oa5vzOP4jwPfzth4IjAF+n9seJGmkpHXyr45zgIcj4tVcfwrp2M/EwvGD4vvZI7+fAtbL62jMPVW3Ofs5sC3pzLS3W/Tb6uf8gdfVR3Tfrw+qny3Ti3QAckF+/BToVaj/GvAM6WyZm4EBLeoWkM4W+TwrznY5lXS2zAvAFwvL/5p8Zkylssb21eImnbL3SF7fjVW28xPANNJY6DTgE62tv0Xblfqn9bNlPgrcm9+bBtLxhQ9X6ft00i+D4uP0XPf9/PqN4qPQdg7pWESx/sIW29Wy7yMK9Yflz+JN0qmMfQp1PUmnZy4mfbl9u1B3OM3PiGp8fLiwzLdzu8WkMfHimVZ9gBtz+xeAwwp1nyONg7+R37tbgTEd2OZBwJ9JB0xnUfjbBo7L7d8EXiSdBLBNoT5IZ9sU+/63Qv2fK7yfE9raZtKvxiANcRX7ntyez/mD/lB+k6wbUrqS87cRUXHv1cysGg/LmJmVkJO7mVkJeVjGzKyEvOduZlZCTu7WafIl6m+0NoGZOmHmSzNrm5O7dZpIl6hvFBHvAUj6s6R/7eq43k8kfUvSs0pTBs+XdG7j+fu5fpykvyhNj1sv6T8KdROUptUtTkN9eKF+Rou6ZZL+sLa30dYOJ3d73ysmvxL4A7BjRPQmXco/Fji+UH8laQbRPqSpcI+RtH+hfn40n4b6ssaKSHPpbxQRG5HmbnmBzrsgzroZJ3drk6QzJP1Pfr6e0s0izs6v15f0Tr4ic1AedqmRNIU08+D5eS/x/EKXn1S6ucNrkn6WLzGvtN51Jf2bpGeUbtYwTdLAXBeSjpX0NPC0knMlvZz3av8uabsObmdPpRtPvCDpJaW7Wq2f6ybkPeV/k/SK0s1aJhfa7idpZo5znqTvFupOkrQg74n/a2tDUxHxTEQsamwKLAeKyw4CroiI9yLNSPlXqs862ZrdSVMI/H4V2tr7QVdfReVH938AewKP5ecfI11h+0Ch7tH8fBDpisGa/PrPwL+26CtIV+ZuSpqnpgHYt8p6TwQeI81iKdJe7OaFfu4i7cGuD+xDuoJ207zstsDWedmTSVfJVnwU1vffpLnI+5D2bP8A/CjXTQCWkS6970naa34TGJnrF5Am44J0E4kd8/N9SVd1jibN9XJ5jn1Yrj8M+HuL7T6MdLVm5PdnbKHuh8BZpEnVRpKuYN65EOO7pKs95wDnAhtWeW8vpY158P14fz+6PAA/uv8jJ893SJOcnUy6eUg9aXbJM4Cf5uXam9yLUxhcA5xcZb2zgAOq1AWwZ+H1nqTJtXYB1lmFbVRO1kMLZbsCc/LzxuS+YYvYT8vPXwCOJt1ysNjvpY1fEPn1sGJybyOm4aSbfWxVKPsY6WYvy3I/ZxTqtiLN/bMOMJg0fPOLCv1ukL88JnT135Yfa+7hYRlrU6QJm+pIe6u7k+Z/+Rvw8Vx2bwe7fLHwvLUpiAeSfiVU0zTdcUT8ETifNEf6S0r37Ww5jW1r+pKS3jTlOfqB23N5o9ei+vTLB5Pmnn9e0r2Sds3l/Wg+LXNbUzQ3iYinSbMmXgBNN0+5nTRZWS/S+7OPpK/n5V+MiJmR5sOfQ7pV4CEVuj6INH9PRz83ex9xcrf2upe0d7wD6XZ795KGQsaT9hArWd0r5OaSbmNXTbP+I+KnEbETaQhkBPnGDXmc/I1qj9z8FdKkWaNjxZTDm0Q6+NhoM1WZfjkiHoqIA0jj2DeS9uohDdcU5wYa2P7NB9L0uo3vwRDS3Zh+E+nmKfWkSbyq3dAkSL9IWjoc+E1E+ArGEnNyt/a6l3STh5kR8S55yIU0bNFQpU1Hpvyt5GLgB5KG5wOmY1Th9msAknaW9FGlO/a8SRpGeg8gIn4Yzc8gafbIyywHfgmcK2nL3Gd/pRs4F52hFtMv59eTJW0Sab7xxY3rJiX5L0vaVtIGpCmgq8oHXBvXP4p0t657cvVTqViHKU2/uxXpXruP5uUnKF1roHzg+SwKN+DOywwg3bj7MqzUnNytvf5GGntv3EufSUqg1fbaAc4DDslnxfx0FdZ5Dik53klKmJfkGCrpTUrOr5GGSxYCP+ng+r5HGs++X9Ji0k0girckfDH3P580r/vXYsUt374IPJfbfY1020Ai4jbStM9/yn3fl5dfAmmedUnFm2J8HHhM0pukaXtvJR3jINJNMA4CTshxPAI8TrqHLqQbRN9H+nL7W64rnkbZGOd9kc60sRJ7X80tk08v+zHQNyJeqVC/KWlvbzvST9IjI+I+pdt/fZZ0JsEzwJcjYpGkHsAvgFrSKWffjIg/txGDSDdx/hxp7+znEbEqicveR9RJ0y9L2paUdHtG89sfmnWqbrfnnn9a/rpC+UBgIumshGrOA26PiI+QTpt7IpffBWwXEWNIP21PyeVfBYiI7XPf/08r7hBTzRGkcdOPRMS2pDFPs6okHZiHbjYD/gv4gxO7rWndLrm34lzS0f+KPzXymRG7k366ExHvRr4YJCLuLPxnup8VB7hGkcczI91EeBFpLx5Je0u6T9J0SddKajywdgzwn3mMtrGdWWuOJp2v/gzp194xXRuOfRC8L5K70uXV8yLi0VYWG0L6D/QrSQ9LurjFmQ2NjiTdKR3SgagDlK6oHAzsBAxUuvfpv5NuNbYj6TTAb+c2Q4FDJdVJuk3Nb1hsJRURf17VIZmI2DefedMnIg6MiAWdHZ9ZS91mTg5JD5Cu/NsI6CPpkVz1fdIBpb3b6KKGdEDpuIh4QNJ5pAtuTius41TSxR9X5KJLSVcy1pEOwv0t1+9C2qv/vzTETg9WHAjrCbwTEbWSDsp97LZqW21mtmZ0uwOq+cDVERFxRH69PWno5K28yADS2QrjI+LFQrutgPsjYlB+vRvpysdP59eHk85i2CsiGvtque6/kU7vG0q6+fAXKizzJOly+efywdVFEbHJam62mVmn6vbDMhHxWERsGRGDcuKuJ83b8WKL5V4E5kpqPHVtL9Lpekjal3Sa2/7FxC5pg8ahG0kTgWURMZM0Lv/xxsmd8nIjcrMbSRfzQLo686nO3mYzs9XVbYZlVoWkfsDFEdF4hd5xwBX5FMdngS/n8vNJwyl35WGW+yPia6SrCe+QtByYRzoHmIhokHQEcJWknrmPfycl8rPyOk4A3iDt6ZuZdSvdbljGzMxWX7cfljEzs45zcjczK6FuMea+xRZbxKBBg7o6DDOz95Vp06a9EhF9K9V1i+Q+aNAg6urqujoMM7P3FUnPV6vzsIyZWQk5uZuZlZCTu5lZCXWLMXezsli6dCn19fW88847XR2KlUivXr0YMGAA6623XrvbOLmbdaL6+no23nhjBg0aRL4a2my1RAQLFy6kvr6ewYMHt7udh2XMOtE777zD5ptv7sRunUYSm2++eYd/DTq5m3UyJ3brbKvyN+XkblZCRx55JFtuuSXbbbddU9mJJ57IRz7yEcaMGcOBBx7IokWLALjrrrvYaaed2H777dlpp5344x//2NTm1FNPZeDAgWy00UbN+l+yZAmHHnoow4YN46Mf/SjPPfdcU91ll13G8OHDGT58OJdddllT+eTJkxk5ciTbbbcdRx55JEuXLgXSsMPxxx/PsGHDGDNmDNOnT29qc/vttzNy5EiGDRvGWWed1VR+2mmnMWbMGMaNG8fee+/N/Pnz29yWadOmsf322zNs2DCOP/54GufVuvDCC9l+++0ZN24cn/jEJ5g5cyYAjzzyCLvuuiujR49mzJgx/O53v2vq6/zzz2fYsGFI4pVXVtzOudq2zJ07lz322INtt92W0aNHc95557X5uay2iOjyx0477RRmZTBz5szmBdtsEwGd99hmm3bFce+998a0adNi9OjRTWV33HFHLF26NCIiTjrppDjppJMiImL69Okxb968iIh47LHHol+/fk1t7rvvvpg/f35suOGGzfr/2c9+FkcffXRERFx11VXx+c9/PiIiFi5cGIMHD46FCxfGq6++GoMHD45XX301IiJuueWWWL58eSxfvjwmTZoUF1xwQVP5vvvuG8uXL4/77rsvxo8fHxERy5YtiyFDhsQzzzwTS5YsiTFjxsSMGTMiIuL1119viuW8885riqW1bdl5553jb3/7Wyxfvjz23XffuPXWW1fqa+rUqbHPPvtERMSsWbPiqaeeioiIefPmxVZbbRWvvfZa03rmzJkT22yzTTQ0NDS1r7Yt8+fPj2nTpkVExOLFi2P48OFN21Ltc2lppb+tiADqokpe9Z672Zr0/POdmdpTf+2w++6706dPn2Zle++9NzU16RyKXXbZhfr6egB22GEH+vXrB8Do0aN55513WLJkSdNyW2+99Ur9T506lcMPPxyAQw45hHvuuYeI4I477mDixIn06dOHzTbbjIkT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\n",
"text/plain": [
"<Figure size 432x360 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize= (6,5))\n",
"plot_polygon(tile.geometry, ax, ec=\"r\", fill=False, label=tile.quadkey)\n",
"plt.legend()\n",
"fig.suptitle(\"Footprint of tile {} \\n with crs={}\".format(tile.quadkey, tile.crs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 3: Locate the right files for the tile\n",
"\n",
"The `TileProcessor` class contains all the tools required process the tile and data associated with it.\n",
"\n",
"The following function narrows down the search for built areas to up to 4 files that can intersect a single tile. This tile is located in the middle of two tiles, therefore the output list contains the two paths for the relevant raster files."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"['../tests/data/30x150000/150/103.tif', '../tests/data/30x150000/151/103.tif']"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"query = TileProcessor.intersect_datasource_with_tile(datasource=datasource, tile=tile)\n",
"query"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 4: Extract the pixels\n",
"\n",
"With the selected files, the program can now find which pixels intersect the tile and extracts them as an array, it also generates an [Affine transformation](https://rasterio.readthedocs.io/en/latest/topics/georeferencing.html) to correctly locate the pixels. Keep in mind that this georeferencing is based on the coordinate system of the datasource.\n",
"\n",
"In this case the `pixel_values` and the `pixel_georeferences` lists have 2 items each, this is because 2 rasters were processed but their data is still not merged. A plot of the current status shows the spatial relationship between the pixels and the tile."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"([array([[2, 2, 2],\n",
" [2, 2, 5],\n",
" [2, 2, 5],\n",
" [4, 5, 2],\n",
" [4, 5, 2],\n",
" [2, 2, 2]], dtype=uint8),\n",
" array([[2, 2, 2, 5],\n",
" [5, 5, 5, 5],\n",
" [5, 5, 5, 2],\n",
" [5, 5, 5, 5],\n",
" [2, 5, 5, 5],\n",
" [2, 2, 5, 2]], dtype=uint8)],\n",
" [Affine(30.0, 0.0, 2549910.0,\n",
" 0.0, -30.0, 4629810.0),\n",
" Affine(30.0, 0.0, 2550000.0,\n",
" 0.0, -30.0, 4629810.0)])"
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"pixel_values, pixel_georeferences = TileProcessor.get_raster_pixels_in_tile(query, tile)\n",
"\n",
"pixel_values, pixel_georeferences"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0.98, 'Pixels intersecting with tile 122100200320321022 \\n with crs=epsg:3857')"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAi0AAAHbCAYAAAAHyqrrAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAABSZklEQVR4nO3deZgU1dXH8e8BZlURFZHNCCqgoAKK+4bivscYg0mMqIkmcY2aKEneqFGixkRjosYQF9wVjcZ9V9QkiCKKAoILqOzuijIbM+f949ZA0fTM9DBT013M7/M8/UzXrdu3bnX3dJ++p+qWuTsiIiIiha5DvjsgIiIikgsFLSIiIpIKClpEREQkFRS0iIiISCooaBEREZFUUNAiIiIiqaCgZTWZ2Sgz+7qV23zfzM5pwePdzI5qzT4VOjPrE+33sHz3JS7X90drvmaZbbXH94OIrNkUtDTAzMZFH/puZjVmNtvM/mRma0VV7gY2zWcfs+gBPJRrZTMbHu1f1wT71GrMbIKZXZ1RPJew36+3fY8atdL7w8wuMLNprdFw9N58OMuqZr3+OW7rJDN7zsy+iN4rfTLW9zGzG6L/j4ro7yVmVharM9jM7jSzuVGdWWb2SzPrEKtTGu3XG9H/24QG+rOnmb1qZpXRtn6apc53zGyGmVVFf7+dsX60mb1iZl+Z2cdm9pCZbZVRx6LXbEHU5wlmNiijTomZ/c3MPjGzb8zsQTPrHVvfISr7MOrvQjO7zcx6Nee5ieptbWbPR3Xmm9nvzMwynpf/mdmnUZ2ZmT+AzOwnZvaimX0WvZ7PmdluGXX2iPo8P3q9R2V5fht9bsxs/eh5mRmtn2tmfzezDWJ1mnzfiGSjoKVxTxO+CDYFfgv8HPgTgLtXuPtHeezbKtx9kbtX5WPbZlaUj+26e22038vysf2G5OP9kdDrXw48CVzQwPotgI7Az4BBwGnAj4CrYnW2Az4Gjo3qnA/8DjgvVqcjUAlcDTySbUNm1hd4FPgfMBS4BPibmX0nVmdnQsB4OzAk+nuPme0Ya2o4cC2wC7A3sAx42szWj9X5FXB2tD/bAx8BT5nZOrE6fwG+AxwD7A50Bh42s46xOs8CRwMDorqbAvc357kxs87AU8DiqC+nA78Ezoq18zXwV2APYCBwMXChmf08Y7/vBkYAOwKzgCfMrF+sztrANOAMoILsmnpuegK9onpbAz+M+nVnrI1c3jciq3J33bLcgHHAwxll/wQWRvdHAV9H943wofI0YFHZ2sA7wNWxxx8PzCB8OL8N/ALoEFv/PnBObPnkqF4l4YPtCaBTI3124Kjofp9o+TtR35ZG2943Y338Ni62P78C3iN8cL0J/DC2nfrHHkP4UK4ATgXWBW4lfIhVArOBM2OPWxcYG61fAjwPDMvYh52iNr8BvgSeIXwIjsvS3z6xvgyLHj88Wh4BTIr2ezKwbcZ2TgA+jNY/RAhIvZHn9jLgsdjyT6LtfC9W9l/gN1neH6Oy9H1U7DU7Cbgn2ufZ8ec6Sz8uyNLW8MzXv4HlXsBdwOfR7RGgX47/D8Pqn/Mc6v4c+LSJOn8EXm1g3dXAhAZeg3cyyq4HJsaW7waeyqjzNHBnI31ZG6gFDo29/xfWv5ZRWVn0nj059l6uBn4Qq7MxUAfs38i2Douex9JcnxvCF/tXQFms7LfAfKLPmwbaua+J/TZgEXBaA+u/rn+fZjym0eemgbYOip6bzi153+imm0ZamqcCWGVEwd0dOI7wy65+SPavhA+1X0IYmgX+QPgVtSXhl8q5hH/UVVg4RuMa4ELCr7R9gMdXo89jor4MBl4B7jKztQlplfpfqIMII0pnRMsXAycCpxB+tV0C/MPMDs5o+xLCL9aBwL+jx20NHEL4JXUC4YOVaCj7EcIX5yGEX8ovAM+aWY+ozmDgOeBdYFdCADMe6BT1bSJwU9TXHtE+NOQSwq/VbYFPgdvrh9OjX+PXE57fIcCDhOe5MROA3cysU7Q8HPgE2Ctqs5zwq3NClsfeDfyZ8Mu2vu93x9b/DniA8BrdDdxoZps00I8/EZ6T+lHAHoSRh0ZF/XuOEEzuCexM+PJ5OlrXmjoTgqKW1sm0M2HUJ+4JYFhspK+hOrs00u46hFHn+v70BbrH23H3CsL7tb6d7QifBfE6c4G3GtpWNJLzA2CSu1c20p/M52Zn4MWoD/F96kkI2rNta2jUj+cb2U4xUErzXodcnptsOgNVhB8JjdVp7ntC2pt8R02FeiNjpAXYgfAldXe0PIrol3SszhGEf8yLor+DY+s+BI7NqH8mMCO2/D7RSAtwJGGkYZ1m9DnbSMvJsfW9orLdouXh0XLXWJ21CMHZ7hlt/wV4NKPtszPqPAjc1EDf9ib8civLKH8d+FV0/3bgpUb2bwKxkauMvmSOtOwfq7NrVNY7Wr4TeDyjnbE0PtKyNlAD7BwtzyMERbOi5X0JIyVF2d4fhBGSaQ28ZpfEljsRPtgbG20ZR8YoYObrn+X9cAJh5M9i6zsSArqjc3hv5TTSAnyL8H9yViN1tiUET99pYH1DIy1vA7/LKNsj6lePaLka+FFGnR8BVY30ZzzwGtAxWt4lavNbGfVuBJ6I7n+fkFayjDrPAv/IKLssem84IfDu2khfVnluCAHCjVmeZ69/P8bK5xE+e2ozn6ss27o8qp919IPsIy1NPjdZ2ukSvff+2pL3jW66uWukpSkHmNnXZlZJ+LB5gZB7zcrd/w3cQRi6/a27TwUwsw0JQ8f/iNr72sKZJZcCmzXQ3FPAB8AcM7vdzI7LyKfn6o3Y/QXR326N1B9I+PX1eEZff5alr5Mzlv8OHG1mUy0ctLxnbN12hOMjPs5od6tYu0MJ6aDW0Nh+bwG8nFF/UmONufvXwBRgeHQMQGfCl+u3zKwnIVj6n7vXtKSvHo7N+ZjGX6PVsR3hV/KS2HP/JbAeDb8Hm8XMNiKMADwFXNlAnQGEEbe/uPu/VmMzntlklvJsdTLL6vtzBbAbIUiozWFbWdtpos7lhPf2foRg4rb4QbSxvjT23OSy3xCOrRkG/BQ408yOzdpJszMI6ecj3f2rRvcou5yeGwsnLjxEGHH9VQN9afJ9I1KvU9NV2rUXCMcb1AALmvpCMrNSQoqgFtg8tqo+OPwpOQzlA7j7EjPblvBLcl9gNPAHM9ve3Rc0/uiVLO+zu3v0WdlYsFq/7lDC6FDWtiLfZPT5sSitcSDhmJJHzOwedz8+ancx4UM1U/2H5iof5C0Q72v9h2n9vuXy5ZPNBEI66BPCcP3XZvYyIWAZTjhIdHVkPq9O6x8k34EwqjUyy7rPWtq4mXUnjDJMI4woZvsC24KQorrL3c/LXJ+DRYTURFw3wojHp03UWZylP1cSno+93H12xnaI2omnIOPtLCKMVHUlBJnxOi/Et+PunxDeM2+b2VtRm7sBL8b60thz09A+kblf7j4nuvtmFAxcQDjOLL7fZxBSuQe6e2bw3pRcnpv67azNiv+JQzxLSiyX941InEZaGrfU3d919w9y/AV9OVBCCDKON7PDAdx9MeGXxmZReyvdGmrM3Ze5+7PuPhrYhpC6OaTFe7VCdfQ3frbDDMLw8iZZ+vpBUw26+yfufqu7jyIcF3OcmZUQRik2AuqytFt/ls0UQhqpsf52bGR9rt4ipPviMpezmUBINe3LimNXJgAH0/DxLPVaq++r29YUQiD9SZbnv0VBS3RM0gTC83qMZzmTy8wGRnXucfdfrOamJhKO7YrbF5gc+/+cGJVl1lnpx4KZXUVI8ezt7jMz6s8hfDnvG6tfSgi469t5lRBsxuv0Jhyv1tgPk/rP3JLY45p6biYCu0d9iO/TAkJKubFtlcQLzOwswnFuB7v7fxp5bENyeW6IRoUfJ7xPD4pGKleSy/tGZBX5zk8V6o0GjhuIrR/FyscsHED4MtkxWv414RdY92j5x4RjRX5BOLB2K0KufXSsjfdZcUzLIYSDT4cCm0TbqyXjWJOMPmU7piXz7Jx4nV6EI/pPADYE1o7KLyb8cj2B8EU3hDBKdFITbf+ecFxPP8KH993Au9E6I/yyfJMwEtOXcIDhhfX7FG2nknB8yeDoefoxUf48Kn812n5XwofySn0h+3E6mXV2jp7LX0Z9PZFwRpM38Z6oP65lWaytvaLl5cezNPD++D7hWJVto76XZL4e2d4HDfTj14RfuQOitoqytZXxWpcTDgR+nnAgbl/CKN6faeQMIsIv6iFR/51wFsgQYP1ofU/CsSYTCCnQ7rFb/TEigwi/wu/KWN89Y1sDo7bvIqQehwBDYuv7Rs/zXwjvrx8T/ufix3/sEr0eowlpwNHRa7ZjrM41hNG9vTP6s3aszrlRnSMJ/6t3EYKEdWJ1/k74MbIP4f/0OcJoVv1+70w4mH0w4X94b8IZZnOIzh7K5bkhnKm0KKqzVdSnr4gdU0ZIWx9CeD/Xv6e/Ai6N1fll9HwdnbGtdTPe40Oi21LCQeJDiB3D0tRzQziweSIwPepLfFvFub5vdNMt2y3vHSjUG80IWghf+IuIHfhG+EKdADzGitOgjyH84q0kHCX/H2Bk7DHvsyJo2S36EPyUEOxMA45vos/NClqi5f8jnEVSx8qnPJ/GilGXjwn55szTpTPb/k30QbWUkHJ4FNgytn4dwjwM86IPz7nRB95msTq7EYbXK4AviM6Sidb1jz4Ml9L0Kc8NBi1R2QnR9isIOfezgYoc3hcvEY4Fqf9iKo1ez8zTbJe/P6LlEuDe6HV3Vj7lublBy4aEgzOX0LxTnjcinH31UfS6ziEcQNnYgaEXsOop1vH+j2pgvRMdtNtIG55lv5uqsyfhf6i+/z/N0uejgJmE99hbhOM2Mv8Hst0uiNWxqN8Lo9f3eWCrjHZKgb8R/kfrT53fOLZ+CCv+h+v7+3eiA8Kb+dxsTfi/qIz6dD4rH1R9JuF/r36qgCmEMxMzp1TItq1xsTrDc6jT6HPTSBvx9+qoRur0ac5ntW7t61b/ZSrSrkXHN+zj7lvnuy8iIpKdDsSVdsnMfkkYPfqaMLz/U0LaRURECpRGWqRdMrO7CcPY6xKG7f8BXOX6hxARKVgKWkRERCQVdMqziIiIpIKCFmnXzGycmT3cRJ3hZuZm1rWt+iUiIqtS0CLt3RnAD+sXzGyCmV2dx/60C2Z2kZnNNLNvzOxzM3vGzHbJqNPdzG41s0VRvalm9oOMOu9HAWX8dmls/ags6+tv27fV/opI69DZQ9KuufuX+e5DPTMr8tW7dlEazSJMvDYHKCNMuvi4mfXzMIM0wC3A+sDhhLmCvg3camZz3T0+Vf7vCfOf1IvPvno3q14d/XLCzMaZ184SkQKnkRZZo5jZJDM7N7Z8e/Srunu0XG5m1Wa2a7S8PD1kZuMIk5edEvs13ifW/OCo/aVmNjm6NlRjfSk2sz+Y2QdmVmVms83s9GhdfcrpIDN72cyqgf3NbGMze8DMPou2M9PMsl0vKNfnYxczez5qa76Z/d3MOsfWTzCz68zsqmjE43Mzu9zMOsTqHGlmb5hZRdSv56Pr2tSvH21miy1ciPEWMzvfzN5vrF/ufpu7P+Pus919OnAWYfLBIbFquwDXuPukqN6fCRMCZl5yYYm7L4rdlgct7l4RX0eYyfVQ4HqdKSaSPgpaZE0zgTC1fr09CRerGx4t70qY1j3bheLOIMy4exPQI7rFLwp3CXAeYSr+T4HbzVa9Wm/MzYRLNZxFmHb+RMIsv3GXEa4KvgXhStPXEqbc34swxfuZ8ceY2XSLXSU7y216rO7WhJlzHyRMJX8kISi4MaMPPyB8FuxMuPLvSdF26y9od1e0L1sSpv5ffgG+KKA6nzAb8raEGWjPijceC9CGZ3uSzKw42uZXhGnw6/2HcNXwDcysg4VreW1ImCU57hwz+9TMXjez30TtNeRowjW8bmqkjogUKKWHZE0zgTBS0olwrZp1gb8SgoC7CMHL/7KlYdz9y2jEY2n0qxyAWFzyf+7+XFT2e8KXai/CZQlWYmb9CFcQPtDd69MTszPrEaaOfzL2uE2Af7n71KhoTkb9g4Cihnaela8Y/Uvg7miEor79nwGvmVk3X3GhyoXA6dHIw0wz608IPK4gXCOmCLjXV1wwc1psG2cQpni/Plq+xMz2Ilxyod5SQjpoabyjZnYI4TUpj/qwbyw1BCHAuIsQdC4jTIV/jLu/HqvzV+A1QhC5A3Ap4XX/cQPPz0mEy3MsbGC9iBQwBS2ypnmRcJ2f7QkXc3uR8Mv8umj9cMI1kVbHG7H7C6K/3cgStBAuoFdHuPZMYzKPq7gKuM7MDgCeAe5391frV3oOV9qO2Q7Y3My+Fyurj8A2I1yDCOCljFTJROCiKI00lfD8TTOzJ6P797r7x1HdLYB/Zmx3ErGgxd1fjupleo4w8tMV+Akw3sx2jgUUF0fr9iEELkcAt5jZHvVBnbtfEWvvDTP7CrjbzM5190/jGzOzQYTRpIOz9EVEUkDpIVmjRMczTCGMrAwnfDFOBDaJRj+2J4zGrI74KEb9l3xD/0ONpY3ivokvuPsNhJGCmwhf/P8zswuWN9qM9FDUt+tZcdXeIYQ0UT9WTsM0yN1rgf2i2xuEFNc7ZjY4Xi3Hfc1s+xt3f9fdX3L3EwnP74+j/dyMcNHOn0THvkx19wuBV6LyhkyK/m6eZd1JhHRf5oG5IpISGmmRNdEEQtCyJfAXd680s0mE4y4aOp6lXjXQsRX6MIUQNOxFM78k3X0eMBYYGx1UfAbhqrrQvPTQFGCQu7/bxCZ3NDOLjbbsBCxw96+i/jgh8JsYpcWmA98jjMLMJKRl4seIZB4om6sOhFEyCCkjgNqMOrU0/mNrSPR3pfSPmZUCxwJ/dfe61eyfiOSZghZZE00AziaMYkyJlf0GeK6J04rfB3aIzhr6GvhsdTrg7u+Y2XjgejM7I+pHb6CPu9/a0OPM7CrgMeBtoDNwADAj1m5z0kOXAS+Z2XWEaystIaRpDnX3k2P1egJ/MbNrga0Jx8JcHPVnJ0J65glgMSHttXGsT1cBN5nZK4RU3LeBHYHPY/u0A+H05R+5+8tR2ulXwEOE4GJDwunPvYHx0cNmAu8C15rZOYRjVo4A9iWcAo2Z7UwIsJ4DviSMol0JPOjuH2Y8F0cRjm/KPAhZRFJE6SFZE71ISFm8GKU3IHyxdaTp1NCfCKMtMwhzg3yrBf34EXAH4WDRmcA4whdnYzoAf4u2/xQhUDhudTbu7m8QzvbpAzxPGBm5JGoz7nbCczOJcHzKDYQvfwjBwK7Aw8A7wJ+Bi9z9tmgbdwEXEQ6AfY1wHNF1QGWs/XJgACtGT5YRzoy6P2rzIWADYI+oz0SB5UGE1+AhQmrqR8Dx7v5Q1E4VYcRnAuH5+n3U/2OyPB0/AZ7IEsyISIrogoki7ZiZTQCmufuprdjm/UAndz+0tdoUEQGlh0SkBcysHPgZ4bidZcB3COmb7+SzXyKyZlLQIiIt4cCBwK8J0/G/Axzr7vfntVciskZSekhERERSQQfiioiISCooaBEREZFUUNAiIiIiqaCgRURERFJBQYuIiIikgoIWERERSQUFLSIiIpIKClpEREQkFRS0iIiISCqkKmgxs3PMzM2sawPru5jZvWY208zeii5dj5ldHpW9YWb3m1mXqLzYzG4yszfNbKqZDc+hD2ZmY8zs7Wgbp7fiLoqIiEgDCi5oMbPhZjYuS/nGwL5AY5eWvwp43N23AAYDb0XlTwFbufs2wNvA6Kj8JwDuvnXU9p/NrKnnZBSwMbCFu28J3JXDbomIiEgLFVzQ0ogrgV8RLtC2CjPrDOwB3ADg7tXu/kV0/0l3XxZVfQnoHd0fCDwT1fkI+AIYFrW3n5lNNLMpZnaPma0dPeZnwO/dvS72OBEREUlYKoIWMzsMmO/uUxuptinwMXCTmb1mZteb2VpZ6p0APBbdnwocbmadzKwvsB2wcZR++i2wj7tvC0wGzooesxnwPTObbGaPmVm/lu+hiIiINKVTvjtQz8wmASXA2sD6ZvZ6tOp8wmXv92uiiU7AtsBp7j7JzK4CzgP+L7aN3wDLgNujohuBLQlByQfA/6L1OxFGYf5rZgDFwMToMSVApbsPM7MjozZ2X729FhERkVyZe9ZsS95EB8OOcvdR0fLWhBTO0qhKb2ABsIO7L4o9rjvwkrv3iZZ3B85z94Oj5eOAnwIj3L2+rcxt/w/4MWE05fvufkyWOjOBA9z9fQsRzRfuvm4Ld1tERESaUPDpIXd/0927uXufKCCZB2wbD1iieouAuWY2ICoaAcwAMLMDgHOBw+IBi5mV16eQzGxfYJm7zyAc97KrmW0eq9c/eti/gb2j+3sSDuwVERGRhBVMemh1mFlP4Hp3PygqOg243cyKgdnA8VH51YS0zlNRuucld/8p0A14wszqgPnAsQDu/rGZjQLuNLOSqI3fEgKUS6Nt/AL4mjAyIyIi0q5E04dcD2xFOEnmBHef2OiDWrrNQksPiYiISOEzs5uBF939+miwoLz+rN3EtqmgRURERJojmmZkKrCpt2EgURDpofLitbxL+Xr57oaIiLSBnn2r8t2FvHnn3U+rv1xSV9J0zabtP2Jj//SzytZoahWvvv7JdCDe+Fh3Hxtbjk8zMhh4FTjD3b9JpEORgghaupSvx4l7nprvboiISBu4cNycfHchb7YcdlNFa7X16aefM+nJrVqruZV02uiTSncf1lgVmphmJJF+Jdm4iIiIJMTKoGjrhBqf1FSFecA8d6+veC8haEmUghYREZEU8rql1FW/kZ9tuy8ys7lmNsDdZxGbZiRJClpERERSqo66fG6+oWlGEqOgRUTaveLyIrb/9jZ07rYOYSonSdLMBbvluwuJMpySos/otf6zFHVM5kDZsKEyKNomocYnN1nD3V8nushwW1HQIiLt3vbf3oZNt+xDeelamKKWxPXsU53vLiTK3fn0sw2Y/xn02fDRBLdTQV1NY9cRXvMoaBGRdq9zt3UUsEirMTM2WL+cTz5ZP+EtOXWe1/RQm1PQIiLtnhkKWKRVmRlOwu8pK8eKBifU+GsJtdsyClpERGJ69euZSLvz31mQSLvSfrkvZVk7Sw8V/FWeRUTag7PP+wWDd9yaEQfttbzsokt/z577784+h4zgxJ+fwJdffQnAC/95ngOP2J8RB+/NgUfsz38n/mf5Yy674lK23307+g/efKX2q6qq+NkZJ7PriF045DsHM3fe3OXr7rlvPLvtsyu77bMr99w3fnn5qWedwh777caIg/bi7PN+QU1NDRCO2fi/3/+WXUfswj6HjODN6StOu33uhefYY7/d2HXELlz9j78tL7/8yj+yzyEj2O/Qfdj/wGNZsGAxAE89/SLDdjiEbYbsz7AdDuHZ5/63/DGvvvom2wzZn35b7MnpZ15A/Wzx1/3jNrYZsj9DtzuQ3fc8ihkz3gHg9dens8tu32arwfsyeOgB3D3+oeVtXX3NzfTbYk86FPXhk08+W17u7px+5gX022JPBg89gClTpgEwd+4C9t5nJAO3HsFWg/flqr/euPwxvzz3D2y51d4MHnoARx51El988WUTr25y6vBEboWqIK491LNLb9eMuCKSLwedNZxv9doEWDHS0lojI7m299LLL7HWWuWc+cszeObR5wB4/sUJ7LrzbnTq1Ikxf7wYgN/86rdMm/4mXbtuSPeNujPz7Zn84ITv8+p/pgDw6muv0rtXb3bfd1fenvru8vZvvn0cb818i0svuowHHv43jz/1GH+/6h98/sXnHPztA3nk/scwMw464gAe/ffjdFm3C89MeIa999wbgFN/8XN23H4nfvSD43hmwjPcdOuN3Hr9bUx5fQrnX/w7Hv7XI9TW1rLHvrtxx7i76NG9Bwd/5yCuueJa+vfrz5IlS1hnnXUAuPehfzDjrXe47to/8Npr09hoow3p2XMjpk2bxQEH/4h5H4T5ynbc+XD+csXv2GmnbTn40FGcduooDjxgL776agmdO4e2HnzoKf5+3a089sgtvP32bMyMfv36smDBYobteAgz3nyaLl3W5bXXprHeeuuy1z4jeeWlh+jaNRxv8uhjz3H1NeN45KFxTJr0GmeedSEv/e8BFi78iIULP2LbbbdiyZKvGbbjodx/71gGDuzHk0+9wN577UKnTp04d/QlAFx2yehVXtO3Zs1li563rlS25bCbvpz1XnWX3N49jRs6pKs//8whrdHUKtbtevOrTcyImxdKD4mIFICddthppdEPgD13H778/rZDtuORxx8GYKtBK2ZBHdBvAFVVVVRVVVFSUsJ2Q7fL2v6TTz/BWaefDcDBBxzCb3//G9yd51+cwO677sF6XcL133bfdQ8mvPAcRxz6bUYMH7H88UMGD2Xh4oXL2zrqiKMwM7Ybuh1fLfmSxR8tZt78ufTZpA+bfCsEgIcffDhPPvME/fv1Xx6wAHyzdOnyY4iGDl0xDf2gQf2prAz78tlnX/LVkiXsvHPYn2N/eCT/fuBJDjxgr+UBC8A336xoq3//TZeX9+y5Ed023ICPP/6MLl3WXWk7cQ88+CTH/vBIzIyddtqWL75cwsKFH9GjRzd69OgGwDrrrM2WW2zG/AWLGDiwH/vtu8fyx++041D+9a/HsradtJAeej0v284XBS0iIilw9713cujBh69S/sjjj7DVwEGUlDR+Db5FixfRo3sY9enUqROd1+7M559/xqLFi+jZY8VxPD2692DR4kUrPbampoZ//fteLvztRcvbWvkxPVm0eBELFy2iR6y8e/cevDZ1yvLly664lHvvv4f1N1iHZ5+6c5U+/uu+xxg6JOzL/PmL6N2rx/J1vXv3WJ5SArjm2lu48qrrqa6u4Zkn71ilrZdffp3qmho222yTRp+XBQsWs3HvFX3u3as78+cvWh6wALz//lxee30GO+4wZJXH3zTuHo7+bjKjHbko5FROEhS0iIgUuL9eexUdO3XiyMOOXKl81juzuOTyMdx+06oBQKZshwKYWYPlcb++YDQ7br8TO26/Y6NtkeULNN7WuWedx7lnncfNd1/J1dfezIXnn7V83fTpb3Pery/liUdvbWIbwSk//xGn/PxH3HHnA4z5w98Yd9MVy9ctXPgRPzr+LMbd8Cc6dGj80M2mtvP1199w1NE/48o//26lER6AMZdcTadOHfnB949odBtJMSujY2JnD+Xn8gBNUdAiIlLA7rlvPE8/9zR333L3Sl+mCxYu4Mc/P5G/XH4VfTbp02Q7Pbr3YOGiBfTs0ZNly5bx1ddf0aXLevTo3oOJkyYur7dw0UJ23nHn5ctX/O3PfPbZp1x2zR9XamvBwgWxxyxgo24bUVNTzcJY+aJFC+nerfsqffn+yMM55PATlgct8+Yt5MjvnszNN16xfGSkd+8ezJu/cPlj5s1buNLoR72R3zuUn5/62+XLX321hEMOO56LLjybnXbatsnnpVev7sydt6LP8+YvomfPjYAwwnTU0T/l+8ccwZHfPmClx918y7088sgzPP3kHXk7Xb7OK6iufj0v284XBS0iIlkkdepzczz3wnNcO/Ya7r39PsrKypeXf/nVlxx30o847+zRbL/dDjm1te+I/bjnvnvYbugwHnn8YXbdaTfMjD13H85lV1zKF19+AcAL/32e884JB5XeMf52nn9xAnfdMn6lEYv9RuzHTbfdxOGHHMGU16ewzjqd2ajbRmyw/gbMeX8OH879kO4bdeeBRx7g6iuuAWD2+7PZtE845uTBh55miwGbAfDFF19yyGHH84eLf8Wuu6447rNHj26ss/bavPTSFHbccSi33nYfp54yCoB33plDv359AXjk0Wfpt3kfAKqrqznyqJM59odH8t2jDs7peTns0H255tqbGfm9w5g06TXW7bwOPXp0w9358U/OZYstNuesX/x4pcc8/sQE/vin65jwzN2Ul5fltJ2ktK+p5RS0iIgUhFPO/BkTX57IZ59/xrDdtuPsM87m6uuuprq6imNGfQ8IB+NeetFl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\n",
"text/plain": [
"<Figure size 576x504 with 2 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"#Plot the pixels that intersect the tile\n",
"fig, ax = plt.subplots(figsize= (8,7))\n",
"for i, matrix in enumerate(pixel_values):\n",
"\n",
" im = rasterio.plot.show(matrix, \n",
" ax=ax, \n",
" transform=pixel_georeferences[i],\n",
" alpha=0.7)\n",
"plot_polygon(tile.geometry, ax, ec=\"r\", fill=False, label=tile.quadkey, linewidth=2)\n",
"plt.legend()\n",
"\n",
"cax = fig.add_axes([0.93, 0.125, 0.04, 0.755])\n",
"norm = mpl.colors.Normalize(vmin=0, vmax=6)\n",
"cmap = mpl.cm.viridis\n",
"cb1 = mpl.colorbar.ColorbarBase(ax=cax, cmap=cmap,\n",
" norm=norm,\n",
" orientation='vertical',\n",
" alpha=0.7)\n",
"cb1.set_label('Pixel values', size=14)\n",
"fig.suptitle(\"Pixels intersecting with tile {} \\n with crs={}\".format(tile.quadkey, tile.crs), size=14)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 5: vectorize the data\n",
"\n",
"In order to calculate areas, the data must be converted to a vector format. In this step two functions will be applied: First, `polygonize_array` will take all the relevant pixels (defined in `tile.built_pixel_values`) and create a geometric feature. Second, `clip_to_tile_extent` will crop the generated polygon to the shape of the tile. This way, the areas outside of the tile can be excluded.\n",
"\n",
"A plot is created to compare all the produced geometries. The darkest polygon represents the built area found within the tile."
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [],
"source": [
"built_geometry = TileProcessor.polygonize_array(pixel_values, pixel_georeferences, datasource)\n",
"\n",
"clipped_built_geometry = TileProcessor.clip_to_tile_extent(built_geometry, tile)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0.98, 'Polygonized pixels and built area within the tile 122100200320321022 \\n with crs=epsg:3857')"
]
},
"execution_count": 9,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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s3sy/+Uvf/EKFSpkp7ds2dLXrl3r7u5/+tOfvEaNGm5mXqNGDb/tttvc3X3btm1+zjnneL169bx9+/a+dOnS7GU/9dRTXq9ePa9Xr54//fTT2ellypTxunXrZi/jjjvucHf3zMxMv+KKK7xu3brerFkznz17dvY8r7/+ujdo0MDr1q3rd911V3b6gAEDvGnTpt68eXM/44wzPC0trcB1mT17tjdt2tTr1q3rV155pWdmZrq7+zXXXONNmjTxli1bevfu3f2rr75yd/exY8d6SkpKjrLmzZvn7kFP8Bo1aniZMmW8WrVqfskll+S7Lv/73/8c8ObNm2eX9frrr7u757lfJG+F6ZVtnuD+woHWrl07nzNnTnFXQ6TU+vrrr2ncuHFxV0N+hbZsgT17irsW+1+ZMhD30/hCSfQ/ZmZz3b1dfF71yhYRkb22Zw+klIJIsnv3gVuW7jGLiIhEiAKziIhIhCgwi4iIRIgCs4iISIQoMIuIiERIKehLJyKFNWsWFOVIfpUrQxIPoRIRdMUsIglkZEDVqkX3SjbIT548GTPjm2++yU5bvnx59hjN06dP54wzzsg137PPPstVV11VqHW89dZbeffddwHo3r07Wc9S+Otf/1qocvaHbdu2cdJJJ7FnL38gnJqammPM5f3pjTde5W9/u6fgjBGyc+dOevfuxu4D+RuoQlBgFpHIGDduHF26dOGll17a78u688476dWrV670fQ3MRXGwf/rppxkwYABlypTZ57L2t9NO68cf/nDTAVte/MnK3py8lCtXju7dezJp0viiqlaRUmAWkUjYsmULH330EU899dReBeaVK1fSt29fGjVqxB133AHkvNoGeOCBB7j99tsBuOiii5g4cWKOMm666Sa2bdtGq1atEo6Y9Omnn3LCCSfQunVrTjjhBBYtWgQEV+wDBw7kN7/5Db1792br1q0MGzaM9u3b07p16+wxmZcvX07Xrl1p06YNbdq04eOPP064Li+88EL2c7GnT59Ot27d6N+/P02aNGHEiBFkZmYCwYlM8+bNadasGTfeeGOuckaOHJk9VCUEw04+8sgjZGZmcsUVV9C0aVPOOOMMTjvttOxtMW3aNFq3bk3z5s0ZNmxY9jjXqamp3HbbbbRp04bmzZtnt2q88MKzXH990FrRuXOr7NdRRx3C//43g61bt/K73w2jW7f2nHBC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5sz51K1bj8suG8Kdd97LJ598QdOmzbn77jsSztu//zm0bt2Op556gZkz53PIIYckzPfNN18zadJ43n33I2bODEacymsM5XXr1nHvvXfx3/++y0cffUabNu34xz8e5LjjanPddTfy+9+P4JFH/sbxxzehZ8/e3HnnPdSpU4+ZM+czatT9TJs2lSVLFjNjxqfMnDmf+fPn8uGHwbZdunQxl156JQsWLKBy5cpMmjSJc845h3bt2vHCCy8wf36wDgcddBD169fn888/L3Ab50dN2SISCbFN2TNnzmTIkCF89dVXRb6ctLQ0zjvvPNasWcPOnTupU+eXoQP79euXHSTeffddFi5cmD1t8+bN/PTTT/kO/ZiXnj17Uil8OkWTJk1YsWIFtWrVKmCu3KZOncrUqVNp3bo1EDxWc/HixXTr1i1Hvg0bNmQPZfjee+9xzjnnZN+vzRqaMj/nn39+9t/rrrsuqbpt2rSJTZsy6No1GPRi8OChXHjhwORWLA/Tp09j3ry5dOvWHoDt27dRterRCfPOnj2Lb75ZSK9eJwLB0706duwMwEUXXcrkyRN46qnH+Pjj+QnnnzZtKu+9N5UTTgi27datW1i6dDG1ah1HamodWrRoBQRDXuZ3a+boo49m9erV2SdGe0OBWUQip3Pnzqxbt4709PR9Hrrxlltu4fXXXweCK9err76a66+/nn79+jF9+nRuv/327LyxgyZkZmYyc+bMXFdzV199dZ5DP+Yla7hEyHvIxGS4OzfffDOXX355vvmyttlBBx2Eu+caNrIgsfkLO29RcncGDx7KHXfcnVTek08+hWefHZdr2s8//8yqVWlAEHATjb/s7vzhDzdzySU5t+2KFcspVy7n/tu2bVue9di+fXueLQDJUlO2iETON998w549e6hSpQq1a9dm4cKF7Nixg02bNjFt2rR85z3ssMP46aefsj+PGjUqe+hGIMfQjWPGjElUBBCM8PToo49mf040f35DPxZWfL0T6dOnD08//XR2D+1Vq1bx448/5srXqFEjvvvuOyC4Wn/55ZdZv349EFxNF2T8+PHZfzt37pxUnStVqkTlykfw0Uf/A2DcuLF06ZL3kJHJrG/37j2ZMmVi9jpu2LCB779fkTBv+/admDXrI5YuDe6J//zzzyxe/C0AI0feyHnnDeb//u9OrrrqMgAqVjyMLVt+WX6v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\n",
"text/plain": [
"<Figure size 576x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.close(\"all\")\n",
"fig, ax = plt.subplots(figsize= (8,7))\n",
"plot_polygon(tile.geometry, ax, ec=\"r\", \n",
" color=\"r\", alpha=0.2, \n",
" label=tile.quadkey)\n",
"plot_polygon(built_geometry, ax, ec=\"b\", \n",
" color=\"b\", alpha=0.2, \n",
" label=\"All built-area (polygonize_array)\")\n",
"plot_polygon(clipped_built_geometry, ax, ec=\"k\", \n",
" color=\"k\", alpha=0.6, \n",
" label=\"Built-area in tile (clip_to_tile_extent)\")\n",
"handles, labels = plt.gca().get_legend_handles_labels()\n",
"by_label = dict(zip(labels, handles))\n",
"plt.legend(by_label.values(), by_label.keys())\n",
"fig.suptitle(\"Polygonized pixels and built area within the tile {} \\n with crs={}\".format(tile.quadkey, tile.crs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 6: refine the product (optional)\n",
"\n",
"The current status of the data is in a very coarse resolution. For this reason, usage of external datasets is recommended to further refine the product. One useful dataset is the OBM roads dataset which can erase built areas by the premise that buildings are not build on roads.\n",
"\n",
"Normally this data can be acquired by connecting to a specific database and request data for the target tile. In this case, a pre-generated query is loaded, containing the same data expected from the database query."
]
},
{
"cell_type": "code",
"execution_count": 10,
"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>osm_id</th>\n",
" <th>z_order</th>\n",
" <th>way_area</th>\n",
" <th>osm_timestamp</th>\n",
" <th>osm_version</th>\n",
" <th>osm_uid</th>\n",
" <th>osm_changeset</th>\n",
" <th>tags</th>\n",
" <th>action_timestamp</th>\n",
" <th>geometry</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>160722551</td>\n",
" <td>36</td>\n",
" <td>None</td>\n",
" <td>2017-12-19T14:06:16</td>\n",
" <td>5</td>\n",
" <td>5894643</td>\n",
" <td>54760717</td>\n",
" <td>\"name\"=&gt;\"Άγιος Γεώργιος - Αγία Άννα\", \"oneway\"...</td>\n",
" <td>1970-01-01T00:00:00</td>\n",
" <td>LINESTRING (22.91087 38.35605, 22.91093 38.356...</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" osm_id z_order way_area osm_timestamp osm_version osm_uid \\\n",
"0 160722551 36 None 2017-12-19T14:06:16 5 5894643 \n",
"\n",
" osm_changeset tags \\\n",
"0 54760717 \"name\"=>\"Άγιος Γεώργιος - Αγία Άννα\", \"oneway\"... \n",
"\n",
" action_timestamp geometry \n",
"0 1970-01-01T00:00:00 LINESTRING (22.91087 38.35605, 22.91093 38.356... "
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# from obmgapanalysis.database import Database\n",
"# roads_database = Database(host=\"your.selected.host\", \n",
"# dbname=\"roads_database\", \n",
"# port=\"5432\", \n",
"# username=\"username\", \n",
"# password=\"password\"\n",
"# )\n",
"# roads_database.create_connection_and_cursor()\n",
"# roads_table_crs_number = roads_database.get_crs_from_geometry_field(tablename=\"planet_osm_roads\",\n",
"# geometry_field=\"way\"\n",
"# )\n",
"# roads_in_tile = roads_database.get_features_in_tile(tile=tile, \n",
"# crs_number=roads_table_crs_number, \n",
"# tablename=\"planet_osm_roads\",\n",
"# geometry_field=\"way\"\n",
"# )\n",
"# roads_database.connection.close()\n",
"\n",
"roads_in_tile = geopandas.read_file(\"../tests/data/roads_query.gpkg\", driver=\"GPKG\")\n",
"roads_in_tile"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The `process_dataframe_with_tile` manipulates this road by clipping it to the tile extent and a buffering to a desired amount (expected width of a road). After this, the produced roads polygons can be subtracted from the initial built areas with `polygon_difference` (as shown on the next plot)."
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [],
"source": [
"# Process the roads query\n",
"roads_processed = TileProcessor.process_dataframe_with_tile(roads_in_tile, tile=tile, buffer_magnitude=3.0)\n",
"\n",
"# Substract result from built area\n",
"refined_built_area = TileProcessor.polygon_difference(clipped_built_geometry, roads_processed)"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Text(0.5, 0.98, 'Built area refined with OBM roads for the tile 122100200320321022 \\n with crs=epsg:3857')"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"<Figure size 576x504 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.close(\"all\")\n",
"fig, ax = plt.subplots(figsize= (8,7))\n",
"plot_polygon(tile.geometry, ax, ec=\"r\", \n",
" color=\"r\", alpha=0.2, \n",
" label=tile.quadkey)\n",
"plot_polygon(clipped_built_geometry, ax, ec=\"b\", \n",
" color=\"b\", alpha=0.2, \n",
" label=\"Built-area in {}\".format(tile.quadkey))\n",
"plot_polygon(refined_built_area, ax, ec=\"k\", \n",
" color=\"k\", alpha=0.6, \n",
" label=\"Refined built-area\")\n",
"\n",
"handles, labels = plt.gca().get_legend_handles_labels()\n",
"by_label = dict(zip(labels, handles))\n",
"plt.legend(by_label.values(), by_label.keys())\n",
"fig.suptitle(\"Built area refined with OBM roads for the tile {} \\n with crs={}\".format(tile.quadkey, tile.crs))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Step 7: Calculate the built area\n",
"\n",
"In order to achieve a good accuracy on the built-area calculations, these are done using the [Albers equal area projection](http://wiki.gis.com/wiki/index.php/Albers_equal-area_conic_projection) on the polygons. The final function `albers_area_calculation` takes a polygon and its current coordinate system and perform the according transformation to finally calculate the area."
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Within the tile 122100200320321022, there are 9919.946984795522 squared meters of built area.\n"
]
}
],
"source": [
"area = TileProcessor.albers_area_calculation(refined_built_area, tile.crs)\n",
"\n",
"print(\"Within the tile {}, there are {} squared meters of built area.\".format(tile.quadkey, area))"