#!/usr/bin/env python3 import os import urllib.request import urllib.parse # https://services9.arcgis.com/LLh6i97mwBitl1k5/ArcGIS/rest/services # # TODO: They have more historical data here but I'm not sure what the format is: # # locgnrl_sales_usetax_areas_2020Q2_History_2004Q1thru2020Q2_Transposed layers = [ ('2018Q3', 'locgnrl_sales_usetax_areas_2018Q3'), ('2018Q4', 'locgnrl_sales_usetax_areas_2018Q4'), ('2019Q1', 'locgnrl_sales_usetax_areas_2019Q1'), ('2019Q2', 'locgnrl_sales_usetax_areas_2019Q2'), ('2019Q3', 'locgnrl_sales_usetax_areas_2019Q3'), ('2019Q4', 'locgnrl_sales_usetax_areas_2019Q4'), ('2020Q1', 'locgnrl_sales_usetax_areas_2020Q1'), ('2020Q2', 'locgnrl_sales_usetax_areas_2020Q2'), ('2020Q3', 'local_general_salestax_areas_2020Q3'), ('2020Q4', 'local_general_salestax_areas_2020Q4'), ('2021Q1', 'local_general_salestax_areas_2021Q1'), ('2021Q2', 'local_general_salestax_areas_2021Q2'), ('2021Q3', 'locgnrl_sales_usetax_areas_2021Q3'), ('2021Q4', 'local_general_salestax_areas_2021Q4'), ('2022Q1', 'local_general_salestax_areas_2022_Q1'), ('2022Q2', 'local_general_salestax_areas_2022Q2'), ('2022Q3', 'local_general_salestax_areas_2022Q3'), ('2022Q4', 'local_general_salestax_areas_2022Q4'), ('2023Q1', 'local_general_salestax_areas_2023Q1'), ('2023Q2', 'locgnrl_sales_usetax_areas_2023Q2'), ('2023Q3', 'local_general_salestax_areas_2023Q3'), ('2023Q4', 'local_general_salestax_areas_2023Q4'), ('2024Q1', 'locgnrl_sales_usetax_areas_2024Q1'), ('2024Q2', 'locgnrl_sales_usetax_areas_2024Q2'), ('2024Q3', 'locgnrl_sales_usetax_areas_2024Q3'), ('2025Q1', 'locgnrl_sales_usetax_areas_2025Q1'), ('2025Q2', 'local_general_salestax_areas_2025Q2'), # ('2025Q2', 'locgnrl_sales_usetax_areas_2025Q2'), # This one also exists? # ('2025Q3', 'locgnrl_sales_usetax_areas_2025Q3'), # 2025Q3 and Q4 400 bad request back? Not sure why. # ('2025Q4', 'locgnrl_sales_usetax_areas_2025Q4'), ('2026Q1', 'locgnrl_sales_usetax_areas_2026Q1'), # ('2026Q2-test', 'test_locgnrl_sales_usetax_areas_2026Q2'), ] BASE_URL = "https://services9.arcgis.com/LLh6i97mwBitl1k5/ArcGIS/rest/services" PATH="FeatureServer/0/query" QUERY_STRING = urllib.parse.urlencode({ "where": "1=1", "outFields": "*", "returnGeometry": "true", "f": "geojson", "maxAllowableOffset": "0.001" }) os.makedirs("data", exist_ok=True) for layer in layers: if os.path.exists(f'data/{layer[0]}.geojson'): print(f"Already have {layer[0]}, skipping…") continue url = f"{BASE_URL}/{layer[1]}/{PATH}?{QUERY_STRING}" print(f"Downloading {layer[0]}…") with urllib.request.urlopen(url) as response, open(f'data/{layer[0]}.geojson', "wb") as out_file: out_file.write(response.read()) with open('data/history.js', 'w') as f: for layer in layers: f.write(f"import Y{layer[0]} from './{layer[0]}.geojson?url';\n") f.write('\nexport default {\n') for layer in layers: f.write(f" '{layer[0]}': Y{layer[0]},\n") f.write("};\n")