Skip to content

Instantly share code, notes, and snippets.

@zhik
Created May 24, 2023 23:39
Show Gist options
  • Save zhik/557bbe24007053a1a53a980c1089a4f6 to your computer and use it in GitHub Desktop.
Save zhik/557bbe24007053a1a53a980c1089a4f6 to your computer and use it in GitHub Desktop.
Geocoding NYC Intersections using Geoclient
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 50,
"id": "ffa2348c",
"metadata": {},
"outputs": [],
"source": [
"import pandas as pd\n",
"import requests\n",
"import re\n",
"from time import sleep\n",
"\n",
"#https://maps.nyc.gov/geoclient/v1/doc\n",
"#get the api here https://api-portal.nyc.gov/api-details#api=geoclient&operation=geoclient\n",
"API_KEY = ''\n",
"\n",
"def geocode_intersection(boro1, street1, street2, compass = None):\n",
" headers = {\n",
" 'Ocp-Apim-Subscription-Key': API_KEY\n",
" }\n",
" url = f'https://api.nyc.gov/geo/geoclient/v1/intersection.json?crossStreetOne={street1}&crossStreetTwo={street2}&borough={boro1}'\n",
" \n",
" \n",
" r = requests.get(url, headers = headers)\n",
" sleep(0.01)\n",
" return r.json()\n",
" "
]
},
{
"cell_type": "code",
"execution_count": 31,
"id": "697d9128",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Closest Intersection</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>52</th>\n",
" <td>Staten Island</td>\n",
" <td>CLOVE RD AT CASTLETON AV</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>Manhattan</td>\n",
" <td>MANHATTAN BR AT BOWERY/CANAL ST</td>\n",
" </tr>\n",
" <tr>\n",
" <th>86</th>\n",
" <td>Staten Island</td>\n",
" <td>HYLAN BOULEVARD AT RICHARD AVENUE</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>Bronx</td>\n",
" <td>E 215 ST 163 FT W BARNES AV</td>\n",
" </tr>\n",
" <tr>\n",
" <th>15</th>\n",
" <td>Manhattan</td>\n",
" <td>7 AV 60 FT S 150 ST</td>\n",
" </tr>\n",
" <tr>\n",
" <th>54</th>\n",
" <td>Brooklyn</td>\n",
" <td>OCEAN AV 90 FT N AVENUE L</td>\n",
" </tr>\n",
" <tr>\n",
" <th>70</th>\n",
" <td>Queens</td>\n",
" <td>COLLEGE POINT BL 115 FT N 18 AV</td>\n",
" </tr>\n",
" <tr>\n",
" <th>97</th>\n",
" <td>Queens</td>\n",
" <td>N Conduit Ave and 160th St</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Closest Intersection\n",
"52 Staten Island CLOVE RD AT CASTLETON AV\n",
"38 Manhattan MANHATTAN BR AT BOWERY/CANAL ST\n",
"86 Staten Island HYLAN BOULEVARD AT RICHARD AVENUE\n",
"42 Bronx E 215 ST 163 FT W BARNES AV\n",
"15 Manhattan 7 AV 60 FT S 150 ST\n",
"54 Brooklyn OCEAN AV 90 FT N AVENUE L\n",
"70 Queens COLLEGE POINT BL 115 FT N 18 AV\n",
"97 Queens N Conduit Ave and 160th St"
]
},
"execution_count": 31,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"df = pd.read_csv('./98 intersections.csv')\n",
"df.sample(8)"
]
},
{
"cell_type": "code",
"execution_count": 34,
"id": "cd17544c",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Closest Intersection</th>\n",
" <th>Street1</th>\n",
" <th>sep</th>\n",
" <th>Street2</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>95</th>\n",
" <td>Queens</td>\n",
" <td>Newtown Rd and 45th St</td>\n",
" <td>Newtown Rd</td>\n",
" <td>None</td>\n",
" <td>45th St</td>\n",
" </tr>\n",
" <tr>\n",
" <th>39</th>\n",
" <td>Brooklyn</td>\n",
" <td>LEWIS AV AT JEFFERSON AV</td>\n",
" <td>LEWIS AV</td>\n",
" <td>None</td>\n",
" <td>JEFFERSON AV</td>\n",
" </tr>\n",
" <tr>\n",
" <th>42</th>\n",
" <td>Bronx</td>\n",
" <td>E 215 ST 163 FT W BARNES AV</td>\n",
" <td>E 215 ST</td>\n",
" <td>W</td>\n",
" <td>BARNES AV</td>\n",
" </tr>\n",
" <tr>\n",
" <th>68</th>\n",
" <td>Queens</td>\n",
" <td>80 AV 50 FT W 265 ST</td>\n",
" <td>80 AV</td>\n",
" <td>W</td>\n",
" <td>265 ST</td>\n",
" </tr>\n",
" <tr>\n",
" <th>13</th>\n",
" <td>Bronx</td>\n",
" <td>GRAND CONCOURSE 126 FT N E 170 ST</td>\n",
" <td>GRAND CONCOURSE</td>\n",
" <td>N</td>\n",
" <td>E 170 ST</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Closest Intersection Street1 sep \\\n",
"95 Queens Newtown Rd and 45th St Newtown Rd None \n",
"39 Brooklyn LEWIS AV AT JEFFERSON AV LEWIS AV None \n",
"42 Bronx E 215 ST 163 FT W BARNES AV E 215 ST W \n",
"68 Queens 80 AV 50 FT W 265 ST 80 AV W \n",
"13 Bronx GRAND CONCOURSE 126 FT N E 170 ST GRAND CONCOURSE N \n",
"\n",
" Street2 \n",
"95 45th St \n",
"39 JEFFERSON AV \n",
"42 BARNES AV \n",
"68 265 ST \n",
"13 E 170 ST "
]
},
"execution_count": 34,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"def getStreets(text):\n",
" #try spliting using AT, 'and', and '(0-9) AT (direction)'\n",
" streets_list = re.split(r\" and | AT | \\d+ FT (N|S|W|E) \", text)\n",
" if len(streets_list) == 3:\n",
" return pd.Series(streets_list)\n",
" else:\n",
" return pd.Series([text, ''])\n",
" \n",
"df[[\"Street1\",\"sep\",\"Street2\"]] = df[\"Closest Intersection\"].apply(getStreets)\n",
"df.sample(5)"
]
},
{
"cell_type": "code",
"execution_count": 53,
"id": "2331d6cd",
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"<AxesSubplot: xlabel='longitude', ylabel='latitude'>"
]
},
"execution_count": 53,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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3t4eVVVVmDBhgtbh5+cn6Z6IyLTY00REsqdWq7F48WL813/9F9588004Ozvj2Wefha+vLxYvXiy5nrVr1yIzMxMTJkzALbfcgi1btqCxsbFH71N348aNw5EjR7B06VLY29vD3d0dUVFRuHjxIjZt2oRf//rX+OSTT/D3v/8dLi4u4ucSEhLwhz/8AWq1GkFBQcjKykJTU5N43tnZGevWrcMzzzyDzs5OzJw5ExqNBsePH8fw4cPx6KOP6vWsiMh42NNERIqwc+dOhIaG4p577kF4eDgEQcChQ4d6DMn1Z/369YiJiUFcXBzCw8MxfPhwLFiwAA4ODn1+ZuPGjTh37hzGjx8PDw8PAEBQUBC2bduG119/HbfddhtOnDihtUoPAH77298iLi4Ojz32GMLDw+Hs7CxOQO/y4osv4ve//z0yMzMRFBSEBQsW4H/+538QEBCgw5MhIlNRCfoM6BMRWYDOzk4EBQXhoYcewosvvmju5hCRzHF4joisxvnz55GXl4fZs2ejra0NW7duRWVlJZYtW2buphGRAnB4joisho2NDXbt2oU777wTkZGRKC0txWeffSZ5MjkRWTcOzxERERFJwJ4mIiIiIgkYNBERERFJwKCJiIiISAIGTUREREQSMGgiIiIikoBBExEREZEEDJqIiIiIJGDQRERERCQBgyYiIiIiCf4fRLekAsJrAR4AAAAASUVORK5CYII=\n",
"text/plain": [
"<Figure size 640x480 with 1 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"def getLatLng(row):\n",
" json = geocode_intersection(row['Borough'], row['Street1'], row['Street2'])\n",
" d = json['intersection']\n",
" try:\n",
" return pd.Series([d['longitude'], d['latitude']])\n",
" except:\n",
" if row['sep'] and 'STREETS INTERSECT TWICE' in d['message'] and row['sep'] in ('N','S','W','E'): \n",
" # this can probably be fixed if we have a compass direction\n",
" try: \n",
" json = geocode_intersection(row['Borough'], row['Street1'], row['Street2'], row['sep'])\n",
" d = json['intersection']\n",
" return pd.Series([d['longitude'], d['latitude']])\n",
" except:\n",
" return pd.Series([None, None])\n",
" return pd.Series([None, None])\n",
" else:\n",
" return pd.Series([None, None])\n",
" #print(d['message'], '\\n---\\t' , row['sep'], row['Closest Intersection'])\n",
" \n",
"df[['longitude','latitude']] = df.apply(getLatLng, axis = 1)\n",
"df.plot.scatter(x='longitude', y='latitude')"
]
},
{
"cell_type": "code",
"execution_count": 56,
"id": "8a5b7f2d",
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>Borough</th>\n",
" <th>Closest Intersection</th>\n",
" <th>Street1</th>\n",
" <th>sep</th>\n",
" <th>Street2</th>\n",
" <th>longitude</th>\n",
" <th>latitude</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>Queens</td>\n",
" <td>LONG ISLAND EP AT 169 ST</td>\n",
" <td>LONG ISLAND EP</td>\n",
" <td>None</td>\n",
" <td>169 ST</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>Brooklyn</td>\n",
" <td>AT 289 EMPIRE BL</td>\n",
" <td>AT 289 EMPIRE BL</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>5</th>\n",
" <td>Brooklyn</td>\n",
" <td>FLATLANDS AVE 120 T W SCHENECTADY AV</td>\n",
" <td>FLATLANDS AVE 120 T W SCHENECTADY AV</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>18</th>\n",
" <td>Queens</td>\n",
" <td>210 ST 90 AT N 64 AV</td>\n",
" <td>210 ST 90</td>\n",
" <td>None</td>\n",
" <td>N 64 AV</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>19</th>\n",
" <td>Queens</td>\n",
" <td>210 ST 90 AT N 64 AV</td>\n",
" <td>210 ST 90</td>\n",
" <td>None</td>\n",
" <td>N 64 AV</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>20</th>\n",
" <td>Brooklyn</td>\n",
" <td>E 22 ST 158 AT N DITMAS AV</td>\n",
" <td>E 22 ST 158</td>\n",
" <td>None</td>\n",
" <td>N DITMAS AV</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>21</th>\n",
" <td>Staten Island</td>\n",
" <td>HYLAN BL 270 AT S ARDEN AV</td>\n",
" <td>HYLAN BL 270</td>\n",
" <td>None</td>\n",
" <td>S ARDEN AV</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>32</th>\n",
" <td>Manhattan</td>\n",
" <td>AT I-95N UPPER EXPY EAST LANE 2</td>\n",
" <td>AT I-95N UPPER EXPY EAST LANE 2</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>34</th>\n",
" <td>Queens</td>\n",
" <td>GRAND CENTRAL PY AT 188 ST</td>\n",
" <td>GRAND CENTRAL PY</td>\n",
" <td>None</td>\n",
" <td>188 ST</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>38</th>\n",
" <td>Manhattan</td>\n",
" <td>MANHATTAN BR AT BOWERY/CANAL ST</td>\n",
" <td>MANHATTAN BR</td>\n",
" <td>None</td>\n",
" <td>BOWERY/CANAL ST</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>47</th>\n",
" <td>Queens</td>\n",
" <td>AT 10-62 GIPSON ST</td>\n",
" <td>AT 10-62 GIPSON ST</td>\n",
" <td></td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>51</th>\n",
" <td>Bronx</td>\n",
" <td>MAJOR DEEGAN EP 500 FT N EXIT 7 RAMP (CBX)</td>\n",
" <td>MAJOR DEEGAN EP</td>\n",
" <td>N</td>\n",
" <td>EXIT 7 RAMP (CBX)</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>57</th>\n",
" <td>Brooklyn</td>\n",
" <td>SETON PL AT FOSTER AV</td>\n",
" <td>SETON PL</td>\n",
" <td>None</td>\n",
" <td>FOSTER AV</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>64</th>\n",
" <td>Queens</td>\n",
" <td>SEAGIRT AV AT BEACH 19 ST</td>\n",
" <td>SEAGIRT AV</td>\n",
" <td>None</td>\n",
" <td>BEACH 19 ST</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>73</th>\n",
" <td>Brooklyn</td>\n",
" <td>GATES AV AT VANDEBILT ST</td>\n",
" <td>GATES AV</td>\n",
" <td>None</td>\n",
" <td>VANDEBILT ST</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>74</th>\n",
" <td>Bronx</td>\n",
" <td>NEW ENGLAND THRUWAY AT GUN HILL RD</td>\n",
" <td>NEW ENGLAND THRUWAY</td>\n",
" <td>None</td>\n",
" <td>GUN HILL RD</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>77</th>\n",
" <td>Manhattan</td>\n",
" <td>HENRY HUDSON PY AT W 134 ST</td>\n",
" <td>HENRY HUDSON PY</td>\n",
" <td>None</td>\n",
" <td>W 134 ST</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>81</th>\n",
" <td>Brooklyn</td>\n",
" <td>KINGS HIGHWAY 147 FT W AVENUE K</td>\n",
" <td>KINGS HIGHWAY</td>\n",
" <td>W</td>\n",
" <td>AVENUE K</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>85</th>\n",
" <td>Brooklyn</td>\n",
" <td>BELT PARKWAY 625 FT W BAY PARKWAY</td>\n",
" <td>BELT PARKWAY</td>\n",
" <td>W</td>\n",
" <td>BAY PARKWAY</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" <tr>\n",
" <th>94</th>\n",
" <td>Queens</td>\n",
" <td>JFK Expy and 150th St</td>\n",
" <td>JFK Expy</td>\n",
" <td>None</td>\n",
" <td>150th St</td>\n",
" <td>NaN</td>\n",
" <td>NaN</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" Borough Closest Intersection \\\n",
"1 Queens LONG ISLAND EP AT 169 ST \n",
"2 Brooklyn AT 289 EMPIRE BL \n",
"5 Brooklyn FLATLANDS AVE 120 T W SCHENECTADY AV \n",
"18 Queens 210 ST 90 AT N 64 AV \n",
"19 Queens 210 ST 90 AT N 64 AV \n",
"20 Brooklyn E 22 ST 158 AT N DITMAS AV \n",
"21 Staten Island HYLAN BL 270 AT S ARDEN AV \n",
"32 Manhattan AT I-95N UPPER EXPY EAST LANE 2 \n",
"34 Queens GRAND CENTRAL PY AT 188 ST \n",
"38 Manhattan MANHATTAN BR AT BOWERY/CANAL ST \n",
"47 Queens AT 10-62 GIPSON ST \n",
"51 Bronx MAJOR DEEGAN EP 500 FT N EXIT 7 RAMP (CBX) \n",
"57 Brooklyn SETON PL AT FOSTER AV \n",
"64 Queens SEAGIRT AV AT BEACH 19 ST \n",
"73 Brooklyn GATES AV AT VANDEBILT ST \n",
"74 Bronx NEW ENGLAND THRUWAY AT GUN HILL RD \n",
"77 Manhattan HENRY HUDSON PY AT W 134 ST \n",
"81 Brooklyn KINGS HIGHWAY 147 FT W AVENUE K \n",
"85 Brooklyn BELT PARKWAY 625 FT W BAY PARKWAY \n",
"94 Queens JFK Expy and 150th St \n",
"\n",
" Street1 sep Street2 longitude \\\n",
"1 LONG ISLAND EP None 169 ST NaN \n",
"2 AT 289 EMPIRE BL NaN NaN \n",
"5 FLATLANDS AVE 120 T W SCHENECTADY AV NaN NaN \n",
"18 210 ST 90 None N 64 AV NaN \n",
"19 210 ST 90 None N 64 AV NaN \n",
"20 E 22 ST 158 None N DITMAS AV NaN \n",
"21 HYLAN BL 270 None S ARDEN AV NaN \n",
"32 AT I-95N UPPER EXPY EAST LANE 2 NaN NaN \n",
"34 GRAND CENTRAL PY None 188 ST NaN \n",
"38 MANHATTAN BR None BOWERY/CANAL ST NaN \n",
"47 AT 10-62 GIPSON ST NaN NaN \n",
"51 MAJOR DEEGAN EP N EXIT 7 RAMP (CBX) NaN \n",
"57 SETON PL None FOSTER AV NaN \n",
"64 SEAGIRT AV None BEACH 19 ST NaN \n",
"73 GATES AV None VANDEBILT ST NaN \n",
"74 NEW ENGLAND THRUWAY None GUN HILL RD NaN \n",
"77 HENRY HUDSON PY None W 134 ST NaN \n",
"81 KINGS HIGHWAY W AVENUE K NaN \n",
"85 BELT PARKWAY W BAY PARKWAY NaN \n",
"94 JFK Expy None 150th St NaN \n",
"\n",
" latitude \n",
"1 NaN \n",
"2 NaN \n",
"5 NaN \n",
"18 NaN \n",
"19 NaN \n",
"20 NaN \n",
"21 NaN \n",
"32 NaN \n",
"34 NaN \n",
"38 NaN \n",
"47 NaN \n",
"51 NaN \n",
"57 NaN \n",
"64 NaN \n",
"73 NaN \n",
"74 NaN \n",
"77 NaN \n",
"81 NaN \n",
"85 NaN \n",
"94 NaN "
]
},
"execution_count": 56,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"#manual geocode those who didn't work\n",
"df[pd.isna(df['longitude'])]"
]
},
{
"cell_type": "code",
"execution_count": 57,
"id": "f78a3ba5",
"metadata": {},
"outputs": [],
"source": [
"df.to_csv('./98 intersections_geocoded.csv', index = False)"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3 (ipykernel)",
"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.11.0"
}
},
"nbformat": 4,
"nbformat_minor": 5
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment