Love's GIS Case Study

Network analysis of EV infrastructure in Pennsylvania (PA). Ranking and identification of Love's Travel Stops

For any Love's store to qualify for Round 1 allocation of EV charging stations, it has to comply with the following conditions - a) Must be inside of the Priority I polygon of an interstate polygon group. b) Must be within a 1-mile polygon to receive funds without an exemption.

Love's Travel Stops are identified and ranked as per the criteria laid down by PennDOT for National Electric Vehicle Infrastructure Formula (NEVI Formula) program.

There are 7 Love's Stops across Pennsylvania (PA).

The current interstate network of PA. Love's Stops are present on I-70, I-76. I-78, I-79, I-80, I-81

The overlay of highways and Loves stores for the EV Charging Infrastructure.

The following is the fifty-mile polygon with a priority order ranked as I, II, and III. And Round 1 locations are part of priority I.

Almost all locations of Love's Stops fall in the 50-mile polygons. However, 3 stores fall in Priority I list of polygons.

Created an attribute named "Rank" by using a python function (refer below) and each store is evaluated based on priority and nearness (distance) to 1-mile polygons at interchanges.

Found only one store - Store #324 (Rank 1) perfectly eligible abiding by all the criteria of PennDOT at the address: I-80, Exit 242, 440 W. 3rd, Mifflinville, PA, 18631. Below is the code utilized for creating the rank label, based on attributes of Priority and NEAR_DIST (computed using geoprocessing tool).


Data Input & Pre-processing

Downloaded PA Counties, PA State shapefiles from US Census Bureau. Extracted Latitude and Longitude of Love's Stops in PA from a manual Google search and made a CSV of attributes. Downloaded data from  PennDOT Anticipated Round 1  of Interstate ways, 50-mile polygons, 1-mile polygon layers at various exits and interchanges. Created a location logo of Love's by using Noun project icons, from a python code exported files from downloaded zip file from PennDOT to the working folder Geodatabase (.gdb)

Geo-processing Tasks

1. XYPointToTable: Converted the CSV file of stores into a shapefile. 2. Merge: performed over all the group layers in PA (merge by priority column). 3. Intersect: Between Love's point layer and merged 50-mile polygon layer (~ Interstate_intersect_layer). 4. Select by location (Within): Extracted all the 1-mile polygon layers within the Interstate_intersect_layer. 5. Near Tool: Performed on Love's point layer and generated distance from nearest polygons, thus creating the NEAR_DIST attribute within Love's point layer. [If the store is within the 1-mile polygon, it gives 0, if it is within 5 miles, it gives the distances, if it is outside of range gives -1] 6. Spatial join: Performed between Interstate_intersect_layer and Love's point layer. Creating a StoreName attribute and table joining it with Love's point layer and extracting the priority information as a new attribute into Love's point layer. 7. Creating a new attribute rank and calculating using rank function.

Data presentation and Results

Creating all the images in Adobe Illustrator, applying cartographic design to maps, and processing them as PNGs. Embedding them into ArcGIS StoryMaps for presentation.

Software & Programming

ArcGIS Pro (geoprocessing), Python - arcpy (data extraction and data design), Adobe illustrator - (Graphic design), ArcGIS Story Maps - Presentation and delivery, Google - data collection of Love's Stores.

Python function used to calculate the field "Rank" in Love's Stops point layer

def rank(priority,nearness_distance):
    if priority=='I' and nearness_distance==0:
        return 1
    elif priority=='II' and nearness_distance==0:
        return 2
    elif priority=='III' and nearness_distance==0:
        return 3
    elif priority=='I' and nearness_distance>0:
        return 4
    elif priority=='II' and nearness_distance>0:
        return 5
    elif priority=='III' and nearness_distance>0:
        return 6
    else:
        return 7

Data loading of all required shapefiles from file folder to geodatabase of working project in ArcGIS Pro

#Using arcpy module for bulk data loading to geodatabase
import arcpy
import os

arcpy.env.workspace = r'D:\Arc_Sidrcs\Loves_EV_PA'
input_folder = r'D:\Arc_Sidrcs\Loves_EV_PA\PA_NEVI_Round1_Shapefiles_01-18-2023'
list_highways = ['70','76','78','79','80','81']
list_folderNames = ['_Groups','_Polygons']
output_geodatabase = r'D:\Arc_Sidrcs\Loves_EV_PA\Loves_EV_PA.gdb'


shapefile_list = []

#iterates through each sub-folder and extracts file paths from each shapefile
for file in os.listdir(input_folder):
    for i in list_highways:
        for j in list_folderNames:
            main_file = 'I'+i+j
            if file == main_file:
                file_path = os.path.join(input_folder,file)
                for extract_file in os.listdir(file_path):
                    if extract_file.endswith('.shp'):
                        #creating a simple list of paths of shapefiles
                        shapefile_list.append(os.path.join(file_path,extract_file))
            else:
                pass

print(shapefile_list)

counter = 0

for shapefile in shapefile_list:

    feature_class_name = shapefile.split('\\')[-1]

    if arcpy.Exists(os.path.join(output_geodatabase, feature_class_name)):
        # Use the Delete tool to delete the feature class
        arcpy.Delete_management(os.path.join(output_geodatabase, feature_class_name))

    output_feature_class = os.path.join(output_geodatabase, feature_class_name)

    # Use the Feature Class To Feature Class tool to copy the shapefile to the geodatabase
    arcpy.FeatureClassToFeatureClass_conversion(shapefile, output_geodatabase, feature_class_name)

    counter+=1

print(counter)

Credits

GIS Analyst & Map designer

Chinna Subbaraya Siddharth (Sid) Ramavajjala | MSc GIS & Cartography, University of Wisconsin Madison

Data credits

PennDOT