This is a write-up for my final project in GEOG 4046. View the Web Map
Introduction
The goal with this web page project is to show bars, music clubs, and restaurants in downtown New Orleans--not just where they are, but who owns them. The map is focused on businesses located in the French Quarter and Marigny, and attempts to illustrate which establishments are part of larger networks, and which ones are truly independent within the district. Visualizing this information may be especially important during this time, as the temporary closures due to the covid-19 pandemic will not be temporary for everyone.
Input Datasets
Two datasets were used to create the map, both of which are publicly available through the city of New Orleans open data initiatives.
1. Active Occupational Licenses
This is a feature layer served through the city's public ArcGIS server:
https://gis.nola.gov/arcgis/rest/services/Revenue/ActiveOccupationalLicenses/FeatureServer
It is a point layer containing approximately 13,500 features, each representing the location and details about a single business license.
Example Occupational License Record
BusinessAddress: 941 BOURBON ST BusinessLicenseNumber: 240807 BusinessName: LAFITTE'S BLACKSMITH SHOP BusinessPhone: 5045939761 BusinessStartDate: April 15, 1996 BusinessType: 1126 - DRINKING PLACES (ALCOHOLIC BEVERAGES) CBD: Not In Central Business District City: NEW ORLEANS CleanZoneDates: June 25, 2017 (6 am) to July 3, 2016 (6 pm) CleanZoneOrdinance: Cal. No. 31,900 CleanZoneTitle: Essence Festival CouncilDistrict: C CulturalProductsDistrictName: French Quarter DDD: Not In Downtown Development District FQTEDD: Within FQTEDD FireDemandZone: 1130 FireEngine: E09 FoodTruckAuthorization: Prohibited FoodTruckZone: Food Truck Prohibited Zone LocalHistoricDistrictName: Vieux Carré LocalHistoricDistrictOrdinance: New Orleans Code of Ordinances, Part II - Code, Chapter 166 - Vieux Carre, Sec. 166-2 LocationX: 3682900.95292 LocationY: 533555.780869 MailAddress: 941 BOURBON ST MailCity: NEW ORLEANS MailState: May 1, 2020 MailZip: 70116 MoratoriumTitle: NO ABO Moratorium NOFDDistrict: 2 NOPDDistrict: 8 OBJECTID: 1068000 OwnerName: BLACKSMITH MANAGEMENT, INC. RevenueZone: 7 State: May 1, 2020 StreetName: BOURBON StreetNumber: 941 StreetSuffix: ST TIFTitle: Not within a Tax Increment Finance (TIF) District VieuxCarre: Vieux Carre VieuxCarreOrdinance: New Orleans, Code of Ordinances, Part II - Code, Chapter 166 - Vieux Carre, Sec. 166-2 Zip: 70116 ZoneLabel: Vieux Carre BusinessAddress: 941 BOURBON ST BusinessLicenseNumber: 240807 BusinessName: LAFITTE'S BLACKSMITH SHOP BusinessPhone: 5045939761 BusinessStartDate: April 15, 1996 BusinessType: 1126 - DRINKING PLACES (ALCOHOLIC BEVERAGES) CBD: Not In Central Business District City: NEW ORLEANS CleanZoneDates: June 25, 2017 (6 am) to July 3, 2016 (6 pm) CleanZoneOrdinance: Cal. No. 31,900 CleanZoneTitle: Essence Festival CouncilDistrict: C CulturalProductsDistrictName: French Quarter DDD: Not In Downtown Development District FQTEDD: Within FQTEDD FireDemandZone: 1130 FireEngine: E09 FoodTruckAuthorization: Prohibited FoodTruckZone: Food Truck Prohibited Zone LocalHistoricDistrictName: Vieux Carré LocalHistoricDistrictOrdinance: New Orleans Code of Ordinances, Part II - Code, Chapter 166 - Vieux Carre, Sec. 166-2 LocationX: 3682900.95292 LocationY: 533555.780869 MailAddress: 941 BOURBON ST MailCity: NEW ORLEANS MailState: May 1, 2020 MailZip: 70116 MoratoriumTitle: NO ABO Moratorium NOFDDistrict: 2 NOPDDistrict: 8 OBJECTID: 1068000 OwnerName: BLACKSMITH MANAGEMENT, INC. RevenueZone: 7 State: May 1, 2020 StreetName: BOURBON StreetNumber: 941 StreetSuffix: ST TIFTitle: Not within a Tax Increment Finance (TIF) District VieuxCarre: Vieux Carre VieuxCarreOrdinance: New Orleans, Code of Ordinances, Part II - Code, Chapter 166 - Vieux Carre, Sec. 166-2 Zip: 70116 ZoneLabel: Vieux CarreBusinessAddress: 941 BOURBON ST BusinessLicenseNumber: 240807 BusinessName: LAFITTE'S BLACKSMITH SHOP BusinessPhone: 5045939761 BusinessStartDate: April 15, 1996 BusinessType: 1126 - DRINKING PLACES (ALCOHOLIC BEVERAGES) CBD: Not In Central Business District City: NEW ORLEANS CleanZoneDates: June 25, 2017 (6 am) to July 3, 2016 (6 pm) CleanZoneOrdinance: Cal. No. 31,900 CleanZoneTitle: Essence Festival CouncilDistrict: C CulturalProductsDistrictName: French Quarter DDD: Not In Downtown Development District FQTEDD: Within FQTEDD FireDemandZone: 1130 FireEngine: E09 FoodTruckAuthorization: Prohibited FoodTruckZone: Food Truck Prohibited Zone LocalHistoricDistrictName: Vieux Carré LocalHistoricDistrictOrdinance: New Orleans Code of Ordinances, Part II - Code, Chapter 166 - Vieux Carre, Sec. 166-2 LocationX: 3682900.95292 LocationY: 533555.780869 MailAddress: 941 BOURBON ST MailCity: NEW ORLEANS MailState: May 1, 2020 MailZip: 70116 MoratoriumTitle: NO ABO Moratorium NOFDDistrict: 2 NOPDDistrict: 8 OBJECTID: 1068000 OwnerName: BLACKSMITH MANAGEMENT, INC. RevenueZone: 7 State: May 1, 2020 StreetName: BOURBON StreetNumber: 941 StreetSuffix: ST TIFTitle: Not within a Tax Increment Finance (TIF) District VieuxCarre: Vieux Carre VieuxCarreOrdinance: New Orleans, Code of Ordinances, Part II - Code, Chapter 166 - Vieux Carre, Sec. 166-2 Zip: 70116 ZoneLabel: Vieux Carre
This layer can be easily added to QGIS as an ArcGIS FeatureServer Layer using the url above, and the first thing I did when I added it was save it out as a separate GeoPackage file, so it would be easier (and quicker) to manipulate.
2. Building Footprints
I downloaded the Building Footprint dataset from data.nola.gov:
https://data.nola.gov/dataset/Building-Footprint/m3gg-u447
This is a large file, approximately 160k features and 150mb on disk.
Geospatial Data Processing
The overall goal was to create a building footprint layer with business information attached to each feature. This would provide a nice way to visualize the businesses and how they are distributed throughout the neighborhood. I didn't want to have the relevant buildings floating in space though, so I decided to make a Mapbox style from the full building footprint dataset, in order to layer it directly on the basemap.
Creating the Building Footprint Layer in Mapbox
In QGIS, I export the building footprint shapefile to GeoJSON (EPSG:4326), and exclude all fields from the export. The result is a GeoJSON file that only contains the geometry for every building in New Orleans, file size is ~54mb. Upload this file to Mapbox as a Tileset, called building-footprints-lite, and then create a new Style, starting with the blank template. Add the building-footprints-lite Tileset to the Style, and give it a simple uniform set of style rules: fill is white and 75% opaque, outline ("stroke") is 1pt, black, and 99% opaque. This style can now be added as a static overlay draped on the final map.
Creating the Data Layer
The actual data layer was created by performing a spatial join to attach the attributes from the Active Occupational License points to the polygons of the Building Footprints. I did this for the whole city, just out of curiosity (resulting in a buildings layer that only contained buildings with businesses) and then reduced the number of buildings further by creating an Area of Interest.
When I had a reduced number of buildings and began to inspect the data more closely, I found that there were many cases where a building footprint would actually intersect with two or more license points. In these cases, the spatial join would only take attributes from one point, thereby losing information about an entire business.
To fix this I did some manual editing of the building footprints, using my best judgment to split them into pieces where necessary.
This splitting was performing for the entire area of interest, and in some cases occupational license points were manually placed on buildings, where initially they had not been positioned to intersect with anything.
Once a final spatial dataset was ready, I exported it to a CSV in order to use Python to inspect the qualitative information attached to each point (that's the important stuff, anyway!)
Tabular Data Processing
I worked up a python script first helped me inspect the ownership information about all of the buildings, and later concatenated some values and enhanced the output CSV.
First, I found that there are 3 types of businesses licenses related to what I'm interested in. Here is a printout from the script showing the count of businesses within the area of interest for each relevant type.
---- BY BUSINESS TYPE ----
('1105 - FULL SVC RESTAURANTS (TABLE SERVICE)', 181)
('1126 - DRINKING PLACES (ALCOHOLIC BEVERAGES)', 146)
('2062 - LIMITED SVC RESTAURANTS(NO TABLE SVC)', 25)
Next, I the rows of the two different times to see if there were owner names that are repeated across multiple values. I did a good bit of sanitizing here (removing all of the . / , -
etc. characters from the strings before comparing them. Doing so was a little disappointing... the most common owner name only had three different locations.
---- BY NORMALIZED OWNER NAME ----
CAFEBEIGNETLLC count: 3
('CAFE BEIGNET,LLC', 'CAFE BEIGNET DECATUR')
('CAFE BEIGNET LLC', 'CAFE BEIGNET')
('CAFE BEIGNET, LLC', 'CAFE BEIGNET IV')
BOURBONSALOONINC count: 3
('BOURBON SALOON, INC', '')
('BOURBON SALOON, INC', 'MANGOMANGO - AB MANGO DAIQUIRI')
('BOURBON SALOON INC', 'MANGOMANGO - BE')
PATOBRIENSBARINC count: 2
("PAT O'BRIEN'S BAR INC", 'PAT OBRIENS BAR')
("PAT OBRIEN'S BAR INC.", 'PAT O BRIENS BAR')
TOMMYPHAMINC count: 2
('TOMMY PHAM, INC', "HOTSY'S BURGER")
('TOMMY PHAM, INC', "T'S PIZZA & PASTA")
## and so on
Finally, instead of the owner name I tried the mailing address for the business. Much greater success.
---- BY MAILING ADDRESS ----
119 MULBERRY DR count: 13
('501-B BOURBON LLC', 'LE BAYOU')
('426 BOURBON LLC', 'PIER 424 SEAFOOD MARKET RESTAURANT')
('CONTI BC, LLC', 'BOMBAY CLUB')
('CAFE MASPERO DECATUR, LLC', 'CAFE MASPERO')
('CCRC 301 CHARTRES LLC', 'THE GOVERNOR')
('540 CHARTRES, LLC', 'CHARTRES HOUSE')
("BROUSSARD'S RESTAURANT LLC", "BROUSSARD'S RESTAURANT")
('301 ROYAL LLC', 'CURIO')
('925 DECATUR, LLC', 'CITY PIZZA WORKS')
('617 DECATUR LLC', 'BIG EASY OF WILKINSON')
('337 CHARTRES LLC', 'KINGFISH')
('218 NOBRUOB LLC', 'BIG EASY DAIQUIRIS & FRY BAR')
('407 BOURBON, LLC', 'CRESCENT CITY PIZZA WORKS')
442 CANAL ST count: 5
('GOLDEN BOURBON INC', "WILLIE'S CHICKEN SHACK")
('CHARTERS CAFE, LLC', "WILLIE'S CHICKEN SHACK")
('VOODOO BAR & PIZZA LLC', "WILLIE'S PIZZA JOINT")
('DIAMOND BOURBON INC', 'BEERFEST I')
("WILLIE'S 707 CANAL LLC", "WILLIE'S CHICKEN SHACK")
P.O. BOX 57809 count: 5
('TEMPTATIONS INC.', "STILETTO'S/FAIS DEAUX DEAUX")
("BAMBOULA'S INC", "BAMBOULA'S")
('JAXX HOUSE INC', "D'LISH")
('SILVER BOURBON INC', 'SCORES')
('SWEET THINGS OF LOUISIANA, INC', 'FISHBOWLS SOLD HERE')
## and so on
Between the name matching and the mailing address matching I decided that I had enough to work with. I modifed the script a little bit to group license numbers (instead of business names as shown above) and then was ready to make my final addition to the script to create the export data.
I made three new fields, not knowing whether I would get a chance to use all of them or not (I didn't). They were
DateCategory - which stored a simple string like "1980s" for when the business was created
OwnerCategory - to store one of "LLC", "Corp.", "Inc." or "Other, as derived from the owner name
RelatedLicenes - to store a semi-colon delimited list of all the other business licenses associated with a given row, as determined by the name and address match logic described above.
The output of the script was a new CSV file, and then I headed back to QGIS to json the newly created fields to the Building Footprints layer.
Putting Together the Web Map
To use my enhanced building footprints in the web map I stripped away as much as possible during the export to geojson. Remember, I had already created a flat, geometry-only footprints style in Mapbox, which relieves this dataset of having to do anything put hold attributes for a select group of buildings, specifically, only the buildings that house businesses in any of the three categories shown above. Therefore, I was able to export a small amount of features and strip down the attributes to keep the file size as small as possible (in the end, 276kb). This GeoJSON layer is added to the map and styled very simply.
In then end, I have four layers, which hopefully blend together to look like less.
- Stamen Watercolor (Open Street Map rendering)
- Full Building Footprint Style published through Mapbox
- The enhanced building footprint layer containing only relevant buildings
- Stamen Terrain Labels
Map Interactivity
The use of the map is very simple: click on a business, and its name, owner, and any other businesses owned by the same entity will pop up in the right-hand panel. Enjoy!