{ "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.10052020AlajärviAlajärviAlajärviPOLYGON ((366787.924 7001300.583, 364487.590 6...
1kunta1000k.20092020AlavieskaAlavieskaAlavieskaPOLYGON ((382543.364 7120022.976, 382899.505 7...
2kunta1000k.30102020AlavusAlavusAlavusPOLYGON ((343298.204 6961570.195, 343831.847 6...
3kunta1000k.40162020AsikkalaAsikkalaAsikkalaPOLYGON ((436139.680 6798279.085, 435714.468 6...
4kunta1000k.50182020AskolaAskolaAskolaPOLYGON ((426631.036 6720528.076, 428821.749 6...
\n", "
" ], "text/plain": [ " id kunta vuosi nimi namn name \\\n", "0 kunta1000k.1 005 2020 Alajärvi Alajärvi Alajärvi \n", "1 kunta1000k.2 009 2020 Alavieska Alavieska Alavieska \n", "2 kunta1000k.3 010 2020 Alavus Alavus Alavus \n", "3 kunta1000k.4 016 2020 Asikkala Asikkala Asikkala \n", "4 kunta1000k.5 018 2020 Askola Askola Askola \n", "\n", " geometry \n", "0 POLYGON ((366787.924 7001300.583, 364487.590 6... \n", "1 POLYGON ((382543.364 7120022.976, 382899.505 7... \n", "2 POLYGON ((343298.204 6961570.195, 343831.847 6... \n", "3 POLYGON ((436139.680 6798279.085, 435714.468 6... \n", "4 POLYGON ((426631.036 6720528.076, 428821.749 6... " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "geodata.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "310" ] }, "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, 364487.590 6...
1009AlavieskaPOLYGON ((382543.364 7120022.976, 382899.505 7...
2010AlavusPOLYGON ((343298.204 6961570.195, 343831.847 6...
3016AsikkalaPOLYGON ((436139.680 6798279.085, 435714.468 6...
4018AskolaPOLYGON ((426631.036 6720528.076, 428821.749 6...
\n", "
" ], "text/plain": [ " code name geometry\n", "0 005 Alajärvi POLYGON ((366787.924 7001300.583, 364487.590 6...\n", "1 009 Alavieska POLYGON ((382543.364 7120022.976, 382899.505 7...\n", "2 010 Alavus POLYGON ((343298.204 6961570.195, 343831.847 6...\n", "3 016 Asikkala POLYGON ((436139.680 6798279.085, 435714.468 6...\n", "4 018 Askola POLYGON ((426631.036 6720528.076, 428821.749 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": "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\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": [ { "data": { "text/plain": [ "'020'" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Conver this number to character string 020\n", "\"0\" + str(int(number))" ] }, { "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": [ "# Truncate and 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\"].apply(lambda x: \"00\" + x if len(x)==1 else x)\n", "data[\"code\"] = data[\"code\"].apply(lambda x: \"0\" + x if len(x)==2 else x)" ] }, { "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, 364487.590 6...Etelä-Pohjanmaa
1009AlavieskaPOLYGON ((382543.364 7120022.976, 382899.505 7...Pohjois-Pohjanmaa
2010AlavusPOLYGON ((343298.204 6961570.195, 343831.847 6...Etelä-Pohjanmaa
3016AsikkalaPOLYGON ((436139.680 6798279.085, 435714.468 6...Päijät-Häme
4018AskolaPOLYGON ((426631.036 6720528.076, 428821.749 6...HUS
...............
305977YlivieskaPOLYGON ((398010.991 7110887.267, 399696.069 7...Pohjois-Pohjanmaa
306980YlöjärviPOLYGON ((313738.511 6896936.100, 319421.316 6...Pirkanmaa
307981YpäjäPOLYGON ((297451.456 6756204.328, 297931.884 6...Kanta-Häme
308989ÄhtäriPOLYGON ((348733.187 6959704.551, 349457.337 6...Etelä-Pohjanmaa
309992ÄänekoskiPOLYGON ((452626.858 6973610.366, 457542.012 6...Keski-Suomi
\n", "

310 rows × 4 columns

\n", "
" ], "text/plain": [ " code name geometry \\\n", "0 005 Alajärvi POLYGON ((366787.924 7001300.583, 364487.590 6... \n", "1 009 Alavieska POLYGON ((382543.364 7120022.976, 382899.505 7... \n", "2 010 Alavus POLYGON ((343298.204 6961570.195, 343831.847 6... \n", "3 016 Asikkala POLYGON ((436139.680 6798279.085, 435714.468 6... \n", "4 018 Askola POLYGON ((426631.036 6720528.076, 428821.749 6... \n", ".. ... ... ... \n", "305 977 Ylivieska POLYGON ((398010.991 7110887.267, 399696.069 7... \n", "306 980 Ylöjärvi POLYGON ((313738.511 6896936.100, 319421.316 6... \n", "307 981 Ypäjä POLYGON ((297451.456 6756204.328, 297931.884 6... \n", "308 989 Ähtäri POLYGON ((348733.187 6959704.551, 349457.337 6... \n", "309 992 Äänekoski POLYGON ((452626.858 6973610.366, 457542.012 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", "305 Pohjois-Pohjanmaa \n", "306 Pirkanmaa \n", "307 Kanta-Häme \n", "308 Etelä-Pohjanmaa \n", "309 Keski-Suomi \n", "\n", "[310 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", "58 Jomala\n", "112 Kumlinge\n", "122 Kökar\n", "135 Lemland\n", "148 Lumparland\n", "154 Mariehamn\n", "237 Saltvik\n", "255 Sottunga\n", "257 Sund\n", "302 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", "Etelä-Pohjanmaa 18\n", "Pohjois-Savo 18\n", "Satakunta 17\n", "Ahvenanmaa 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", "Länsi-Pohja 6\n", "Kymenlaakso 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 ((595843.841 6772915.996, 592557.900 6...
2Etelä-PohjanmaaPOLYGON ((249539.259 6894974.367, 244232.829 6...
3Etelä-SavoPOLYGON ((596327.952 6823806.064, 596718.363 6...
4HUSMULTIPOLYGON (((272609.681 6632304.439, 272418...
5Itä-SavoPOLYGON ((572240.425 6898837.522, 576521.513 6...
6KainuuPOLYGON ((606127.874 7081796.115, 603849.594 7...
7Kanta-HämePOLYGON ((393094.362 6756355.691, 394102.316 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 (((200371.753 6892181.697, 200360...
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 ((595843.841 6772915.996, 592557.900 6...\n", "2 Etelä-Pohjanmaa POLYGON ((249539.259 6894974.367, 244232.829 6...\n", "3 Etelä-Savo POLYGON ((596327.952 6823806.064, 596718.363 6...\n", "4 HUS MULTIPOLYGON (((272609.681 6632304.439, 272418...\n", "5 Itä-Savo POLYGON ((572240.425 6898837.522, 576521.513 6...\n", "6 Kainuu POLYGON ((606127.874 7081796.115, 603849.594 7...\n", "7 Kanta-Häme POLYGON ((393094.362 6756355.691, 394102.316 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 (((200371.753 6892181.697, 200360...\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', scheme=\"equal_interval\",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 }