{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# GeoSeries and folium\n", "> First you will learn to get information about the geometries in your data with three different GeoSeries attributes and methods. Then you will learn to create a street map layer using folium. This is the Summary of lecture \"Visualizing Geospatial Data in Python\", via datacamp.\n", "\n", "- toc: true \n", "- badges: true\n", "- comments: true\n", "- author: Chanseok Kang\n", "- categories: [Python, Datacamp, Visualization]\n", "- image: images/downtown_map.png" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "> Note : Folium map doesn't embed this page correctly. So use nbviewer for interactive map [link](https://nbviewer.jupyter.org/github/goodboychan/datacamp_repo/blob/master/Visualizing.Geospatial.Data.in.Python/GeoSeries-and-folium.ipynb)" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import geopandas as gpd\n", "import matplotlib.pyplot as plt\n", "from IPython.display import HTML, IFrame\n", "\n", "plt.rcParams['figure.figsize'] = (10, 5)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GeoSeries attributes and methods I\n", "- Shapely attributes and methods\n", " - GeoSeries.area - returns the area of each geometry in a GeoSeries\n", " - GeoSeries.centroid - returns the center point of each geometry in a GeoSeries\n", " - GeoSeries.distance(other) - returns the minimum distance to other" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Find the area of the Urban Residents neighborhood\n", "How big is the Urban Residents neighborhood?\n", "\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Read in the neighborhoods geojson file\n", "neighborhoods = gpd.read_file('./dataset/neighborhoods.geojson')\n", "\n", "# Get just the Urban Residents neighborhood polygon and save it as urban_polygon\n", "urban_polygon = neighborhoods.loc[neighborhoods.name == \"Urban Residents\"]" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name geometry\n", "41 Urban Residents MULTIPOLYGON (((-86.78122 36.16457, -86.78205 ...\n", " name geometry\n", "41 Urban Residents MULTIPOLYGON (((-9660441.281 4323289.005, -966...\n", "The area of the Urban Residents neighborhood is [1.12898961] km squared\n" ] } ], "source": [ "# Print the head of the urban polygon\n", "print(urban_polygon.head())\n", "\n", "# Create a copy of the urban_polygon using EPSG:3857 and print the head\n", "urban_poly_3857 = urban_polygon.to_crs(epsg=3857)\n", "print(urban_poly_3857.head())\n", "\n", "# Print the area of urban_poly_3857 in kilometers squared\n", "area = urban_poly_3857.geometry.area / 10**6\n", "print('The area of the Urban Residents neighborhood is ', area.values, ' km squared')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The Urban Residents neighborhood is around 1.13 square km. That seems manageable for walking to see the public art!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## GeoSeries attributes and methods II\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### The center of the Urban Residents neighborhood\n", "Now you'll find the center point of the `urban_poly_3857` and plot it over the polygon.\n", "\n" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Create downtown_cernter from urban_poly_3857\n", "downtown_center = urban_poly_3857.geometry.centroid\n", "\n", "# Print the type of downtown_center\n", "print(type(downtown_center))\n", "\n", "# Plot the urban_poly_3857 as ax and add the center point\n", "ax = urban_poly_3857.plot(color='lightgreen', figsize=(7, 7));\n", "downtown_center.plot(ax=ax, color='black');\n", "plt.xticks(rotation=45);" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You can see the centroid of the Urban Residents neighborhood. Notice that latitude and longitude are in meters instead of degrees. In the next exercise you will calculate the distance in meters of each artwork from the centroid of the Urban Residents neighborhood." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Prepare to calculate distances\n", "In this exercise you will prepare a GeoDataFrame called `art_dist_meters` with the locations of downtown art converted to meters using EPSG:3857. You will use `art_dist_meters` in the next exercise to calculate the distance of each artwork from the center of the Urban Residents neighborhood in meters." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "from shapely.geometry import Point\n", "\n", "art = gpd.read_file('./dataset/public_art.csv')\n", "art['geometry'] = art.apply(lambda x: Point(float(x.Longitude), float(x.Latitude)), axis=1)\n", "center_point = art.geometry.centroid" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " Title Last Name First Name \\\n", "0 [Cross Country Runners] Frost Miley \n", "1 [Fourth and Commerce Sculpture] Walker Lin \n", "\n", " Location Medium Type Description Latitude \\\n", "0 4001 Harding Rd., Nashville TN Bronze Sculpture 36.12856 \n", "1 333 Commerce Street, Nashville TN Sculpture 36.16234 \n", "\n", " Longitude Mapped Location geometry \n", "0 -86.8366 (36.12856, -86.8366) POINT (-86.83660 36.12856) \n", "1 -86.77774 (36.16234, -86.77774) POINT (-86.77774 36.16234) \n", " Title Last Name First Name \\\n", "0 [Cross Country Runners] Frost Miley \n", "1 [Fourth and Commerce Sculpture] Walker Lin \n", "\n", " Location Medium Type Description Latitude \\\n", "0 4001 Harding Rd., Nashville TN Bronze Sculpture 36.12856 \n", "1 333 Commerce Street, Nashville TN Sculpture 36.16234 \n", "\n", " Longitude Mapped Location geometry \n", "0 -86.8366 (36.12856, -86.8366) POINT (-9666606.094 4318325.479) \n", "1 -86.77774 (36.16234, -86.77774) POINT (-9660053.829 4322982.159) \n" ] } ], "source": [ "from shapely.geometry import Point\n", "\n", "# Create art_dist_meters using art and the geometry from art\n", "art_dist_meters = gpd.GeoDataFrame(art, geometry=art.geometry)\n", "art_dist_meters.crs='epsg:4326'\n", "print(art_dist_meters.head(2))\n", "\n", "# Set the crs of art_dist_meters to use EPSG:3857\n", "art_dist_meters.geometry = art_dist_meters.geometry.to_crs(epsg=3857)\n", "print(art_dist_meters.head(2))\n", "\n", "# Add a column to art_meters, center\n", "art_dist_meters['center'] = center_point" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0 POINT (-86.83660 36.12856)\n", "1 POINT (-86.77774 36.16234)\n", "2 POINT (-86.78817 36.15790)\n", "3 POINT (-86.79975 36.16202)\n", "4 POINT (-86.78205 36.16215)\n", " ... \n", "127 POINT (-86.82221 36.16510)\n", "128 POINT (-86.73445 36.09082)\n", "129 POINT (-86.66777 36.13469)\n", "130 POINT (-86.78382 36.16527)\n", "131 POINT (-86.79900 36.15896)\n", "Name: center, Length: 132, dtype: geometry" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "art_dist_meters['center']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The art_dist_meters Data Frame has the location of each artwork and the center point of the Urban Residents neighborhood -- both using meters for distance." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Art distances from neighborhood center\n", "Now that you have the center point and the art locations in the units we need to calculate distances in meters, it's time to perform that step.\n", "\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "{'12th & Porter Mural': 10583948.500651475,\n", " 'A Splash of Color': 10585357.160178259,\n", " 'A Story of Nashville': 10583565.969078569,\n", " 'Aerial Innovations Mural': 10579929.255218184,\n", " 'Airport Sun Project': 10570311.412935875,\n", " 'Andrew Jackson': 10583951.468665037,\n", " 'Angel': 10588435.041707946,\n", " 'Anticipation': 10583698.952539692,\n", " 'April Baby': 10586916.00892881,\n", " 'Arial Triangle [from the Gravity Series]': 10583398.52483797,\n", " 'Ariel': 10585905.336208293,\n", " 'Athena Parthenos': 10586065.827814262,\n", " 'Benedictio': 10577769.979416678,\n", " 'Bicycle Bus-Green Fleet': 10582635.68286198,\n", " 'Blowing Bubbles': 10588435.041707946,\n", " 'Breaking Bread': 10582634.392548595,\n", " 'Building a Positive Community': 10582136.29114304,\n", " 'Can-Do': 10582120.049094511,\n", " 'Chet Atkins': 10583602.67968694,\n", " \"Children's Chairs For The Seasons\": 10583565.969078569,\n", " 'Confederate Memorial': 10577769.979416678,\n", " 'Confederate Private Monument': 10585868.029575413,\n", " 'Confluence': 10585513.082652403,\n", " 'Cool Fences': 10579074.346806614,\n", " 'Dancing on Air': 10570372.644642536,\n", " 'Demonbreun Hill Mural': 10583908.579902012,\n", " 'Dragon Wall Mural': 10584123.478874767,\n", " 'Eastside Mural': 10581245.290643545,\n", " 'Ed and Bernice Johnson and Mary': 10583193.594816655,\n", " 'Edward Ward Carmack': 10583921.539018078,\n", " 'Flights of Fantasy': 10570344.379658109,\n", " 'Foliated Scroll': 10583565.969078569,\n", " 'Founding Fathers Cenotaph': 10584221.716760146,\n", " 'Founding of Nashville': 10583078.144842813,\n", " 'Furman Monument': 10577769.979416678,\n", " 'Gold Star Monument to World War I Veterans': 10586021.858499767,\n", " 'Gone Fishing': 10583591.376403218,\n", " 'Happy Times at The Arcade': 10583544.984285295,\n", " 'Headstones': 10581464.612607874,\n", " 'Hillsboro Village Mural': 10583854.405716073,\n", " 'History in Stained Glass': 10584221.716760146,\n", " 'I BELIEVE IN NASHVILLE 12 South': 10582156.834978476,\n", " 'I BELIEVE IN NASHVILLE East Nashville': 10580136.449174412,\n", " 'I BELIEVE IN NASHVILLE North Nashville': 10585239.187925545,\n", " 'In Concert': 10572751.806064371,\n", " 'Industry - The TVA Group': 10584680.719262363,\n", " 'Industry, Agriculture, Commerce, Statesmanship': 10583520.14461468,\n", " 'Isabella': 10583485.955582885,\n", " 'Isabelle and Calvin': 10584967.506033441,\n", " 'John L. Nolen Monument': 10577769.979416678,\n", " 'John W. Thomas': 10586021.858499767,\n", " 'Johnny Cash Mural': 10582628.289268441,\n", " 'La Storia della Terra': 10583565.969078569,\n", " 'Lane Motor Museum': 10577496.17633061,\n", " 'Les Paul Guitar Mural': 10582854.565917103,\n", " 'Library Doors': 10583565.969078569,\n", " 'Lightning Wire Fountain': 10583073.144394962,\n", " 'M&M Furniture-Riverside Village': 10580110.247643126,\n", " 'Major General William Bate Monument': 10577769.979416678,\n", " 'Maybelle Carter': 10582681.28994042,\n", " 'Migration': 10578647.940171225,\n", " 'Music City Center - Art Collection': 10582899.568035366,\n", " 'Nashville, A History through Maps and Aerial Views': 10583565.969078569,\n", " 'Oh, Roy': 10583134.666506412,\n", " 'Orpheus and Eurydice': 10582814.322708014,\n", " 'Our Past, Your Future': 10581513.854999846,\n", " 'Owen Bradley': 10583977.664424112,\n", " 'Paint Waterfalls': 10586050.17255176,\n", " 'Parthenon East Pediment': 10586039.029226098,\n", " 'Parthenon West Pediment': 10586086.185064087,\n", " 'Phillips Monument': 10577769.979416678,\n", " 'Phillips Toy Mart': 10589122.922370559,\n", " 'Phoenix': 10583193.594816655,\n", " 'Piecing It All Together': 10583583.83412909,\n", " 'Pioneer Family - The Mountain Group': 10583940.557855405,\n", " 'Polarbears with Snowballs': 10582948.623516602,\n", " 'President Andrew Johnson': 10583888.306385722,\n", " 'Raccoons and the Magic Horseshoes': 10588449.304129982,\n", " 'Rolf and Daughters Mural': 10585530.548435524,\n", " 'Rolling Hills': 10567500.082015224,\n", " 'Rose on 65th Street': 10583485.955582885,\n", " 'Roy Orbison Tribute Statue': 10583983.27808947,\n", " 'Safe Haven Family Shelter Mural': 10580722.202142382,\n", " 'Sam Davis': 10587219.534638887,\n", " 'Sam Davis of Tennessee': 10583957.687431902,\n", " 'Samaritan': 10588435.041707946,\n", " 'Sea Serpent': 10584599.331890862,\n", " 'Sergeant Alvin C. York': 10583831.406240454,\n", " 'Servant or Master': 10583295.262231264,\n", " 'Sir Draco Star (a.k.a Eli)': 10581769.904107656,\n", " 'Soldier and Farmer - The Equestrian Group': 10583980.483601985,\n", " 'Something in the Air': 10583345.067374147,\n", " 'St. George and the Maiden': 10588435.041707946,\n", " 'St. Vincent de Paul': 10585450.35995012,\n", " 'Statue of Dr. W. E. B. Dubois': 10586151.741414448,\n", " 'Stay Tuned': 10582208.784466524,\n", " 'Teacher and Student': 10587219.534638887,\n", " \"Tennessee Confederate Women's Memorial\": 10583808.163062796,\n", " 'Tennessee Falls': 10583749.204294588,\n", " 'Tennessee Korean War Memorial': 10583763.398102595,\n", " \"Tennessee Vietnam Veteran's Memorial\": 10583793.462008132,\n", " 'Tennessee WWII Memorial': 10584791.513626093,\n", " 'The Birth of Apollo': 10582837.385831947,\n", " 'The Flutist': 10582802.090989307,\n", " 'The Peace Monument': 10581938.152564157,\n", " 'The Prince': 10583565.969078569,\n", " 'The Readers': 10583393.872061776,\n", " 'The Recording Angel': 10582755.631360933,\n", " 'The Three Graces': 10584019.73571512,\n", " 'The Waterfall Mural': 10581643.66630736,\n", " 'Thomas Gleen Ryman': 10583110.04814488,\n", " 'Threshold': 10582893.378709938,\n", " 'Timeless': 10582989.494809307,\n", " 'Timothy Demonbreun': 10583247.956294278,\n", " 'Tomatoes': 10579771.420321863,\n", " 'Tommy Owen': 10587219.534638887,\n", " 'Two Musicians': 10581245.290643545,\n", " 'Untitled': 10589663.659840992,\n", " 'Vanderbilt University - Public Collection': 10584709.70990316,\n", " 'Various': 10582656.32923829,\n", " 'Victory': 10583866.220337586,\n", " 'Voices Gathering': 10583459.815030094,\n", " 'Volume': 10581771.247803846,\n", " 'Warner Monument': 10577769.979416678,\n", " 'Waveform: Pan American Blues': 10570399.600396495,\n", " 'We Are Our Stories': 10587812.786960982,\n", " 'Welcome to Flatrock': 10574716.19476862,\n", " 'Wind Reeds': 10570407.991440946,\n", " 'Women Suffrage Memorial': 10583921.539018078,\n", " 'Youth Opportunity Center-STARS Nashville - Peace Jam mural': 10585108.655408468,\n", " '[Cross Country Runners]': 10587219.534638887,\n", " '[Fourth and Commerce Sculpture]': 10583138.736775193}\n" ] } ], "source": [ "import pprint\n", "\n", "# Build a dictionary of titles and distances for Urban Residents art\n", "art_distances = {}\n", "for row in art_dist_meters.iterrows():\n", " vals = row[1]\n", " key = vals['Title']\n", " ctr = vals['center']\n", " art_distances[key] = vals['geometry'].distance(other=ctr)\n", " \n", "# Pretty print the art_distances\n", "pprint.pprint(art_distances)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Street maps with folium\n", "- Folium\n", " - python package\n", " - interactive maps\n", " - built upon Leaflet.js" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a folium location from the urban centroid\n", "In order to construct a folium map of the Urban Residents neighborhood, you need to build a coordinate pair location that is formatted for folium." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "urban_polygon.crs = 'epsg:4326'" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "\n", "Name: WGS 84\n", "Axis Info [ellipsoidal]:\n", "- Lat[north]: Geodetic latitude (degree)\n", "- Lon[east]: Geodetic longitude (degree)\n", "Area of Use:\n", "- name: World\n", "- bounds: (-180.0, -90.0, 180.0, 90.0)\n", "Datum: World Geodetic System 1984\n", "- Ellipsoid: WGS 84\n", "- Prime Meridian: Greenwich" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "urban_polygon.crs" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " name geometry\n", "41 Urban Residents MULTIPOLYGON (((-86.78122 36.16457, -86.78205 ...\n", "41 POINT (-86.77756 36.16128)\n", "dtype: geometry\n", "[41 36.161278\n", "dtype: float64, 41 -86.777565\n", "dtype: float64]\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\kcsgo\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:5: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " \"\"\"\n" ] } ], "source": [ "# Print the head of the urban_polygon\n", "print(urban_polygon.head())\n", "\n", "# Create urban_center from the urban_polygon center\n", "urban_center = urban_polygon.to_crs(epsg=4326).centroid\n", "\n", "# Print urban_center\n", "print(urban_center)\n", "\n", "# Create array for folium called urban_location\n", "urban_location = [urban_center.y, urban_center.x]\n", "\n", "# Print urban_location\n", "print(urban_location)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Folium locations are arrays with latitude first. You just created a folium location from the center of the Urban Residents neighborhood." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Create a folium map of downtown Nashville\n", "In this exercise you will create a street map of downtown Nashville using folium." ] }, { "cell_type": "code", "execution_count": 31, "metadata": { "scrolled": false }, "outputs": [], "source": [ "import folium\n", "\n", "# Construct a folium map with urban_location\n", "downtown_map = folium.Map(location=urban_location, zoom_start=15, width=500, height=500)\n", "\n", "# Display the map\n", "downtown_map.save('./html/downtown_map.html')" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#hide_input\n", "IFrame(src='/chans_jupyter/assets/attach/downtown_map.html', width=500, height=500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Folium locations are arrays with latitude first. You just created a folium location from the center of the Urban Residents neighborhood." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Folium street map of the downtown neighborhood\n", "This time you will create the folium map of downtown and add the Urban Residents neighborhood area from urban_polygon.\n", "\n" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\kcsgo\\anaconda3\\lib\\site-packages\\ipykernel_launcher.py:1: UserWarning: Geometry is in a geographic CRS. Results from 'centroid' are likely incorrect. Use 'GeoSeries.to_crs()' to re-project geometries to a projected CRS before this operation.\n", "\n", " \"\"\"Entry point for launching an IPython kernel.\n", "C:\\Users\\kcsgo\\anaconda3\\lib\\site-packages\\geopandas\\geodataframe.py:831: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " super(GeoDataFrame, self).__setitem__(key, value)\n" ] } ], "source": [ "urban_polygon['center'] = urban_polygon.loc[:, 'geometry'].centroid" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [], "source": [ "# Create array for called folium_loc from the urban_polygon center point\n", "point = urban_polygon.center\n", "folium_loc = [point.values.y, point.values.x]\n", "\n", "# Construct a map from folium_loc: downtown_map\n", "downtown_map = folium.Map(location = folium_loc, zoom_start = 15, width=500, height=500)\n", "\n", "# Draw our neighborhood: Urban Residents\n", "folium.GeoJson(urban_polygon.geometry).add_to(downtown_map)\n", "\n", "downtown_map.save('html/downtown_map2.html')" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 34, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#hide_input\n", "IFrame(src='/chans_jupyter/assets/attach/downtown_map2.html', width=500, height=500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating markers and popups in folium\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Adding markers for the public art\n", "Now that you have added the polygon for the Urban Residents neighborhood to your folium street map, it's time to add the locations of the art within the neighborhood. You can do that by creating folium markers. Each marker needs a location assigned. Use `iterrows()` to loop through the data to grab the values you need.\n", "\n" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [], "source": [ "# Create a GeoDataFrame from art and verify the type\n", "art_geo = gpd.GeoDataFrame(art, crs=neighborhoods.crs, geometry=art.geometry)\n", "\n", "# Spartially join neighborhoods with art_geo\n", "neighborhood_art = gpd.sjoin(art_geo, neighborhoods, op='within')\n", "\n", "# Create urban_art from neighborhood_art where the neighborhood name is Urban Residents\n", "urban_art = neighborhood_art.loc[neighborhood_art.name == 'Urban Residents']" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "first part: 1\n", "second part: Title [Fourth and Commerce Sculpture]\n", "Last Name Walker\n", "First Name Lin\n", "Location 333 Commerce Street, Nashville TN\n", "Medium \n", "Type Sculpture\n", "Description \n", "Latitude 36.16234\n", "Longitude -86.77774\n", "Mapped Location (36.16234, -86.77774)\n", "geometry POINT (-86.77773999999999 36.16234)\n", "center POINT (-86.77773999999999 36.16234)\n", "index_right 41\n", "name Urban Residents\n", "Name: 1, dtype: object\n", "first part: 4\n", "second part: Title A Story of Nashville\n", "Last Name Ridley\n", "First Name Greg\n", "Location 615 Church Street, Nashville TN\n", "Medium Hammered copper repousse\n", "Type Frieze\n", "Description Inside the Grand Reading Room, this is a serie...\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 4, dtype: object\n", "first part: 21\n", "second part: Title Chet Atkins\n", "Last Name Faxon\n", "First Name Russell\n", "Location Corner of Fifth Avenue North and Union Street,...\n", "Medium Bronze stool and guitar on a granite plynth\n", "Type Sculpture\n", "Description A sculpture of a young Chet Atkins seated on a...\n", "Latitude 36.16466\n", "Longitude -86.78102\n", "Mapped Location (36.16466, -86.78102)\n", "geometry POINT (-86.78102 36.16466)\n", "center POINT (-86.78102 36.16466)\n", "index_right 41\n", "name Urban Residents\n", "Name: 21, dtype: object\n", "first part: 22\n", "second part: Title Children's Chairs For The Seasons\n", "Last Name McGraw\n", "First Name Deloss\n", "Location 615 Church Street, Nashville TN\n", "Medium Mixed Media - wood and paint\n", "Type Furniture\n", "Description chairs depicting the four seasons\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 22, dtype: object\n", "first part: 34\n", "second part: Title Foliated Scroll\n", "Last Name Bloomer\n", "First Name Kent\n", "Location 615 Church Street, Nashville TN\n", "Medium Aluminum\n", "Type Frieze\n", "Description a contemporary adaptation of a classical folia...\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 34, dtype: object\n", "first part: 39\n", "second part: Title Gone Fishing\n", "Last Name Cooper\n", "First Name Michael\n", "Location Church Street Park\n", "Medium Acrylic on Brick\n", "Type Mural\n", "Description Just having some fun with Trompe L'oeil balconies\n", "Latitude 36.16298\n", "Longitude -86.78184\n", "Mapped Location (36.16298, -86.78184)\n", "geometry POINT (-86.78184 36.16298)\n", "center POINT (-86.78184 36.16298)\n", "index_right 41\n", "name Urban Residents\n", "Name: 39, dtype: object\n", "first part: 40\n", "second part: Title Happy Times at The Arcade\n", "Last Name Cooper\n", "First Name Michael\n", "Location In the Alley between 4th and 5th off of Union\n", "Medium Silicate paint on brick and concrete block\n", "Type Mural\n", "Description Trompe L'oeil artwork celebrating The Arcade\n", "Latitude 36.1647\n", "Longitude -86.78043\n", "Mapped Location (36.1647, -86.78043)\n", "geometry POINT (-86.78043 36.1647)\n", "center POINT (-86.78043 36.1647)\n", "index_right 41\n", "name Urban Residents\n", "Name: 40, dtype: object\n", "first part: 54\n", "second part: Title Johnny Cash Mural\n", "Last Name Bryan Deese, Audie Adams, Ryan Shrader\n", "First Name \n", "Location 300 4th Avenue\n", "Medium Latex paint and spray paint\n", "Type Mural\n", "Description Classic street art by Thoughts Manifested crew...\n", "Latitude 36.158301\n", "Longitude -86.774955\n", "Mapped Location (36.158301, -86.774955)\n", "geometry POINT (-86.77495500000001 36.158301)\n", "center POINT (-86.77495500000001 36.158301)\n", "index_right 41\n", "name Urban Residents\n", "Name: 54, dtype: object\n", "first part: 55\n", "second part: Title La Storia della Terra\n", "Last Name The Kubach - Wilmsen Team\n", "First Name The Kubach - Wilmsen Team\n", "Location Church St & 7th Ave N Nashville TN\n", "Medium Stone\n", "Type Sculpture\n", "Description A 20 foot tower of stone books. There are 26 b...\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 55, dtype: object\n", "first part: 57\n", "second part: Title Les Paul Guitar Mural\n", "Last Name Hughes\n", "First Name Milree\n", "Location 100 Broadway, Nashville TN 37201\n", "Medium Painting\n", "Type Mural\n", "Description \n", "Latitude 36.1624\n", "Longitude -86.77491\n", "Mapped Location (36.1624, -86.77491)\n", "geometry POINT (-86.77491000000001 36.1624)\n", "center POINT (-86.77491000000001 36.1624)\n", "index_right 41\n", "name Urban Residents\n", "Name: 57, dtype: object\n", "first part: 59\n", "second part: Title Library Doors\n", "Last Name LeQuire\n", "First Name Alan\n", "Location 615 Church Street, Nashville TN\n", "Medium Bronze\n", "Type Bronzes\n", "Description images of local people as well as Tennessee an...\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 59, dtype: object\n", "first part: 60\n", "second part: Title Lightning Wire Fountain\n", "Last Name Walker\n", "First Name Lin\n", "Location 333 Commerce Street, Nashville TN\n", "Medium \n", "Type Sculpture/Fountain\n", "Description \n", "Latitude 36.16233\n", "Longitude -86.7771\n", "Mapped Location (36.16233, -86.7771)\n", "geometry POINT (-86.7771 36.16233)\n", "center POINT (-86.7771 36.16233)\n", "index_right 41\n", "name Urban Residents\n", "Name: 60, dtype: object\n", "first part: 66\n", "second part: Title Nashville, A History through Maps and Aerial V...\n", "Last Name Haas\n", "First Name Richard\n", "Location 615 Church Street, Nashville TN\n", "Medium Oil on Canvas\n", "Type Mural\n", "Description Eight scenes showing the development of Nashvi...\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 66, dtype: object\n", "first part: 67\n", "second part: Title Oh, Roy\n", "Last Name Faxon\n", "First Name Russell\n", "Location 116 5th Ave N, Nashville TN\n", "Medium Bronze\n", "Type Sculpture\n", "Description Minnie Pearl and Roy Acuff seated on a bench i...\n", "Latitude 36.16151\n", "Longitude -86.77816\n", "Mapped Location (36.16151, -86.77816)\n", "geometry POINT (-86.77816 36.16151)\n", "center POINT (-86.77816 36.16151)\n", "index_right 41\n", "name Urban Residents\n", "Name: 67, dtype: object\n", "first part: 68\n", "second part: Title Orpheus and Eurydice\n", "Last Name Kaskey\n", "First Name Ray\n", "Location 1 Symphony Place, Nashville TN\n", "Medium Limestone\n", "Type Sculpture\n", "Description Relief sculpture above main entrance of Scherm...\n", "Latitude 36.16017\n", "Longitude -86.77575\n", "Mapped Location (36.16017, -86.77575)\n", "geometry POINT (-86.77575 36.16017)\n", "center POINT (-86.77575 36.16017)\n", "index_right 41\n", "name Urban Residents\n", "Name: 68, dtype: object\n", "first part: 75\n", "second part: Title Piecing It All Together\n", "Last Name Cooper\n", "First Name Michael\n", "Location 600 Church Street, Nashville TN\n", "Medium Painting on Stone\n", "Type Mural\n", "Description \n", "Latitude 36.16281\n", "Longitude -86.78186\n", "Mapped Location (36.16281, -86.78186)\n", "geometry POINT (-86.78185999999999 36.16281)\n", "center POINT (-86.78185999999999 36.16281)\n", "index_right 41\n", "name Urban Residents\n", "Name: 75, dtype: object\n", "first part: 104\n", "second part: Title The Birth of Apollo\n", "Last Name Eskridge\n", "First Name Casey\n", "Location 1 Symphony Place, Nashville TN\n", "Medium Bronze sculpture as centerpiece of fountain\n", "Type Sculpture\n", "Description Two figures topping a fountain, one with a lyr...\n", "Latitude 36.15993\n", "Longitude -86.77611\n", "Mapped Location (36.15993, -86.77611)\n", "geometry POINT (-86.77611 36.15993)\n", "center POINT (-86.77611 36.15993)\n", "index_right 41\n", "name Urban Residents\n", "Name: 104, dtype: object\n", "first part: 105\n", "second part: Title The Flutist\n", "Last Name Varo\n", "First Name Marton\n", "Location 1 Symphony Place, Nashville TN\n", "Medium Marble\n", "Type Sculpture\n", "Description Statue commemorating Kenneth D Schermerhorn, M...\n", "Latitude 36.15961\n", "Longitude -86.77594\n", "Mapped Location (36.15961, -86.77594)\n", "geometry POINT (-86.77594000000001 36.15961)\n", "center POINT (-86.77594000000001 36.15961)\n", "index_right 41\n", "name Urban Residents\n", "Name: 105, dtype: object\n", "first part: 107\n", "second part: Title The Prince\n", "Last Name Outlaw\n", "First Name Adrienne\n", "Location 615 Church Street, Nashville TN\n", "Medium Mixed Media Use of heavy guage aluminum wire a...\n", "Type Mobile\n", "Description The Little Prince\\nOutlaw hung a whimsical mob...\n", "Latitude 36.16215\n", "Longitude -86.78205\n", "Mapped Location (36.16215, -86.78205)\n", "geometry POINT (-86.78205 36.16215)\n", "center POINT (-86.78205 36.16215)\n", "index_right 41\n", "name Urban Residents\n", "Name: 107, dtype: object\n", "first part: 109\n", "second part: Title The Recording Angel\n", "Last Name Flack\n", "First Name Audrey\n", "Location 1 Symphony Place, Nashville TN\n", "Medium Bronze\n", "Type Sculpture\n", "Description Bronze angel holding a fountain pen and tablet\n", "Latitude 36.1592\n", "Longitude -86.77571\n", "Mapped Location (36.1592, -86.77571)\n", "geometry POINT (-86.77571 36.1592)\n", "center POINT (-86.77571 36.1592)\n", "index_right 41\n", "name Urban Residents\n", "Name: 109, dtype: object\n", "first part: 112\n", "second part: Title Thomas Gleen Ryman\n", "Last Name Shields\n", "First Name Steve\n", "Location 116 5th Ave N, Nashville TN\n", "Medium Bronze sculpture with brick base\n", "Type Sculpture\n", "Description Full-length standing figure of Ryman, holding ...\n", "Latitude 36.16156\n", "Longitude -86.77789\n", "Mapped Location (36.16156, -86.77789)\n", "geometry POINT (-86.77789 36.16156)\n", "center POINT (-86.77789 36.16156)\n", "index_right 41\n", "name Urban Residents\n", "Name: 112, dtype: object\n", "first part: 114\n", "second part: Title Timeless\n", "Last Name Sorci\n", "First Name Joe\n", "Location 3rd Avenue North between Commerce and Broadway\n", "Medium Steel and Civil War cannonballs\n", "Type Sculpture\n", "Description Two nearly interlinked hemicycles with cannonb...\n", "Latitude 36.16227\n", "Longitude -86.77631\n", "Mapped Location (36.16227, -86.77631)\n", "geometry POINT (-86.77631 36.16227)\n", "center POINT (-86.77631 36.16227)\n", "index_right 41\n", "name Urban Residents\n", "Name: 114, dtype: object\n" ] } ], "source": [ "# Iterate through the urban_art and print each part of tuple returned\n", "for row in urban_art.iterrows():\n", " print('first part: ', row[0])\n", " print('second part: ', row[1])\n", " \n", "# Create a location and marker with each iteration for the downtown_map\n", "for row in urban_art.iterrows():\n", " row_values = row[1]\n", " location = [row_values['Latitude'], row_values['Longitude']]\n", " marker = folium.Marker(location=location)\n", " marker.add_to(downtown_map)\n", "\n", "downtown_map.save('html/downtown_map3.html') " ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#hide_input\n", "IFrame(src='/chans_jupyter/assets/attach/downtown_map3.html', width=500, height=500)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "You have created a folium map of downtown Nashville, a polygon showing the Urban Residents neighborhood, and markers to show the location of the artworks. All that's left is to create some popups for the markers!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Troubleshooting data issues\n", "You will be building popups for the downtown art using the `title` and `desc` columns from the `urban_art` DataFrame. Here, you will inspect those columns to identify and clean up any problematic values.\n", "\n" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1 [Fourth and Commerce Sculpture]\n", "4 A Story of Nashville\n", "21 Chet Atkins\n", "22 Children's Chairs For The Seasons\n", "34 Foliated Scroll\n", "39 Gone Fishing\n", "40 Happy Times at The Arcade\n", "54 Johnny Cash Mural\n", "55 La Storia della Terra\n", "57 Les Paul Guitar Mural\n", "59 Library Doors\n", "60 Lightning Wire Fountain\n", "66 Nashville, A History through Maps and Aerial V...\n", "67 Oh, Roy\n", "68 Orpheus and Eurydice\n", "75 Piecing It All Together\n", "104 The Birth of Apollo\n", "105 The Flutist\n", "107 The Prince\n", "109 The Recording Angel\n", "112 Thomas Gleen Ryman\n", "114 Timeless\n", "Name: Title, dtype: object\n", "1 \n", "4 Inside the Grand Reading Room, this is a serie...\n", "21 A sculpture of a young Chet Atkins seated on a...\n", "22 chairs depicting the four seasons\n", "34 a contemporary adaptation of a classical folia...\n", "39 Just having some fun with Trompe L'oeil balconies\n", "40 Trompe L'oeil artwork celebrating The Arcade\n", "54 Classic street art by Thoughts Manifested crew...\n", "55 A 20 foot tower of stone books. There are 26 b...\n", "57 \n", "59 images of local people as well as Tennessee an...\n", "60 \n", "66 Eight scenes showing the development of Nashvi...\n", "67 Minnie Pearl and Roy Acuff seated on a bench i...\n", "68 Relief sculpture above main entrance of Scherm...\n", "75 \n", "104 Two figures topping a fountain, one with a lyr...\n", "105 Statue commemorating Kenneth D Schermerhorn, M...\n", "107 The Little Prince\\nOutlaw hung a whimsical mob...\n", "109 Bronze angel holding a fountain pen and tablet\n", "112 Full-length standing figure of Ryman, holding ...\n", "114 Two nearly interlinked hemicycles with cannonb...\n", "Name: Description, dtype: object\n", "1 \n", "4 Inside the Grand Reading Room, this is a serie...\n", "21 A sculpture of a young Chet Atkins seated on a...\n", "22 chairs depicting the four seasons\n", "34 a contemporary adaptation of a classical folia...\n", "39 Just having some fun with Trompe L'oeil balconies\n", "40 Trompe L'oeil artwork celebrating The Arcade\n", "54 Classic street art by Thoughts Manifested crew...\n", "55 A 20 foot tower of stone books. There are 26 b...\n", "57 \n", "59 images of local people as well as Tennessee an...\n", "60 \n", "66 Eight scenes showing the development of Nashvi...\n", "67 Minnie Pearl and Roy Acuff seated on a bench i...\n", "68 Relief sculpture above main entrance of Scherm...\n", "75 \n", "104 Two figures topping a fountain, one with a lyr...\n", "105 Statue commemorating Kenneth D Schermerhorn, M...\n", "107 The Little Prince\\nOutlaw hung a whimsical mob...\n", "109 Bronze angel holding a fountain pen and tablet\n", "112 Full-length standing figure of Ryman, holding ...\n", "114 Two nearly interlinked hemicycles with cannonb...\n", "Name: Description, dtype: object\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "C:\\Users\\kcsgo\\anaconda3\\lib\\site-packages\\pandas\\core\\generic.py:6245: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", " self._update_inplace(new_data)\n" ] } ], "source": [ "# Print the urban_art titles\n", "print(urban_art.Title)\n", "\n", "# Print the urban_art description\n", "print(urban_art.Description)\n", "\n", "# Replace Nan and ' values in description\n", "urban_art.Description.fillna('', inplace=True)\n", "urban_art.Description.str.replace(\"'\", \"`\")\n", "\n", "# Print the urban_art descriptions again\n", "print(urban_art.Description)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### A map of downtown art\n", "Now you will assign a popup to each marker to give information about the artwork at each location. In particular you will assign the art title and description to the popup for each marker. You will do so by creating the map object downtown_map, then add the popups, and finally use the display function to show your map.\n", "\n", "One warning before you start: you'll need to ensure that all instances of single quotes (') are removed from the pop-up message, otherwise your plot will not render!\n" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [], "source": [ "downtown_map = folium.Map(location=urban_location, zoom_start=15, width=500, height=500)\n", "folium.GeoJson(urban_polygon.geometry).add_to(downtown_map)\n", "\n", "# Create popups inside the loop you built to create the markers\n", "for row in urban_art.iterrows():\n", " row_values = row[1] \n", " location = [row_values['Latitude'], row_values['Longitude']]\n", " popup = (str(row_values['Title']) + ': ' + str(row_values['Description'])[:20])\n", " \n", " marker = folium.Marker(location = location, popup=popup)\n", " marker.add_to(downtown_map)\n", "\n", "downtown_map.save('./html/downtown_map4.html')" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", " \n", " " ], "text/plain": [ "" ] }, "execution_count": 36, "metadata": {}, "output_type": "execute_result" } ], "source": [ "#hide_input\n", "IFrame(src='/chans_jupyter/assets/attach/downtown_map4.html', width=500, height=500)" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.6" } }, "nbformat": 4, "nbformat_minor": 4 }