{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Snapping points to line" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "import geopandas as gpd\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "import networkx as nx\n", "from shapely.geometry import box, LineString, Point,MultiPoint\n", "import os\n", "import sys\n", "import fiona\n", "from scipy.spatial import cKDTree\n", "import numpy as np\n", "from shapely import wkt\n", "import time\n", "from rtree import index\n", "\n", "sys.path.append(os.path.realpath('..'))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Line data" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "shp_file = r\"../intermediate_data/lion_gdf2012/lion_gdf2012.shp\"\n", "lion_gdf = gpd.read_file(shp_file)\n", "lion_gdf.crs = {'init': 'epsg:4326'}" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Point data from the Sidewalk Café Licenses and Applications" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "fp = r\"https://data.cityofnewyork.us/api/views/qcdj-rwhu/rows.csv?accessType=DOWNLOAD\"\n", "sidewalk_df = pd.read_csv(fp)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "sidewalk_df['geometry'] = list(zip(sidewalk_df['LONGITUDE'], sidewalk_df['LATITUDE']))" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "sidewalk_df['geometry'] = sidewalk_df['geometry'].apply(Point)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [], "source": [ "sidewalk_gdf = gpd.GeoDataFrame(sidewalk_df, geometry='geometry',crs = {'init': 'epsg:4326'})" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LICENSE_NBRLIC_STATUSBUSINESS_NAMEBUSINESS_NAME2BUILDINGSTREETCITYSTATEZIPSWC_TYPE...HEARING_DDHEARING_PUBLICHEARING_PUBLIC_DDCCCC_DDMOOMOO_DDISSUANCEISSUANCE_DDgeometry
02042126-DCAActiveTHE ELEMENT RESTAURANT GROUP INC181 CABRINI854W 181ST STNEW YORKNY10033Unenclosed...12/13/2018NaNNaNReview Period Expired01/03/2019Pending ReviewNaNPending ReviewNaNPOINT (-73.93992100497887 40.85108121215804)
11139678-DCAActiveTHE ORIGINAL VINCENT'S, ESTABLISHED 1904 INC.NaN119MOTT STNEW YORKNY10013Unenclosed...01/19/2018NaNNaNReview Period Expired01/19/2018Waived01/19/2018Issued01/19/2018POINT (-73.99731247308198 40.71786474110945)
22038120-DCAActiveLUKE'S LOUNGE INCNaN1808HONE AVEBRONXNY10461Unenclosed...02/28/2019NaNNaNReview Period Expired03/21/2019Approved05/02/2019Issued05/02/2019POINT (-73.85497001294844 40.84922986597552)
31193339-DCAActiveEISEN & SON, INC.LASAGNA RESTAURANT1968TH AVENEW YORKNY10011Unenclosed...NaNNaNNaNNaNNaNNaNNaNIssued09/18/2017POINT (-73.99979069006966 40.74322630997722)
42028248-DCAActiveBILTMORE GARAGE RESTAURANT ASSOCIATES LLCMEL'S BURGER BAR14502ND AVENEW YORKNY10021Unenclosed...12/14/2017NaNNaNApproved12/14/2017Approved12/14/2017Issued12/14/2017POINT (-73.95649231137126 40.77099765829954)
\n", "

5 rows × 48 columns

\n", "
" ], "text/plain": [ " LICENSE_NBR LIC_STATUS BUSINESS_NAME \\\n", "0 2042126-DCA Active THE ELEMENT RESTAURANT GROUP INC \n", "1 1139678-DCA Active THE ORIGINAL VINCENT'S, ESTABLISHED 1904 INC. \n", "2 2038120-DCA Active LUKE'S LOUNGE INC \n", "3 1193339-DCA Active EISEN & SON, INC. \n", "4 2028248-DCA Active BILTMORE GARAGE RESTAURANT ASSOCIATES LLC \n", "\n", " BUSINESS_NAME2 BUILDING STREET CITY STATE ZIP SWC_TYPE \\\n", "0 181 CABRINI 854 W 181ST ST NEW YORK NY 10033 Unenclosed \n", "1 NaN 119 MOTT ST NEW YORK NY 10013 Unenclosed \n", "2 NaN 1808 HONE AVE BRONX NY 10461 Unenclosed \n", "3 LASAGNA RESTAURANT 196 8TH AVE NEW YORK NY 10011 Unenclosed \n", "4 MEL'S BURGER BAR 1450 2ND AVE NEW YORK NY 10021 Unenclosed \n", "\n", " ... HEARING_DD HEARING_PUBLIC HEARING_PUBLIC_DD CC \\\n", "0 ... 12/13/2018 NaN NaN Review Period Expired \n", "1 ... 01/19/2018 NaN NaN Review Period Expired \n", "2 ... 02/28/2019 NaN NaN Review Period Expired \n", "3 ... NaN NaN NaN NaN \n", "4 ... 12/14/2017 NaN NaN Approved \n", "\n", " CC_DD MOO MOO_DD ISSUANCE ISSUANCE_DD \\\n", "0 01/03/2019 Pending Review NaN Pending Review NaN \n", "1 01/19/2018 Waived 01/19/2018 Issued 01/19/2018 \n", "2 03/21/2019 Approved 05/02/2019 Issued 05/02/2019 \n", "3 NaN NaN NaN Issued 09/18/2017 \n", "4 12/14/2017 Approved 12/14/2017 Issued 12/14/2017 \n", "\n", " geometry \n", "0 POINT (-73.93992100497887 40.85108121215804) \n", "1 POINT (-73.99731247308198 40.71786474110945) \n", "2 POINT (-73.85497001294844 40.84922986597552) \n", "3 POINT (-73.99979069006966 40.74322630997722) \n", "4 POINT (-73.95649231137126 40.77099765829954) \n", "\n", "[5 rows x 48 columns]" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sidewalk_gdf.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Snap all locations to line" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Find the nearest line to student nodee" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "def snap_to_line(point, line_gdf, spatial_index):\n", " nearest_line_index = list(spatial_index.nearest(point.bounds))\n", " line = line_gdf['geometry'].iloc[nearest_line_index[0]]\n", " point_snapped = line.interpolate(line.project(point))\n", " return point_snapped,nearest_line_index[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Create spatial index" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "spatial_index = lion_gdf.sindex" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "sidewalk_gdf[['nearest_point_on_line','on_line']] = sidewalk_gdf.apply(lambda row: snap_to_line(row['geometry'],lion_gdf, spatial_index), axis=1, result_type = 'expand')" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
LICENSE_NBRLIC_STATUSBUSINESS_NAMEBUSINESS_NAME2BUILDINGSTREETCITYSTATEZIPSWC_TYPE...HEARING_PUBLIC_DDCCCC_DDMOOMOO_DDISSUANCEISSUANCE_DDgeometrynearest_point_on_lineon_line
02042126-DCAActiveTHE ELEMENT RESTAURANT GROUP INC181 CABRINI854W 181ST STNEW YORKNY10033Unenclosed...NaNReview Period Expired01/03/2019Pending ReviewNaNPending ReviewNaNPOINT (-73.93992100497887 40.85108121215804)POINT (-73.93989685705797 40.85132131512788)65509
11139678-DCAActiveTHE ORIGINAL VINCENT'S, ESTABLISHED 1904 INC.NaN119MOTT STNEW YORKNY10013Unenclosed...NaNReview Period Expired01/19/2018Waived01/19/2018Issued01/19/2018POINT (-73.99731247308198 40.71786474110945)POINT (-73.99716714163807 40.71777462231699)67875
22038120-DCAActiveLUKE'S LOUNGE INCNaN1808HONE AVEBRONXNY10461Unenclosed...NaNReview Period Expired03/21/2019Approved05/02/2019Issued05/02/2019POINT (-73.85497001294844 40.84922986597552)POINT (-73.85497716139835 40.84922428758369)13383
31193339-DCAActiveEISEN & SON, INC.LASAGNA RESTAURANT1968TH AVENEW YORKNY10011Unenclosed...NaNNaNNaNNaNNaNIssued09/18/2017POINT (-73.99979069006966 40.74322630997722)POINT (-73.99972826980175 40.74337448032719)60047
42028248-DCAActiveBILTMORE GARAGE RESTAURANT ASSOCIATES LLCMEL'S BURGER BAR14502ND AVENEW YORKNY10021Unenclosed...NaNApproved12/14/2017Approved12/14/2017Issued12/14/2017POINT (-73.95649231137126 40.77099765829954)POINT (-73.95666905608053 40.77112649759413)57296
\n", "

5 rows × 50 columns

\n", "
" ], "text/plain": [ " LICENSE_NBR LIC_STATUS BUSINESS_NAME \\\n", "0 2042126-DCA Active THE ELEMENT RESTAURANT GROUP INC \n", "1 1139678-DCA Active THE ORIGINAL VINCENT'S, ESTABLISHED 1904 INC. \n", "2 2038120-DCA Active LUKE'S LOUNGE INC \n", "3 1193339-DCA Active EISEN & SON, INC. \n", "4 2028248-DCA Active BILTMORE GARAGE RESTAURANT ASSOCIATES LLC \n", "\n", " BUSINESS_NAME2 BUILDING STREET CITY STATE ZIP SWC_TYPE \\\n", "0 181 CABRINI 854 W 181ST ST NEW YORK NY 10033 Unenclosed \n", "1 NaN 119 MOTT ST NEW YORK NY 10013 Unenclosed \n", "2 NaN 1808 HONE AVE BRONX NY 10461 Unenclosed \n", "3 LASAGNA RESTAURANT 196 8TH AVE NEW YORK NY 10011 Unenclosed \n", "4 MEL'S BURGER BAR 1450 2ND AVE NEW YORK NY 10021 Unenclosed \n", "\n", " ... HEARING_PUBLIC_DD CC CC_DD MOO \\\n", "0 ... NaN Review Period Expired 01/03/2019 Pending Review \n", "1 ... NaN Review Period Expired 01/19/2018 Waived \n", "2 ... NaN Review Period Expired 03/21/2019 Approved \n", "3 ... NaN NaN NaN NaN \n", "4 ... NaN Approved 12/14/2017 Approved \n", "\n", " MOO_DD ISSUANCE ISSUANCE_DD \\\n", "0 NaN Pending Review NaN \n", "1 01/19/2018 Issued 01/19/2018 \n", "2 05/02/2019 Issued 05/02/2019 \n", "3 NaN Issued 09/18/2017 \n", "4 12/14/2017 Issued 12/14/2017 \n", "\n", " geometry \\\n", "0 POINT (-73.93992100497887 40.85108121215804) \n", "1 POINT (-73.99731247308198 40.71786474110945) \n", "2 POINT (-73.85497001294844 40.84922986597552) \n", "3 POINT (-73.99979069006966 40.74322630997722) \n", "4 POINT (-73.95649231137126 40.77099765829954) \n", "\n", " nearest_point_on_line on_line \n", "0 POINT (-73.93989685705797 40.85132131512788) 65509 \n", "1 POINT (-73.99716714163807 40.71777462231699) 67875 \n", "2 POINT (-73.85497716139835 40.84922428758369) 13383 \n", "3 POINT (-73.99972826980175 40.74337448032719) 60047 \n", "4 POINT (-73.95666905608053 40.77112649759413) 57296 \n", "\n", "[5 rows x 50 columns]" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "sidewalk_gdf.head()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the visualization" ] }, { "cell_type": "code", "execution_count": 60, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "i = 425\n", "f, ax = plt.subplots(1, figsize=(15, 10))\n", "\n", "lion_gdf.loc[lion_gdf['SegmentID'] == lion_gdf['SegmentID'].iloc[sidewalk_gdf['on_line'].iloc[i]]].plot(ax=ax)\n", "sidewalk_gdf = sidewalk_gdf.set_geometry('geometry')\n", "# Original point\n", "sidewalk_gdf.loc[sidewalk_gdf.index == i].plot(ax=ax, color = 'blue')\n", "sidewalk_gdf = sidewalk_gdf.set_geometry('nearest_point_on_line')\n", "# Snapped point\n", "sidewalk_gdf.loc[sidewalk_gdf.index == i].plot(ax=ax, color = 'red')\n", "\n", "plt.show();" ] } ], "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.3" } }, "nbformat": 4, "nbformat_minor": 2 }