From 645aa85751fd930e73c35c21b2c43b8ae3af6a01 Mon Sep 17 00:00:00 2001 From: Chandler Swift Date: Sat, 19 Aug 2023 13:52:20 -0500 Subject: [PATCH] Add Punch Pizza --- layers/chains/index.js | 5 +++ layers/chains/punch-pizza/get_data.py | 43 +++++++++++++++++++ layers/chains/punch-pizza/layer.js | 24 +++++++++++ layers/chains/punch-pizza/pin.svg | 60 +++++++++++++++++++++++++++ 4 files changed, 132 insertions(+) create mode 100755 layers/chains/punch-pizza/get_data.py create mode 100644 layers/chains/punch-pizza/layer.js create mode 100644 layers/chains/punch-pizza/pin.svg diff --git a/layers/chains/index.js b/layers/chains/index.js index d12b301..6ad85f2 100644 --- a/layers/chains/index.js +++ b/layers/chains/index.js @@ -4,6 +4,7 @@ import krispyKremeLayer from './krispy-kreme/layer.js'; import kwikTripLayer from './kwik-trip/layer.js'; import menardsLayer from './menards/layer.js'; import milwaukeeBurgerCompanyLayer from './milwaukee-burger-company/layer.js'; +import punchPizzaLayer from './punch-pizza/layer.js'; import waffleHouseLayer from './waffle-house/layer.js'; import whataburgerLayer from './whataburger/layer.js'; @@ -34,6 +35,10 @@ const chains = { name: "Milwaukee Burger Company", layer: milwaukeeBurgerCompanyLayer, }, + { + name: "Punch Pizza", + layer: punchPizzaLayer, + }, { name: "Waffle House", layer: waffleHouseLayer, diff --git a/layers/chains/punch-pizza/get_data.py b/layers/chains/punch-pizza/get_data.py new file mode 100755 index 0000000..63a3b82 --- /dev/null +++ b/layers/chains/punch-pizza/get_data.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import requests +import json +from bs4 import BeautifulSoup +import re +import urllib.parse + +# Stolen from my machine, appears to work; sufficient and necessary to get +# around their firewall apparently? +UA={ + "User-Agent": 'Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/114.0' +} + +response = requests.get('https://punchpizza.com/locations/', headers=UA) + +soup = BeautifulSoup(response.text, 'html.parser') +location_links = soup.select('div.loctop > .wpb_wrapper > ul > li > a') # Two rows with the same id :eyeroll: + +locations = [] +for location_link in location_links: + location_response = response = requests.get(urllib.parse.urljoin("https://punchpizza.com", location_link['href']), headers=UA) + latlon = re.search(r'var punchloc = {lat: ([0-9.-]*), lng: ([0-9.-]*)};', location_response.text) + if not latlon: + raise Exception("No latlon found") + locations.append({ + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [float(latlon[2]), float(latlon[1])], # yes, [lon, lat] since it's [x, y] + }, + # TODO: addresses are kind of a mess + }) + +geojson = { + "type": "FeatureCollection", + "features": locations, +} + +print(len(locations), "locations found") + +with open("data.geojson", "w") as f: + f.write(json.dumps(geojson)) diff --git a/layers/chains/punch-pizza/layer.js b/layers/chains/punch-pizza/layer.js new file mode 100644 index 0000000..96b894e --- /dev/null +++ b/layers/chains/punch-pizza/layer.js @@ -0,0 +1,24 @@ +import VectorLayer from 'ol/layer/Vector'; +import {Vector as VectorSource} from 'ol/source.js'; +import GeoJSON from 'ol/format/GeoJSON.js'; + +import {Style} from 'ol/style.js'; +import Icon from 'ol/style/Icon.js'; + +import url from './data.geojson?url'; // TODO: remove `?url`? +import pin from './pin.svg?url'; // TODO: remove `?url`? + +const vectorLayer = new VectorLayer({ + source: new VectorSource({ + url: url, + format: new GeoJSON, + }), + style: new Style({ + image: new Icon({ + anchor: [0.5, 1], + src: pin, // or https://punchpizza.com/wp-content/themes/sprung-total/img/mappoint-punch.png + }), + }), +}); + +export default vectorLayer; diff --git a/layers/chains/punch-pizza/pin.svg b/layers/chains/punch-pizza/pin.svg new file mode 100644 index 0000000..0b526c5 --- /dev/null +++ b/layers/chains/punch-pizza/pin.svg @@ -0,0 +1,60 @@ + + + + + + + + + + + +