{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Case: hospital districts\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this tutorial, we will create boundaries of Finnish hospital districts (*sairaanhoitopiiri* in Finnish) by dissolving municipality boundaries into larger entities. Main processing steps include a table join and dissolving the municipality geometries into larger entities.\n", "\n", "We will combine information from [municipality polygons](https://www.stat.fi/org/avoindata/paikkatietoaineistot/vaesto_tilastointialueittain.html) from Statistics Finland and a [list of health care districts](https://www.kuntaliitto.fi/sosiaali-ja-terveysasiat/sairaanhoitopiirien-jasenkunnat) by the Finnish Municipality authority Kuntaliitto." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Importing required python packages:" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import json\n", "import numpy as np\n", "import pandas as pd\n", "import geopandas as gpd\n", "from pyproj import CRS\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Read in data\n", "- **Municipality polygons** from Statistics Finland web feature service: https://www.stat.fi/org/avoindata/paikkatietoaineistot/kuntapohjaiset_tilastointialueet.html\n", " - wfs: http://geo.stat.fi/geoserver/tilastointialueet/wfs?\n", " - feature: `tilastointialueet:kunta1000k` (most recent information about municipality polygons)\n", "\n", "\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# For available features, see http://geo.stat.fi/geoserver/tilastointialueet/wfs?request=GetCapabilities\n", "url = \"http://geo.stat.fi/geoserver/tilastointialueet/wfs?request=GetFeature&typename=tilastointialueet:kunta1000k&outputformat=JSON\"\n", "geodata = gpd.read_file(url)" ] }, { "cell_type": "code", "execution_count": 3, "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", "
idkuntavuosiniminamnnamegeometry
0kunta1000k.10052021AlajärviAlajärviAlajärviPOLYGON ((366787.924 7001300.583, 364150.540 7...
1kunta1000k.20092021AlavieskaAlavieskaAlavieskaPOLYGON ((382543.364 7120022.976, 380556.177 7...
2kunta1000k.30102021AlavusAlavoAlavusPOLYGON ((343298.204 6961570.195, 340572.015 6...
3kunta1000k.40162021AsikkalaAsikkalaAsikkalaPOLYGON ((436139.680 6798279.085, 432732.949 6...
4kunta1000k.50182021AskolaAskolaAskolaPOLYGON ((426631.036 6720528.076, 425751.505 6...
\n", "
" ], "text/plain": [ " id kunta vuosi nimi namn name \\\n", "0 kunta1000k.1 005 2021 Alajärvi Alajärvi Alajärvi \n", "1 kunta1000k.2 009 2021 Alavieska Alavieska Alavieska \n", "2 kunta1000k.3 010 2021 Alavus Alavo Alavus \n", "3 kunta1000k.4 016 2021 Asikkala Asikkala Asikkala \n", "4 kunta1000k.5 018 2021 Askola Askola Askola \n", "\n", " geometry \n", "0 POLYGON ((366787.924 7001300.583, 364150.540 7... \n", "1 POLYGON ((382543.364 7120022.976, 380556.177 7... \n", "2 POLYGON ((343298.204 6961570.195, 340572.015 6... \n", "3 POLYGON ((436139.680 6798279.085, 432732.949 6... \n", "4 POLYGON ((426631.036 6720528.076, 425751.505 6... " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geodata.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "309" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Check length (there are 310 municipalities in Finland in 2020)\n", "len(geodata)" ] }, { "cell_type": "code", "execution_count": 5, "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", "
codenamegeometry
0005AlajärviPOLYGON ((366787.924 7001300.583, 364150.540 7...
1009AlavieskaPOLYGON ((382543.364 7120022.976, 380556.177 7...
2010AlavusPOLYGON ((343298.204 6961570.195, 340572.015 6...
3016AsikkalaPOLYGON ((436139.680 6798279.085, 432732.949 6...
4018AskolaPOLYGON ((426631.036 6720528.076, 425751.505 6...
\n", "
" ], "text/plain": [ " code name geometry\n", "0 005 Alajärvi POLYGON ((366787.924 7001300.583, 364150.540 7...\n", "1 009 Alavieska POLYGON ((382543.364 7120022.976, 380556.177 7...\n", "2 010 Alavus POLYGON ((343298.204 6961570.195, 340572.015 6...\n", "3 016 Asikkala POLYGON ((436139.680 6798279.085, 432732.949 6...\n", "4 018 Askola POLYGON ((426631.036 6720528.076, 425751.505 6..." ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#Select and rename columns\n", "geodata.rename(columns={'kunta':'code'}, inplace=True)\n", "geodata = geodata[['code','name', 'geometry']]\n", "geodata.head()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAKIAAAEDCAYAAAC2xd/kAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAABa20lEQVR4nO29d5ika13n/bnrqZyrOucwMz05x3MOhyQZEVRQMaCAgourcrmuoK7s+67uuy6oC8gisqiAYiAJiEtO58A5k+OZHDrn7sq56nnu94/nqZqq7uo00z3dc6Y+1zXXdD/1VPXdVb++wy98f0JKSY0a641pvQdQowbUDLHGBqFmiDU2BDVDrLEhqBlijQ1BzRBrbAjW1RCFEH8rhJgSQjy3zPt/RghxRQhxWQjxj2s9vhoPDrGefkQhxAuBBPBpKeWuJe7dAnwWeKmUMiyEaJRSTj2IcdZYe9Z1RpRSPgWEyq8JITYJIb4uhDgjhHhaCLHNeOjXgP8tpQwbz60Z4fOIjbhH/Djwm1LKg8DvAh81rvcBfUKIHwkhjgshXrVuI6yx6pjXewDlCCHcwOPA54QQxcs2438zsAV4MdAOPC2E2CWljDzgYdZYAzaUIaLP0BEp5b4qj40Ax6WUeaBfCHEd3TBPPcDx1VgjNtTSLKWMoRvZmwCEzl7j4S8BLzGu16Mv1XfWY5w1Vp/1dt/8E/AssFUIMSKEeDvwC8DbhRAXgMvA643bvwHMCiGuAN8D/rOUcnY9xl1j9VlX902NGkU21NJc49Fl3Q4r9fX1sru7e71+fI114MyZMzNSyoZqj62bIXZ3d3P69On1+vE11gEhxOBCj9WW5hobgiUNUQixVQhxvuxfTAjx7jn3+IQQ/yaEuGAkJLx1zUZc43nJkkuzlPI6sA9ACKEAo8C/zrntN4ArUsrXCSEagOtCiM9IKXOrPN4az1NWujT/GHBbSjl3rZeAR+hxOTd6IkNhFcZX4xFhpYb4c8A/Vbn+EWA7MAZcAn5bSqnNvUkI8Q4hxGkhxOnp6ekVD7bG85dlG6IQwgr8BPC5Kg+/EjgPtKIv4x8RQnjn3iSl/LiU8pCU8lBDQ9VTfI1HlJXMiK8GzkopJ6s89lbgi1LnFtAPbKtyX40aVVmJIb6Z6ssywBD6/hEhRBOwlVpCQo0VsCyHthDCCbwceGfZtV8HkFJ+DPhj4JNCiEuAAN4jpZxZ/eHWqMb3r08RzxQ4NxThfa/bsd7DuSeWZYhSyhRQN+fax8q+HgNesbpDq7Ecnroxzbs+c5ZUTsVsEvz+a7ZhUR6+OMXDN+JHlLyqMR3PEk7edc3+/bMD/PLfnSSVUwEoaJK//O6t9RrifbHRMrRrVGEskuY1H36aVE6lxWfndXtamU3m+NzpYeZm8X30e7fY1erlFTub12ew90htRnwI+OrFMSKpPLmCxuBsio987xb/dHKIgjY/l7SgSd7x92f4yvnRdRjpvVMzxA3O965P8effvLGi55hNgn84PsipgdDSN28Qaoa4gUlkC/y/X7lMtjAvSLUoe9p9nBwI86aPPcsb/+oZvn1lko2eiV8zxA3KuaEwv/iJEwzMplb83ET2bpj/9GCYX/30aV72Fz/gs6eGV3OIq0rNEDcoH3/qDueHIyt+3tZmDzcmE/Ou355O8l++/Bxp44S90agZ4gblYFdgxc+xW0yksgsnPeUKGv/30vj9DGvNqBniBmQqnuGfTg6t6Dm99S62NnkYDqcXve8zJxbM1l9Xan7EDUg0lef2dHLJ+2xmE7vafMQz+arLcTXODkW4ORlnS5Pnfoe5qtQMcQNydii85D31bit1LhtnBpe+txyP3Uyzz36vQ1szaktzFaSUfPXiGAMzS89Ka0EsvfA+z24xcawnSCpb4PpkfMWv/Y4ne/HYLfczvDWhNiPOIZLK8Y6/P8PJ/hBCwLGeOj75tsPYzMoDG8NTN+dnrwsBBzoDjIRSHO+/N0f1kZ4g73rJ5vsd3ppQmxHn8PGn7nDS+KClhGfvzPKlcw8uXBbP5Hn6ZmUG3dYmD5sb3JwZDDMZz97T6wZdVj78c/tRTGLpm9eBmiEaZPK6f21Lk3veY//7e7cpqCuLbtwr54Yipa+bvDYOdAa4Phnn5tTyDiML8f6f3rMh94ZFaoaI7tJ47H98h6duTPOivkbEnEljKJTiMydW5k65V2KZPE6rwtGeIOFkblkHl+VwtDe4Kq+zVtT2iMDLtzcxNJvibZ88xcu2N81LrQL44Ldv8FMH2tZ8o9/X6MFhUThxj/vAalgUgcu6sT/q2owINHrt/OdXbmVnq5evX56oek84ledTzwys+Vji2TyzydXVJShoctVm1rWiZohlpJaIw/7ND/tJ5dZWN2BzgweLsroHCrNJ0L9OrqjlUjNEA7Ni4r//5G56G1wL3hNO5bkyFlvTcVwei5JXVy9lK+iy8g9vP8qbDnWs2muuBTVDLONIT5BPvOUQLuvCPsN/OL62sdrPnl69VK097T6+/BtPcLS3bumb15maIc6ht8HNb79sy4KP/9vFcSKp5e3htCqp/NUIJXO86zNn+M1/Ose/r2J2TK6g8dHv3+Ivv3Nz1V5zrdjYR6l14pcf72YimuVvf9Q/7zFVk0TTefxO66Kvkc6pPPn+77Kn3c8n3nII0wKO5Exe5Rc+cYKr46u/5F+biHNtIk5PvYvf/LGF/7g2ArUZsQo2s8LBrgAee/W/07/41g3e9ZkzTMYyC77G969PMZPI8d1rU/zi35xY0CH+Nz/sXxMjLGd/h39NX381qM2IC/DaPS0c7gnw+o/8iPFopcF9+fwYAE/fnOHlO5oIOK383qu2YjaZ+LcLY1wdj/G15+66gZ65Pctb/vYkb3msm5dua8Rqvvv3/yASK17Yt/EFr2qGuAiNHju/cLSTL54d5U4Vg4lnCnzxrB6HnklkuTYeXzAj5pnbszxze5Y6l5U/e9NeXrKtsfS8taQj6ODH97Ss6c9YDVZFuti478XG45eFED9Yk9GuA//xpVv43K8/Rp1r8T3hl8+PLSstazaZ4+2fOsWd6QR/+rVrnB5YW0fzO1+4CfNDIEGyKtLFQgg/ehfRV0kph4QQjas+0nWkzm3jic31fOXC2Kq8nibhI9+9xRfXOKun2WvnTYfa1/RnrBarJV388+j6iEPw/Oyl/OE37+fkH/4Yn3zrYfa2++779b55ZYK1zsjqbXA90DzK+2G1pIv7gIAQ4vtGw++3VHvywy5d3Oix8+KtjXzxXU/wFz+zF/N9WFIiq9JTv3AU536wKoLNjS5SuQK5FRbnrxerJV1sBg4Cr0WXMf4jIUTf3JueL9LFiknwUwfaeeb3X0rAufJsHL/TQmfQSavfsarjqndbOdoTxGkzc2sqyfnhKOc2eLJDkdWSLh4Bvi6lTBoCnU8Be6vc97yi0WPns+98jK4657Lur3dbOdDpJ5LKMxRK8fTNGba3eNjRMk9ufEVsaXRxsDNANJ3nRH+ISCpfeuzZOw9HA9eVuG8Wky7+MrqAuxmwAkeB/3WfY3so2NLk4e0v6OF9X7686H1eh/5Wny3LwAa4Oq6ftLc3e3DbLUzHMwzOpjCbBHs6fJhNJiSgqpKCppEraGQKGumcSjJXIJktcHMqCVT3Rz57e5Z3v+x+f8u1Z1Wki6WUV4UQXwcuAhrwCSnlc2sw3g3Jzxzq4L9+5XLVhNoimxvc84ywnKsTd10/LptCk8fOmcGF718u54YjZPIqdsvGPrSsinSx8f0HgA+s3tAeHkLJHPUuK5sa3Gjo5aiRVL5UZ3Kg07+oEc7FbBJVHej3Qq6g8a0rk7xub+uqvN5asfE9nQ8BTV47P3zvS5lOZDnZH+LUQJjb0wl2t/l4YnPdslQbyukMLm/PuRy665389j+f47UffpovnBnZsKfomiGuAopJYDMrHOm5W6CkSbg0GqV/Ornik7VzFetLXBYzmoTLYzH+0+cu8IL/+V3+8js3iWXySz/5AVIzxFXkv7x2B7vaKk/AY9EMbtvKDKtY2nq/7G33c3lOZs9UPMuff+sGf/q1a6vyM1aLmiGuIi6bmT9/0z7ayvyDFkWQW2FN9I3JeEWGzr1gUQSzyYUTKj53epjh0MpFQNeKmiGuMs1ee8UM6LFblq3UVSSd19i0SO3McjjQGWBkEYm6vCr58AbK3K4Z4iqiaZJXfvCpiiycbOHeltnQfZSU+p0WroxFl7zvX8+NrpvQ1FxqhriKzCSzTMzJ2k5m1RUfVjoCDiZj956nuKXRTTy79B9AQZN8aIPMijVDXEW0BbaCjZ6Vac603EcMuqvOuSLNxOFwio98d/2NsWaIq0g0Xd0l4nWsbEa8H8F1j0131ywHiyIYDaf4s2/e4L1fuPjAhKaqUTPEVaTeba2q0jBX1GkxLIrg1j0qf21v8fDcCgQADnQGGI/qW4B/PjW8rn38aoa4itS5bbQH9KiIEHC0J0hvgwunZflvc1+Th/Q9+BFbfXYKK1CIONIdnCf0VO9evBxiLakVT60iXzo3Sv9MEq/dTFeds/RB+1awNK/U+e2yKexq9XF+OMxYdOHy1nIsiuDq+PxTdd86CrzXZsRVIlfQ+NOvXaO33oXLpnBp9O4SGVtg71iNeGZlIk89dS5O9IfIFpY/G+7r8M87Vbf47Oxqu/8SiHulZoirhNVs4r2v3sZPH2ybFyseCaexmZe3UTSvQAlsW/PK9oSgq9BerfKc//q6HbhWOBuvJrWleRV5w/42AAZmUhUZN9mCxt52HxdGlnYyZ/PLP7l670E0tMXn4HwsUnFtT7uPV65zf+fajLgGWKrEiZdTTXe0J7jslhVCgERypDuAf5l70DqXdV5/PyHgv71+F2IlR/s1oGaIq8xwKMVzo/Nnvsvj0VK5QDUOdPo5vQJH9KYGF6cGwpwcCKNqGkd7gksKfHZXqRr8z6/cuirlsfdLzRBXkfFomiff/z0uVlmCk1mV7c3Vi6RsZsHNyQTqMj3RQsBQWfvceFblRH+IA52LN5JMZisPTW6bmTcf7lz32RBqhriqWBTToulbz41VnxV3tvqIL9JVdC4Bp5VcFZ/h9UXSx7Y2ebg2Ueko/7UnewksIaXyoKgdVlYRt82M125ZUFgpmVV54ZZ6ZpM5bGYTFsVErqBhMyuYTYLCMmfEzqCzanZOJJXncHeAXEGbdzCau29t9Nj41Sd7lvmbrT01Q1xF7BaFNx5s52M/uL3gPdPxbEXFXhGLSXC0J0helUgpObdA0/DOoJM7MwuHAE8Zok5bmzzUe6zkChpjkfS8fevvvnLrurpr5rJxRvI84Y0H2xY1xIHZJIpJzNsP5jVZEXI72jM/BOe2mcmr6qJNI0E36oDTwok7oaqz7K42L286uLHEmWqGuMpsbvTwzhf28s0rk5hNgjqXlal4lv6ZJBI9+7qrzsng7OJp+sXDx+WxKNmChsOq0B5wcGMyTtBlpbvOicWQm8vkNa6M690IdrV6GQmnF20c+Yev2bEhDijl1AxxDfjpg+389VN3AChm+nntZnrqdXUuIVjSEEHv23yg089ENMOWJg/ZvEpvvZtb04l5e8Q97T6ujsdw281EFgkpBl1WHtu08boM1AxxDehr8nCsN8jxO3dnpVimUDpAHOlefl+8s0MRtjZ5+MGNxdXTLo5E2d/pJ7VEZnYmryKl3HAz4qopxhr3HhZCqEKIN676SB8yfvrAwnuwxarrqnF9Ms7+Tv+S950biixpYKmcyuU1blp0LyxpiFLK61LKfVLKfejScynmKMZCSU32fwLfWO1BPmwksgX++dTCjXsGZ1PYV1guutzST/sych8/+QB6Cq6U1VKMBfhN4AvA804tdqVEUrmqdSOKgF2tXrY2e+hcppRdkZlEblkZPHem9XzIxfj8mRG+d21jfUyrohgrhGgDfhL42LxnVN73UCvGLpdqWjcWRXC4O8jViTiXx2I4F2mzthD1btuS90wnsrT4HGxumN8AvZz/8qXn1rzB5UpYLcXYDwLvkVIuulN+vijGLsVMvHIP6LIq7OsIcLw/VPIfmk0rj64utwjr+mScuiXS/kcjaT72/YX9nQ+a1VKMPQT8sxBiAHgj8FEhxBvuf3gPJwOz+oxoUQStPjtOm5lTA5V+PeUe9LfvxXgX49PHB5fdV3CtWclvtqBirJSyR0rZLaXsBj4PvEtK+aX7H97Dx49uzvCZ40OAHmYTQjAdX52mPo4VFGENLeNwE0nl+Ytv3bifIa0ay/rNyhRjv1h27deLqrE1dAZmkvz2v5zDZjFxoNPPlfEYo5Hq+jP34sU7ORDmSPfiqV6gV+ONRzPYLSaO9gQ52hPkWE+QJu/8Pebnz4yQWEHmz1qxaoqxZdd/5f6H9XAyFk0zk9CXurn9+8pp8dm5co+NIM8MRdjd5uNSleTb9oCjJGm3t90HglK8+khPkMlYlt56Fw0eG+FUDr/DCki++dwEP7XOsedaZGUVsS3DN2g1m3DbzIsa6mKomqR/JklXnYPB2buz7Z52X0VCbvEPAvTs75OGQd6ZSc6TRc4WtHU3xFpi7CoyMLPwvsyiCHa3+XjBpvoVlZdWI5EtkMlr7GjW65CP9gSrZoUXsS7Ri+/CSJT+dVYFqxniKtJdX+mkbvXZOdDp50CnH6tiwmlV+O71KWLZAkd7gitqgXag08+hrkBJHnkylsXrsLC/Y+lal3Aqj9u2uN/yM8erxSgeHLWleRXZ2eqjt95Vajh+ZTxWUl841BUo7dfSOb3GZHOjG4FkMpZF0ySKIojOyTVsNPZzikmUkl6P9QQ5MRBiOpFdllD89ck4NrOJZq+NiQXk7v7umQFes6dlybqXtaI2I64idovCl//jE+wxapjzZXUl1Sr7bk0luDmVJJYpkMipRNMFuoJODnb68drNHO0JEkvn2dLo4VLZ0nu8P8S2Jg/tgeXL12lSspjYl6pJfvezF1ZNv3ul1AxxlfHYLeztmD+r5JeQfCu6VibjGYQQmIwTb6agcWU8RmZOW4qrE3EGZlL0NS0eyityoDPA9BJNyu/MJPns6YWTNdaSmiGuAfs7/cuWolNMgn0dfiZjWbY0unHbFE4PhoksUQ4AMBhKcWMysap9Wb67TskQNUNcAzY1uHlxX2Us/VB3oGpY71BXoKS+cHMqQWdweTNcOepCUrWASehZ2eeHI8uaPZ+9PYtcrJfbGlEzxDVirsTbqYEwu9q8HO0Jcrg7wK5WLy/YXF9RIOW0KgzOrsyNIgSkc9qC+Y1HuoPEM3ncNvOyuhtkCxrfuFwtnWBtqRniGvGLx7oqvpcSLgxHOWG0SLsyHiM5Jw1rd5uP2RV2EzjaHaSv2b1g7+cr4zEcFmVFr/uNyxMrGsNqUDPENaLebSt1uPfYzZQvdjaz7tw+t4JGkdVo8Nh4bjTK8Tsh7swk2d48X2gzlimwfYX9oC8sUFO9ltT8iGtETtXLRpu9dlQpuTWVKIXddrb6qnYrPdEf4mCnnzNDEbY3e6oW4pfT6rNXKDo0eGylnMV8WX/niyNRrIqoKlNSjYHZJKlcYVV7Ai5FzRDXCI/NzCfecoiOoJMPfvs6t6YSBJwW2gLOeQkPHruZbEE3moIm2dzoIpJefCmt1no3U9BKMeW57O/0L3sG1qTe0Pxg14NzbtcMcY0wmQRtfgdmxcQvHuumzmXj+9eneebObIWj+3B3oBQxEVCa4doDdo72BNGkfirWJKRyBewWBRNwe3r+wSO1SFsMyxLx5iJtfgev3tVM+D46X90LNUNcQ4rCR06bmWOb6plN5nnBljr+7Js3KWiSfR3+khECFftIs8k0T3JkKUbCqQXFnDTjmtumkFig9vmdL+zld17RtyxR0dWmZohriJS6e8Vrt+BtsbCt2UNBkxzq8vPXTw3w9UXcJKZ7KCVIZguoC/gAb00lONoTJJVTcVqVqkZ+cSS6YPestaZmiGvIXGMSQmA2wf6uet71EjOjkUxFgqvHprC91YdAz228s4yEhnIaPTZGI9XzHCPpfMn4TAIOdwfn1dFcHosSTedx3EOF4f1SM8QHTFGJYU+7n/e9bge/8H9OlPo572j1lYxl6z30PLFblmdAmoQzgyG2NLooaPppO5tXee2eFpp9K+sbuFrUDHEdOdwdZFebl7NDEQSVwkz3UrB32yiujy3Sq6Uz6KTJa0NKSnmMxaTYNx/pXPkPXSVqDu0HTDSVLxUrnRkMccc4/e5s81W02J2MZjjUFVhxJ/vNjW72VBFn9zst7O/0MxxKcWogXDWZdj2LqGqG+IDxOsylNmfDs6nSCXau8kMolef0YJhty0zzKnJ2KMKlkSiH5vgANze4OTcUYTGXtmcJqZK1pGaID5hytS6rWSm5Wq6Nx3DNSef3OcykV9AAqIgEYpm7dTF1LivaEhk1T26p52cOdaz4Z60WtT3iOtIR1GtaTCaBIgTXJ+LAXR/ftmbvin2JoBtwvduGy2ZmJJRmOpFdMulhPJrhf337Jvs7/bxka+OKf+b9UjPEdeREf7hqzLnIc6NRuoJOBpcpSVekM+hkOp5F1eSSWdlFbk0l+PB3bvKy7U3rYoi1pXmdSGcLnB1avPoumVOZTWTZ1br87BmLSXB9MsHNqcQ97fmW6l61VtRmxAeAqkk++r1bDMym+PG9LbxkayPpgsq7XrQJVZV848rCEZZETuXmVJwX9TWUZIc1qZcYSEBVNYQQ5FWNSCpPo9fGqYEw25o9y2pCWcRuMfHBn93H45vrV+E3XjlLGqIQYivwL2WXeoH3SSk/WHbPLwDvMb5NAP9BSnlhFcf5UHNmMMyff+sGzV47L+yr5xuXJ3jlzmYCTis/sa+Fb12dZLFeP9mCJJNX5+0Xu+ud84r6i8v4jck4u1q9y26ju6nBzat2tazsF1tFVku6uB94kZRyD/DHwMdXe6APMwc6/bx+XyuqlOxp9/PKnc3MJrK8/VOnCLisuObk/TV47ibVFrk4EmFLY6UrZzySobdhfqNH0KMnizm257IOZSoVrHRpripdLKV8puzb48DG6iazzpgVEx/6uf2Ekjm8djM3JuM0uG34HVb+8ju32daih/NODYTpCDhIZlX2dvi4MBwtuXfSeQ3fHKHObEFbVHl2LLJwNs5clnuoWStWaohVpYvn8Hbga9UeEEK8A3gHQGfn+oWT1oNrEzH+5ul+JmIZro7HcNnMfPyXDvLxp+7w7O1ZNCl56bYGzg5FiKTyhAZzpRYZXXUO/A5r1WjIYro2DR473XVOTg2ElzTG6XiWE3dmOdq7Pj1YxHJLBw3p4jFg5wKqsQghXgJ8FHiBlHJ2sdc7dOiQPH369AqH+3Dy5fOjfOqZAc4ORWjy2pg0ZD9+fE8LX704zrHeIMOhNHlVI5bOkyloBJwWNjW4kUhuTyeJpCqFm3a2epFSzy88OTDfQBWTYFuzh8tjMTY3uEnnCwtm5hR5cks9H/zZfYxHM3jsZrrqqi/794oQ4oyU8lC1x1YyIy4mXYwQYg/wCeDVSxnho0Y4mStlT0/GshzpDjAYSvGdq/pbORbJlAQ9j/UEOd4fIpzKo2qSUCpXYYRmk+BgV4D+mQSqBlcWcFT31rtK/VRuTSfoCDhw2RSSizQEevrmDAf/5NsAvKivgU+97cj9//LLZFWki4UQnehqsr8kpdwYWrgbhNtTcb5wdrSiCeTJgTAdAWdJhqTRayv5784NR/AZPZ0Lmjav1dlOI1VsKp5jU+PCcWjbnJSw4XCaJo+d7S0egsvo0RxJ5R5oof1qSRe/D11R9qNGd6pHY81dAiklv/PZ81wajXJzKlGRY3h6MExfk5eA04JZCPKqxGPTy06dhhFdGo3NE1qylvVaWcxOLFUyvO/MJLk6HieSyrGr1TvPUV4uk3JhJMr3rz+4FiSrIl0spfxV4FdXd2gPPyPhNBdG9OXRZVUYDlf6/K6Mx9ja5MFm1rWuRyNpgi4rdS4riVyY7c0ephM5nFaFna1ehowUriKziSw+h3melN32Fg95VWNPu4+xSLpCPRZ0107Rv7ivw89YJE1H0Mm18RibGlw4rGZesKWeF299cC1IaiG+NSKVK3B5LFr2vcr2Fg+72ypzBS1mwQ9uzmACwsksd6bipHIqm+rdXB2PUVBV9nX4uTAcKR1yiuhF9d6KmexApw+n1cxzYzEujkTJ5jXaAw4OLSACf344QqPHypnBMMmcysXRGCf6Q+xo8T7QxpG1EN8a8Y3LE3zo2zc52hPkznSSmWSWM4MRQBdeKrpi3IYz+8pEnLaAk4yR9nV+JMKRngBSwjO3Fz77TSWyHOoKkMgWcFnNXBiOoEpJd52TgdkU8WyBeLbASDhNZ9BJndvK5dFoqdi+yWujWt39t69O8mPbm1bxHVmcmiGuAV84M8IffukSmbzGgJH+313nJJzKE03rCa97233EMgWyxoElmtYfA71Hyp52fWY7eWdhIywadLUiqwaPjdFIuqKGeiiUIuC00Bl0EXRbEcCl0ei8mRbgW1em+B8/dT/vwsqoLc2rzL+eG+GPvvxcaWbz2MwoJsHAbIodLXcPKxdGogzNJo0WE/O5aBwWuupcLJQQk1tE/PPUQBiHVZnXXnc8muHWdIKT/SFO9IcWLMpPZgsMLaO5+WpRM8T7pNzFMRnL8JffvcXuNh9NXhuHuwN01zuxKYIX9zVwfjjC0Z5gSViz2Wdf0kVydSJOywJKX+XtNBSToM1vZ1+Hv1QOGk8XuD2d4LHeOlp8uiJto2fpxpIA6bzKqz70FL/xj2cfiOpDbWm+T4obelWTfPDbN7kzneTOdJJjPUGGwinGIxk66xz86PYMeVVyoj+EAF7UV8/ZwTBXx2NLxoNdNl1P++JolC2NbkbDacyKQNMkTV4b7QEnAt0lNBrJ0OKzcaDDz1Q8y2Qsw7N3ZjGb9O6oK/ENpnIq/35xnKlYhj9+wy62Na9MVWwl1GbEVWA8kuavvn+Lfzo5VLqWyKk4LWZa/XZCyXzFXk2iR1jiWZXJeLZq1V051yfiXByJlvqpZPIq0/EsZ4b0k/SZwcqqvESmwGgkzc2pRCkDp6BJTg2E5mkyLodTA2He+4VLK37eSqgZ4n2iqhpnBkP82TfvBpS2t3hIZPLcmk5gUUzsafNV9N472hPkWpnkXP9MkrYqy6/DqnC0J0iz18ae9ruvkcypC+Yvum0Kdou5dEiay9XxOE3LXJ7LmU1mlxSkvx9qhnifhNN5Pjqn7/FMIsdYJM3+Tj+xTIEf3Z7lYFeA7jonx3qCnBmsTHANp/LzFF87Ag72tOnhvIlYlhP9oWXlF25r8S6Z0rWcEN9chkNp/vXc6Iqft1xqhngf/Pd/v8J0NF2afTY3ujjSHWA6nmV/ZwABpVjx6cEw0bReXF+oMrGEklke6w2WYs4tfsc9VfApy3BCu++xftm7hnXPNUO8R1RN8qlnBnnNR37ENkMy2O+wllKyRiIpwnOacodT+dLBo7wlhds45T57J4THZuZwd6DqSTWayhNwLm4My1k+Tw2E2d/hX/K+cvxOCy/sW7uQX80Ql0E6VyBnbPJVVSWczOmGIvTEg+FwmmO9wVLXppdsbSCRUXHbzDR5bQihC7Xv7/BzZUwXdC8XO9rZ5iu1Mgul8pwdDNPmrxRD6q5z4nNY0KTgaE+QXa0eehtc8/o+nx2KzFN5qMZQKMXBLv+CPsq5/KeX962plHHNfbMM+qdifOfaNL/6wk2cHgzzhTMj9M8kyRlrbLvfwbmhMNmCfoK4OZUgkS1waTSGVREc6Q4yOJus6IN3ZSzGk5vruDweJz5n76dK+OGtGepcVmaTOY71BLk8FittAU70h2j02Gj02Ai4rGxpdBPL5Lk6rh+AzgyGl6yHnk3mmE3maPXbGVsiYfZwd4Bfeqx7xe/bSqjNiEtwYyLK3x8fYiaZ5yvnR3j3P5/nS+fHKko1r03GS9nMdS4rbX5HKcUqZ/gObRalokPothYPT9+aJZTMlQy6yNYmDzvb/Lhs+qn5eH8IsyLYVFYoNRXPIoQglMxxoj/EjckE25s9tPntSKiYcYXQi+7nZobZzCbGIxlMAnobXBzuDlTtYvWKHc33/P4tl9qMuAiRVI6nb87wjStTHOgKkMwV5iWqgt5tVNPApghcNnPpkFEuuD44m6LRY8OimNCkLsBU5PZ0AqdVoafORUGTXJ+MY1EEu8r0EsOpPFuaPBXdSK+Ox9jW7OHaRBxVk1ydiBNwWnjJ1gaOlx10mjx2hkIp3DaF3gY3DouClJJsQSOWKTARy5Qc8Ud7ggyVzaQv7Gvgx/eufZlpzRAXwW4S9DW5sZpNDM4m+fbVJAc6/YRTeRrcNkDSP5NiOpHl1nSCw92BCgmRCyPR0vIK+ix2oMOPxVypjy3R95AnB0KlZNe8KhmY04Xq9ECIjoCD4bBeVqBKictW+RGGU3meujHNrjZfadbuDDqZiGVIZNVFG4wDpQhPX6Ob//SKPl75gGqda0vzIlyejPMH/3qZLY0ePHYLrX47Z4cijEXSnBwIcXIgjNVsKh0sTg2EKw4KqibZ1Kgvp2aT3nE0nM7NSzRoD+iumrnRt4Cz0t+nSSoM70BngDNVKvtUqc+yTV4bbpt5RQ3Kb0zEebw3yI2pxIqUIu6XmiFWYSaR5fpEjI9+7zYOq8L1yThnhyLE0gWO9QTJGnu67S16z+QWn0NX9TJa2x4uS0Idj2Q43BPAazdzuDtI/0yKW9OJCp/cQu3L5s52AP6y2maXVVlQqyaRVekIOtjZ6uXMkJ52FnBaqt5bxGMz09vg4pk7+mz90e/f5vNnRhZ9zmpRM8QqPDcS4ep4nPFYhtlEjqm4ftpNZAsc7w+x3zA6r93C1YkYpwd1Va/D3UEAbk/pEsJWs4lGj414ulCxHKdzKttbvDgsJo70BOlfQLTdNkct1uewoEqNTQ0udrZ4uTwW42BnYJ4qBEBfk5vTAxFO9IfIq5ILI9Gqhl3O9pb5ejnv+cJFnrk9s7w37j6oGWIZUkpUVeMTP+zn9mSUK2Mxouk8e9oqs076p5MEnFZO9IfY0ng3x/BEf4gX9dXjsJpI5Qo8samOM0MRrk3E0bS7kYmdrV5uTsU52lvHyf5Q1ZCc32mZt4RbzSZODUQYnE1yeTzGbDLH8f4Qu9t8NMyJH3vs82e/Zu/CQu1CVJcoUTXJOz99Zs1nxkfGEMeNuuFyCgWVp66Nl76PpvO85wsXGYtk+ORxvZN7QZPkNYmrTNrDbTezp92HzWwimS1wuDtAi0/vFBVO5kjmVPZ3BklkCiW9mulEttQ612lRCCXzfP/6NEd6guxt99M1x23S1+SZ1yotmS0gBPNChFfGo3qXK+Nwtbfdh8My/6OtNnMWkZIFVWXj2QJ/8MVL3JxcvDfg/fDIGGK928o/Hh/gqxfHmDJE0yPpPPs79OX0wnAEs4BfONZF/2yywsk8Hc+SNGYnxSQoqBrfuz6N32lBEYJTA2HGoxn9wAFEUnlODYQ4NRiu+PBPD4Z5weZ6RqN3/yhO9oe4MBJhMJTiiLG0g66p3V3nrMiU2dHinWewO1q8tPmd2MyCZp+dG5P6IeOHt2bpqqu8Nz8nZWeuXc49HJWTUzXe/H9O8OffvM7wCoVDl8MjYYhSSi6NRoln8/zLqeHS9VQuj9NuIZkt8J2rk4TTeTY1uPitl24uHQI8djPZvMYLNtfT1+Tmsd5gKUIyGcvisSsVyv/lYTC/01LqmWc2CQ50+vnhrZmqKV8Al0YjRvjOi9QkA7MpsgV9T9gZdHJxNMpsWWno0Z4gs8ksd2aSnOgPMxK+a+BNXhtTc2pRBmaSBJ0Wmrw2DnUF8Dks7G33LTpTljOTyPKX373Fk+//Hn/y1SulkOZqsGztm9VmrbVvsnm1Qu3gYz+4RSRVoNlr40hvHVJq/PDmLPs7vFjNCt+5NsW/nhvj5490cHk8znevTdHud1DQJCOhFHVuK9PxLFaziSavneFQCtXQntnU4C5t8gNOC111TiKpPF67hZGIXj3nsin86NbdQqi+JveCHeV3t/m4NBotOavnsqfNSzSTZ3B2/najyOHuAAJBJJ3DophK8iOHugJMxbMVTusDnX40Q95kKLTwa87lic11fOqtRzAvs+HkamnfPFTMldzY2eLj1//hDA6rwvucFj53dpRX7Wzit/75AkGXlZdva+Qn9rTw6WcGmIjrs47JBP1T+om2OAumjcq8J7fUM5PIksqphJI5OoMORsJpNje6K4rgQU8Fm1tXrCwyC40Z+9mFpIcj6QJBpwVvm7WihVqR7S0erk/EiWUKbGv2MBG9G0tWTKLCCIGSE/5QV2BFhvijW7O86APf50M/t49DZduKe2G1FGMF8CHgNehCnr8ipTx7XyNbBaSUpZqSJ/sa+MCb9tLqsxFwWvj4D/v5wy9dBiDosnFlIs63rk5VPN9tq+53a/XbuTEZryjD3N3mI5VTF2yaU37Y8drN+OwWXrilnnROJZrR08Osiom8qmESAkXo+9btLZ5SMkORyViGFp+fM4MhGjw2puN3x9HX5ObWZKK0HyzOqC0+O+FUjpHwwvu74XCKBrdtRVqJo5E0v/y3J/nHXzvK3o577++8pCFKKa8D+wCEEAowynzF2FcDW4x/R4G/Mv5fN1RNks0XcJYZ0yu2N5JTJYMzMRrcNrY0uhkJp7g5FafFP9+1sdCslS/I0h7SbVXY2uLludEo2YJGMqfOy2ixmk2c7A8RdFkxmwThVI6LIxFSi/RQ2d/hZyoRwVPF92ct80kWOwgI4Eh3kGg6N+9QAvrB5GhPHT+4sbCeTVGpbLmG6LIp7Gjx0j+T5DtXp9bWEOdQVTEWeD3waalvOI8LIfxCiBYp5fj8l3gwKCYxL2QmJfz7pTGyBY1jPXX8xe0bbGv2YLMofOfqFEd7gpzoD9His9MRcGI3VzfE6USWoz1BxqIZvE5LKcy2vcWDz6GfpJNZle46J3aLQkHVODMUIZ2/e9DIqxKnVVmwrjhiFNvPVEmy2GxU8k3Fs8QzeR7fFCRfkHoEZYGE19FIhtFIpvQ7LkS2Wvp4FbY0ug2/pv67H78ToqBqy94vzmWlz1pIMbYNGC77fsS4VoEQ4h1CiNNCiNPT02uvNDWbyCClpFDQ+NunbzMZTxNOZvn+tSm+cnGMJq++xComfcbI5FW2NLqYjGUQAp4bi3OkJ8iRniBN3kqHcVFmriPg5GhPkCaPjavjcY7fCfGj27P0NelRihP9Ic4M6afhIiahn2o3LyIrV6w/HphJVoTm9rR5yataKdpzYzJBJFXg1KCuCjsaTs9LlgU9tWxvu4/xaIbtzfM7n/YZrdYujEQr0s3msrnBzaYGFzenEqUDEMDJgRA//4kTzN6jBPKyZ0RDMfYngN+v9nCVa/PWBynlxzGE3g8dOrTmx/WOOjeqJjGZBD6nlVa/iyafnRtTCRo8di6Pxdjf4efZ2yGO9gQZj2YYCqWoc+kywaomiaXzXJuI47Aq9Na7kOgn4/6ZJF1BBzcm44TnqLl21znn9VCZTeYIuqxIKdnS5OFkfwgkFdk05dyaStDstTERyxq5jkk2N3oIJ3M4rAouq0Iyp+K13+3tB2CzmLAooqRtA3pEZSiULLVT29TgIui0EkrlcFhM7G7zMRbNcLg7wKmBMG6bmb0dPuxGJ3tVkySzBVI5lXg2X1WiBHSf6O989gJ/9yuHV9z4fCUz4mKKsSNAeSO3dnSZ43VFCIFZMZErqDhtZgZDSZ4biTEUSnNhOMyRniC3pvTN/In+UCkEt6nRXZrxZoy/8HRO5c5Mkv6ZJGeHIvidFvKarDDCgNPC0Z6gsazrb+3edh9HugPcmkoQSubY3e7jnLGUT8azCyY8WBQTZpPJiNboSbCnBkLcmk5wZybBVmNWk1JyfiRS9jtTiuAUmYhlKnQWb08nyamaPpN77Zwc0H2Q0XReL4XNFrgwHC29L6cHw9yaTqBq2oJGWOQHN6b5t4sr/+hXRTEW+ArwFqFzDIiu5/5wLuFUnksjUX71U2f4+xN6EXxBA6QkXiblazGMZ6TMvVFtD2cSlGa3cnobXJzoD/H0rRm2t3o52hPk8li0QuM6nVORZYvFtYkYO1u9FQejoMuK32mhzUgPU0wmCkZR1P4OP4oQJZdLPKvSGXRwpDvA4e4ADW4bN6funrLtZhNHuoPzfg+b2cSV8VhF/fONyQReu6WUfFs+p+VVScMisepynl1EvWwhVksx9v8Cd4BbwP8B3rXikawhOVXj3y+NU++2lsSRAEKpHDvLVFMnoxn2dfgJp/Ps7/DTXefE77TQXe9kf4efoLFXO9gVMJT6qUj/n4nfPVhcG49zeSw6Ly58aiDMgS59vxh0WtjW7CWaznO4O0DQacVhMdHgtnJtIs6F4Qhg6CC26OMcCafnJSfcmkpyciDMKeNfsXYG9JKBkwMhZhI5w8mt47Gb55UoABXx7bl7p4sjUZbTPvqXHuta+qY5LMsQpZQpKWWdlDJadu1jRdVYqfMbUspNUsrdUsoNJV08Hk0TS+cZCac42BXgWE+Q3gYXoUSOK2MxjvYE9X2Ty0quoGI3mzg3HMFjtzAWyTAwk2IkkmZzk4dmr63kEJ6OZ9nZelcupKBppUPNzlZvqRdzkS2Nbv20HUnTXeck6LZxfjiCx27m+J0QkXSOgNNKLFOgK+gkU2YoZkUgBNR7ll8c77YpJWPLFjTjjyCARdHVyfa2++YdTOKZAluMZN6bU4mK5AlVkxzqWtxxfaQ7WPGeLJdHItZ8/M4sbX4HbX4HZwbDHO8PcWc6SavfgUTfB4VTeQZnk1wZv3v4GJhJsLnByJ6JZznZH6KrzlWxTzo5EOKJzXU4LSbaA87SY7emEiUda6/DzPZmD6mc3sasyWvHopi4NZXQ3SXG1KNJGI9lyOY1FEXgtpnxOywc6QlyeyrB/o4ADotSOuEuRSKr4rKZ6S5Lfohn8jR6bBzo9HN5PMZwKFWRSLG3w8dNI5oUSubYOUfhdrRKFlM5L9txb51Nn/eGqGqSodk01yfjFXu1fe2+ipqQUDKH02bmWM9dtYV4ViVTUEvSwE1eG8OzqZIh1LmsbG5wcfz2LLvafFjNJtoDDo72BMnm9e5RR3qC+OwWkjm1lOh6ZjDMzSk9ztwZdOIty7qWUu8ycGc6yaYGF/VuK5fHokzEspwdCmNRTLhtZo50B7At4OcsZzySLvlTFZNgIqr7E88ORUhmVXKqpNFrQzEJfA4LYo4D5MJwhGNlrqd69+K6OVvvUTHseW+I8Uyed7ywu8LFsb3ZQyxbYGerjz1tXvZ2+LCYBJOxLMf7Q+xq9bGl0UWTx0aL1176IFt9DsZiGVI5lcPdQZq9dm5OJVGlvk97+uYMUkqujseoc9vwOCycGQgxHE4zFEpxZ2Z+JrbdYprnYB4KpfA6zFwYiXJrOsmusqUulslzdijCyYEwXXUujvYEeXxTkC2NbhwWE4qgwu+YyKml0lJVkxUnaoGewaOYBDtavMQzeeYqluRVyfH+EAcNwc8LI7pPtNqfgMOiR1ruhedt0kORdE7l21emK9wsLruZqwO65K9J6KpbdW4bE0ae4rnhCE6rglUxcW0iRledk8FZfZ+4u83LpdFYRcoVQEfQQSiVK3V3imUK+J0W9nX4ObNIc/C5HaVAN5hGj42Y0S2gKGkMECpLAyvP3mlw2yhokjq3jVgmT4vPTr3bxng0XaG9aDObSvHrA12BeX8EE9EMB7v08oOZRJaRcJomr51Jw4GuSX0rc7Bz/u/1km0N8zLFl8vzfkZs8TvIFioPDeXNdzQJLT4HqiY50OkvNV5M5VQi6TzxrGqUjur7xKKTdx5Vpgg9CUL/2UeMPMNiwVURp63y9cwmwb4Of4VbJZa5a4hBt3VeI8hdbV40Kcmrkql4lkxeYzya4dJolAaPDVWTPNZbx9GeID+6Pcud6QRHuqvPauPRDAVV40R/CI/dQoNHP5zN/cPTE3krY8uvvo/S0+f9jAjw+KY6/vHkMLPJHDaz4FJZgdCmBhe3jP3adCLL1iYPfU1unhuLkTZ8b2eHwqX65GoRg70dPmbi8x29zT47T9+c4UCnn1NG9jbobc5avHZimQIeu5k6l40zg2G2t+hlq9F0noNdAVK5AoOzunZiMYnCZ6+sZTEJcFnNpdrpuVwd14v1fQ4LGeN52YLkzGCIXW3VT7fFleG84T6qxkwiRyiZY2+7Xj+9u83Hy+6jC8HzfkYs8oZ9LTitCkd66tjZ6i0peM3t7nl9Ms6pgXBFPxRNUooL35iMV3R16mtyY4LSknykO8ChrgB9Te5SdvbZoUiFTy6napwaDHN9Ms7pwTBC6LPx9Yk4J436ZpdV4ep4HJ/DSqEsXGcyCTw2M7vavDisCke6gxWPV6M94GQmkSNRZsCq1Ge17vr5EiOTsSx1y9BQ1KSutW03m/jlx7tL2t33wiMxI+5q9+Oxm7k6keD4nVm66/RZ8PFNQZ65XT0TZe68V3RbdAadJHMF6lw2JPqp0iT0mWlfh7/iZO51mOd1kd/R4q1wSAddVoZn06U9GOh/DMVIy3g0w2Qsw9GeAMmsys3JOD6nhedGY9S7rZwZCmNWTAtm1bT67AsmIkRSeYJOK0GnhZCxV7WYBHlN0hV0MpvMYTeb8DstBJxWrlbJFs/mNX7l8W7eePD+WnQ/Eoaol1YKLo5EyauSeKaAhEUF1OcaYiqrVmrZKKkKXWz9EFOZLR1LF1B9koDTQjiVx6IIRiN6TPfFfQ2kCyqpbIGxiJ5wcGEkWnJA35pO0B7Qs741qc+4oWSlSkSxtVle1f2Tj/Xqgk0uq1Lam07EMrT5HQuqzTptCmNRlb3tPgZDKd0wjaSPA51+cqrGc6Mx7BZdEErVJAVNoknJxZEos8kcv/ljW5bxKSzOI2GIAD0NbrY0ujg3HCWcynGkO8BYJDNvxgI9AnJ7OsmRniDJbIE6l5U7M0kuDEfoDDoZClUaIcBQKI3Xbpm3V7s6Eae7zsnmRg8gGY9miKbzfP/GNFub9ZR+0LNz6lxWZgv68/ua3KXHQFdhEEAqt7BDWZW6DMn1iTh9TW5yBQ23zUwqp7K/08+5OafcPUbhVCavoUp9hoyk8iU309my9LWB2VTFAcokYFuTmz/5yd1LFu4vh0fGEEfCSa5N6Hu29oCjtIRGUzl66l30G29+wGnBaVW4OZVgOpFlc4ObaDpfOjX6HNXLB6JGfLrRY5u3hBU/RJtZVBhwuXyIQN+HdmuSM4NhnhuNsb3ZU3qtaq9bzoFOP4OzSWxmhU0NLmYSOZK5QoXxFJfvw4a88rWJeGkGzhWqJ+jaDG2fqXi2YuyahHe+ePN916oUeWQOK3/79B3SRvljeXQgnlWJpfN47WYsiqDOZStV5NW5rGQLaoXr4tJolBZfZRZKcT93dSJGLJMvbfTnHrCbfY5SuemOFi8joRRHjBmnGGocCafornPS1+TGblFo9dvZ2+6joEkcloUPA3lVT9EaCqUMFTILW5s8bGl0s7vNh0URnBwI8dJtjbisZurdtgo31o3JBEd7AqWQpt1iYn+Hn6duzjAaybCn3V/x8z785v385P55uc/3zCNjiCPRuxv2iVjl8jabzLGvw89uI0xXpLfBxXA4zWwyx94O/RR9uDtIm99RyjdUTILDXQHa/A7cNjOjkQyNHhv7O/0VJ+99HX5i6Tzbmj20+Ox47GaSeZWh2RSHugP01OuJBgGHBSl1w1BMgul4lgsjUU4PhthlSJ90BBwc6wlWREFsc/ybyZzK2SE9lPjcaJSg02qcsDWevjnN6cH5OtrZgmQknNLFOo0T8V2NJ1nyXzZ77bxix+o2jHwkluZ0Tk/03NPuw6KYUFWNEZEudeU80hPkqZu60FAxG6XVZ69YiuKGElgyp3JpNMr2Zo/uSrGbOT0QwmUz09vgRtMoLaFCwP5OP+eHdSm7cCpfaszT4rMTTeXx11m4MBxhW7OXLY1uhiNpkln98FDexCdbkJwdDPNYb5BLI1GGw2mO9AT1TG/0k3ZXnaNU6zwSTuGymomk80igu95FJKX3ft7W7OXyeMxoTunngpFYazWbyBS0UnZReU31mcEITV4bdovCf3v9TuyLzM73wiMxI1pMglfvaubiSJQzg2HOj0Rp8tk51hPkaE+AUwP6h2k3m6h32zjWqxdGlTt078wkOd4fKs2YVyfiSAkn7oQoaBBNFzg3FCGnaqXSUSl1P6XZJCo29A6Lwkwih92iF+vv6/ATdFlKWwfQT7tz9WtUCRdHoyV/4LnBMH1NbiyKIJ4pYFX0n2tRBNuavaUCLNCX/dvTCUYiGexWpZRXaCv7GYOzyaqaOUUmY3oLjlfsXH0p40fCEM1mhT94zTacxpscdOp5hsf7Q0amtn5fpqAZDXYyBJwW6lzWee3JyttHXBmPsXfO44lsgaayTOaCphFwWkuHIdCXvBafnXRe/3mnBsKcG47Q7LOzq9XH7jYfbX4HBzvnl2f6DZkQ0LVszIpga5OHw93BUsHV4a5gVZHNgga99S4S2QJ72/0c7QkSLzPWyVgWh9VMq696JnaT18afvGF31cful0diaQZdy/BAV4Af3pplS5On5Pw9MxiucAY7rHoyaV+Tm6l4jv7phJ7WVdA4PxzBZVVw28ylQvqFJOVAz+SupuhajVi6wOmBMJ1GMZUEfA4zLptCsizBtlgWWnTHXBnTl+SiC6rebeW5cb1vXyiZQzGJ0hJrEnqfvrFwmvgCQgChpOHais7vNPAHr9lO4B66Vi2HR2JGBH1Z6wzof+lTZVGMzY3uisNLOqdiEoJLozFSuQLxrO4svjIWxWM38+ydEDvKygsmYtmS4RW5NBrlSHdg0bT6kwOVyrKgu2CGDCME2N7srTBCuFugVa6F3ey9m0Qxk8gRSxc40R8imsrhtpvZ1+7niU11tPgcjEYWNsIiokr3qjfsa+X1+1bvlDyXR2ZGtCiCZr8DRejLm92i7webvXauztEhBD1zZlebr5RxnVMlObWASeipUsXSy00NLibLZOa2N3tQFBMnB8JYTKLUZX4uUupJBfvafWQKGh67eV77slhG10P0O/TIjN1iwmu3zAvlLSSkFXTryRRS6tWEY5H0/BrfKhSTdoGScth/e/3OZTzz3nlkZkRNkxzpqcfvtKJKTT85h/Wy0p56Fwe77mY862Wf3grxIgCnxcTuNj9DoVRJ4UARAp/TZnQRtZLOq0SM1me9DW76Z5IVaV/l5FWJxWzi2oSeaJGaI/MWTuVocOlpX8d6grT7HYxF50dW+mdSWKtoaTusSimp98JIlIPL6EhV/J1sZr3DVSxd4BU7m/E61mZJLvLIGOK18QiKSZfyuDgSY59xEIhnVW5MxtGkZHOjp5Q547VbSOUK7GjxGu3LfCBEydUBeu7g7emEYZgh8qoeRXHbzGxr9uB1mPE6LFiNxIG97T42G4VJJgEv2FRXmn2avXasiqDeffcDH49m6G5wMxrJGDXNSQ5UOcBMJ7JVr9+eSlRk11wei+GxLe52MZsEu9q8+A1p5n0d/vvKM1wuj8zS7LBaiGQyHO7yc7w/XGpFkTPUt8rjsE1eG/VuG731rlIo0G42sa3Fi0URJLIFro7H2dHqLe3VbGal1AyoeDiwmk04LIohKezh4kiETF6jwW2j2WdnPJYhktJLSRWT4PidEH1NbrJ5rbSPOzcULqkygK4EZjWb5pWCnh+JsLvNy9XxWKmE1WFR8JSJUFkU3e8Zzy4ssNnX5OF716eNr9389VsOVjj514pHZkbsqnPyqWcGK2ac04NhcgVtXkdPxSS4PhFnPJqhI+Ag6LSSKWhcGI5weiBccuaW5zJaFDGvjWyuoBFN59nZ5qWgaqWa6ulElkujUQqqpLveqS/zEhwWEzcmE6UC+3q3FZsxmxYZmE1VrQvJ5DUujeq1MjtbvaWirJuTcfZ16A0pY5mCobVd/T062hMs1TULAe9/4168VUTh14JHwhAzeZVwusBjm+r47nU9gtLX5Ka33sW1iTiXx2KlmG9xWS5okuFwmuFwmi1NbmxmgQQa3Fayxl4umbt7+uypd9Hsc7C9xVNRqAV6zt5UlQxuj93MwIwexTg5EMJiGLYqJZFUnq3NHsyKCbvZVGE8C4mug+4LdNvMNPvs5DWNTEHj/HCU29MJjvUEOTccwW2zzPN/HppTv/LSrY3sW2Er3fvhkViazQJMQmASopTP57FbKnx8J/tDvGJHE9+9NjUvT/FEf4gjPUE0TRJO5Uhm1ZJ+NehhwXIH8u42H06rwlAoRZvfQa6g0ea3z6v7KI+2aBK2Nns4ZejQ+BxmLo/FiKTy9NS76Kl3Ueeycbw/NK//ylyEgDtTyQofZyyj94jpa3ITcFpRNcm+Dj+qJrGbTUTSd9PXAk4L/99PrY3jeiEeCUPMq5LhUILPnxkq9VWeiGaMblGCdF7FaVF46sY0rX7HPGlf0E/dRTfMlkY3eVUrLdFz8/GKCbKKgJl4lo6ggwaP7sM0CX0ZD7qsFdV5+mN3T74Bp7U0jnNDEbY0ujkxEOJgV2DRhN7NjS5uTCbmNa/srXfhsin68u2yYlb08lmnVS8BtSgmuuuctAUcvOdV2yqiQw+C5Wrf+IUQnxdCXBNCXBVCPDbncZ8Q4t+EEBeEEJeFEG9dm+HeGw6bmQa3jWRO42R/iHROZTSS5txwhFgmj8dm5tRgmExBo8Fd3U1RqR6rd/Z0W82lJIQiu1q9bG3SK/X2dwbY3OQmntUljfua3PidVvKqZDyanZfbqGmSQ126Bo4QgqK9He0JcnMqgZR6JCiRKZTClXOpc9nmGaFJQJ2hp9NplAAU/aN1Lt3gr4zH8dgt/MeXbJmX8vUgWO6M+CHg61LKNxo6iXMrbn4DuCKlfJ0QogG4LoT4jJSyemnZA0ZKyXA4QzSVR5P6Mrir1YtZMTE0m6zoL7LQXFOsWLNbFKyK4OmyDgE7W70MGEJJo5E044b/sXwpdliUeTPtXM/fqcEwdouJviYPdrOJUDJHNJ1n7gR4azrBIUMIqpw2v72UwFHOkZ4gx43+etVm+2Je4mOb6nhsU90C78Dashwxdy/wQuBXAAzjmmtgEvAYou5uIAQsHkd6gESTaS6PR0tL6c2pBJsbXWg5lb0d/gqx9ES2UNU9MpvIMa5qqJoknVcr4tP1biuNHlvJ7VGNvDrfZdI/m2RnqxeXzWy00LBxczLOxZEoioAnNteTzqtcn6iM/BzqCpSMvRybReFYr25ImlFbMhJOz5NwLqfVr0vftfkd/O4rti584xqznBmxF5gG/k4IsRc4A/y2lLJcP+Mj6BqJY4AH+Fkp5TzNMyHEO4B3AHR2dt7n0JfP1y9PcbZ/tiJj2uewcmYwTMBlodFrM9Ku9ISGrU1uXFYzN6cSpRqUUCpHo8dWOv2eMRJLJfD0zRkaPXa9UeN4DL/TwpZGd2nPlytoWM2CVE4r7Qv7mtzkVVmS/32sN8izd+7OZqqEH92aYWuzl2xBw24xkcnr/58aCOO1m+kKOknnVabiWdoDDiaiegPwuWHFiViGg50BzpSp2AZd1orT96+/eNMD8RcuxJINf4QQh4DjwBNSyhNCiA8BMSnlH5Xd80bgCeB3gE3At4C9Usr5QVyDtW74U0RKyXQsxZMfeIo2v4OAy4pVEXqz76kkbptSym7e0+6rmNV2tnpx28xICRLJ6YHw3dR+qTf2bvE5Kk7ML9/RyI9uzlTtGLC50UWTx05W1RgOpSpUxVxWhfags6JgCjASHCJsa/EaPZ9FhZvlaG8QKfU+fZfHYmxv8aBpeqJske3NHu5MJ9jd7ufaRJydrV5yqobZpGvlHNtUx7tf1nef7/TS3G/DnxFgREp5wvj+88B759zzVuBPja4Ct4QQ/cA24OQ9jnnVePb2LJNRPdh/ZyYJRl7g4e4AFlOKZFbFopgIp/I8NxrDJCjtyQRUfug9QU4O6F0HisoLU/EcrT47Y9EMLqvCrckEvY1unhud/zd4ayrJrakkW5s88ySAkzm1VH5QpKvOUepqH0vnuT2dpHeOnuFUNMtYNF3qBnCrLGGhyGQ8S2edi9ODYTqMuPe5IT2l7SM/f4CXbLs3KbnVZMm5WEo5AQwbjX9Ab3FxZc5tQ8Z1hBBNwFZ0Bdl1R0qNz50dJVfQ2NLoxu+0lJa3A10BFBMlgabpRLbU9nZbswcJpUKofR0+rozHkFLP6SvWo9gUQWedk/2degVf/2yK0XC6okJv3piMI9GBTn9F42+JHl053B3gsU1BxqPZ0v6uKCd8Z1rfV+7v8POiPr37VdEIFZPQ4+KdgZLqgt9hIeiyksjqv+NwOE0qp7K7zccn33ZkQxghLP/U/JvAZ4wT8x3grUXZYkM19o+BTwohLqFPJO+RUq59t+lFUDV9ST49GGY6luFYb9CIXEhafA4GZpKl2c5rN5cK0IvhNJ/DwnQiS2fQSdBlpaBR6lgayxSYiGZ4ydYGLgxHSifSYjZ3OKUXSWlSzits39+hZ+84rApnhyI4rIqeUIF+UDraU8fxO7N0BJ0l3ey5FPeVL9nawPZWb6luZXuzh0ujuojAke4AJiGYSeTmzZLRdJ6P/eIBdtyDsutasSxDlFKeB+au7R8re3wMeMXqDev+MQm94OdbV6fY2eajfybJydEQmoSbU0n2dehJqIK7iaBtfgfhVI59HT5uTt11CgecFnrrnRzqCjCTzBJwWrEqJsajGZw2M6FUnvaAg/7pBHUuK/WGxJ3eDNLMwGySyViWPe0+zs0RNuoOOiloGjOJnOHP011LTquCy2peMInVY1NK+9mjPUEGZpOYFb1uus5lRQg4vkBjn9ftbdlQRgjP08hKOqeSzeX5s2/eoH82Rb4giaRyFf64RLbAk5vrSOVVCqquwDAWSfPkljpCyXyFUzicypPOS66Mh3likz5jqYYvUq/20zCbBHaLntp/fTJOvdvK4GyKeLbApgYXeadGPFPAY1No9jm4OZUoSZCUz5qNHhvZgsrt6QQBp5UWv71qF9NsQSudjsv3sfs6/BUt0qrx+Kb6+3yHV5/npSE6rAqhRJrfe/lmvvbcOF95bpr2gKNCu0Zv6hNhS5O7lMoVcOrZz645zSAPdwfw2M1E03qzoO56F06ruRTKe1FfAyfuzOJzWhiYTXGoK8BgKFWazW5PJ3l8Ux2pbIGgy1vqc5xXJbvb3ISSOYZDKfxOKx67GbNiIp3XSEczENVLT+f6DW1m07x+yZOxLJOx7LwsoCLv+/Ed/PielnsW01xLnpfZN5omCbrsbG318bKdzbisCiPhNP0zukLsMeP0m86rRsxYfxvCqTxNXgc7W70V2S4C+MGNGSyKiel4FtUQISqSyat01t0Vci8WxoOek9gRcOiZOkJwZjDMcCjF7lYvR3qCWBUTA7Mpdrb5DN8eWEx3f3iD21ZV4SGe1YVEj/YE5z3usZtL4qJF3vmiXt72gh4avfaqNSnrzfPSEDMFFYdNbw12eSzGJqOtRFedixdvbeC4oUEIupDl7jZfSXd6KJTih7dm2FYmSm41K6iapMlrx2YWNPnsFYYYSultKQ53B2j02EiWKXZtqncyk8hycTiKRREc7g4SyxRQpZ7xU9zHXRyJcnMqwUQ0U/HaXXXOqtrboIcQp+JZHt98V39mc4ObNr+j1DEL4Cf2tvL7r95+H+/o2vO8W5oLqobTakZKyTN3Qmiaxu2pBELomdXHeu9+aIe7A0TTem+5w90BvnV1SndeSz0BdWerB4fFTCavKy/YzAqPbarn+3NCeVbl7p6syWujzmnlcFcAsyKIZQpYjKV2NpFjMqYXXpmEqKpEls6rXB6P4bSY2NToqVp4BfrWwmlVGA2nqHdb6a13kcqpeB1m+mdSpZj5k1vq+ZOf3LV6b/Aa8VAaYnlD8HI0TW/TKqXk6liUswMhnuyr4/J4CrMiGDTyAx0WPe3/1ECY7jonsbSuO3jACNmdHYqwqcFFwUj9avLozbQ1qadwHekJcnUsVtoDWsoytfV9mm6oh7sDJcF4AK/DQiiVKyUrFCXfOgIOXetaSsYNHcSuOheDs9VnQtAFQ4sncFWTpVlzIpZhT7uP6USWnnoXf/4zDy7L+n54KJfmhfY4iaxKOlfg+ngUj0XQ4LHzNz8c4CV99ZweDPPWYx3s7/TTXe9EEYJjPUGafXa2tXj1MFlOJZNXS815rk3ECTotJHOFkrHlVcnJ/hA+oxjqiU1Bgi7LvGTVYhOd3W0+9nT42N7iIeC0lLoIdNc5uTYR50Cnn2afg7NDEexmhVg6T1vAztWJOL31lVGUYuOebc2eitSdvKphVURJUvm50Sg/tq2Rv3/7ERo9Dzav8F7Z0DOipmmMhJMUNEGz104omaXeaSWVUwl67RUzYzpbIJPLoSkmZuJZmtv8pPIqnUEniXyel29vJKsJro5Eeby3jr97ZpDD3UEGZ5IEXFZuTSXw2C0I9NPzrekkXruZvR1+Ujm96c/1iTgdQScXR6KMhNOMhNNsaXQb8nUaR4z+I8Xm43P9eOU1LiGj3W0mrxJJ6yfiaDrP1hZPqTNoUZI4p2qG3Qk8dgsSKoq93DYz+zsDpVa8VsXEu1/WR3tgvj72RmVDGqKUklgqT0FqPHt7hvd/4ya//Fg3L9taj8umkM7niSXB7dB7iugJppJMTuNmOE6dx4ZJCN790k2EUjksJsFYLEv/dJKZhIXeOiev2tXEd65M0V2vp87nVUlvg4ubkwlyquRxw19YngRhN6ryimxpdHNrKsGIRaHZa+PisC7C9OSWenIFDZtZsK9D732XyWulNhtuq4LDqtAecHBmMILHpvB4b5BMQSupRFwciaKYBOeHI/TUu7g+qc+el0aj7Dbk6Vp9VqbjeS6NxkoSKE9urtMl8do3lsN6KTakIQohEEgi6RyKSeGnD3Tw9K0ZPn18iP/+kztp9dgYj+U40GXDaTGRyeaZTmQxI5GawK4o3JmJkslrpPPS0H7O0Nvo4gvnx0hmC+zrCNDscfB/L43T6LHplXFSn5WiaV3vem5CaqagZ3gf7QnitCrMJrJI9APGvk4/2bxKrqAxHslQ57ayqdHN2aEwAl2ksyPg4KVbG/ju9Wl2tPk42R/CYhL0NrhJ5tRSFs/JAV2PR6JLohRDeorQZ9S+Rjdve6KHaCbPt69M6jo1MT0s+dLtjfzK4z0P7sNaJTacIaqaZGA6zufPjpDMaTitChaTxGbWU5b+/eI4733lNqLpDMlsHqdVYSKZI5zIU9AK1HsspAsqAaedgVCSnjonJpOJnKrhtdnoqXNzaTTCrz3ZzT+dHOYn9jYzGM7QVedn0pCCs5pNzCaqJ5cXlV2L3aiK5AtayVkOEHQHuTKmp2K1BxxMx7MEnRZO9MfY1uxhYFbPpElkCoyE0/Q2uDjc7efCcJScKjk3HCFX0BX703nVuMfJjhYXP3u4k20tPqaiKV6/u4V/vTDGwQ4PkbTK1hbvhvQTLsWGMkRN08jkVLrq3Xz76jSbG10ksyrXxmNsa/UQcFn50a1Zbu+PcXwgwq8/6UJRFGKZHGeHZ/nFY71cGw/TXedmNp6gN+ggIyVXRkO0eh0IAa/f24DHqpDKSnIFSVvAzlO3dEWDeKaAzazQHnSU2kcUVI1Ien68N+C0VhiiMkenWDOm06DLSotPr+CzmE2oUpLMFuipc3Flzsm7M+jk917Zx5cvTLC92cOViRgv395Ek9dGX6OHQ11+zo9EGY9k8DutNPucaJrkDfvacNrMqy6e+SDZUIZoMplw2fU0/Zdtb8JjN/Evp0bxOCw0ue0c7alHSEmmoPGCzUEcNjPJbIFbE3G2NXmwmE1savDitFuIpi2cHYqiAAU0VClp9zupdzl4QV89KhqDoRSpvMrmRjcz8SzfvDJJOq+SmlD5xaMdWM0m/vZHg1XHOnfSKXe1KCZBPFvgcFeAeLZAOqeyo8WLzWxCShiLZpDoddEv397Erek4E9EsO1o9zCRy/OZLNrG/00f/bJrr4zFetr2RjqCTUDLPi7Y2MhXLYLMoCCEwmcBuUZYsMd3obChDLGI1m3jPq7cxOJvkU88O0eSwMZXI8YGf2cw3L09gM0OTx04slSVlGK3Nov8qTsNnNpPI8PTNGY71BNnc6MLvsvHtGzM4FUGLz8ydKZUj3QF+dDvEzx5sI6dqvGhrPWaTiX0dPgZnU/z98aF5YzMJ2Nvh5/ycVhGRVJ4XbalnMJyip87FM7dnyBYkmxvcXJ+ME3RamYhm2Nnq5cp4jIDTysFOP731+uOdQQceQwuxxe8gns5zpKeOA50BzIoJTZM0enRjazRKPVVVQ1FMOKzKQ7kcl7NkqcBasdxSgVg6x9n+Wa5OJTg/HKXd7+Dnj3bgtimcG4oScFk51BVAMWR746k8boeZWCqHRTFxcSTMuz97kdfva+PfLozx2l1N3JxO8dpdTTS4rdyZTRF02/nf37vJaDhNKq/RU+dECFE1tOayKfQ1eSrcJ8Uy0edGo/gcFnwOC9cm4liNkN5gKMV0PMO+jgBdQTvNHgvTSZVX72rmyxfGafE7aHDpPfkOdQdw2iwl9a3iEj+3B2C+oOobVpOocKhvZO63VGBd8Tqs9DW5sNrMfPXiOD93uAObWeEzJ4awKQq/cKSdwekI7fV+LIoJjxEzdhrLdlvQybte3IPfaeVQx1bcdis72rI8vrkeoak4rBZULYfDolBMQ3XaFBo9dkYjKbIFya42L06LUmp5ZlNMHOkJEs/kGZhJMhbJcGMywe42H5dGo2QLGs0eGzariUQ2j8uqcGx3C267hZ8+2EpP0IUUJqaiSX7pWBd7O/x86dwIfY1O6tx2LGUdAqo1oQQq7nk+sOFnRIBcXkVTVa5OxrAoCl9/boKdLR5SeY03HOhAairpnIrDasZsLgqpS6SEVDaPxQRWq4VkOo/DZiadyepLmt2Gqmr85F89w6jRxsKqmPjVJ7tJ5VRSOZXB2VRFbp/FSD5VTIL97T5MRjzZppi4OhHHhO7m+fE9LdgVwdue6GI6lUdI2NzgoclnI69J4uk89Z6NmQmzVjzUMyKA1aKARWFfZx2aJtnR6qv4AIXZTC6dZ2I2xRajQ3s6m8dpt+J26CdfKSUOmz6rOR02TEaqlZ4KJtnVqqf2D4Yy7Gn3ki/A588MU1A1euqdjEf1jGu3zczZoQialMwkc6XOTi6rwhO9QUbCaW7PJAk6FN714s00+Z3sEIJsXsVmnGoVBeyWh+Ktf2A8VO+GEAKlijIqwFM3ZvDaBV0BB1arGYeR3KppGqlsgWxeJZ3LU+e247RbkFIaIcQUv/vSXjKahsOm0Fvn5vxIHIfFRIPHTiSdIJnVHdUBp7XU8uJgZwCTgNfubsFnN7GlyU2T18k/Hh/EYRH8+os30xy4Gyu2PcSulQfBQ2GImiYX3CsVeeGWevwuW+m+4oypSV3uI5LK4XfasJhNCCFQVQ1N08gXNJx2Ez1eDyrQ5HGQU6N84BvXOdjpY3+nn/StWXa3+fA5FC6NCg60e3ndnibGI2les7OBnkYvNrOCySR47Z4W3vrCXloDrkVGW2MuD8UecbnMTQ8rfq8boX4KzWQLCCCezeOwWQjHklwZT7Kl2U1Xvd5NKpsrMJNIc3M6wdcvTdJd78bvUJiJ59jU6KTDZ8PjcmIWKh6bBa9bTy7QNEm+oGKzPhR/3w+ch36PuFyKM52imPRSTAlmsygZIYDdkJCzWEyYTCZCisILttThdNxNrVel5GuXp/nqxXG8djO/9dLNzMYzdO50YDVbsFrMmExi3kHDZBI1I7xHnlcz4r1QvuwXZ1BNk+RVDZtFMfaSEsXw1WXy6kMdSltPHpkZ8V4o33sWZziTSWAzKaVr5QekmhGuDQ+HS77G855VUYw17nmxEOK8oRj7g9Ufao3nM6uiGCuE8AMfBV4lpRwSQmwMZZ8aDw2rpRj788AXpZRDxj1TqzvMGs93lrM0lyvGnhNCfEIIMddb2wcEhBDfF0KcEUK8pdoLCSHeIYQ4LYQ4PT29sMxvjUeP5RiiGTgA/JWUcj+QZL5Qpxk4CLwWeCXwR0KIeRKkUsqPSykPSSkPNTQ03N/IazyvWI4hVlOMPVDlnq9LKZOGLuJTwN7VG2aN5zurpRj7ZeBJIYRZCOEEjgJXV3WkNZ7XrIpirJTyqhDi68BFQAM+IaV8bk1GXON5ybqF+IQQ00D1yqS1oR5YVzllg40yDnjwY+mSUlY9HKybIT5ohBCnF4pzPorjgI01llqIr8aGoGaINTYEj5Ihfny9B2CwUcYBG2gsj8wescbG5lGaEWtsYGqGWGNjoBeib8x/QAfwPfQozWX09rwAQfQOqDeN/wNlz/l94BZwHXhl2fWDwCXjsQ9zd1tiA/7FuH4C6C57zi8bP+Mm8MvGNQU4B3x1HcfyH9BDrdeM9+ax9XxPVuWzXm9jW8IQW4ADxtce4AawA3g/8F7j+nuB/2l8vQO4YLyRPcBtQDEeO2l8YAL4GvBq4/q7gI8ZX/8c8C9lBnbH+D9gfB1AbwX8j2WGuB5jiQO/ZTxmBfzr+Z487w2ximF+GXg5+l92S5mxXje+/n3g98vu/4bxRrcA18quvxn46/J7jK/N6JEGUX6P8dhfA78BfAd4aZkhPtCxAF4gBrx5znuzXu9JxTju9d9Ds0cUQnQD+9GXiiYp5TiA8X8xI7wNGC572ohxrc34eu71iudIKQtAFKhb4LXeCfweUN429EGPpRfdEH9nTn7oer0nbawCD4UhCiHcwBeAd0sp53fkLru1yjW5yPWVPKcPiEspzywx3LUeixl9NntGLpwf+iDGMfc598WGN0QhhAXdCD8jpfyicXlSCNFiPN4CFEsTRtAPOEXagTHjenuV6xXPEUKYAR8QqvJau4BtQogB4J+Blwoh/mEdxjICpIDjxvfF/ND1eE/Kn3N/rPe+b4k9oQA+DXxwzvUPULkxf7/x9U4qN+Z3uLsxPwUc4+7G/DXG9d+gcmP+WePrINCPvikPGF8HjcdezN094nqMJQMcMR77f4wxrOt7ct+f9Xob2xKG+AL0qf8icN749xr0/cp30F0I3yl/M4A/RD8ZXsc4BRrXDwHPGY99hLuuCjvwOXRXxUmgt+w5bzOu3wLeWna93BDXYyzvA04b78uXDKNY1/fkfv/VQnw1NgQbfo9Y49GgZog1NgQ1Q6yxIagZYo0NQc0Qa2wIaoZYY0NQM8QaG4L/H5YxRAgjgVP6AAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "geodata.plot()" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "code object\n", "name object\n", "geometry geometry\n", "dtype: object" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geodata.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- **Finnish municipalities with hospital district information** as an Excel spreadsheet \n", " - Downloaded from: https://www.kuntaliitto.fi/sosiaali-ja-terveysasiat/sairaanhoitopiirien-jasenkunnat in March 2020. \n", " - File `Shp_jäsenkunnat_2020.xls`, sheet `kunnat_shp_2020_ aakkosjärj.` This is the original unaltered file.\n", " - In this file, \"shp\" stands for \"sairaanhoitopiiri\" (hospital district in Finnish)\n", " \n", "*Note: this data set does not include Åland (Ahvenanmaa). Åland municipalities are added in the later step.*\n", "*Note: \"hospital districts\" is a more proper translation to sairaanhoitopiirit, but in this lesson I use \"health care districts\" to refer to these entities*\n", "\n", "Excel files often come with additional formatting such as metadata on the first lines of the data array. This is why it is a good idea to download the file on your own computer and have a look at the data structure before reading in the file using Python.\n", "It is also often a good idea to save the file as a csv file before reading in the data. However, it is also possible to read in data directly from Excel. For this, you need to have the xlrd module installed:\n", "\n", "```\n", "conda install -c conda-forge xlrd\n", "```\n", "\n", "Now we are ready to read in the data using pandas.\n", "\n", "In the case of this health districts excel the header is located on the 4th row (index 3) of the excel spreadsheet. " ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "# Read in the excel spreadsheet\n", "data = pd.read_excel(r\"data/Shp_jäsenkunnat_2020.xls\", sheet_name=\"kunnat_shp_2020_ aakkosjärj.\", header=3)" ] }, { "cell_type": "code", "execution_count": 9, "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", "
kunta-\\nkoodikuntashp:n koodisairaanhoitopiirierva-aluekuntien lkm
0NaNNaNNaNNaNNaNNaN
120.0Akaa6.0PirkanmaaTAYS1.0
25.0Alajärvi15.0Etelä-PohjanmaaTAYS2.0
39.0Alavieska18.0Pohjois-PohjanmaaOYS3.0
410.0Alavus15.0Etelä-PohjanmaaTAYS4.0
\n", "
" ], "text/plain": [ " kunta-\\nkoodi kunta shp:n koodi sairaanhoitopiiri erva-alue \\\n", "0 NaN NaN NaN NaN NaN \n", "1 20.0 Akaa 6.0 Pirkanmaa TAYS \n", "2 5.0 Alajärvi 15.0 Etelä-Pohjanmaa TAYS \n", "3 9.0 Alavieska 18.0 Pohjois-Pohjanmaa OYS \n", "4 10.0 Alavus 15.0 Etelä-Pohjanmaa TAYS \n", "\n", " kuntien lkm \n", "0 NaN \n", "1 1.0 \n", "2 2.0 \n", "3 3.0 \n", "4 4.0 " ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In addition, the first row after the header is empty. We can get rid of it using the dropna() -function:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "data.dropna(inplace=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check number of rows (16 Åland municipalities are missing)" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "294" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(data)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The data needs some fixing and cleaning after reading the excel sheet" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "# Rename columns from Finnish to English \n", "data.rename(columns={\"kunta-\\nkoodi\":\"code\", 'sairaanhoitopiiri':'healthCareDistrict'}, inplace=True)\n", "\n", "# Select only useful columns\n", "data = data[['code','healthCareDistrict']]" ] }, { "cell_type": "code", "execution_count": 13, "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", "
codehealthCareDistrict
120.0Pirkanmaa
25.0Etelä-Pohjanmaa
39.0Pohjois-Pohjanmaa
410.0Etelä-Pohjanmaa
516.0Päijät-Häme
.........
290977.0Pohjois-Pohjanmaa
291980.0Pirkanmaa
292981.0Kanta-Häme
293989.0Etelä-Pohjanmaa
294992.0Keski-Suomi
\n", "

294 rows × 2 columns

\n", "
" ], "text/plain": [ " code healthCareDistrict\n", "1 20.0 Pirkanmaa\n", "2 5.0 Etelä-Pohjanmaa\n", "3 9.0 Pohjois-Pohjanmaa\n", "4 10.0 Etelä-Pohjanmaa\n", "5 16.0 Päijät-Häme\n", ".. ... ...\n", "290 977.0 Pohjois-Pohjanmaa\n", "291 980.0 Pirkanmaa\n", "292 981.0 Kanta-Häme\n", "293 989.0 Etelä-Pohjanmaa\n", "294 992.0 Keski-Suomi\n", "\n", "[294 rows x 2 columns]" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks better! Now we need to prepare the data for table join. We will use the municipality code as the common key." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "code float64\n", "healthCareDistrict object\n", "dtype: object" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.dtypes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The code column is currently a floating point number. We need to modify these codes so that they match the ones in the spatial data:" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "20.0" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Example using one code\n", "number = data.at[1, \"code\"]\n", "number" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "020\n" ] } ], "source": [ "# Conver this number to character string 020\n", "print(\"20\".zfill(3))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's apply this process on all rows at once, and take into account different number of digits:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Convert to character string\n", "data[\"code\"] = data[\"code\"].astype(int).astype('str')\n", "\n", "# Add missing zeros to municipality codes\n", "data[\"code\"] = data[\"code\"].str.zfill(3)" ] }, { "cell_type": "code", "execution_count": 18, "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", "
codehealthCareDistrict
1020Pirkanmaa
2005Etelä-Pohjanmaa
3009Pohjois-Pohjanmaa
4010Etelä-Pohjanmaa
5016Päijät-Häme
\n", "
" ], "text/plain": [ " code healthCareDistrict\n", "1 020 Pirkanmaa\n", "2 005 Etelä-Pohjanmaa\n", "3 009 Pohjois-Pohjanmaa\n", "4 010 Etelä-Pohjanmaa\n", "5 016 Päijät-Häme" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "data.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Join Health district info to the municipality polygons" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [], "source": [ "# Merge health district info to geodata using \"code\" as the common key\n", "geodata = geodata.merge(data, on=\"code\", how=\"left\")" ] }, { "cell_type": "code", "execution_count": 20, "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", "
codenamegeometryhealthCareDistrict
0005AlajärviPOLYGON ((366787.924 7001300.583, 364150.540 7...Etelä-Pohjanmaa
1009AlavieskaPOLYGON ((382543.364 7120022.976, 380556.177 7...Pohjois-Pohjanmaa
2010AlavusPOLYGON ((343298.204 6961570.195, 340572.015 6...Etelä-Pohjanmaa
3016AsikkalaPOLYGON ((436139.680 6798279.085, 432732.949 6...Päijät-Häme
4018AskolaPOLYGON ((426631.036 6720528.076, 425751.505 6...HUS
...............
304977YlivieskaPOLYGON ((398010.991 7110887.267, 392464.690 7...Pohjois-Pohjanmaa
305980YlöjärviPOLYGON ((313738.511 6896936.100, 311165.511 6...Pirkanmaa
306981YpäjäPOLYGON ((297451.456 6756204.328, 291432.640 6...Kanta-Häme
307989ÄhtäriPOLYGON ((348733.187 6959704.551, 347302.684 6...Etelä-Pohjanmaa
308992ÄänekoskiPOLYGON ((452626.858 6973610.366, 451491.412 6...Keski-Suomi
\n", "

309 rows × 4 columns

\n", "
" ], "text/plain": [ " code name geometry \\\n", "0 005 Alajärvi POLYGON ((366787.924 7001300.583, 364150.540 7... \n", "1 009 Alavieska POLYGON ((382543.364 7120022.976, 380556.177 7... \n", "2 010 Alavus POLYGON ((343298.204 6961570.195, 340572.015 6... \n", "3 016 Asikkala POLYGON ((436139.680 6798279.085, 432732.949 6... \n", "4 018 Askola POLYGON ((426631.036 6720528.076, 425751.505 6... \n", ".. ... ... ... \n", "304 977 Ylivieska POLYGON ((398010.991 7110887.267, 392464.690 7... \n", "305 980 Ylöjärvi POLYGON ((313738.511 6896936.100, 311165.511 6... \n", "306 981 Ypäjä POLYGON ((297451.456 6756204.328, 291432.640 6... \n", "307 989 Ähtäri POLYGON ((348733.187 6959704.551, 347302.684 6... \n", "308 992 Äänekoski POLYGON ((452626.858 6973610.366, 451491.412 6... \n", "\n", " healthCareDistrict \n", "0 Etelä-Pohjanmaa \n", "1 Pohjois-Pohjanmaa \n", "2 Etelä-Pohjanmaa \n", "3 Päijät-Häme \n", "4 HUS \n", ".. ... \n", "304 Pohjois-Pohjanmaa \n", "305 Pirkanmaa \n", "306 Kanta-Häme \n", "307 Etelä-Pohjanmaa \n", "308 Keski-Suomi \n", "\n", "[309 rows x 4 columns]" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geodata" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Looks good! However, Municipalities in the Åland island did not have a matching health care district in the data. Let's have a closer look: " ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "7 Brändö\n", "8 Eckerö\n", "15 Finström\n", "17 Föglö\n", "18 Geta\n", "24 Hammarland\n", "57 Jomala\n", "111 Kumlinge\n", "121 Kökar\n", "134 Lemland\n", "147 Lumparland\n", "153 Mariehamn\n", "236 Saltvik\n", "254 Sottunga\n", "256 Sund\n", "301 Vårdö\n", "Name: name, dtype: object" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# List all municipalities that lack health district info:\n", "geodata[geodata[\"healthCareDistrict\"].isnull()].name" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [], "source": [ "# Update \"Ahvenanmaa\" as the health care district for Åland municipalities (16 municipalities in total)\n", "geodata.loc[geodata[\"healthCareDistrict\"].isnull(), \"healthCareDistrict\"] = \"Ahvenanmaa\"" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Check the count of municipalities per health care disctrict" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Pohjois-Pohjanmaa 29\n", "Varsinais-Suomi 28\n", "HUS 24\n", "Pirkanmaa 23\n", "Keski-Suomi 21\n", "Pohjois-Savo 18\n", "Etelä-Pohjanmaa 18\n", "Ahvenanmaa 16\n", "Satakunta 16\n", "Lappi 15\n", "Vaasa 13\n", "Pohjois-Karjala 13\n", "Päijät-Häme 12\n", "Kanta-Häme 11\n", "Keski-Pohjanmaa 10\n", "Etelä-Karjala 9\n", "Etelä-Savo 9\n", "Kainuu 8\n", "Kymenlaakso 6\n", "Länsi-Pohja 6\n", "Itä-Savo 4\n", "Name: healthCareDistrict, dtype: int64" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geodata[\"healthCareDistrict\"].value_counts()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Create polygons for health care districts " ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "# Dissolve (=combine) municipality polygon geometries for each health care district\n", "districts = geodata.dissolve(by='healthCareDistrict')" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [], "source": [ "districts.reset_index(inplace=True)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "# Select useful columns\n", "districts = districts[[\"healthCareDistrict\", \"geometry\"]]" ] }, { "cell_type": "code", "execution_count": 27, "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", " \n", " \n", "
healthCareDistrictgeometry
0AhvenanmaaMULTIPOLYGON (((173277.623 6640282.925, 173136...
1Etelä-KarjalaPOLYGON ((538858.650 6740202.117, 536909.932 6...
2Etelä-PohjanmaaPOLYGON ((249539.259 6894974.367, 244232.829 6...
3Etelä-SavoPOLYGON ((520334.347 6786709.482, 520632.817 6...
4HUSMULTIPOLYGON (((272609.681 6632304.439, 272418...
5Itä-SavoPOLYGON ((603980.674 6824572.057, 600339.558 6...
6KainuuPOLYGON ((643098.600 7165870.100, 643537.000 7...
7Kanta-HämePOLYGON ((369728.766 6728123.905, 366878.133 6...
8Keski-PohjanmaaMULTIPOLYGON (((302835.219 7083897.220, 302801...
9Keski-SuomiPOLYGON ((439110.805 6852598.036, 439300.113 6...
10KymenlaaksoMULTIPOLYGON (((501532.450 6680088.052, 501352...
11LappiPOLYGON ((518535.957 7313104.574, 515335.969 7...
12Länsi-PohjaMULTIPOLYGON (((399348.710 7271646.236, 399096...
13PirkanmaaPOLYGON ((324952.559 6773513.092, 327451.427 6...
14Pohjois-KarjalaPOLYGON ((681990.187 6886181.668, 680094.200 6...
15Pohjois-PohjanmaaMULTIPOLYGON (((462785.501 7079521.042, 461527...
16Pohjois-SavoPOLYGON ((568071.215 6914370.703, 570686.991 6...
17Päijät-HämePOLYGON ((441787.770 6730507.194, 442140.745 6...
18SatakuntaMULTIPOLYGON (((198569.146 6782909.960, 198622...
19VaasaMULTIPOLYGON (((201701.793 6884336.726, 201726...
20Varsinais-SuomiMULTIPOLYGON (((258767.605 6632338.388, 258668...
\n", "
" ], "text/plain": [ " healthCareDistrict geometry\n", "0 Ahvenanmaa MULTIPOLYGON (((173277.623 6640282.925, 173136...\n", "1 Etelä-Karjala POLYGON ((538858.650 6740202.117, 536909.932 6...\n", "2 Etelä-Pohjanmaa POLYGON ((249539.259 6894974.367, 244232.829 6...\n", "3 Etelä-Savo POLYGON ((520334.347 6786709.482, 520632.817 6...\n", "4 HUS MULTIPOLYGON (((272609.681 6632304.439, 272418...\n", "5 Itä-Savo POLYGON ((603980.674 6824572.057, 600339.558 6...\n", "6 Kainuu POLYGON ((643098.600 7165870.100, 643537.000 7...\n", "7 Kanta-Häme POLYGON ((369728.766 6728123.905, 366878.133 6...\n", "8 Keski-Pohjanmaa MULTIPOLYGON (((302835.219 7083897.220, 302801...\n", "9 Keski-Suomi POLYGON ((439110.805 6852598.036, 439300.113 6...\n", "10 Kymenlaakso MULTIPOLYGON (((501532.450 6680088.052, 501352...\n", "11 Lappi POLYGON ((518535.957 7313104.574, 515335.969 7...\n", "12 Länsi-Pohja MULTIPOLYGON (((399348.710 7271646.236, 399096...\n", "13 Pirkanmaa POLYGON ((324952.559 6773513.092, 327451.427 6...\n", "14 Pohjois-Karjala POLYGON ((681990.187 6886181.668, 680094.200 6...\n", "15 Pohjois-Pohjanmaa MULTIPOLYGON (((462785.501 7079521.042, 461527...\n", "16 Pohjois-Savo POLYGON ((568071.215 6914370.703, 570686.991 6...\n", "17 Päijät-Häme POLYGON ((441787.770 6730507.194, 442140.745 6...\n", "18 Satakunta MULTIPOLYGON (((198569.146 6782909.960, 198622...\n", "19 Vaasa MULTIPOLYGON (((201701.793 6884336.726, 201726...\n", "20 Varsinais-Suomi MULTIPOLYGON (((258767.605 6632338.388, 258668..." ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "districts" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(40857.339215, 765862.479085, 6575077.820610001, 7833703.7515899995)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "districts.plot(column='healthCareDistrict', cmap='tab20', k=20)\n", "plt.axis('off')" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [], "source": [ "# Write GeoJSON in original projection\n", "districts.to_file(\"healthDistrictsEPSG3067.geojson\", driver='GeoJSON', encoding='utf-8')" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "# Re-project to WGS84 and save again\n", "wgs84 = CRS.from_epsg(4326)\n", "districts.to_crs(wgs84).to_file(\"healthDistrictsEPSG4326.geojson\", driver='GeoJSON', encoding='utf-8')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "That's it! You can elaborate this workflow by joining additional data. For example, if you join population info per municipality you can sum it up for each health care district using the `aggfunc=sum` argument to get population count per health care district." ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.6" } }, "nbformat": 4, "nbformat_minor": 4 }