\n",
"\n",
"\n",
"See https://shapely.readthedocs.io/en/stable/manual.html#spatial-analysis-methods for more details."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"For example, using the toy data from above, let's construct a buffer around Brussels (which returns a Polygon):"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"geopandas.GeoSeries([belgium, brussels.buffer(1)]).plot(alpha=0.5, cmap='tab10')"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"and now take the intersection, union or difference of those two polygons:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"brussels.buffer(1).intersection(belgium)"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 6,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"brussels.buffer(1).union(belgium)"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"brussels.buffer(1).difference(belgium)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"### Spatial operations with GeoPandas"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"Above we showed how to create a new geometry based on two individual shapely geometries. The same operations can be extended to GeoPandas. Given a GeoDataFrame, we can calculate the intersection, union or difference of each of the geometries with another geometry.\n",
"\n",
"Let's look at an example with a subset of the countries. We have a GeoDataFrame with the country polygons of Africa, and now consider a rectangular polygon, representing an area around the equator:\n"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"africa = countries[countries.continent == 'Africa']"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"from shapely.geometry import LineString\n",
"box = LineString([(-10, 0), (50, 0)]).buffer(10, cap_style=3)"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig, ax = plt.subplots(figsize=(6, 6))\n",
"africa.plot(ax=ax, facecolor='none', edgecolor='k')\n",
"geopandas.GeoSeries([box]).plot(ax=ax, facecolor='C0', edgecolor='k', alpha=0.5)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"The intersection method of the GeoDataFrame will now calculate the intersection with the rectangle for each of the geometries of the africa GeoDataFrame element-wise. Note that for many of the countries, those that do not overlap with the rectangle, this will be an empty geometry:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"1 MULTIPOLYGON (((13.22332 -10.00000, 13.12099 -...\n",
"11 POLYGON ((29.34000 -4.49998, 29.27638 -3.29391...\n",
"13 POLYGON ((2.69170 6.25882, 1.86524 6.14216, 1....\n",
"14 POLYGON ((-2.89227 10.00000, -2.82750 9.64246,...\n",
"25 POLYGON EMPTY\n",
"dtype: geometry"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"africa_intersection = africa.intersection(box)\n",
"africa_intersection.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"What is returned is a new GeoSeries of the same length as the original dataframe, containing one row per country, but now containing only the intersection. In this example, the last element shown is an empty polygon, as that country was not overlapping with the box."
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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\n",
"text/plain": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# remove the empty polygons before plotting\n",
"africa_intersection = africa_intersection[~africa_intersection.is_empty]\n",
"# plot the intersection\n",
"africa_intersection.plot()"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"# Unary union and dissolve\n",
"\n",
"Another useful method is the `unary_union` attribute, which converts the set of geometry objects in a GeoDataFrame into a single geometry object by taking the union of all those geometries.\n",
"\n",
"For example, we can construct a single Shapely geometry object for the Africa continent:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"africa_countries = countries[countries['continent'] == 'Africa']"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"africa = africa_countries.unary_union"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"image/svg+xml": [
""
],
"text/plain": [
""
]
},
"execution_count": 15,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"africa"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"MULTIPOLYGON (((32.83012047702888 -26.7421916643362, 32.58026492689768 -27.47015756603182, 32.46213260267845 -28.30101124442056, 32.20338870619304 -28.75240488049007, 31.52100141777888 -29.25738697684626, 31.325561150851 -29.40197763439891, 30.90176272962535 -29.90995696382804, 30.62281334811382 -30.42377573010613, 30.05571618014278 -31.14026946383296, 28.92555260591954 -32.1720411109725, 28.2197558936771 -32.77195281344886, 27.46460818859597 -33.2269637997788, 26.41945234549283 -33.61495045342619, 25.90966434093349 -33.6670402971764, 25.7806282895007 -33.94464609144834, 25.17286176931597 -33.79685149509358, 24.67785322439212 -33.98717579522455, 23.59404340993464 -33.79447437920815, 22.98818891774474 -33.91643075941698, 22.57415734222224 -33.86408253350531, 21.54279910654103 -34.25883879978294, 20.689052768647 -34.41717538832523, 20.07126102059763 -34.79513681410799, 19.61640506356457 -34.81916635512371, 19.19327843595872 -34.46259897230979, 18.85531456876987 -34.44430551527847, 18.424\n"
]
}
],
"source": [
"print(str(africa)[:1000])"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"Alternatively, you might want to take the unary union of a set of geometries but *grouped* by one of the attributes of the GeoDataFrame (so basically doing \"groupby\" + \"unary_union\"). For this operation, GeoPandas provides the `dissolve()` method:"
]
},
{
"cell_type": "code",
"execution_count": 17,
"metadata": {
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"continents = countries.dissolve(by=\"continent\") # , aggfunc=\"sum\""
]
},
{
"cell_type": "code",
"execution_count": 18,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"**REMEMBER**:\n",
"\n",
"GeoPandas (and Shapely for the individual objects) provide a whole lot of basic methods to analyze the geospatial data (distance, length, centroid, boundary, convex_hull, simplify, transform, ....), much more than what we can touch in this tutorial.\n",
"\n",
"* An overview of all methods provided by GeoPandas can be found here: https://geopandas.readthedocs.io/en/latest/docs/reference.html\n",
"\n",
"\n",
"
\n",
"\n",
"**EXERCISE: What are the districts close to the Seine?**\n",
"\n",
"Below, the coordinates for the Seine river in the neighborhood of Paris are provided as a GeoJSON-like feature dictionary (created at http://geojson.io). \n",
"\n",
"Based on this `seine` object, we want to know which districts are located close (maximum 150 m) to the Seine. \n",
"\n",
"* Create a buffer of 150 m around the Seine.\n",
"* Check which districts intersect with this buffered object.\n",
"* Make a visualization of the districts indicating which districts are located close to the Seine.\n",
" \n",
"
\n",
"\n",
"**EXERCISE: Exploring a Land Use dataset**\n",
"\n",
"For the following exercises, we first introduce a new dataset: a dataset about the land use of Paris (a simplified version based on the open European [Urban Atlas](https://land.copernicus.eu/local/urban-atlas)). The land use indicates for what kind of activity a certain area is used, such as residential area or for recreation. It is a polygon dataset, with a label representing the land use class for different areas in Paris.\n",
"\n",
"In this exercise, we will read the data, explore it visually, and calculate the total area of the different classes of land use in the area of Paris.\n",
"\n",
"* Read in the `'paris_land_use.shp'` file and assign the result to a variable `land_use`.\n",
"* Make a plot of `land_use`, using the `'class'` column to color the polygons. Add a legend with `legend=True`, and make the figure size a bit larger.\n",
"* Add a new column `'area'` to the dataframe with the area of each polygon.\n",
"* Calculate the total area in km² for each `'class'` using the `groupby()` method, and print the result.\n",
"\n",
"Hints\n",
"\n",
"* Reading a file can be done with the `geopandas.read_file()` function.\n",
"* To use a column to color the geometries, use the `column` keyword to indicate the column name.\n",
"* The area of each geometry can be accessed with the `area` attribute of the `geometry` of the GeoDataFrame.\n",
"* The `groupby()` method takes the column name on which you want to group as the first argument.\n",
"\n",
"\n",
"\n",
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Make a plot of the land use with 'class' as the color\n",
"land_use.plot(column='class', legend=True, figsize=(15, 10))"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {
"clear_cell": true,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"# Add the area as a new column\n",
"land_use['area'] = land_use.geometry.area"
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {
"clear_cell": true,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"class\n",
"Continuous Urban Fabric 45.943090\n",
"Discontinuous Dense Urban Fabric 3.657343\n",
"Green urban areas 9.858438\n",
"Industrial, commercial, public 13.295042\n",
"Railways and associated land 1.935793\n",
"Roads and associated land 7.401574\n",
"Sports and leisure facilities 3.578509\n",
"Water bodies 3.189706\n",
"Name: area, dtype: float64"
]
},
"execution_count": 39,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Calculate the total area for each land use class\n",
"total_area = land_use.groupby('class')['area'].sum() / 1000**2\n",
"total_area"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"
\n",
"\n",
"**EXERCISE: Intersection of two polygons**\n",
"\n",
"For this exercise, we are going to use 2 individual polygons: the district of Muette extracted from the `districts` dataset, and the green urban area of Boulogne, a large public park in the west of Paris, extracted from the `land_use` dataset. The two polygons have already been assigned to the `muette` and `park_boulogne` variables.\n",
"\n",
"We first visualize the two polygons. You will see that they overlap, but the park is not fully located in the district of Muette. Let's determine the overlapping part:\n",
"\n",
"* Plot the two polygons in a single map to examine visually the degree of overlap\n",
"* Calculate the intersection of the `park_boulogne` and `muette` polygons.\n",
"* Plot the intersection.\n",
"* Print the proportion of the area of the district that is occupied by the park.\n",
"\n",
"Hints\n",
"\n",
"* To plot single Shapely objects, you can put those in a `GeoSeries([..])` to use the GeoPandas `plot()` method.\n",
"* The intersection of to scalar polygons can be calculated with the `intersection()` method of one of the polygons, and passing the other polygon as the argument to that method.\n",
"\n",
"\n",
"\n",
"
\n",
"\n",
"**EXERCISE: Intersecting a GeoDataFrame with a Polygon**\n",
"\n",
"Combining the land use dataset and the districts dataset, we can now investigate what the land use is in a certain district.\n",
"\n",
"For that, we first need to determine the intersection of the land use dataset with a given district. Let's take again the *Muette* district as example case.\n",
"\n",
"* Calculate the intersection of the `land_use` polygons with the single `muette` polygon. Call the result `land_use_muette`.\n",
"* Remove the empty geometries from `land_use_muette`.\n",
"* Make a quick plot of this intersection, and pass `edgecolor='black'` to more clearly see the boundaries of the different polygons.\n",
"* Print the first five rows of `land_use_muette`.\n",
"\n",
"Hints\n",
"\n",
"* The intersection of each geometry of a GeoSeries with another single geometry can be performed with the `intersection()` method of a GeoSeries.\n",
"* The `intersection()` method takes as argument the geometry for which to calculate the intersection.\n",
"* We can check which geometries are empty with the `is_empty` attribute of a GeoSeries.\n",
" \n",
"\n",
"\n",
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Plot the intersection\n",
"land_use_muette.plot(edgecolor='black')"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"You can see in the plot that we now only have a subset of the full land use dataset. The original `land_use_muette` (before removing the empty geometries) still has the same number of rows as the original `land_use`, though. But many of the rows, as you could see by printing the first rows, consist now of empty polygons when it did not intersect with the Muette district.\n",
"\n",
"The `intersection()` method also returned only geometries. If we want to combine those intersections with the attributes of the original land use, we can take a copy of this and replace the geometries with the intersections (you can uncomment and run to see the code):"
]
},
{
"cell_type": "code",
"execution_count": 52,
"metadata": {
"clear_cell": true,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/html": [
"
\n",
"\n",
"**EXERCISE: The land use of the Muette district**\n",
"\n",
"Based on the `land_use_muette` dataframe with the land use for the Muette districts as calculated above, we can now determine the total area of the different land use classes in the Muette district.\n",
"\n",
"* Calculate the total area per land use class.\n",
"* Calculate the fraction (in percentage) for the different land use classes.\n",
"\n",
"Hints\n",
"\n",
"* The intersection of each geometry of a GeoSeries with another single geometry can be performed with the `intersection()` method of a GeoSeries.\n",
"* The `intersection()` method takes as argument the geometry for which to calculate the intersection.\n",
"* We can check which geometries are empty with the `is_empty` attribute of a GeoSeries.\n",
" \n",
"\n",
"\n",
"
"
]
},
{
"cell_type": "code",
"execution_count": 55,
"metadata": {
"clear_cell": true,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"class\n",
"Continuous Urban Fabric 1.275297e+06\n",
"Discontinuous Dense Urban Fabric 8.828861e+04\n",
"Green urban areas 2.624229e+06\n",
"Industrial, commercial, public 3.629901e+05\n",
"Railways and associated land 5.424307e+03\n",
"Roads and associated land 2.262708e+05\n",
"Sports and leisure facilities 6.039885e+05\n",
"Water bodies 2.921943e+05\n",
"Name: area, dtype: float64"
]
},
"execution_count": 55,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"land_use_muette['area'] = land_use_muette.geometry.area\n",
"# Total land use per class\n",
"land_use_muette.groupby(\"class\")[\"area\"].sum()"
]
},
{
"cell_type": "code",
"execution_count": 56,
"metadata": {
"clear_cell": true,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
"class\n",
"Continuous Urban Fabric 23.277436\n",
"Discontinuous Dense Urban Fabric 1.611493\n",
"Green urban areas 47.898906\n",
"Industrial, commercial, public 6.625501\n",
"Railways and associated land 0.099008\n",
"Roads and associated land 4.130023\n",
"Sports and leisure facilities 11.024339\n",
"Water bodies 5.333295\n",
"Name: area, dtype: float64"
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Relative percentage of land use classes\n",
"land_use_muette.groupby(\"class\")[\"area\"].sum() / land_use_muette.geometry.area.sum() * 100"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"The above was only for a single district. If we want to do this more easily for all districts, we can do this with the overlay operation."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"## The overlay operation\n",
"\n",
"In a spatial join operation, we are not changing the geometries itself. We are not joining geometries, but joining attributes based on a spatial relationship between the geometries. This also means that the geometries need to at least overlap partially.\n",
"\n",
"If you want to create new geometries based on joining (combining) geometries of different dataframes into one new dataframe (eg by taking the intersection of the geometries), you want an **overlay** operation."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"### How does it differ compared to the intersection method?"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"With the `intersection()` method introduced in the previous section, we could for example determine the intersection of a set of countries with another polygon, a circle in the example below:\n",
"\n",
""
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"However, this method (`countries.intersection(circle)`) also has some limitations.\n",
"\n",
"* Mostly useful when intersecting a GeoSeries with a single polygon.\n",
"* Does not preserve attribute information of the intersecting polygons.\n",
"\n",
"For cases where we require a bit more complexity, it is preferable to use the \"overlay\" operation, instead of the intersection method."
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"Consider the following simplified example. On the left we see again the 3 countries. On the right we have the plot of a GeoDataFrame with some simplified geologic regions for the same area:\n",
"\n",
"
\n",
"
\n",
"
\n",
"
\n",
"\n",
"By simply plotting them on top of each other, as shown below, you can see that the polygons of both layers intersect. \n",
"\n",
"But now, by \"overlaying\" the two layers, we can create a third layer that contains the result of intersecting both layers: all the intersections of each country with each geologic region. It keeps only those areas that were included in both layers.\n",
"\n",
"
"
],
"text/plain": [
" iso_a3 name_1 continent pop_est gdp_md_est name_2 \\\n",
"0 AGO Angola Africa 29310273.0 189000.0 Brazzaville \n",
"1 COD Dem. Rep. Congo Africa 83301151.0 66010.0 Brazzaville \n",
"2 COG Congo Africa 4954674.0 30270.0 Brazzaville \n",
"3 AGO Angola Africa 29310273.0 189000.0 Luanda \n",
"4 AGO Angola Africa 29310273.0 189000.0 Kinshasa \n",
"\n",
" geometry \n",
"0 POLYGON ((14.10056 -5.86749, 16.32653 -5.87747... \n",
"1 POLYGON ((16.34948 -5.94680, 16.32653 -5.87747... \n",
"2 POLYGON ((16.09773 -2.43295, 15.97280 -2.71239... \n",
"3 POLYGON ((13.69097 -10.78080, 13.68638 -10.731... \n",
"4 POLYGON ((14.03697 -5.86721, 16.32653 -5.87747... "
]
},
"execution_count": 61,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"intersection.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"With the overlay method, we pass the full GeoDataFrame with all regions to intersect the countries with. The result contains all non-empty intersections of all combinations of countries and city regions.\n",
"\n",
"Note that the result of the overlay function also keeps the attribute information of both the countries as the city regions. That can be very useful for further analysis."
]
},
{
"cell_type": "code",
"execution_count": 62,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"data": {
"text/plain": [
""
]
},
"execution_count": 62,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAPQAAAD6CAYAAACWJWqOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuMiwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8vihELAAAACXBIWXMAAAsTAAALEwEAmpwYAAA5DElEQVR4nO2dd3hcxbmH39mq3qstyZJtuXfL3cbGFBswNQRI6Jg4BQgEbgIkFxJIgcQJgVwIgVBCcwwJvdrGYFxwkwvG3ZJVbfVeV1vm/rGSrLIrraxdaXc17/P4kfacs+fMsfa3M+ebb76fkFKiUCj8A81gN0ChULgPJWiFwo9QglYo/AglaIXCj1CCVij8CCVohcKPcJughRBaIcQ+IcRHra+jhBAbhBAnWn9GuutaCoXCMcJd89BCiHuBDCBMSrlCCPEnoFJK+bgQ4gEgUkp5f0/niImJkampqW5pj0Lhr+zZs6dcShnraJ/OHRcQQiQBlwC/B+5t3Xw5sKT191eATUCPgk5NTSUzM9MdTVIo/BYhRJ6zfe4acj8J/AKwddgWL6UsAmj9GeemaykUCif0W9BCiBVAqZRyz1m+f5UQIlMIkVlWVtbf5igUQxp39NALgMuEELnAWmCpEOJ1oEQIkQjQ+rPU0ZullM9LKTOklBmxsQ4fCxQKhYv0W9BSygellElSylTgOuALKeUNwAfAza2H3Qy8399rKRSKnvHkPPTjwAVCiBPABa2vFQqFB3FLlLsNKeUm7NFspJQVwHnuPL9CoegZlSmmUPgRStAKhR/h1iG3YvCx2iRbTpTx3r5TAJw7Lo7Lpw1HSokQYpBbp/A0StBehNlqo6zORGmdiQaThXqThQaThYYWK9OTI5g0PLzH9z/7ZRYvf51LaZ2pfVt1k5maJjPv7jvF6yvnEGxUf3J/Rv11B5HCqkae2HCcEyX1FNc2U15vwllq/Q8Xj+xV0PsLqzuJGWDTsTL25Fbx71VzlZiHAOovPIhoNYJ39p5y6djpyRG9HpMaHexw++j4kF6/DBT+gQqK9ZF9+VU0mCxuOVdieCAXT07o9biUqCCWjovv9bgb540gQN/9T3r4dC3v73fti0Ph2yhB94GmFis/eHUPV/59GxX1pt7f4AKPXDaJEdFBTvcHGbQ8dd00DLre/1RJkUGsvnoqWk3n4JfJYmN7dkW/26rwfpSg+8BD7x+kvN7E8ZJ6fv7fA245Z2yokbd/PJ/Lpg6jiw6ZnRrF2z+ez/QU12tDXDp1GG+umsuMlIhO20fHhbihtQpvx20FDtxBRkaG9Nb10BuPlLDylc5t++Sni5gwLMxt1yivN3HodC1mi40x8aGk9NBzu0JpXTNF1c2EB+oZER2kpq38BCHEHillhqN9KijmAhaLjbvX7uu2/evscrcKOibEyOIx7ltxFhcaQFxogNvOp/B+1JC7FzYeKWH2YxupN1m77attdk9wTKFwF6qHdsLnh4v53cdHyK1odHpMUkTgALZIoegdJegulNY2c+nTWymp7TmKbdBqWDLOtwoy7DhZQUJYAKkxjuerFb6PEnQHqhpauOHFnb2KGeBHS0b53PPpO3sL2X6yAr1Gw9JxcUxLieBUVRPJUUFMHh5OUmSgCpz5OErQHXj6yyyOl9T3etxN80Zwz3npA9Ai9xIfGkB9s4WqRjMnt+Z02z8yNpgVkxO5ZMowxsSHKHH7ICoo1oG7z09n5gjnc76p0UG89cO5PHr5JDRdJ419gPPGx1HVaHa6/2RZA3/7IovrX9iJ1eY905kK11E9dAfCAvSsXTWXf+/K5797CjleUodOo2Fqcjg3zk1l2cR4n+61pqVEcuGEeNYfLunxuJ8vG4NOq77rfRGVWDLEqG02c/srmezKqXS4/85zR3PfhWO8/otrX34Vz27KpqTORHVjCylRQVw8OZFrMpIR4JMjKFfxaGKJECIA2AwYW8/3Xynlr4UQUcCbQCqQC1wjpazq7/UU/SMsQM+a2+fw9t5C3tl7iuyyegxaDdNTIrl5fiqz06IGu4m98t89hdz/9oFOjwV5FY3sOFnB/vxqvjhWyrljY7l4ciJ786s4UVLPtuxyDvx62SC2emDodw8t7F/lwVLKeiGEHtgK3A1cRR+9rVQPregNKSXn/nlTj/kBbdy2II0PvzlNWetCmv+7bjqXThvm6SZ6nJ56aHfU5ZZSyrbQsL71n8TubfVK6/ZXgCv6ey2Fory+xSUxAxwpqmXjfecwebg9PffFbd0j+/6GWyIfrVay+7G7Y2yQUu7ERW8rZYWj6AtNLd1TcLtibF1q2thiISzQwId3LeJft8xiRFQQ3hQz8gRuEbSU0iqlnAYkAbOFEJP68F5lhaNwmfhwY7tgnXHdrGR0GtEpI27JuDie+t50rw/29Re3zk1IKauxF9pfjoveVgpFXzDqtCyf1HOVl61Z5Vw9M4lLp/j+83JfcYf7ZKwQIqL190DgfOAoyttK4SF+vmws4YF6p/uzyxq4YEI8540feg7G7uihE4EvhRAHgN3Yn6E/QnlbKTxEUmQQb9w+h+FOVrtdOCGeuSOj/X547YghkVhis0m2ZpWTX9lIbnkDk4aHc8X04QCcLKtnx8lKapvNJEUGsig9tsdvf4X30Gy28sH+02w/WUFtk/3vt3xSInNHRvm1mId0xZKaRjP3vLmPL4+diaCPSwhl8ZhYfvnut3x6sLjT8YnhAdy+MI3bFqb59YfCHwjQa7lmVjLXzEoe7KZ4DX4v6N98eKiTmAGOFtdx7XPbOV7afWVVYlgAr27PparRzP8sGztQzVQo3IJfZ+B/nVXOu/u616PWacBstTI92b4GWK8RTEkKZ1pyOLUmM6eqm8nMreTQqZpBaLVCcfb4bQ9dVNPE/7530OG+IIOOnIomqGhq33ag0C5evVZgsUl25FSydncBv1WOEwofwi8F/eTnx3l2UzYmi63bvuhgAxUNLS6d53BRrbubplB4FL8T9NYT5Tz5+QmH+8YmhJAYFkBtswW9VtNqDCeR2JPP2wL+e/LUojCFb+J3gp6eEsFFkxK6Ra8BxsSFcu8FY7jq2a97rNzRxvjEUE80UaHwGH4n6GCjjmdvmMmevCrWHy6mqLqZiCA9C0bHcN64OHRaDdfOSuEfX2X3eq7rZqUMQIsVCvfhd4JuY+aISKf1we5aOpovj5ZyrKTO6ft/vGSUsmBV+Bx+PW3ljGCjjrWr5rJsYneL1kC9ll9ePI5fqDlohQ/itz10b0QGG3juxgyySuvYfrKyPXVwyZg4woNU6qfCNxmygm5jdFwoo+NU8EvhHwzJIbdC4a8oQSsUfoQStELhRyhBKxR+hBK0QuFHKEErFH6EO4oEJgshvhRCHBFCHBJC3N26PUoIsUEIcaL1p3NbR4VC4Rbc0UNbgPuklOOBucAdQogJwAPARillOrCx9bVCofAg7rDCKZJS7m39vQ44AgxHWeEoFAOOWzPFhBCpwHSgmxWOEMIjRZLX7sqn3mRhwrAw5qRFo/VjG1GFojfcJmghRAjwNnCPlLLW1YqZQohVwCqAlJS+LVdsNlv51XsH221F02KCWX31FDJSvd8SVaHwBO4yq9NjF/MbUsp3Wje7ZIXTH28rg1ZDsEHb/jqnvIHvv7CT3bmOzcwVCn/HHVFuAbwIHJFSPtFhl8etcDQaweSkzmuWWyw2fv6fb7BYu9cTUyj8HXf00AuAG4GlQoj9rf8uZoCscBLDu9uh5FY0sv1khScup1B4Nf1+hpZSbgWcPTCf19/z98aw8ACH2w+frmVRurKnVQwtfD5TzGzzHm8uhWKw8fkCB/mVjQ63j08MG+CWKAabU9VNfPTNabLL6jHqtExLjuDiyYkEdgic+js+LWgpJUcdFMNPiQpi/qjoQWiRYjCQUvL3Tdk8+flxzNYzI7bXduTxp3VHefLa6cxz8fOQV9HAP7ecZOfJSl5bOYcEJ4903opPD7k/PFBEdllDp20GrYbVV09Bp/XpW1P0gb9vymb1umOdxNxGSa2JW17exbeFvfuUffptERf+dTOv78jnRGk9L2/L8URzPYpPf+r351cxZXg4M0dEMCctiowRkay5fQ5zRqreeahwqrqJJz8/3uMxJouNh9537HPWxqHTNfx07b5O9knrDhXjTf7pruDTQ+6oYD1FNU3cODeV6SMimDcyWvXMQ4yPD5x22DN3ZX9BNTnlDaTFBDvc/9cNx7udJ7eikeyyep8qIumzn36L1cY7e09TVt9CTkUDi9JjlZiHIFkOPL6dke3kWLPVxubj5Q733blmH8U1zWfVtsHAZ3vo21/N5GS5/fn5vX2n+MWysSRGdE8y8WZK65r5z+4CDp6upa7Zgk4jSI4OYtWikSRHBQ1283wCo871CLZB5/gLv6qxhRYnmYVHi+u44plt/PXaaS4H1gYTn+vSbDYbf9t4gk3Hytq3SeCml3ZR3eiaTaw3sDeviv956xtWrz/OpweL2ZpVzqbjZby2PY9lT27mi6Mlg91En2B6SoRLx2k1gslOrI3CA/Xtq/SSHHQKxbXNfP+FHfzuo8M0m61n3daBwOcEveVEOU9t7G4Xe6K0nh++tgdbPxNNyutNvL4jj998cIjHPjnCZweLaHHgM93fa6x8ZTebTzge5jW2WPnJG3s5Web6cHKoctGkROLDjL0ed+X04UQGGxzuM+q0zGsNpGq1gknDwpiaHM605HBmpEQwLiGEhDAjL2zN4fUdeW5tv7vxuSH34rFxbLpvCees/pKu0t2ZU8mnB4u5ZEpin88rpeSVr3N5/LOjNJs7CzglKognr5vGjBTXqig1my18+E0Rnx4sprimmahgAwvTY/je7BTCA/W8nVnYq51ts9nG019k8cS10/p8L/1BSklFQwsCiAo24Ooy2MEi0KDlqeumc/NLuzpFqDsyOi6Ehy6Z0ON57jk/HYvNxo6TzlfqLUqP4bszk/vVXk/jc4IGSI4O4oIJ8aw/fGZYmhhmJCzQwKffFp2VoF/elsujHx12uC+/spEbXtjJ2z+e32sGWn5FA/e8uZ+9+dWdtm/NKufFrTk8f+NMPvz2NKPjQnoN6Hx5rBQp5YCIqqHZwrNfZfNmZgFldSbAnif//Tkp/OCckX16Vh1o5o6M5r8/ms9D7x9kf0F1+3atRnDl9OE8dMmEXv3KMlKjWDFlGLtyKnE0yIsI0nPvBWO83vdMeNM8W0ZGhszMzHTp2K0nyrjppV1ICVoBFgmBeg1IyRur5rncmwKU1Daz6E9f9jq0npUayX9+NN/p/qYWK1f+fRtHi53b1IYH6hGARoBep6Gk1uT0WL1GcOjR5U6DOe6isqGFm1/ayaHTtQ4/zDNSInh15RxCjN7//Z9T3kB2aT0GnYbJw8OdDrOd8U1BNc98mcXX2RXUmyzEhRpZNjGBO5eOJj6se9aYxWob8NkVIcQeKWWGo33e/xdywrv7CgEwaAU6nQaLyUqT2YZOI7h77T6euGYas1ysXPLRAdeek3fnVpFf0UhKtOMI9Bs783oUM0BNk5nwQB2VjRbmpEX1KOixCaHotZ7vnR//5AjHiuuwScgYEUlmXlWn/Xvzq3nkg0Os/u5Uj7elv6TFBDuda3aFqckRPH9TBlJKrDbpVKxSSl7cmsOr2/NYu2ouw7xkhsXngmJtLB0bj02CySppMJ2JPFpskoLKJu576xvMLhY5ONGD8XtXjvdw7LpDxS6do+0ZvaimiTlpUUwaHkZ4YPeh3LxR0R4fbh8truWtPYVMT4kkLSaYIKPjofV/9xZyurrJo23xJoQQPfa8L27N4fnNJzFbrVzyty28v//UALbOOT4r6GUTE4gM0tt76C6FAfVaQUW9ie1ZjqPIXdFpBUJAclTv37K6HnrMU1WufeBNFhuhRi35lU3szKnk4KlaRnTp9dOig7kmw/MBmK+z7IUg9uZXMSw8gB3Z5YyM7d7DSQk7VNEIwD5LsXrdMUrrTKTFBJMaE8zD7x9kV87gl77yWUHrdBpWTBlGi1Vi6fLgZ7ZKWqw2Dp7uPSEfYHZaFEkRgRRUNjGjh3lNjYBJTuYyAUIDXAuYGLQanr8xg9CAM088eo2G1OggooMNTEuO4BfLx5Ae7/mUw5ome7TdbJVsy65gekoU0U6eO9uOHeqsP1SCyWJjyvBwvs6uZF9+NQ0mq1eUvfJZQQP89opJDIvoHqiIDTUyPTnC6TRGV84bF09Ta8JAQWWT03nNFVOGERPifM7T1UyiOSOjmDc6hnX3nMONc0cwJSmcWpOZhhYrS8bG8ZdrpnLR5GEunau/DO/y7FdvsjiNJ3jLc+Jgk1NeT5BBS16lPVPRqNPwxu1zmD86ZpBb5qagmBDiJWAFUCqlnNS6LQp4E0gFcoFrpJRVzs5xtmy7fynFtc38/uMjbM0qRyugrM5EWZ2JXblV/HtXARdPTuTOpaOdijHYqOMv10zj9ld2U1ZvYlZqZLdgVUpUEA9f2vNc5sqFaazdnd9tHrsrP1kyGrAL5LdXTOrD3bqfJeNiMWg1tFhtzEmLYmdOJVOSuo9CQow6FnjBB9YbCDToaDJbsdns/aHJYuPh9w8SHxbAqyvnDGrb3DJtJYQ4B6gHXu0g6D8BlVLKx4UQDwCRUsr7ezpPX6atuiKl5PnNJ3ns06MO98eEGHn99tmMS3A+j5yZW8mv3j1IaICuU6T34skJPHLZJGJDe89IWneomFe+zm1/DGj7/xVCUNtk5vo5Kdw4L7UPd+aY6sYW3tiZz9fZ5VQ3mkkMD+TCifFcOX04+j5Oo/xl/TF2nqxkV2v54+nJEezrMJ8L8NCKCaxcmNbvdns7B0/V8NGBIgoqGwk2apmVGsWlU4cRoD8TLNx83D5lOiExDJ1GUNdsJqfCXjnnj9+ZzLWz+lZfvq/0NG3ltnnoVteMjzoI+hiwpNU1IxHYJKUc29M5+iPoNm56aafTlTPJUYGsv2dxjyVppJQcOl3bWsZGw9TkCIeVRXvi4Kka/rz+GFtPlLcLe0ZKBHefP4bFY/pfuHB3biU/em0PFQ3dc9cnJIbx0i2z+lRpw2q18esPD/H6jnzAPhUYFWJsX2X04yWj+MWysV6fNdYfWiw2HnrvIG9mFnTbNzwikGeun8G05AgArDbJJX/b0j5FGWrUUWeyAPZqmX+4ajIL02MoqGhkT14VO3MqeeyqyW5bcDNYgq6WUkZ02F8lpewx28Mdgv7qWCk/eG2P0+fA310xiRvmjujXNVyl2WylrM5ERJDe5YBZbxRUNnLxU1vaP0COGJcQygd3LuxzQsrOkxW8mVnA0aI6RsYGE2zQ8b05Ke0fZH/mvre+4e29hU73hxp1fHDXwvY57hMldVzz3HaqGs1ogN6iNbfMT+U3l010S1t7EvSgB8WEEKuEEJlCiMyysrLe39ALi8fGseb2OUR0mdfVaSDUqGXtrvx+X8NVAvRakqOC3CZmgCc2HO9RzGBf8vefPd17mt6YMzKaJ66Zxid3L+Lp78/gj1dPGRJizsyt7FHMAHUmC3/45Ej76/T4UN67YwEaYRdzcC+FCLdnD8yUnycF7XErHGdkpEbx1c+XdJoWkgjqTFYOnq51qb6UN2K1Sda7mLzy2UHXjlPA+/tPu3TcF0dLqWs+M3UXFxrQnirb0GJlQqLzacaBmvLzpKA9boXTE+FBBt5cNReNgCCDtt3QDuAfm7MHsiluo7qxhYYW19bjuprkooDciobeD8L+hdqxbHSAXkNUhzn7w0V1zEqNZJSDxBxH06uewF3TVv8GlgAxQohC4NfYrW/eEkKsBPKB77rjWn1hwrBwFo+J5ctjnYfyO85y+GO1STafKGNHdgW1zRaSowJZPjGBkbEh7mhurwQbdfYhngthj1AHqaQKx/RlJVnHaLcQgmUT4/n3rjOPN7tz7bMjyVGBJIYHklveQGmdiWUTE9zX4B5wi6CllN9zssvjVji9MSUpvJugqxtbOFpcS7PZxoioIJdW5OSUN3Dnmr0cOt25Dvjqdce4eV4qv7pkfJ+ni9o4dKqGZzZlk1VSB0gCDTomDAtjekokyyclENb6DB6g1zJzRGT7h6Yn5qnKpy4zc0Qknx/pvUJMdLCB1OjOve9dS9P5+EARtc2d4xoFlU0UVNpHSeeOi+XGeQMTiPXZ5ZOuklfRwOLVmzpta+vlJiSGkVNez7xRMfzvJeOd9rRldSZW/N+WHldGXZuRzB+vnuJSm4prmvn0YBFbT5SxL7+GmuYW2rIGBXQq3BAWoON3V07msqn2zLEvj5Vy68u7ezx/iFHH5/cu9rki8YNFRb2JJX/eRF1zz8HGny8byx3nju62fW9+Fate3UN5fffPx8jYYF6+ZRYjos9+BVhXvDrK7WlGRAfz48UjO22zSXvmV15FA01mG18cLeWyp7exv8Bxz/fndcd6FDPAm5kFPSbnSykpqzPxwpaTLFn9Je/sPcXGo2VUNp4RsyNqmy389N/7+PhAEQDnjo3jnvPTnR5v0Gl46rppSsx9IDrEyBPXTOu2yKcji9JjWHXOSIf7ZqREsvHexfx82VjmpEUxJj6ERekxPHr5RD756SK3irk3/L6HbuM3HxziX1/ntr9Ojw/hREnniiELR8fwws0ZnZ6TWiw2pj6yvj3XuyeWTYjnuZs6f3FabfbSRi9ty6GwQ6AqQK/pNUW0I1HBBrbdv7Q9KWbD4RL+74sTHGiN2Os0gsVjYvmfZWOVr9dZsievkkc/PMw3HWZBQo06bl2Qyp1L0z1eaMJVBiSxxB14UtBgn2/8x1fZlNWZOFBY060mGcBfvjuV78xMan+dW97Akj9vcvka35udws/OTycuLACz1caPXtvDxqPdZ+xcDW515O/Xz+DiyZ3LK9U0maltMhMbauz0RTSUkFJSWmeiscVKYnhAv/8fCiobya9sJNioY3xiqNeVX/LLiiVnQ0ZqFC+kRpFf0cj3X9jRqcdsIzOvspOg9X38Vv7sYBE7Tlbw3h0LeHFrjkMxg319cV85XlLXTdDhgXqHxRGGAjab5I2deTy/5WR7AMqg1XDBxHgeWD7urFMtk6OCfLYu+pASdBsp0UG89cN53PLyLo53GXZ3rH4C9kJ5caFGSut6foYGe22zepOFqkYzqz87yrv7nFex6KpnrUYQbNASEaTHoNUQZNCh1QjqTRZyyhuw2ORZR9HdSb3Jwqvbc9lwuISSmmYiWyuarlyQRpyDmluewmqT3L12Hx+1xhbaaLHa+PhAEZuPl/H6yjlMHQKZbh0ZkoIG+9LFD+5cyDNfZvHspuz2RRSpXSqHCCG4eX4qq9cd6/WcVgkzkiPYnVvF23tP9fjcbdBqGBEdxN3nj2bFlOE9nnfHyQpufyWTqUkRPR5Xb7KQX9FIgF7DiOjg9uLxUkr2F1SzM6eS+mYLKVFBLB0f1+PabkecKKnjlpd3c6pDKaLTNc0cOl3Lmp35/OOGmQO2xPLlbTndxNyRumYLP359DxvvWzKk/KGH1DO0Mw6eqmHVq5mcrmlm3T3nMDahcwpfi8XGzS/tYrsLJXhiQ4xUNJgcPh/rNILZaVHcc346s9P6Nk+8L7+KKUkR7SLtSF5FA499cpQNR0oYFRvM8ZJ6ooIN3Do/lcumDuP+dw50qzdt0Gm4+7x0frJklEurqOqazSx/cksnMXclyKDl07s9H9W12iRz/rDR4TRRVx67ajLfm+3Z5YwDjXqG7oVJw8N5784FfHygqJuYwf7hf/nWWaxed4xXt+di1GmJDTWQHBVEfGgA0SFGWiw2tmaV0dRiRasR2Do4GYYF6PjpeencPG8E+rMMsEx3Upb428Iarn9hR3tiQ1sSSmVDC3/ZcJynv8xyWLmlxWJj9bpj1Jss3L98XK/Xf3V7nlMx67WCIIOWmiYLT31+wuPmANll9S6JGewryPxN0D2hBN1KXGgAty5wvoA/QK/loRUT+OVF49D28ixb02jm86PFHC+uZ96oaOaPivHIlEez2cpP1uyhttlCgF7DeePj2XK8c1Zcb2WY/vFVNpdOGcaEYT1PdW047DiTamx8KHXNZsrqTcxIiSCrrN7j5gC1fVjo0FuyiL+hBN1HehMzQHiQnu/M8HzFzqKaZn7aOj963vh4Qow6HvnwEC9vy3X5HFLCf/YU8OthPa/VLantbqkaH2qkqKapfXTQ5hbS2GIh2Oi5yHtSVCCzUyPZ5UIKbFLk0KqDpgTtwzgqKv/Li8fz5dFScisanbyrO8d6MQcAiAgyUNTFJzk1JpidXbLjAvQaAvWe/VglhAWi02qYkRLRzXKoKxdN7rstkjuobTbz2bfFHC6qRQh7mvFFkxM97j6iBO1n6LUa1v9sMavXHeOfW0669B6NC8PjRaOjCTXqEAKqG81UN7Y4NDJYMCoGTQ8plO7ivgvHcs0/vmZWaiTNZhtC2Ktvmq0SnUZQWmdiweho5qS55p7iTj4+UMSD7xzotmDjD58c4fHvTPHoyqvBn9hUuB2DTsP9y8YS5OJ0TU+1xtu4bWEaR4pq2ZlTybGSOkrqTDR0qZyiEXDn0u6LFzzBzBGRPHP9TA6frqWmycyBwhp251axv6CazLwqxsSH8NCKCQNeB23doWLuWLO3m5gBqhrN/OSNvR51IFE9tJ+i02mYlRrFV8d7Luuk0wiundX7835CeCB/v2EGq17dQ5PZihBQ2XAmOKUR8LsrJjuNxnuC5ZMSmJGyhDd3F7Ajp4LGFiup0cFcOjWRc8fGDbiYm81W/ve9gz0ec//ysR6tb64E7cfoXRj6PnDROJfN3Ralx/LJ3Yt46vPjlNWb2JZVgVGnYcHoGO5aOnpAxdxGXFgAd52Xzl04X4E2UGw5Ud5uxdsVo07Dn66ewuXTek4i6i9K0H6KzWZjX0E1M1MiSIkOIq+ikbAAPUU1zRj1GqKDDVw+fRhXTEvq/WQdSIsJ5snrpiOlpN5kaU9R9QYOFFbz5u4CjhTVIoRg4rAwrpuV0uuUnLs4Ueo4uDgsPIDnb8pw6dGmvyhB+ykHTtVQ0dBCRUML+wtruPeCMaRGB1HZ0EJyVBBzR0b3a1WSEMKt1Uz7g5SSxz89ynObOwcB9+RV8dqOPO5ams7Pzk/3+BDc4GBK8zszknh4Re+G8+5CCdpP2dSh7JLVJvnz+mOs/cFcLpkyMJ5ZA8mzX2V3E3MbUsLfNp4gKkjPLT0kDrmDjgtB4sOMPHbVZJaOi/foNbvicUELIZYDTwFa4AUp5eOevqbC/kGenhLRPiUlpeTtvYXM8bNaY1UNLfxt44lej/vz+uNcnZHs0XngmSmRTBwWxpj4UH5z2cRBWdbqUUELIbTAM8AFQCGwWwjxgZTysCevq4DQAB37uiRd7Cuo5teXTiTYw8kNA8mm46UuVX6JCzOyLauMZRPPJJrUNZvZcbKS4tpmooIMzBkZ1ecVaB3RaASvr5xDRJB+0GyDPP2XnQ1kSSlPAggh1gKXA0rQHmbLie7+XlLaF234k6ALK3uf0w3UazGZre1FEGw2yXObT/L0Fyc61TnXawU3zk3l/ovGnnWVElcqyHoST/9lhwMdPVkKgcH12xwC1DabHVqvaAREhwzuB66/NJutrDtUTEFlI5UNZirqu+eYd2Xi8DAyc6vaV6I9+tHhTvXl2jBbJS9tyyGnvJ4Xbp7lNdH7vuBpQTv6H+m0UlgIsQpYBZCSMnSWuXmS9YdKaHGQljknLZogg+/2zltPlHPvW/spqzORGhNMTrlrjhdtH8I5I6P4OqvcoZg78uWxMtbuzuf6OQNTS9udeDr1sxDomIaUBHQyEvKEt9VQxmSx8sT67tVVNALuu3DMILTIPezOreTWf+2itM7EqLgQl8XcxoopiYyIDub1nXkuHd9mretrePrrejeQLoRIA04B1wHf9/A1hzQ1TWZOd1kVpdMI/nDlZDJSB36hgjuw2SQPvvMt5taiEdrWgFN0sIEx8aHUNrVwqroZi81mN0uQYLHZsNgkZqskMsjA76+YDMC3p1wzKjxaXIvZavOKOm59waOCllJahBB3AuuwT1u9JKU85MlrDnXiQgO4ad4I/pNZSHignnmjoll1zkifrtX9TWE1WaVnijnWNLWQEGagor6FZrOVQ0VnMrSySutpbA10RQUbuG5WMncuHd3+qBEVZGgPjvWElGDzovJcruLxByop5SfAJ56+juIMj14+iUcvnzTYzXAbH37T2e61uIOLyb6CaiIDdVQ12Vc33TRvBDfMHYFGCBLCArot5YwNNTJzRCS55Q1UNLQ4vebI2GCvq8ftCr41nlB4HCkl2aV1rD9UzL78Kiw9+fQMAHvyqnhl+5nnXoO2e5y1uunMUkWDTktSZBDDIgIdrsu+emYye/KqaGyxMictCqPOcST7mgzPV5zxBL4b8lS4nbf3FPLIh4c6reWNCTFw4YR4fnfF5AEpXNARKSUPv3+wk7e3QaehxWolNEBHXbOFAJ2G5g5106Yl97wAYtnEeC6ZnMjH3xaxM6eSmBADk6KD2ZN3ppzR1OQIbl2Q6vb7GQiUoBUA/PHTozz7VXa37SaLjTW7CtiXX80ndy8a0Ayok+UN3ex7DVoNIUbRXvyv41xxanQQi9J7nikRQvDXa6cRE2LgtR15lNe3UF7fwsjYYAxaDSNjg3nsqik+OdwGJWgFcKCwyqGYgfasgSPFdTz64WF+fVnPxQTdSU5Z96mpmmZLpx67LdNL2ypUV6LSBp2GRy6fxO2LRvLlsVKKa5qJCjawKD3WYRlnX0IJWsGjHx5xus/aIdK7Zlf+gArakeOFrYuDgV4rMFslyycl9LnAQnJUEDfNS+1PE70OFRRTcNRJ1c8Qo7Z9Cgjsw+/CSterifaXScPD0XcJgknOVGIZHRvcPjd94cSBXaborageWoHZautmbxuo01Bv6u7NVVrXTNIAOTOGB+q5JiOZN3Z2ztoaFR9CWICeXa0lhIdHBLpUSbOyoYXnvsrm04PFnKpuIixAx/xRMfxo8SgmJ3m+mshAoHpoBSlRQdikXcQAQQYNTU4cN0bFhQxk03jw4vFMGt45KUbaZLuYgw1a/u/703utvnK0uJZlT27muc0nya9sxGqTVDWa+fjbIi5/Ziuv7+icEtrYYukU+fYVlKAVzG0tetAm4sYWx2JODA8gPHBgV2uFGHW8uWoet8xPJUBv/7i2tWHB6Gjeu2MBM3p5dm4wWVj5r0ynBfxsEh56/yA7TlbQbLby2KdHmPnbz3l+s5NAoRejhtwKHrpkPO/sK+zmjd2VP35nygC1qDPBRh2/uWwiv1g+liNFdVhtktToIJf9qNfuLujRNRPsqZ5/WX8MvVbD161LT6+e6XvJJUrQCgx6Le/fsYAbX9xFXbPZPlPVJY35vgvHcs6YwV0NF2TQMXNE30sFbzpW6tJxmblV7bcdFqBjyVjfW/2nhtwKAEbHhbLpf5ZwTUYKYQF6bBL0Og2z06L48K4F3LbQswX2PElFvfOc7Y50/A7TaITPrbQC1UMrOmDUa3n40gk8fOmEwW6KW4kNNUJR395T3WjmhS0nuWleqkesgD2FEvQQ5uCpGp78/Dhgd0e8emYyKdEDMyU1kCwdF9erJZAjfvfxEb46XsZrK32napbvfPUo3E5cmJHPj5Ty+ZFS/vZFFuc9sYkXt+YMdrPczjUZyaT0MncusBeC6EpiuGuBN29BCXoIExcawLQOxeHNVslvPzrMm7t9s/yOMwINWl66ZRbDnZjE6bWCP109heWTuien3Dg31cOtcy9K0EMcRxlWf/jkaDerWF9ndFwIn9y9iJ+el87Y+FCCDVqGhQdw1YzhfHTXIr6bkcwDF40jsotlja9VLVHP0EOcCyfG88fPjnbaVtNkZsuJcoc9li8THqjn3gvGcO8FjoslJkUGseYHc7njjb2cbC1C6Gtlj/vVQwshviuEOCSEsAkhMrrse1AIkSWEOCaEWNa/Zio8xZ5cx+mNeRV9q6rpL4xPDGPdz87hme/P4KZ5Iyiq6b3utzfR3x76IHAV8FzHjUKICdgrfE4EhgGfCyHGSCl7TkVSDDirHZT8BQjyI3eNvqLXarhkSiKXTEns/WAvo189tJTyiJTS0SficmCtlNIkpcwBsrDb4ii8jIWjYxxun+2jJX+HOp4KijmywPGsdb3irLhxXnd3iMVjfL9yx1ClV0ELIT4XQhx08O/ynt7mYJvDcKEQYpUQIlMIkVlW1vfJf0X/mJES2WnqKiUqiD9dPTiLMBT9p9cHJSnl+Wdx3l4tcDqc/3ngeYCMjAzfmiPwEx67ajLXv7CTC8bHc/9F44gaZAdFxdnjqcjHB8AaIcQT2INi6cAuD11L0U/GJ4ax+1fn+6TboqIz/Z22ulIIUQjMAz4WQqwDaLW7eQu7D/RnwB0qwu3dKDH7B/3qoaWU7wLvOtn3e+D3/Tm/QqHoG0N3slHh15itNjYdK2VbVgUNJgvp8aGcNz6OUbEDWxNtoFGCVvgdR4pquWPNXkxmW3vpocnDw3js0yPcOj+NX148Dp0PFi9wBf+8K8WQpbCqke/9cwcnyxo6FeovqGpCSnhpWw6/+dB/HY2VoBV+xWOfHKW60czo2OBOntLVjWYSwowAvL4jn/0F1YPUQs+ihtwKr6Wmycy7ewvJzKui2WwjLSaIy6cNZ9Jwx0XxG0wW1h0qBiA6xEhWF2+slOhgtBoNp6qbeG/fqU4JNf6CErTCK9l8vIx73txPZRdT9n9uyeH6OSn85rKJ3Yr45VY0YGm1/yivNzFpWBgHO7hX7sqpJFCvZVxCCNll9fgjasit8DoOFFZz+yuZ3cTcxhs783n0w8Pdtht1GqYmRzArNZIms5WDp2uZnRaFXiva59mbzFYaTFYCfKjwX1/wz7tS+DSPfHiYFqtj9442XtuRx+Eu3tGp0cHkVTSwO7eK09X2dcxtljkpUUGEBdgHpAVVTcwd6XiVma+jBK3wKk5XN7nsKbW+9Xm5DZ1W49Ae1myV5JQ3kNBa8C/IoOXSqb631tkVlKAVXkVuueuVUgqqulvb3nHuKIdruWNDjGSXNaARdksfV210fA0laIVX4cjkvSM6DcxJi2JsfChGnQaz1UZhVSOV9XYjOqNOyyu3zWblwjSMHZ6To4L1jIwJ5tXb5nDp1GEevYfBREW5FV7F+MQwgg1aGlq6r+XRawVJkYHsbLOSNWqZ9sh6GlqspEQFMS4hlKXj4rh2VjIPrZjAPeen821hDfUmCyOigxgTH4oQ/r0IRQla4VUE6LXcND+VZzd1tnIdER1IbEgAma3P10LA3vzq9v35lY0U1TRRWtdMdlk9DywfR2iAnvlOSiz5K2rIrfA67j4vnTlpZ56DxyWEUF7XckbM2O1fu2K2SvYX1PDPLTm8sj2v+wFegs0mKaltprKhBenmut+qh1Z4HQF6La+unM3TX2SxPbucg6draTbbp7HS40I4Udp7UsjH3xZx8/xUr1rnXdXQwlMbT/DuvlPUNJkB+3TazfNTuXneCLcsGFGCVnglRp2W+y4cS4slneMldZgsVkZEB/P7j4+4JOgWi43ssnrGxHtHscPCqkaufW5HN+P5/MpGfvvRYTYfL+P5m2Zi1PUcFOwNNeRWeDUGnYZJw8OZOSKKmBAjta09myv05VhPYrNJ7lyzr5uYO/LV8TL+uuFEv6+lBK3wKYZHOjac60qQQevysZ5mW3a5S6u7Nhwu7vWY3lCCVvgUrvptxYYYSAz3DkF/nV3h0nEXTOi/l1h/iwSuFkIcFUIcEEK8K4SI6LBPeVsp3M68kdGcPz6+x2M0Am5ZkDZALeqdGheH/ivcYL3T3x56AzBJSjkFOA48CN28rZYDfxdC9O9pX6EAhBA8ed00zhkT63B/gF7Dk9dNJ8OLrHyc+VJ3ZGRsMBOHhfX7Wv2t+rm+w8sdwNWtv7d7WwE5Qog2b6vt/bmeQgEQYtTxyq2zWHeohA8PnCa3vIEgg5aM1ChumDvCJQENJMsmxrN6nWNTwDaunDbcLVls7py2ug14s/X34dgF3oZTbyshxCpgFUBKSoobm6PwZ4QQLJ+U4BMe1qPjQvn+nBTW7Mx3eszl09xj/eYWbyshxK8AC/BG2yYHp3KYEiOlfF5KmSGlzIiNdTyMUgw+JouVktpmms3KL+Fs+PWlE5wuCpmREkFKdJBbrtNvbyshxM3ACuA8eSaPzWVvK4V3c/BUDU9sOM6WE2WYrRKtRjAnLYp7zh/D7DTveU71dow6LX+7bhpXz0zinb2FnCipR6/TMC0pnJvmp7rtOqI/uaRCiOXAE8BiKWVZh+0TgTXYn5uHARuB9N7scDIyMmRmZuZZt0fhXj46cJp71u5vr9PVESHgt5dP4oa53e1oFZ5FCLFHSpnhaF9/o9xPA6HABiHEfiHEP0B5W/kDOeUN3PvWNw7FDPbFEQ+/f5Bv/LQcrq/S3yj36B72KW8rH+b5zSdpsfRc18sm4e+bsnjuRoedhWIQUJliCodszy536ThXs6AUA4NabaVwiKvZTXXNFmw2iaYfyxSbzVZ25lSSX9lIiFHLrNQokiLdE/UdaihBKxwyLCKQqsbeRZ0QFtAvMb+zt5Dff3yEii41uC+bOoxHL59IRJDhrM89FFFDboVDLnRxocCyiT3nVffEy9tyuPetb7qJGeCDb07zwDvf0mCynPX5hyKqh1Y45NaFqbyVWdDjGt6oYAN3nOs0LtojueUN/P7jI073j4gK5LODxUibZOLwcKw2yfjEUJaMjSNAr5YFOEMJWuGQsAA9r9w2m9v+tZv8yu71r+NCjbxwc8ZZ17d+K7PA6ZQYgKG1cse6wyWsO1zSvj021MhjV07m/AndRwa7cyp5MzOfQ6frAJiQGMb3Zid71UINT9OvxBJ3oxJLvI/GFgtrdxXwxdFSSmqbiQo2sHhsLNfPGUF4oP6sz3vjizvZcsJxJH1MfAjHS5yXGRIC/nljBpHBep776iQHCqupbbLQaLYSHaynoqHzs//KhWn86uLx/XrW9yZ6SixRPbSiR4IMOm5bmMZtC927vtjmoCOZNCyMgqrGHsUM9qSWO9fspdnBPHlXMQO8u+8Ul00dxlQ/tI/tihK0YlAYlxDGtqzOc9g6raCmybUgmCMxd2VkbDC3LxzJVTOGD5nnbiVoxaBw9cwkPvrmNA0mC0a9llGxIewvrHbb+WNDjGz42WKvKuM7EKhpK8WgMD4xjKszkqhvsVLR0MKu3MpeU02d4Uizr9w6a8iJGZSgFYPI/1w4ll8sH9vJVO5s6Bgsb5Pwlc9+3a9z+ipqyK0YNIQQ/GTJaK7NSGbjkVLyKxt5K7OA0jqTy+fQCrB2EbQE3GBC4ZMoQSsGnegQI9fMSqamyYzJYuWfW3Jcfq9V2i1m20brbdpOiwl2f0N9ACVoxaCzN7+KP312lB0nK106vmuvbLGd6ZnbNv/vxRPc3UyfYIgOTBTewgffnOa7/9juspinJoXz6so56LoEvLrOas8bYjaybShBKwaNvIoGfv6fb7D2kALaldsWpLFgdAwf3bWQhDBjt/16jeDhFePd2UyfQg25FYPGy9tyMfVxquqRjw5z4cQExiWGsf3B89idW8m2rAqazFYmJIaydHw8YQFnn5Lq6/RL0EKI32Ivqm8DSoFbpJSnW/c9CKwErMBPpZTr+tlWhZ+x46Rr1U6CDFriwwKICTHwTWENXx0vY/mkBIQQzE6LZnZatIdb6jv0d8i9Wko5RUo5DfgIeBiUFY7CNeqae0/zDDFqaWyxklPewO7cKkbGBJNd1rs/9FClX4KWUtZ2eBnMmdhEuxWOlDIHaLPCUSjaSY7q2bIm1Kil3tS5WGxYoK7fiSj+TL//Z4QQvxdCFADX09pDY7e9KehwmFMrHMXQ5eLJzt0WhYC6LmKOCtJz8FQt01MiPNwy36XfVjhSyl9JKZOx2+Dc2fY2B6dyGMoUQqwSQmQKITLLysocHaLwU66dlcy4hFCH+6SkvSfWCJgyPJw6k4XRcSHMSIkcyGb6FL0KWkp5vpRykoN/73c5dA3wndbfXbbCUd5WQxejTsu/bp3N5OHhDvebLDZGRAUxJj6UA6dqCDHqeOKaaW5xafRX+hvlTpdSnmh9eRlwtPX3D4A1QognsFvhpAO7+nMthX+SEB7Auz+Zz4cHTvP54VLyKhoorm2mvN5eODCvtfzR4jGx/PbySW4zdfNX+jsP/bgQYiz2aas84Edgt8IRQrRZ4VhQVjiKHtBpNVw5PYkrpye1byupbeZwUS1SSsYlhDHMyzyfvRVVU0xxVkgpsdokuqG6rGkQUTXFFG5n45FSbn81k6TIQC6dOowfLR7Vr6KBCvegvl4VfabFYuOr4/YZicKqJp7dlM0lf9tCXkXDILdMoQSt6DNajeDrLmZ2hVVN/PC1PZitZ1dGSOEelKAVfUarEaw6Z2S37UeL6/j0YPEgtEjRhhK04qxICHccdd58XCUHDSZK0IqzIjE8gIig7kGwSgfGc4qBQwlacVaMiQ/lk58uYlxCKHrtmcyteAdFBxQDh5q2Upw1wyIC+eyec8gqrePONftosdr4zoyk3t+o8BhK0Ip+MzoulM/uOWewm6FADbkVCr9CCVqh8COUoBUKP0IJWqHwI5SgFQo/QglaofAjlKAVCj9CCVqh8COUoBUKP8KrShAJIcqw1yYDiAHKezjcl1H35nt4032NkFI6LJHrVYLuiBAi01ndJF9H3Zvv4Sv3pYbcCoUfoQStUPgR3izo5we7AR5E3Zvv4RP35bXP0AqFou94cw+tUCj6iNcJWgixWghxVAhxQAjxrhAiosO+B4UQWUKIY0KIZYPYzLNCCLG8te1ZQogHBrs9/UEIkSyE+FIIcUQIcUgIcXfr9ighxAYhxInWnz5pFSmE0Aoh9gkhPmp97RP35XWCBjYAk6SUU4DjwIMAQogJwHXARGA58HchhHbQWtlHWtv6DHARMAH4Xus9+SoW4D4p5XhgLnBH6/08AGyUUqYDG1tf+yJ3A0c6vPaJ+/I6QUsp10spLa0vd2C3ogW4HFgrpTRJKXOALGD2YLTxLJkNZEkpT0opW4C12O/JJ5FSFkkp97b+Xof9wz8c+z290nrYK8AVg9LAfiCESAIuAV7osNkn7svrBN2F24BPW38fDhR02FfYus1X8PX2O0UIkQpMB3YC8VLKIrCLHogbxKadLU8Cv8DuqtqGT9zXoBQJFEJ8DiQ42PWrNiN5IcSvsA/r3mh7m4PjfSlE7+vtd4gQIgR4G7hHSlnr62bsQogVQKmUco8QYskgN6fPDIqgpZTn97RfCHEzsAI4T56ZVysEkjsclgSc9kwLPYKvt78bQgg9djG/IaV8p3VziRAiUUpZJIRIBEoHr4VnxQLgMiHExUAAECaEeB0fuS+vG3ILIZYD9wOXSSkbO+z6ALhOCGEUQqQB6cCuwWjjWbIbSBdCpAkhDNgDfB8McpvOGmHvil8Ejkgpn+iw6wPg5tbfbwbeH+i29Qcp5YNSyiQpZSr2v9EXUsob8JH78sa63E8DRmBD6/Bth5TyR1LKQ0KIt4DD2Ifid0gprYPYzj4hpbQIIe4E1gFa4CUp5aFBblZ/WADcCHwrhNjfuu2XwOPAW0KIlUA+8N3BaZ7b8Yn7UpliCoUf4XVDboVCcfYoQSsUfoQStELhRyhBKxR+hBK0QuFHKEErFH6EErRC4UcoQSsUfsT/AzYg8bnJvz4pAAAAAElFTkSuQmCC\n",
"text/plain": [
"
\n",
"REMEMBER \n",
"\n",
"* **Spatial join**: transfer attributes from one dataframe to another based on the spatial relationship\n",
"* **Spatial overlay**: construct new geometries based on spatial operation between both dataframes (and combining attributes of both dataframes)\n",
"\n",
"
\n",
"\n",
"**EXERCISE: Overlaying spatial datasets I**\n",
"\n",
"We will now combine both datasets in an overlay operation. Create a new `GeoDataFrame` consisting of the intersection of the land use polygons which each of the districts, but make sure to bring the attribute data from both source layers.\n",
"\n",
"* Create a new GeoDataFrame from the intersections of `land_use` and `districts`. Assign the result to a variable `combined`.\n",
"* Print the first rows the resulting GeoDataFrame (`combined`).\n",
"\n",
"Hints\n",
"\n",
"* The intersection of two GeoDataFrames can be calculated with the `geopandas.overlay()` function.\n",
"* The `overlay()` functions takes first the two GeoDataFrames to combine, and a third `how` keyword indicating how to combine the two layers.\n",
"* For making an overlay based on the intersection, you can pass `how='intersection'`.\n",
"\n",
"\n",
"\n",
"
"
],
"text/plain": [
" class id district_name population \\\n",
"0 Water bodies 61 Auteuil 67967 \n",
"1 Continuous Urban Fabric 61 Auteuil 67967 \n",
"2 Roads and associated land 61 Auteuil 67967 \n",
"3 Green urban areas 61 Auteuil 67967 \n",
"4 Roads and associated land 61 Auteuil 67967 \n",
"\n",
" geometry \n",
"0 POLYGON ((3751395.345 2890118.001, 3751395.345... \n",
"1 MULTIPOLYGON (((3753253.104 2888254.529, 37532... \n",
"2 POLYGON ((3751519.830 2890061.509, 3751522.057... \n",
"3 MULTIPOLYGON (((3754314.717 2890283.121, 37543... \n",
"4 POLYGON ((3751619.113 2890500.000, 3751626.627... "
]
},
"execution_count": 65,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Print the first five rows of the result\n",
"combined.head()"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"
\n",
"\n",
"**EXERCISE: Overlaying spatial datasets II**\n",
"\n",
"Now that we created the overlay of the land use and districts datasets, we can more easily inspect the land use for the different districts. Let's get back to the example district of Muette, and inspect the land use of that district.\n",
"\n",
"* Add a new column `'area'` with the area of each polygon to the `combined` GeoDataFrame.\n",
"* Create a subset called `land_use_muette` where the `'district_name'` is equal to \"Muette\".\n",
"* Make a plot of `land_use_muette`, using the `'class'` column to color the polygons.\n",
"* Calculate the total area for each `'class'` of `land_use_muette` using the `groupby()` method, and print the result.\n",
"\n",
"Hints\n",
"\n",
"* The area of each geometry can be accessed with the `area` attribute of the `geometry` of the GeoDataFrame.\n",
"* To use a column to color the geometries, pass its name to the `column` keyword.\n",
"* The `groupby()` method takes the column name on which you want to group as the first argument.\n",
"* The total area for each class can be calculated by taking the `sum()` of the area.\n",
"\n",
"\n",
"\n",
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Visualize the land use of the Muette district\n",
"land_use_muette.plot(column='class')"
]
},
{
"cell_type": "code",
"execution_count": 69,
"metadata": {
"clear_cell": true,
"collapsed": false,
"deletable": true,
"editable": true,
"jupyter": {
"outputs_hidden": false
}
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"class\n",
"Continuous Urban Fabric 1.275297\n",
"Discontinuous Dense Urban Fabric 0.088289\n",
"Green urban areas 2.624229\n",
"Industrial, commercial, public 0.362990\n",
"Railways and associated land 0.005424\n",
"Roads and associated land 0.226271\n",
"Sports and leisure facilities 0.603989\n",
"Water bodies 0.292194\n",
"Name: area, dtype: float64\n"
]
}
],
"source": [
"# Calculate the total area for each land use class\n",
"print(land_use_muette.groupby('class')['area'].sum() / 1000**2)"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"
\n",
"\n",
"**EXERCISE: Overlaying spatial datasets III**\n",
"\n",
"Thanks to the result of the overlay operation, we can now more easily perform a similar analysis for *all* districts. Let's investigate the fraction of green urban area in each of the districts.\n",
"\n",
"* Based on the `combined` dataset, calculate the total area per district using `groupby()`.\n",
"* Select the subset of \"Green urban areas\" from `combined` and call this `urban_green`.\n",
"* Now calculate the total area per district for this `urban_green` subset, and call this `urban_green_area`.\n",
"* Determine the fraction of urban green area in each district.\n",
"\n",
"