From e203a93478738fb2a3b26f606537b103e5ecbd5c Mon Sep 17 00:00:00 2001 From: Chandler Swift Date: Tue, 25 Jul 2023 17:41:31 -0500 Subject: [PATCH] Add Milwaukee Burger Company layer --- layers/index.js | 5 +++ layers/milwaukee-burger-company/get_data.py | 43 +++++++++++++++++++++ layers/milwaukee-burger-company/layer.js | 24 ++++++++++++ layers/milwaukee-burger-company/pin.svg | 16 ++++++++ 4 files changed, 88 insertions(+) create mode 100755 layers/milwaukee-burger-company/get_data.py create mode 100644 layers/milwaukee-burger-company/layer.js create mode 100644 layers/milwaukee-burger-company/pin.svg diff --git a/layers/index.js b/layers/index.js index 4a88746..0e66a63 100644 --- a/layers/index.js +++ b/layers/index.js @@ -10,6 +10,7 @@ import culversLayer from './culvers/layer.js'; import kwikTripLayer from './kwik-trip/layer.js'; import waffleHouseLayer from './waffle-house/layer.js'; import krispyKremeLayer from './krispy-kreme/layer.js'; +import milwaukeeBurgerCompanyLayer from './milwaukee-burger-company/layer.js'; const layerCategories = [ { @@ -87,6 +88,10 @@ const layerCategories = [ name: "Krispy Kreme", layer: krispyKremeLayer, }, + { + name: "Milwaukee Burger Company", + layer: milwaukeeBurgerCompanyLayer, + }, ] } ]; diff --git a/layers/milwaukee-burger-company/get_data.py b/layers/milwaukee-burger-company/get_data.py new file mode 100755 index 0000000..31ee135 --- /dev/null +++ b/layers/milwaukee-burger-company/get_data.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python3 + +import requests +import json +from bs4 import BeautifulSoup + +print("Searching for Milwaukee Burger Company locations") + +# 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://milwaukeeburgercompany.com/', headers=UA) + +soup = BeautifulSoup(response.text, 'html.parser') +location_lis = soup.select('section#locations ul.location-list > li') + +locations = [] +for location_li in location_lis: + lon = location_li + locations.append({ + "type": "Feature", + "geometry": { + "type": "Point", + "coordinates": [float(location_li['data-lng']), float(location_li['data-lat'])], # yes, [lon, lat] since it's [x, y] + }, + "properties": { + 'address': location_li.find('dd', class_="street").text, + 'city': location_li.find('dd', class_="city-state-zip").text.split(',')[0], + 'state': location_li.find('dd', class_="city-state-zip").text.split(', ')[1].split(' ')[0], + 'zip': location_li.find('dd', class_="city-state-zip").text.split(' ')[-1], + }, + }) + +geojson = { + "type": "FeatureCollection", + "features": locations, +} + +with open("milwaukee-burger-company-data.geojson", "w") as f: + f.write(json.dumps(geojson)) diff --git a/layers/milwaukee-burger-company/layer.js b/layers/milwaukee-burger-company/layer.js new file mode 100644 index 0000000..fc3f8e8 --- /dev/null +++ b/layers/milwaukee-burger-company/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/milwaukee-burger-company-data.geojson?url'; // TODO: remove `?url`? +import pin from '/layers/milwaukee-burger-company/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, + }), + }), +}); + +export default vectorLayer; diff --git a/layers/milwaukee-burger-company/pin.svg b/layers/milwaukee-burger-company/pin.svg new file mode 100644 index 0000000..5cd6d2c --- /dev/null +++ b/layers/milwaukee-burger-company/pin.svg @@ -0,0 +1,16 @@ + + + + +