diff --git a/_solved/01-introduction-tabular-data.ipynb b/_solved/01-introduction-tabular-data.ipynb index f22f0f9..56b3f39 100644 --- a/_solved/01-introduction-tabular-data.ipynb +++ b/_solved/01-introduction-tabular-data.ipynb @@ -3324,7 +3324,7 @@ "\n", "**EXERCISE**:\n", "\n", - "* Select all rows for the districts of the 1st arrondissemnt.\n", + "* Select all rows for the districts of the 1st arrondissement.\n", "* For this subset, what is the total population of the arrondissement?\n", " \n", "" @@ -3476,7 +3476,7 @@ "\n", "**EXERCISE**:\n", "\n", - "* Select the districts with a population of more than 50.000 inhabitans.\n", + "* Select the districts with a population of more than 50.000 inhabitants.\n", "\n", "" ] @@ -3675,7 +3675,7 @@ "\n", "**EXERCISE**:\n", "\n", - "* How many districts are this that have a population of more than 50.000 inhabitans?\n", + "* How many districts have a population of more than 50.000 inhabitants?\n", "\n", "
\n", " Hints\n", @@ -3808,16 +3808,6 @@ } }, "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 49, - "metadata": {}, - "output_type": "execute_result" - }, { "data": { "image/png": "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\n", @@ -3832,7 +3822,7 @@ } ], "source": [ - "countries['pop_est'].plot()" + "countries['pop_est'].plot();" ] }, { @@ -3895,7 +3885,7 @@ "editable": true }, "source": [ - "This is still not the best plot, but now you can see this is due to a few countries with a very large population." + "This is still not the best plot. This is due to a few countries with a very large population." ] }, { @@ -4057,7 +4047,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 54, "metadata": { "collapsed": false, "deletable": true, @@ -4073,7 +4063,7 @@ "" ] }, - "execution_count": 55, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" }, @@ -4107,7 +4097,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 55, "metadata": { "collapsed": false, "deletable": true, @@ -4123,7 +4113,7 @@ "(0.0, 500000000.0)" ] }, - "execution_count": 56, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" }, @@ -4162,7 +4152,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 56, "metadata": { "deletable": true, "editable": true @@ -4174,7 +4164,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 57, "metadata": { "collapsed": false, "deletable": true, @@ -4190,7 +4180,7 @@ "" ] }, - "execution_count": 58, + "execution_count": 57, "metadata": {}, "output_type": "execute_result" }, @@ -4266,7 +4256,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 58, "metadata": { "deletable": true, "editable": true @@ -4278,7 +4268,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 59, "metadata": { "collapsed": false, "deletable": true, @@ -4294,7 +4284,7 @@ "1219176238" ] }, - "execution_count": 60, + "execution_count": 59, "metadata": {}, "output_type": "execute_result" } @@ -4315,7 +4305,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 60, "metadata": { "collapsed": false, "deletable": true, @@ -4338,7 +4328,7 @@ "Name: pop_est, dtype: int64" ] }, - "execution_count": 61, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" } @@ -4365,7 +4355,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 61, "metadata": { "collapsed": false, "deletable": true, @@ -4381,7 +4371,7 @@ "" ] }, - "execution_count": 62, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" }, @@ -4414,7 +4404,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 62, "metadata": { "deletable": true, "editable": true @@ -4427,7 +4417,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 63, "metadata": { "collapsed": false, "deletable": true, @@ -4519,7 +4509,7 @@ "4 5 Gaillon 2 1345 188012.203855" ] }, - "execution_count": 64, + "execution_count": 63, "metadata": {}, "output_type": "execute_result" } @@ -4530,7 +4520,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 64, "metadata": { "collapsed": false, "deletable": true, @@ -4635,7 +4625,7 @@ "4 48.841487 2.430793 NaN " ] }, - "execution_count": 65, + "execution_count": 64, "metadata": {}, "output_type": "execute_result" } @@ -4661,7 +4651,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 65, "metadata": { "clear_cell": true, "collapsed": false, @@ -4682,7 +4672,7 @@ "" ] }, - "execution_count": 66, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" }, @@ -4714,14 +4704,14 @@ "\n", "EXERCISE:\n", "\n", - "* Using groupby(), calculate the total population of each of the arrondissments.\n", + "* Using groupby(), calculate the total population of each of the arrondissements.\n", "\n", "" ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 66, "metadata": { "clear_cell": true, "collapsed": false, @@ -4763,7 +4753,7 @@ "Name: population, dtype: int64" ] }, - "execution_count": 67, + "execution_count": 66, "metadata": {}, "output_type": "execute_result" } @@ -4790,7 +4780,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 67, "metadata": { "clear_cell": true, "collapsed": false, @@ -4804,10 +4794,10 @@ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 68, + "execution_count": 67, "metadata": {}, "output_type": "execute_result" }, @@ -4849,7 +4839,7 @@ }, { "cell_type": "code", - "execution_count": 69, + "execution_count": 68, "metadata": { "clear_cell": true, "deletable": true, @@ -4862,7 +4852,7 @@ }, { "cell_type": "code", - "execution_count": 70, + "execution_count": 69, "metadata": { "clear_cell": true, "collapsed": false, @@ -4879,7 +4869,7 @@ "" ] }, - "execution_count": 70, + "execution_count": 69, "metadata": {}, "output_type": "execute_result" }, @@ -4909,7 +4899,7 @@ "source": [ "## Other useful things to know!\n", "\n", - "This notebook is only a very short intro. The pandas library provides a lot more functionality for working with tabular data, which we won't be able to cover all in this course." + "This notebook is only an intro. The pandas library provides a lot more functionality for working with tabular data, which we won't be cover in this course." ] }, { @@ -4934,7 +4924,7 @@ }, { "cell_type": "code", - "execution_count": 71, + "execution_count": 70, "metadata": { "collapsed": false, "deletable": true, @@ -4956,7 +4946,7 @@ "Name: continent, dtype: int64" ] }, - "execution_count": 71, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -4987,7 +4977,7 @@ }, { "cell_type": "code", - "execution_count": 72, + "execution_count": 71, "metadata": { "collapsed": false, "deletable": true, @@ -5003,7 +4993,7 @@ "'Fiji'" ] }, - "execution_count": 72, + "execution_count": 71, "metadata": {}, "output_type": "execute_result" } @@ -5034,7 +5024,7 @@ }, { "cell_type": "code", - "execution_count": 73, + "execution_count": 72, "metadata": { "deletable": true, "editable": true @@ -5046,7 +5036,7 @@ }, { "cell_type": "code", - "execution_count": 74, + "execution_count": 73, "metadata": { "collapsed": false, "deletable": true, @@ -5138,7 +5128,7 @@ "4 LUX Luxembourg 107260 49.611660 6.130003" ] }, - "execution_count": 74, + "execution_count": 73, "metadata": {}, "output_type": "execute_result" } @@ -5149,7 +5139,7 @@ }, { "cell_type": "code", - "execution_count": 75, + "execution_count": 74, "metadata": { "collapsed": false, "deletable": true, @@ -5254,7 +5244,7 @@ "4 0.056823 " ] }, - "execution_count": 75, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -5275,7 +5265,7 @@ }, { "cell_type": "code", - "execution_count": 76, + "execution_count": 75, "metadata": { "collapsed": false, "deletable": true, @@ -5497,7 +5487,7 @@ "[209 rows x 10 columns]" ] }, - "execution_count": 76, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -5515,14 +5505,14 @@ "source": [ "## Towards geospatial data\n", "\n", - "The datasets used in this notebook are actually containing spatial information: data about areas (countries, districts) or point locations (cities, bike stations). But the data itself didn't always explicitly include the the spatial component. For example, we don't know the exact extent of the countries with the dataset used here. \n", + "The datasets used in this notebook are containing spatial information: data about areas (countries, districts) or point locations (cities, bike stations). But the data itself didn't always explicitly include the the spatial component. For example, we don't know the exact extent of the countries with the dataset used here. \n", "\n", "With point locations, such as the cities DataFrame, the location is included as two columns:" ] }, { "cell_type": "code", - "execution_count": 77, + "execution_count": 76, "metadata": { "collapsed": false, "deletable": true, @@ -5614,7 +5604,7 @@ "4 LUX Luxembourg 107260 49.611660 6.130003" ] }, - "execution_count": 77, + "execution_count": 76, "metadata": {}, "output_type": "execute_result" } @@ -5635,7 +5625,7 @@ }, { "cell_type": "code", - "execution_count": 78, + "execution_count": 77, "metadata": { "collapsed": false, "deletable": true, @@ -5651,7 +5641,7 @@ "" ] }, - "execution_count": 78, + "execution_count": 77, "metadata": {}, "output_type": "execute_result" }, @@ -5686,7 +5676,7 @@ }, { "cell_type": "code", - "execution_count": 79, + "execution_count": 78, "metadata": { "deletable": true, "editable": true @@ -5698,7 +5688,7 @@ }, { "cell_type": "code", - "execution_count": 80, + "execution_count": 79, "metadata": { "deletable": true, "editable": true @@ -5710,7 +5700,7 @@ }, { "cell_type": "code", - "execution_count": 81, + "execution_count": 80, "metadata": { "collapsed": false, "deletable": true, @@ -5884,7 +5874,7 @@ "[243 rows x 6 columns]" ] }, - "execution_count": 81, + "execution_count": 80, "metadata": {}, "output_type": "execute_result" } @@ -5902,16 +5892,6 @@ "source": [ "Now, we have a single column with the location information (the \"geometry\" column). This is the topic of the next notebook." ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "deletable": true, - "editable": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/_solved/02-introduction-geospatial-data.ipynb b/_solved/02-introduction-geospatial-data.ipynb index 4f2d192..d7c5a1e 100644 --- a/_solved/02-introduction-geospatial-data.ipynb +++ b/_solved/02-introduction-geospatial-data.ipynb @@ -2,12 +2,17 @@ "cells": [ { "cell_type": "markdown", - "metadata": { - "deletable": true, - "editable": true - }, + "metadata": {}, "source": [ - "# Introduction to geospatial vector data in Python" + "

Introduction to geospatial vector data in Python

\n", + "\n", + "\n", + "> *DS Python for GIS and Geoscience* \n", + "> *October, 2020*\n", + ">\n", + "> *© 2020, Joris Van den Bossche and Stijn Van Hoey (, ). Licensed under [CC BY 4.0 Creative Commons](http://creativecommons.org/licenses/by/4.0/)*\n", + "\n", + "---" ] }, { @@ -225,10 +230,10 @@ "editable": true }, "source": [ - "What can we observe:\n", + "What do we observe:\n", "\n", "- Using `.head()` we can see the first rows of the dataset, just like we can do with Pandas.\n", - "- There is a 'geometry' column and the different countries are represented as polygons\n", + "- There is a `geometry` column and the different countries are represented as polygons\n", "- We can use the `.plot()` method to quickly get a *basic* visualization of the data" ] }, @@ -286,7 +291,7 @@ "Such a `GeoDataFrame` is just like a pandas `DataFrame`, but with some additional functionality for working with geospatial data:\n", "\n", "* A `.geometry` attribute that always returns the column with the geometry information (returning a GeoSeries). The column name itself does not necessarily need to be 'geometry', but it will always be accessible as the `.geometry` attribute.\n", - "* It has some extra methods for working with spatial data (area, distance, buffer, intersection, ...), which we will see in later notebooks" + "* It has some extra methods for working with spatial data (area, distance, buffer, intersection, ...), which we will learn in later notebooks" ] }, { @@ -408,7 +413,7 @@ "editable": true }, "source": [ - "**It's still a DataFrame**, so we have all the pandas functionality available to use on the geospatial dataset, and to do data manipulations with the attributes and geometry information together.\n", + "**It's still a DataFrame**, so we have all the Pandas functionality available to use on the geospatial dataset, and to do data manipulations with the attributes and geometry information together.\n", "\n", "For example, we can calculate average population number over all countries (by accessing the 'pop_est' column, and calling the `mean` method on it):" ] @@ -464,7 +469,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 12, "metadata": { "collapsed": false, "deletable": true, @@ -474,16 +479,6 @@ } }, "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 11, - "metadata": {}, - "output_type": "execute_result" - }, { "data": { "image/png": "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\n", @@ -498,7 +493,7 @@ } ], "source": [ - "africa.plot()" + "africa.plot();" ] }, { @@ -552,7 +547,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 13, "metadata": { "collapsed": false, "deletable": true, @@ -588,7 +583,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 14, "metadata": { "deletable": true, "editable": true @@ -600,7 +595,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 15, "metadata": { "collapsed": false, "deletable": true, @@ -634,7 +629,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 16, "metadata": { "deletable": true, "editable": true @@ -646,7 +641,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 17, "metadata": { "collapsed": false, "deletable": true, @@ -682,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 18, "metadata": { "collapsed": false, "deletable": true, @@ -698,7 +693,7 @@ "shapely.geometry.polygon.Polygon" ] }, - "execution_count": 17, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -719,7 +714,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 19, "metadata": { "deletable": true, "editable": true @@ -731,7 +726,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 20, "metadata": { "deletable": true, "editable": true @@ -743,7 +738,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 21, "metadata": { "collapsed": false, "deletable": true, @@ -767,7 +762,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 22, "metadata": { "deletable": true, "editable": true @@ -779,7 +774,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 23, "metadata": { "collapsed": false, "deletable": true, @@ -795,7 +790,7 @@ "0.5" ] }, - "execution_count": 22, + "execution_count": 23, "metadata": {}, "output_type": "execute_result" } @@ -806,7 +801,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 24, "metadata": { "collapsed": false, "deletable": true, @@ -822,7 +817,7 @@ "1.4142135623730951" ] }, - "execution_count": 23, + "execution_count": 24, "metadata": {}, "output_type": "execute_result" } @@ -864,7 +859,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 25, "metadata": { "collapsed": false, "deletable": true, @@ -880,7 +875,7 @@ "[(-20.0, 60.0), (-40.0, 40.0)]" ] }, - "execution_count": 24, + "execution_count": 25, "metadata": {}, "output_type": "execute_result" }, @@ -911,7 +906,7 @@ "editable": true }, "source": [ - "See the [04-more-on-visualization.ipynb](04-more-on-visualization.ipynb) notebook for more details on visualizing geospatial datasets." + "See the [visualization-02-geopandas.ipynb](visualization-02-geopandas.ipynb) notebook for more details on visualizing geospatial datasets." ] }, { @@ -949,13 +944,15 @@ "We will start with exploring the bicycle station dataset (available as a GeoPackage file: `data/paris_bike_stations_mercator.gpkg`)\n", " \n", "* Read the stations datasets into a GeoDataFrame called `stations`.\n", - "* Check the type of the returned object (with `type(..)`)\n", - "* Check the first rows of the dataframes. What kind of geometries dooes this datasets contain?\n", - "* How many features are there in the dataset? (hint: use the `.shape` attribute)\n", + "* Check the type of the returned object\n", + "* Check the first rows of the dataframes. What kind of geometries does this datasets contain?\n", + "* How many features are there in the dataset? \n", " \n", "
Hints\n", "\n", + "* Use `type(..)` to check any Python object type\n", "* The geopandas.read_file() function can read different geospatial file formats. You pass the file name as first argument.\n", + "* Use the `.shape` attribute to get the number of features\n", "\n", "
\n", " \n", @@ -965,7 +962,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 26, "metadata": { "clear_cell": true, "deletable": true, @@ -978,7 +975,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 27, "metadata": { "clear_cell": true, "collapsed": false, @@ -995,7 +992,7 @@ "geopandas.geodataframe.GeoDataFrame" ] }, - "execution_count": 26, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" } @@ -1006,7 +1003,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 28, "metadata": { "clear_cell": true, "collapsed": false, @@ -1100,7 +1097,7 @@ "4 POINT (270594.689 6248007.705) " ] }, - "execution_count": 27, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -1111,7 +1108,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 29, "metadata": { "clear_cell": true, "collapsed": false, @@ -1128,7 +1125,7 @@ "(1226, 4)" ] }, - "execution_count": 28, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -1149,14 +1146,14 @@ "**EXERCISE**:\n", "\n", "* Make a quick plot of the `stations` dataset.\n", - "* Make the plot a bit larger byt setting the figure size to (12, 6) (hint: the `plot` method accepts a `figsize` keyword).\n", + "* Make the plot a bit larger by setting the figure size to (12, 6) (hint: the `plot` method accepts a `figsize` keyword).\n", " \n", "" ] }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 30, "metadata": { "clear_cell": true, "collapsed": false, @@ -1173,7 +1170,7 @@ "" ] }, - "execution_count": 29, + "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, @@ -1206,8 +1203,6 @@ "We are going to make use of the [contextily](https://github.com/darribas/contextily) package. The `add_basemap()` function of this package makes it easy to add a background web map to our plot. We begin by plotting our data first, and then pass the matplotlib axes object (returned by dataframe's `plot()` method) to the `add_basemap()` function. `contextily` will then download the web tiles needed for the geographical extent of your plot.\n", "\n", "\n", - "\n", - "\n", "
\n", "\n", "**EXERCISE**:\n", @@ -1222,7 +1217,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 31, "metadata": { "clear_cell": true, "deletable": true, @@ -1235,7 +1230,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 32, "metadata": { "clear_cell": true, "collapsed": false, @@ -1290,7 +1285,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 33, "metadata": { "clear_cell": true, "collapsed": false, @@ -1307,7 +1302,7 @@ "" ] }, - "execution_count": 32, + "execution_count": 33, "metadata": {}, "output_type": "execute_result" }, @@ -1342,7 +1337,7 @@ "Let's now visualize where the available bikes are actually stationed:\n", " \n", "* Make a plot of the `stations` dataset (also with a (12, 6) figsize).\n", - "* Use the `'available_bikes'` colums to determine the color of the points. For this, use the `column=` keyword.\n", + "* Use the `'available_bikes'` columns to determine the color of the points. For this, use the `column=` keyword.\n", "* Use the `legend=True` keyword to show a color bar.\n", " \n", "
" @@ -1350,7 +1345,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 34, "metadata": { "clear_cell": true, "collapsed": false, @@ -1367,7 +1362,7 @@ "" ] }, - "execution_count": 33, + "execution_count": 34, "metadata": {}, "output_type": "execute_result" }, @@ -1411,7 +1406,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 35, "metadata": { "clear_cell": true, "deletable": true, @@ -1424,7 +1419,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 36, "metadata": { "clear_cell": true, "collapsed": false, @@ -1518,7 +1513,7 @@ "4 POLYGON ((451328.752 5412991.278, 451294.721 5... " ] }, - "execution_count": 35, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1529,7 +1524,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 37, "metadata": { "clear_cell": true, "collapsed": false, @@ -1546,7 +1541,7 @@ "(80, 4)" ] }, - "execution_count": 36, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1557,7 +1552,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 38, "metadata": { "clear_cell": true, "collapsed": false, @@ -1574,7 +1569,7 @@ "" ] }, - "execution_count": 37, + "execution_count": 38, "metadata": {}, "output_type": "execute_result" }, @@ -1614,7 +1609,7 @@ "\n", "
Hints\n", "\n", - "* Adding a column can be done by assing values to a column using the same square brackets syntax: `df['new_col'] = values`\n", + "* Adding a column can be done by assigning values to a column using the same square brackets syntax: `df['new_col'] = values`\n", "* To sort the rows of a DataFrame, use the `sort_values()` method, specifying the colum to sort on with the `by='col_name'` keyword. Check the help of this method to see how to sort ascending or descending.\n", "\n", "
\n", @@ -1624,7 +1619,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 39, "metadata": { "clear_cell": true, "collapsed": false, @@ -1652,7 +1647,7 @@ "Length: 80, dtype: float64" ] }, - "execution_count": 38, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1663,7 +1658,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 40, "metadata": { "clear_cell": true, "deletable": true, @@ -1677,7 +1672,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 41, "metadata": { "clear_cell": true, "collapsed": false, @@ -1840,7 +1835,7 @@ "[80 rows x 5 columns]" ] }, - "execution_count": 40, + "execution_count": 41, "metadata": {}, "output_type": "execute_result" } @@ -1869,7 +1864,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 42, "metadata": { "clear_cell": true, "deletable": true, @@ -1884,7 +1879,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 43, "metadata": { "clear_cell": true, "collapsed": false, @@ -1901,7 +1896,7 @@ "" ] }, - "execution_count": 42, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" }, @@ -1925,7 +1920,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 44, "metadata": { "clear_cell": true, "collapsed": false, @@ -1942,7 +1937,7 @@ "" ] }, - "execution_count": 43, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, @@ -1990,7 +1985,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "metadata": { "deletable": true, "editable": true @@ -2205,7 +2200,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 47, "metadata": { "deletable": true, "editable": true @@ -2260,7 +2255,7 @@ "1 POINT (2.00000 2.00000) 2 0.2" ] }, - "execution_count": 45, + "execution_count": 47, "metadata": {}, "output_type": "execute_result" } @@ -2286,7 +2281,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 48, "metadata": { "deletable": true, "editable": true @@ -2302,7 +2297,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 49, "metadata": { "deletable": true, "editable": true @@ -2315,7 +2310,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 50, "metadata": { "deletable": true, "editable": true @@ -2403,7 +2398,7 @@ "4 Caracas Venezuela 10.48 -66.86 POINT (-66.86000 10.48000)" ] }, - "execution_count": 48, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } diff --git a/_solved/03-coordinate-reference-systems.ipynb b/_solved/03-coordinate-reference-systems.ipynb index 47c270a..e39fee6 100644 --- a/_solved/03-coordinate-reference-systems.ipynb +++ b/_solved/03-coordinate-reference-systems.ipynb @@ -7,12 +7,20 @@ "editable": true }, "source": [ - "# Coordinate reference systems" + "

Coordinate reference systems

\n", + "\n", + "\n", + "> *DS Python for GIS and Geoscience* \n", + "> *October, 2020*\n", + ">\n", + "> *© 2020, Joris Van den Bossche and Stijn Van Hoey (, ). Licensed under [CC BY 4.0 Creative Commons](http://creativecommons.org/licenses/by/4.0/)*\n", + "\n", + "---" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 3, "metadata": { "deletable": true, "editable": true @@ -27,7 +35,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 4, "metadata": { "deletable": true, "editable": true @@ -52,7 +60,7 @@ "\n", "> The **Coordinate Reference System (CRS)** relates the coordinates to a specific location on earth.\n", "\n", - "For a nice in-depth explanation, see https://docs.qgis.org/2.8/en/docs/gentle_gis_introduction/coordinate_reference_systems.html" + "For an in-depth explanation, see https://docs.qgis.org/2.8/en/docs/gentle_gis_introduction/coordinate_reference_systems.html" ] }, { @@ -97,7 +105,7 @@ "\n", "We project the surface of the earth onto a 2D plane so we can express locations in cartesian x and y coordinates, on a flat surface. In this plane, we then typically work with a length unit such as meters instead of degrees, which makes the analysis more convenient and effective.\n", "\n", - "However, there is an important remark: the 3 dimensional earth can never be represented perfectly on a 2 dimensional map, so projections inevitably introduce distortions. To minimise such errors, there are different approaches to project, each with specific advantages and disadvantages.\n", + "However, there is an important remark: the 3 dimensional earth can never be represented perfectly on a 2 dimensional map, so projections inevitably introduce distortions. To minimize such errors, there are different approaches to project, each with specific advantages and disadvantages.\n", "\n", "Some projection systems will try to preserve the area size of geometries, such as the Albers Equal Area projection. Other projection systems try to preserve angles, such as the Mercator projection, but will see big distortions in the area. Every projection system will always have some distortion of area, angle or distance.\n", "\n", @@ -144,7 +152,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 5, "metadata": { "collapsed": false, "deletable": true, @@ -170,7 +178,7 @@ "- Prime Meridian: Greenwich" ] }, - "execution_count": 3, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -194,7 +202,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 6, "metadata": { "collapsed": false, "deletable": true, @@ -210,7 +218,7 @@ "" ] }, - "execution_count": 4, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" }, @@ -277,7 +285,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 7, "metadata": { "deletable": true, "editable": true @@ -290,7 +298,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": { "deletable": true, "editable": true @@ -302,7 +310,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": { "collapsed": false, "deletable": true, @@ -318,7 +326,7 @@ "" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" }, @@ -371,7 +379,7 @@ "\n", "- Mapping (distortion of shape and distances)\n", "\n", - "- Distance / area based calculations -> ensure you use an appropriate projected coordinate system expressed in a meaningful unit such as metres or feet (not degrees).\n", + "- Distance / area based calculations -> ensure you use an appropriate projected coordinate system expressed in a meaningful unit such as meters or feet (not degrees).\n", "\n", "
\n", "\n", @@ -413,7 +421,7 @@ "\n", "* Read the districts datasets (`\"data/paris_districts.geojson\"`) into a GeoDataFrame called `districts`.\n", "* Look at the CRS attribute of the GeoDataFrame. Do you recognize the EPSG number?\n", - "* Make a simple plot of the `districts` dataset.\n", + "* Make a plot of the `districts` dataset.\n", "* Calculate the area of all districts.\n", "* Convert the `districts` to a projected CRS (using the `EPSG:2154` for France). Call the new dataset `districts_RGF93`.\n", "* Make a similar plot of `districts_RGF93`.\n", @@ -422,9 +430,9 @@ " \n", "
Hints\n", "\n", - "* The CRS information is stored in the `crs` attribute of a GeoDataFrame.\n", + "* The CRS information is stored in the `.crs` attribute of a GeoDataFrame.\n", "* Making a simple plot of a GeoDataFrame can be done with the `.plot()` method.\n", - "* Converting to a different CRS can be done with the `to_crs()` method, and the CRS can be specified as an EPSG number using the `epsg` keyword.\n", + "* Converting to a different CRS can be done with the `.to_crs()` method, and the CRS can be specified as an EPSG number using the `epsg` keyword.\n", "\n", "
\n", "\n", @@ -433,7 +441,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": { "clear_cell": true, "deletable": true, @@ -447,7 +455,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": { "clear_cell": true, "collapsed": false, @@ -474,7 +482,7 @@ "- Prime Meridian: Greenwich" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -486,7 +494,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": { "clear_cell": true, "collapsed": false, @@ -580,7 +588,7 @@ "4 POLYGON ((2.33632 48.86797, 2.33587 48.86700, ... " ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -592,7 +600,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": { "clear_cell": true, "collapsed": false, @@ -609,7 +617,7 @@ "" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" }, @@ -633,7 +641,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": { "clear_cell": true, "collapsed": false, @@ -648,7 +656,7 @@ "name": "stderr", "output_type": "stream", "text": [ - ":2: UserWarning: Geometry is in a geographic CRS. Results from 'area' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + ":2: UserWarning: Geometry is in a geographic CRS. Results from 'area' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " districts.geometry.area\n" ] @@ -670,7 +678,7 @@ "Length: 80, dtype: float64" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -682,7 +690,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": { "clear_cell": true, "deletable": true, @@ -696,7 +704,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": { "clear_cell": true, "collapsed": false, @@ -713,7 +721,7 @@ "" ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" }, @@ -737,7 +745,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": { "clear_cell": true, "collapsed": false, @@ -765,7 +773,7 @@ "Length: 80, dtype: float64" ] }, - "execution_count": 15, + "execution_count": 17, "metadata": {}, "output_type": "execute_result" } @@ -786,7 +794,7 @@ "\n", "**EXERCISE:**\n", "\n", - "In the first notebook, we did an exercise on plotting the bike stations locations in Paris and adding a background map to it using the `contextily` package.\n", + "In the previous notebook, we did an exercise on plotting the bike stations locations in Paris and adding a background map to it using the `contextily` package.\n", "\n", "Currently, `contextily` assumes that your data is in the Web Mercator projection, the system used by most web tile services. And in that first exercise, we provided the data in the appropriate CRS so you didn't need to care about this aspect.\n", "\n", @@ -800,7 +808,7 @@ "
Hints\n", "\n", "* Making a simple plot of a GeoDataFrame can be done with the `.plot()` method. This returns a matplotlib axes object.\n", - "* The marker size can be specified with the `markersize` keyword if the `plot()` method.\n", + "* The marker size can be specified with the `markersize` keyword if the `.plot()` method.\n", "* To add a background map, use the `contextily.add_basemap()` function. It takes the matplotlib `ax` to which to add a map as the first argument.\n", "\n", "
\n", @@ -810,7 +818,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": { "clear_cell": true, "collapsed": false, @@ -904,7 +912,7 @@ "4 POINT (2.43079 48.84149) " ] }, - "execution_count": 16, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -916,7 +924,7 @@ }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": { "clear_cell": true, "collapsed": false, @@ -1010,7 +1018,7 @@ "4 POINT (2.43079 48.84149) " ] }, - "execution_count": 17, + "execution_count": 19, "metadata": {}, "output_type": "execute_result" } @@ -1023,7 +1031,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": { "clear_cell": true, "collapsed": false, @@ -1053,16 +1061,6 @@ "ax = stations_webmercator.plot(markersize=5)\n", "contextily.add_basemap(ax)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "deletable": true, - "editable": true - }, - "outputs": [], - "source": [] } ], "metadata": { diff --git a/_solved/04-spatial-relationships-joins.ipynb b/_solved/04-spatial-relationships-joins.ipynb index 1218fec..68b6663 100644 --- a/_solved/04-spatial-relationships-joins.ipynb +++ b/_solved/04-spatial-relationships-joins.ipynb @@ -4,12 +4,20 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "# Spatial relationships and joins" + "

Spatial relationships and joins

\n", + "\n", + "\n", + "> *DS Python for GIS and Geoscience* \n", + "> *October, 2020*\n", + ">\n", + "> *© 2020, Joris Van den Bossche and Stijn Van Hoey (, ). Licensed under [CC BY 4.0 Creative Commons](http://creativecommons.org/licenses/by/4.0/)*\n", + "\n", + "---" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "metadata": {}, "outputs": [], "source": [ @@ -21,7 +29,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -62,7 +70,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -78,7 +86,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -95,7 +103,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "metadata": {}, "outputs": [], "source": [ @@ -112,7 +120,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 8, "metadata": {}, "outputs": [ { @@ -121,7 +129,7 @@ "" ] }, - "execution_count": 6, + "execution_count": 8, "metadata": {}, "output_type": "execute_result" }, @@ -153,7 +161,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -162,7 +170,7 @@ "True" ] }, - "execution_count": 7, + "execution_count": 9, "metadata": {}, "output_type": "execute_result" } @@ -180,7 +188,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 10, "metadata": {}, "outputs": [ { @@ -189,7 +197,7 @@ "True" ] }, - "execution_count": 8, + "execution_count": 10, "metadata": {}, "output_type": "execute_result" } @@ -207,7 +215,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -216,7 +224,7 @@ "False" ] }, - "execution_count": 9, + "execution_count": 11, "metadata": {}, "output_type": "execute_result" } @@ -227,7 +235,7 @@ }, { "cell_type": "code", - "execution_count": 10, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -236,7 +244,7 @@ "False" ] }, - "execution_count": 10, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -254,7 +262,7 @@ }, { "cell_type": "code", - "execution_count": 11, + "execution_count": 13, "metadata": {}, "outputs": [ { @@ -263,7 +271,7 @@ "False" ] }, - "execution_count": 11, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } @@ -274,7 +282,7 @@ }, { "cell_type": "code", - "execution_count": 12, + "execution_count": 14, "metadata": {}, "outputs": [ { @@ -283,7 +291,7 @@ "True" ] }, - "execution_count": 12, + "execution_count": 14, "metadata": {}, "output_type": "execute_result" } @@ -305,7 +313,7 @@ }, { "cell_type": "code", - "execution_count": 13, + "execution_count": 15, "metadata": {}, "outputs": [ { @@ -325,7 +333,7 @@ "Length: 177, dtype: bool" ] }, - "execution_count": 13, + "execution_count": 15, "metadata": {}, "output_type": "execute_result" } @@ -343,7 +351,7 @@ }, { "cell_type": "code", - "execution_count": 14, + "execution_count": 16, "metadata": {}, "outputs": [ { @@ -397,7 +405,7 @@ "55 MULTIPOLYGON (((2.51357 51.14851, 2.65842 50.7... " ] }, - "execution_count": 14, + "execution_count": 16, "metadata": {}, "output_type": "execute_result" } @@ -422,7 +430,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 17, "metadata": {}, "outputs": [], "source": [ @@ -431,7 +439,7 @@ }, { "cell_type": "code", - "execution_count": 16, + "execution_count": 18, "metadata": {}, "outputs": [ { @@ -507,7 +515,7 @@ "124 POLYGON ((-69.52968 -10.95173, -68.66508 -12.5... " ] }, - "execution_count": 16, + "execution_count": 18, "metadata": {}, "output_type": "execute_result" } @@ -550,12 +558,12 @@ "source": [ "## Let's practice!\n", "\n", - "We will again use the Paris datasets to do some exercises. Let's start importing them again, and directly converting both to the local projected CRS:" + "We will again use the Paris datasets to exercise. Let's start importing them again, and directly converting both to the local projected CRS:" ] }, { "cell_type": "code", - "execution_count": 17, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -573,7 +581,7 @@ "\n", "The Eiffel Tower is an iron lattice tower built in the 19th century, and is probably the most iconic view of Paris.\n", "\n", - "The location of the Eiffel Tower is: x of 648237.3 and y of 6862271.9.\n", + "The location of the Eiffel Tower is: x of 648237.3 and y of 6862271.9\n", "\n", "* Create a Shapely point object with the coordinates of the Eiffel Tower and assign it to a variable called `eiffel_tower`. Print the result.\n", "* Check if the Eiffel Tower is located within the Montparnasse district (provided).\n", @@ -596,7 +604,7 @@ }, { "cell_type": "code", - "execution_count": 18, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -606,7 +614,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 21, "metadata": { "clear_cell": true }, @@ -618,7 +626,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 22, "metadata": { "clear_cell": true }, @@ -638,7 +646,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 23, "metadata": {}, "outputs": [], "source": [ @@ -649,7 +657,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 24, "metadata": { "clear_cell": true }, @@ -669,7 +677,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 25, "metadata": { "clear_cell": true }, @@ -689,7 +697,7 @@ }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 26, "metadata": { "clear_cell": true }, @@ -733,7 +741,7 @@ }, { "cell_type": "code", - "execution_count": 25, + "execution_count": 27, "metadata": {}, "outputs": [], "source": [ @@ -743,7 +751,7 @@ }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 28, "metadata": { "clear_cell": true }, @@ -765,7 +773,7 @@ "Length: 80, dtype: bool" ] }, - "execution_count": 26, + "execution_count": 28, "metadata": {}, "output_type": "execute_result" } @@ -778,7 +786,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 29, "metadata": { "clear_cell": true }, @@ -830,7 +838,7 @@ "27 POLYGON ((649336.752 6861767.761, 649110.815 6... " ] }, - "execution_count": 27, + "execution_count": 29, "metadata": {}, "output_type": "execute_result" } @@ -858,8 +866,8 @@ "\n", "
Hints\n", "\n", - "* The `distance()` method of a GeoDataFrame works element-wise: it calculates the distance between each geometry in the GeoDataFrame and the geometry passed to the method.\n", - "* A Series has a `min()` method to calculate the minimum value.\n", + "* The `.distance()` method of a GeoDataFrame works element-wise: it calculates the distance between each geometry in the GeoDataFrame and the geometry passed to the method.\n", + "* A Series has a `.min()` method to calculate the minimum value.\n", "* To create a boolean mask based on a condition, we can do e.g. `s < 100`.\n", "\n", "
\n", @@ -869,7 +877,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 30, "metadata": { "clear_cell": true }, @@ -881,7 +889,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 31, "metadata": { "clear_cell": true }, @@ -892,7 +900,7 @@ "232.34672323449053" ] }, - "execution_count": 29, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } @@ -904,7 +912,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 32, "metadata": { "clear_cell": true }, @@ -916,7 +924,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 33, "metadata": {}, "outputs": [ { @@ -991,7 +999,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 34, "metadata": {}, "outputs": [], "source": [ @@ -1001,7 +1009,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 35, "metadata": {}, "outputs": [ { @@ -1067,7 +1075,7 @@ "235 Paris POINT (2.33139 48.86864) FRA" ] }, - "execution_count": 33, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" } @@ -1078,7 +1086,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 36, "metadata": {}, "outputs": [ { @@ -1151,7 +1159,7 @@ "4 ARG Argentina South America" ] }, - "execution_count": 34, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1172,7 +1180,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 37, "metadata": {}, "outputs": [ { @@ -1248,7 +1256,7 @@ "3 Paris POINT (2.33139 48.86864) FRA France Europe" ] }, - "execution_count": 35, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" } @@ -1261,7 +1269,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "**But**, for this illustrative example, we added the common column manually, it is not present in the original dataset. However, we can still know how to join those two datasets based on their spatial coordinates." + "**But** for this illustrative example we added the common column manually, it is not present in the original dataset. However, we can still know how to join those two datasets based on their spatial coordinates." ] }, { @@ -1279,7 +1287,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 38, "metadata": {}, "outputs": [], "source": [ @@ -1288,7 +1296,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 39, "metadata": {}, "outputs": [ { @@ -1308,7 +1316,7 @@ "Length: 243, dtype: bool" ] }, - "execution_count": 37, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1327,7 +1335,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 40, "metadata": {}, "outputs": [ { @@ -1388,7 +1396,7 @@ "235 Paris POINT (2.33139 48.86864)" ] }, - "execution_count": 38, + "execution_count": 40, "metadata": {}, "output_type": "execute_result" } @@ -1449,7 +1457,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 41, "metadata": {}, "outputs": [], "source": [ @@ -1458,7 +1466,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 42, "metadata": {}, "outputs": [ { @@ -1649,7 +1657,7 @@ "[243 rows x 8 columns]" ] }, - "execution_count": 40, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" } @@ -1660,7 +1668,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 43, "metadata": {}, "outputs": [ { @@ -1675,7 +1683,7 @@ "Name: continent, dtype: int64" ] }, - "execution_count": 41, + "execution_count": 43, "metadata": {}, "output_type": "execute_result" } @@ -1695,7 +1703,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 44, "metadata": {}, "outputs": [], "source": [ @@ -1724,7 +1732,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 45, "metadata": { "clear_cell": true }, @@ -1735,7 +1743,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 46, "metadata": { "clear_cell": true }, @@ -1835,7 +1843,7 @@ "429 POINT (651261.351 6859926.893) 52 Montparnasse " ] }, - "execution_count": 44, + "execution_count": 46, "metadata": {}, "output_type": "execute_result" } @@ -1852,7 +1860,7 @@ "\n", "**EXERCISE: Map of tree density by district (I)**\n", "\n", - "Using a dataset of all trees in public spaces in Paris, the goal is to make a map of the tree density by district. For this, we first need to find out how many trees each district contains, which we will do in this exercise. In the following exercise, we will then use this result to calculate the density and create a map.\n", + "Using a dataset of all trees in public spaces in Paris, the goal is to make a map of the tree density by district. We first need to find out how many trees each district contains, which we will do in this exercise. In the following exercise, we will use this result to calculate the density and create a map.\n", "\n", "To obtain the tree count by district, we first need to know in which district each tree is located, which we can do with a spatial join. Then, using the result of the spatial join, we will calculate the number of trees located in each district using the pandas 'group-by' functionality.\n", "\n", @@ -1872,7 +1880,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 50, "metadata": { "clear_cell": true }, @@ -1885,7 +1893,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 51, "metadata": { "clear_cell": true }, @@ -1960,7 +1968,7 @@ "4 Sophora Alignement POINT (447041.361 5409756.712)" ] }, - "execution_count": 46, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" } @@ -1972,7 +1980,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 52, "metadata": { "clear_cell": true }, @@ -2078,7 +2086,7 @@ "428 44 Sainte-Marguerite 36476 " ] }, - "execution_count": 47, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -2097,15 +2105,15 @@ "\n", "**EXERCISE: Map of tree density by district (II)**\n", "\n", - "- Calculate the number of trees located in each district: group the `joined` DataFrame by the `'district_name'` column, and calculate the size of each group. Call the resulting Series `trees_by_district`.
\n", - " We then convert `trees_by_district` to a DataFrame for the next exercise.\n", + "Calculate the number of trees located in each district: group the `joined` DataFrame by the `'district_name'` column, and calculate the size of each group. Call the resulting Series `trees_by_district`.
\n", + "\n", + "We then convert `trees_by_district` to a DataFrame for the next exercise.\n", "\n", "
Hints\n", "\n", "- The general group-by syntax in pandas is: `df.groupby('key').aggregation_method()`, substituting 'key' and 'aggregation_method' with the appropriate column name and method. \n", "- To know the size of groups, we can use the `.size()` method.\n", "\n", - "\n", "
\n", "\n", "
" @@ -2113,7 +2121,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 53, "metadata": { "clear_cell": true }, @@ -2125,7 +2133,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 54, "metadata": { "clear_cell": true }, @@ -2137,7 +2145,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 55, "metadata": { "clear_cell": true }, @@ -2205,7 +2213,7 @@ "Auteuil 392" ] }, - "execution_count": 50, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -2227,7 +2235,7 @@ "\n", "For this, we first need to merge the number of trees in each district we calculated in the previous step (`trees_by_district`) back to the districts dataset. We will use the [`pd.merge()`](https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.merge.html) function to join two dataframes based on a common column.\n", "\n", - "Since not all districts have the same size, it is a fairer comparison to visualize the tree density: the number of trees relative to the area.\n", + "Since not all districts have the same size, we should compare the tree density for the visualisation: the number of trees relative to the area.\n", "\n", "- Use the `pd.merge()` function to merge `districts` and `trees_by_district` dataframes on the `'district_name'` column. Call the result `districts_trees`.\n", "- Add a column `'n_trees_per_area'` to the `districts_trees` dataframe, based on the `'n_trees'` column divided by the area.\n", @@ -2251,7 +2259,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 56, "metadata": { "clear_cell": true }, @@ -2345,7 +2353,7 @@ "4 POLYGON ((451328.752 5412991.278, 451294.721 5... 7 " ] }, - "execution_count": 51, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -2358,7 +2366,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 57, "metadata": { "clear_cell": true }, @@ -2370,7 +2378,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 58, "metadata": { "clear_cell": true }, diff --git a/_solved/05-spatial-operations-overlays.ipynb b/_solved/05-spatial-operations-overlays.ipynb index 1cda0c8..97e0eb9 100644 --- a/_solved/05-spatial-operations-overlays.ipynb +++ b/_solved/05-spatial-operations-overlays.ipynb @@ -1,5 +1,20 @@ { "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "

Spatial operations and overlays: creating new geometries

\n", + "\n", + "\n", + "> *DS Python for GIS and Geoscience* \n", + "> *October, 2020*\n", + ">\n", + "> *© 2020, Joris Van den Bossche and Stijn Van Hoey (, ). Licensed under [CC BY 4.0 Creative Commons](http://creativecommons.org/licenses/by/4.0/)*\n", + "\n", + "---" + ] + }, { "cell_type": "markdown", "metadata": { @@ -7,8 +22,6 @@ "editable": true }, "source": [ - "# Spatial operations and overlays: creating new geometries\n", - "\n", "In the previous notebook we have seen how to identify and use the spatial relationships between geometries. In this notebook, we will see how to create new geometries based on those relationships." ] }, @@ -168,7 +181,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 5, @@ -198,7 +211,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 6, @@ -228,7 +241,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 7, @@ -257,8 +270,7 @@ "editable": true }, "source": [ - "Above we showed how to create a new geometry based on two individual shapely geometries. \n", - "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", + "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" ] @@ -480,7 +492,7 @@ "" ], "text/plain": [ - "" + "" ] }, "execution_count": 15, @@ -699,8 +711,7 @@ "\n", "**REMEMBER**:\n", "\n", - "GeoPandas (and Shapely for the individual objects) provides a whole lot of basic methods to analyse the geospatial data (distance, length, centroid, boundary, convex_hull, simplify, transform, ....), much more than the few that we can touch in this tutorial.\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", @@ -730,20 +741,20 @@ "\n", "**EXERCISE: What are the districts close to the Seine?**\n", "\n", - "Below, the coordinates for the Seine river in the neighbourhood of Paris are provided as a GeoJSON-like feature dictionary (created at http://geojson.io). \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", + "* 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", "" ] }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 24, "metadata": { "clear_cell": false, "deletable": true, @@ -756,7 +767,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 25, "metadata": { "clear_cell": false, "deletable": true, @@ -771,7 +782,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 26, "metadata": { "deletable": true, "editable": true @@ -784,7 +795,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 27, "metadata": { "collapsed": false, "deletable": true, @@ -800,7 +811,7 @@ "" ] }, - "execution_count": 22, + "execution_count": 27, "metadata": {}, "output_type": "execute_result" }, @@ -826,42 +837,40 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 30, "metadata": { "deletable": true, "editable": true }, - "outputs": [], + "outputs": [ + { + "data": { + "image/svg+xml": [ + "" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], "source": [ "# access the single geometry object\n", - "seine = s_seine_utm.geometry.item()" + "seine = s_seine_utm.geometry.item()\n", + "seine" ] }, { "cell_type": "code", - "execution_count": 24, + "execution_count": 31, "metadata": { "clear_cell": true, "deletable": true, "editable": true }, - "outputs": [], - "source": [ - "seine_buffer = seine.buffer(150)" - ] - }, - { - "cell_type": "code", - "execution_count": 25, - "metadata": { - "clear_cell": true, - "collapsed": false, - "deletable": true, - "editable": true, - "jupyter": { - "outputs_hidden": false - } - }, "outputs": [ { "data": { @@ -869,21 +878,23 @@ "" ], "text/plain": [ - "" + "" ] }, - "execution_count": 25, + "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ + "# Take a buffer\n", + "seine_buffer = seine.buffer(150)\n", "seine_buffer" ] }, { "cell_type": "code", - "execution_count": 26, + "execution_count": 34, "metadata": { "clear_cell": true, "deletable": true, @@ -891,12 +902,13 @@ }, "outputs": [], "source": [ + "# Use the intersection\n", "districts_seine = districts[districts.intersects(seine_buffer)]" ] }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 35, "metadata": { "clear_cell": true, "collapsed": false, @@ -913,7 +925,7 @@ "" ] }, - "execution_count": 27, + "execution_count": 35, "metadata": {}, "output_type": "execute_result" }, @@ -931,12 +943,20 @@ } ], "source": [ + "# Make a plot\n", "fig, ax = plt.subplots(figsize=(20, 10))\n", "districts.plot(ax=ax, color='grey', alpha=0.4, edgecolor='k')\n", "districts_seine.plot(ax=ax, color='blue', alpha=0.4, edgecolor='k')\n", "s_seine_utm.plot(ax=ax)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "------" + ] + }, { "cell_type": "markdown", "metadata": { @@ -971,7 +991,7 @@ }, { "cell_type": "code", - "execution_count": 28, + "execution_count": 36, "metadata": { "clear_cell": true, "collapsed": false, @@ -1053,7 +1073,7 @@ "4 POLYGON ((3751390.345 2888647.357, 3751390.370... " ] }, - "execution_count": 28, + "execution_count": 36, "metadata": {}, "output_type": "execute_result" } @@ -1066,7 +1086,7 @@ }, { "cell_type": "code", - "execution_count": 29, + "execution_count": 37, "metadata": { "clear_cell": true, "collapsed": false, @@ -1083,7 +1103,7 @@ "" ] }, - "execution_count": 29, + "execution_count": 37, "metadata": {}, "output_type": "execute_result" }, @@ -1107,7 +1127,7 @@ }, { "cell_type": "code", - "execution_count": 30, + "execution_count": 38, "metadata": { "clear_cell": true, "deletable": true, @@ -1121,7 +1141,7 @@ }, { "cell_type": "code", - "execution_count": 31, + "execution_count": 39, "metadata": { "clear_cell": true, "collapsed": false, @@ -1147,7 +1167,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 31, + "execution_count": 39, "metadata": {}, "output_type": "execute_result" } @@ -1171,7 +1191,7 @@ "\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", + "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", @@ -1190,7 +1210,7 @@ }, { "cell_type": "code", - "execution_count": 32, + "execution_count": 40, "metadata": { "deletable": true, "editable": true @@ -1203,7 +1223,7 @@ }, { "cell_type": "code", - "execution_count": 33, + "execution_count": 41, "metadata": { "deletable": true, "editable": true @@ -1218,7 +1238,7 @@ }, { "cell_type": "code", - "execution_count": 34, + "execution_count": 42, "metadata": { "collapsed": false, "deletable": true, @@ -1234,7 +1254,7 @@ "" ] }, - "execution_count": 34, + "execution_count": 42, "metadata": {}, "output_type": "execute_result" }, @@ -1258,7 +1278,7 @@ }, { "cell_type": "code", - "execution_count": 35, + "execution_count": 43, "metadata": { "clear_cell": true, "deletable": true, @@ -1272,7 +1292,7 @@ }, { "cell_type": "code", - "execution_count": 36, + "execution_count": 44, "metadata": { "clear_cell": true, "collapsed": false, @@ -1289,7 +1309,7 @@ "" ] }, - "execution_count": 36, + "execution_count": 44, "metadata": {}, "output_type": "execute_result" }, @@ -1313,7 +1333,7 @@ }, { "cell_type": "code", - "execution_count": 37, + "execution_count": 45, "metadata": { "clear_cell": true, "collapsed": false, @@ -1370,7 +1390,7 @@ }, { "cell_type": "code", - "execution_count": 38, + "execution_count": 46, "metadata": { "deletable": true, "editable": true @@ -1384,7 +1404,7 @@ }, { "cell_type": "code", - "execution_count": 39, + "execution_count": 47, "metadata": { "clear_cell": true, "deletable": true, @@ -1398,7 +1418,7 @@ }, { "cell_type": "code", - "execution_count": 40, + "execution_count": 48, "metadata": { "clear_cell": true, "collapsed": false, @@ -1413,13 +1433,13 @@ "name": "stderr", "output_type": "stream", "text": [ - "/home/joris/miniconda3/envs/DS-geospatial-test/lib/python3.8/site-packages/geopandas/array.py:689: RuntimeWarning: All-NaN slice encountered\n", + "/home/stijnvh/miniconda3/envs/DS-geospatial/lib/python3.8/site-packages/geopandas/array.py:689: RuntimeWarning: All-NaN slice encountered\n", " np.nanmin(b[:, 0]), # minx\n", - "/home/joris/miniconda3/envs/DS-geospatial-test/lib/python3.8/site-packages/geopandas/array.py:690: RuntimeWarning: All-NaN slice encountered\n", + "/home/stijnvh/miniconda3/envs/DS-geospatial/lib/python3.8/site-packages/geopandas/array.py:690: RuntimeWarning: All-NaN slice encountered\n", " np.nanmin(b[:, 1]), # miny\n", - "/home/joris/miniconda3/envs/DS-geospatial-test/lib/python3.8/site-packages/geopandas/array.py:691: RuntimeWarning: All-NaN slice encountered\n", + "/home/stijnvh/miniconda3/envs/DS-geospatial/lib/python3.8/site-packages/geopandas/array.py:691: RuntimeWarning: All-NaN slice encountered\n", " np.nanmax(b[:, 2]), # maxx\n", - "/home/joris/miniconda3/envs/DS-geospatial-test/lib/python3.8/site-packages/geopandas/array.py:692: RuntimeWarning: All-NaN slice encountered\n", + "/home/stijnvh/miniconda3/envs/DS-geospatial/lib/python3.8/site-packages/geopandas/array.py:692: RuntimeWarning: All-NaN slice encountered\n", " np.nanmax(b[:, 3]), # maxy\n" ] }, @@ -1434,7 +1454,7 @@ "dtype: geometry" ] }, - "execution_count": 40, + "execution_count": 48, "metadata": {}, "output_type": "execute_result" } @@ -1446,7 +1466,7 @@ }, { "cell_type": "code", - "execution_count": 41, + "execution_count": 49, "metadata": { "clear_cell": true, "deletable": true, @@ -1460,7 +1480,7 @@ }, { "cell_type": "code", - "execution_count": 42, + "execution_count": 50, "metadata": { "clear_cell": true, "collapsed": false, @@ -1482,7 +1502,7 @@ "dtype: geometry" ] }, - "execution_count": 42, + "execution_count": 50, "metadata": {}, "output_type": "execute_result" } @@ -1494,7 +1514,7 @@ }, { "cell_type": "code", - "execution_count": 43, + "execution_count": 51, "metadata": { "clear_cell": true, "collapsed": false, @@ -1511,7 +1531,7 @@ "" ] }, - "execution_count": 43, + "execution_count": 51, "metadata": {}, "output_type": "execute_result" }, @@ -1547,7 +1567,7 @@ }, { "cell_type": "code", - "execution_count": 44, + "execution_count": 52, "metadata": { "clear_cell": true, "collapsed": false, @@ -1629,7 +1649,7 @@ "279 POLYGON ((3751954.462 2891571.778, 3752000.000... " ] }, - "execution_count": 44, + "execution_count": 52, "metadata": {}, "output_type": "execute_result" } @@ -1643,7 +1663,7 @@ }, { "cell_type": "code", - "execution_count": 45, + "execution_count": 53, "metadata": { "clear_cell": true, "collapsed": false, @@ -1660,7 +1680,7 @@ "" ] }, - "execution_count": 45, + "execution_count": 53, "metadata": {}, "output_type": "execute_result" }, @@ -1683,7 +1703,7 @@ }, { "cell_type": "code", - "execution_count": 46, + "execution_count": 54, "metadata": { "clear_cell": true, "collapsed": false, @@ -1772,7 +1792,7 @@ "Water bodies MULTIPOLYGON (((3755507.459 2889412.262, 37555..." ] }, - "execution_count": 46, + "execution_count": 54, "metadata": {}, "output_type": "execute_result" } @@ -1810,7 +1830,7 @@ }, { "cell_type": "code", - "execution_count": 47, + "execution_count": 55, "metadata": { "clear_cell": true, "collapsed": false, @@ -1836,7 +1856,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 47, + "execution_count": 55, "metadata": {}, "output_type": "execute_result" } @@ -1849,7 +1869,7 @@ }, { "cell_type": "code", - "execution_count": 48, + "execution_count": 56, "metadata": { "clear_cell": true, "collapsed": false, @@ -1875,7 +1895,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 48, + "execution_count": 56, "metadata": {}, "output_type": "execute_result" } @@ -1984,7 +2004,7 @@ }, { "cell_type": "code", - "execution_count": 49, + "execution_count": 57, "metadata": { "deletable": true, "editable": true @@ -1996,7 +2016,7 @@ }, { "cell_type": "code", - "execution_count": 50, + "execution_count": 58, "metadata": { "collapsed": false, "deletable": true, @@ -2012,7 +2032,7 @@ "" ] }, - "execution_count": 50, + "execution_count": 58, "metadata": {}, "output_type": "execute_result" }, @@ -2035,7 +2055,7 @@ }, { "cell_type": "code", - "execution_count": 51, + "execution_count": 59, "metadata": { "collapsed": false, "deletable": true, @@ -2049,7 +2069,7 @@ "name": "stderr", "output_type": "stream", "text": [ - ":1: UserWarning: Geometry is in a geographic CRS. Results from 'buffer' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", + ":1: UserWarning: Geometry is in a geographic CRS. Results from 'buffer' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " cities['geometry'] = cities.buffer(2)\n" ] @@ -2061,7 +2081,7 @@ }, { "cell_type": "code", - "execution_count": 52, + "execution_count": 60, "metadata": { "collapsed": false, "deletable": true, @@ -2077,7 +2097,7 @@ "" ] }, - "execution_count": 52, + "execution_count": 60, "metadata": {}, "output_type": "execute_result" }, @@ -2101,7 +2121,7 @@ }, { "cell_type": "code", - "execution_count": 53, + "execution_count": 61, "metadata": { "collapsed": false, "deletable": true, @@ -2212,7 +2232,7 @@ "4 POLYGON ((14.03697 -5.86721, 16.32653 -5.87747... " ] }, - "execution_count": 53, + "execution_count": 61, "metadata": {}, "output_type": "execute_result" } @@ -2235,7 +2255,7 @@ }, { "cell_type": "code", - "execution_count": 54, + "execution_count": 62, "metadata": { "collapsed": false, "deletable": true, @@ -2251,7 +2271,7 @@ "" ] }, - "execution_count": 54, + "execution_count": 62, "metadata": {}, "output_type": "execute_result" }, @@ -2309,7 +2329,7 @@ "\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 wich each of the districts, but make sure to bring the attribute data from both source layers.\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", @@ -2327,7 +2347,7 @@ }, { "cell_type": "code", - "execution_count": 55, + "execution_count": 63, "metadata": { "deletable": true, "editable": true @@ -2340,7 +2360,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 64, "metadata": { "clear_cell": true, "deletable": true, @@ -2354,7 +2374,7 @@ }, { "cell_type": "code", - "execution_count": 57, + "execution_count": 65, "metadata": { "clear_cell": true, "collapsed": false, @@ -2454,7 +2474,7 @@ "4 POLYGON ((3751619.113 2890500.000, 3751626.627... " ] }, - "execution_count": 57, + "execution_count": 65, "metadata": {}, "output_type": "execute_result" } @@ -2496,7 +2516,7 @@ }, { "cell_type": "code", - "execution_count": 58, + "execution_count": 66, "metadata": { "clear_cell": true, "deletable": true, @@ -2510,7 +2530,7 @@ }, { "cell_type": "code", - "execution_count": 59, + "execution_count": 67, "metadata": { "clear_cell": true, "deletable": true, @@ -2524,7 +2544,7 @@ }, { "cell_type": "code", - "execution_count": 60, + "execution_count": 68, "metadata": { "clear_cell": true, "collapsed": false, @@ -2541,7 +2561,7 @@ "" ] }, - "execution_count": 60, + "execution_count": 68, "metadata": {}, "output_type": "execute_result" }, @@ -2565,7 +2585,7 @@ }, { "cell_type": "code", - "execution_count": 61, + "execution_count": 69, "metadata": { "clear_cell": true, "collapsed": false, @@ -2621,7 +2641,7 @@ }, { "cell_type": "code", - "execution_count": 62, + "execution_count": 70, "metadata": { "clear_cell": true, "collapsed": false, @@ -2644,7 +2664,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 62, + "execution_count": 70, "metadata": {}, "output_type": "execute_result" } @@ -2656,7 +2676,7 @@ }, { "cell_type": "code", - "execution_count": 63, + "execution_count": 71, "metadata": { "clear_cell": true, "deletable": true, @@ -2669,7 +2689,7 @@ }, { "cell_type": "code", - "execution_count": 64, + "execution_count": 72, "metadata": { "clear_cell": true, "collapsed": false, @@ -2692,7 +2712,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 64, + "execution_count": 72, "metadata": {}, "output_type": "execute_result" } @@ -2704,7 +2724,7 @@ }, { "cell_type": "code", - "execution_count": 65, + "execution_count": 73, "metadata": { "clear_cell": true, "deletable": true, @@ -2717,7 +2737,7 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 74, "metadata": { "clear_cell": true, "collapsed": false, @@ -2740,7 +2760,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 66, + "execution_count": 74, "metadata": {}, "output_type": "execute_result" } @@ -2751,7 +2771,7 @@ }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 75, "metadata": { "clear_cell": true, "collapsed": false, @@ -2774,7 +2794,7 @@ "Name: area, dtype: float64" ] }, - "execution_count": 67, + "execution_count": 75, "metadata": {}, "output_type": "execute_result" } @@ -2795,7 +2815,7 @@ }, { "cell_type": "code", - "execution_count": 68, + "execution_count": 76, "metadata": { "collapsed": false, "deletable": true, @@ -2920,7 +2940,7 @@ "[357 rows x 3 columns]" ] }, - "execution_count": 68, + "execution_count": 76, "metadata": {}, "output_type": "execute_result" }