From 034d9edac8b27b0c5b9518db5234b9e7c2e95a6e Mon Sep 17 00:00:00 2001 From: Alfred Sawatzky Date: Sun, 7 Sep 2014 14:16:03 -0600 Subject: [PATCH] commit current Python code --- .gitignore | 10 + BeeSafe.qgs | 522 ++++++++++++++++++ PublicProjectMiller.bat | 3 + PublicProjectMiller.py | 66 +++ RUN-EVERYTHING.bat | 10 + TileMill/README.md | 22 + TileMill/TileMill.py | 79 +++ TileMill/TileMillTestCase.py | 20 + TileMill/__init__.py | 3 + TileMillProjects/app.db | 35 ++ .../project/BeeSafeBoulderCanvass/.thumb.png | Bin 0 -> 35524 bytes .../project/BeeSafeBoulderCanvass/project.mml | 155 ++++++ .../project/BeeSafeBoulderCanvass/style.mss | 85 +++ .../project/BeeSafeBoulderPrivate/.thumb.png | Bin 0 -> 32695 bytes .../project/BeeSafeBoulderPrivate/bee.png | Bin 0 -> 3689 bytes .../project/BeeSafeBoulderPrivate/highway.mss | 0 .../project/BeeSafeBoulderPrivate/project.mml | 175 ++++++ .../project/BeeSafeBoulderPrivate/style.mss | 109 ++++ .../project/BeeSafeBoulderPublic/.thumb.png | Bin 0 -> 7050 bytes .../project/BeeSafeBoulderPublic/bee.png | Bin 0 -> 3689 bytes .../project/BeeSafeBoulderPublic/project.mml | 79 +++ .../project/BeeSafeBoulderPublic/style.mss | 45 ++ canvass-packages/st_templates/package.st | 22 + canvass-packages/st_templates/row.st | 1 + canvass-packages/st_templates/row_page.st | 6 + code/1-update_pledge_spreadsheet.bat | 3 + code/2-update_neighborhoods_and_blocks.bat | 3 + code/3-create_canvass_packages.bat | 3 + code/4-create_private_maps.bat | 3 + code/5-create_pledge_summary.bat | 3 + code/create_canvass_packages.py | 131 +++++ code/create_pledge_summary.py | 79 +++ code/create_private_maps.py | 65 +++ code/dataset.py | 36 ++ code/rasterize.js | 48 ++ code/update_neighborhoods_and_blocks.py | 34 ++ code/update_pledge_spreadsheet.py | 170 ++++++ 37 files changed, 2025 insertions(+) create mode 100644 .gitignore create mode 100644 BeeSafe.qgs create mode 100644 PublicProjectMiller.bat create mode 100644 PublicProjectMiller.py create mode 100644 RUN-EVERYTHING.bat create mode 100644 TileMill/README.md create mode 100644 TileMill/TileMill.py create mode 100644 TileMill/TileMillTestCase.py create mode 100644 TileMill/__init__.py create mode 100644 TileMillProjects/app.db create mode 100644 TileMillProjects/project/BeeSafeBoulderCanvass/.thumb.png create mode 100644 TileMillProjects/project/BeeSafeBoulderCanvass/project.mml create mode 100644 TileMillProjects/project/BeeSafeBoulderCanvass/style.mss create mode 100644 TileMillProjects/project/BeeSafeBoulderPrivate/.thumb.png create mode 100644 TileMillProjects/project/BeeSafeBoulderPrivate/bee.png create mode 100644 TileMillProjects/project/BeeSafeBoulderPrivate/highway.mss create mode 100644 TileMillProjects/project/BeeSafeBoulderPrivate/project.mml create mode 100644 TileMillProjects/project/BeeSafeBoulderPrivate/style.mss create mode 100644 TileMillProjects/project/BeeSafeBoulderPublic/.thumb.png create mode 100644 TileMillProjects/project/BeeSafeBoulderPublic/bee.png create mode 100644 TileMillProjects/project/BeeSafeBoulderPublic/project.mml create mode 100644 TileMillProjects/project/BeeSafeBoulderPublic/style.mss create mode 100644 canvass-packages/st_templates/package.st create mode 100644 canvass-packages/st_templates/row.st create mode 100644 canvass-packages/st_templates/row_page.st create mode 100644 code/1-update_pledge_spreadsheet.bat create mode 100644 code/2-update_neighborhoods_and_blocks.bat create mode 100644 code/3-create_canvass_packages.bat create mode 100644 code/4-create_private_maps.bat create mode 100644 code/5-create_pledge_summary.bat create mode 100644 code/create_canvass_packages.py create mode 100644 code/create_pledge_summary.py create mode 100644 code/create_private_maps.py create mode 100644 code/dataset.py create mode 100644 code/rasterize.js create mode 100644 code/update_neighborhoods_and_blocks.py create mode 100644 code/update_pledge_spreadsheet.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..05e49c7 --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +data/ +*.pyc +GoogleDrive-BeeSafe/ +canvass-packages/*.html +canvass-packages/*.png +BeeSafeBoulder.vpp +BeeSafeBoulder.vpp~1 +TileMillProjects/export/ +TileMillProjects/output/ +TileMillProjects/project/test/ diff --git a/BeeSafe.qgs b/BeeSafe.qgs new file mode 100644 index 0000000..31d72aa --- /dev/null +++ b/BeeSafe.qgs @@ -0,0 +1,522 @@ + + + + + feet + + 3008145.906825 + 1229808.973373 + 3154503.813115 + 1313755.686767 + + 0 + + + +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs + 213 + 2231 + EPSG:2231 + NAD83 / Colorado North (ftUS) + lcc + GRS80 + false + + + + + + + + + + + + + + + + + + + + + + + BeeSafeNeighborhood20140901205246589 + ./data/BeeSafeNeighborhood/BeeSafeNeighborhood.shp + + + BeeSafeNeighborhood + + + +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs + 213 + 2231 + EPSG:2231 + NAD83 / Colorado North (ftUS) + lcc + GRS80 + false + + + 255 + ogr + + + + + + + + + + + + + + + + + + + + + + + + + + + + + LOCAL_ROADS20140819082401004 + ./data/cdot_boulder_roads/LOCAL_ROADS.shp + + + LOCAL_ROADS + + + +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs + 213 + 2231 + EPSG:2231 + NAD83 / Colorado North (ftUS) + lcc + GRS80 + false + + + 255 + ogr + + + + + + + + + + + + + + + + + + + + + GIS_ID + + ROUTENAME + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + . + + . + + + + + + + + Pie + 0 + + 0 + + + + Parcels20140819071537746 + ./data/Parcels/Parcels.shp + + + Parcels + + + +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs + 213 + 2231 + EPSG:2231 + NAD83 / Colorado North (ftUS) + lcc + GRS80 + false + + + 255 + ogr + + + + + + + + + + + + + + + + + + + ADDR_FMT + + + + + + + + + + + + + + . + + . + + + + + + + + Pie + 0 + + 0 + + + + addresses20140819071845330 + ./data/addresses/addresses.shp + + + addresses + + + +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs + 213 + 2231 + EPSG:2231 + NAD83 / Colorado North (ftUS) + lcc + GRS80 + false + + + 255 + ogr + + + + + + + + + + + + + + + + + + + ADDR_FMT + + ADDR_NUM + + + + + + + + + + + + + . + + . + + + + + + + + Pie + 0 + + 0 + + + + blocks20140819071759987 + ./data/blocks_sp/blocks.shp + + + blocks + + + +proj=lcc +lat_1=40.78333333333333 +lat_2=39.71666666666667 +lat_0=39.33333333333334 +lon_0=-105.5 +x_0=914401.8288036576 +y_0=304800.6096012192 +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +units=us-ft +no_defs + 213 + 2231 + EPSG:2231 + NAD83 / Colorado North (ftUS) + lcc + GRS80 + false + + + 255 + ogr + + + + + + + + + + + + + + + + + + + Name + + + + + + + + + + + + . + + . + + + + + + + + Pie + 0 + + 0 + + + + + + EPSG:4326 + 213 + + + false + + + 0 + 255 + 255 + 255 + 255 + 255 + 255 + + + 2 + true + + + diff --git a/PublicProjectMiller.bat b/PublicProjectMiller.bat new file mode 100644 index 0000000..c867fcf --- /dev/null +++ b/PublicProjectMiller.bat @@ -0,0 +1,3 @@ +c:\Python27-32bit\python.exe PublicProjectMiller.py + +pause \ No newline at end of file diff --git a/PublicProjectMiller.py b/PublicProjectMiller.py new file mode 100644 index 0000000..6ecbd92 --- /dev/null +++ b/PublicProjectMiller.py @@ -0,0 +1,66 @@ +#------------------------------------------------------------------------------- +# Name: ProjectMiller +# Purpose: Generates Asset mbtiles files from a TileMill map. Also uploads the mbtiles. +# +# Author: Alfred +# +# Created: 12/12/2012 +#------------------------------------------------------------------------------- +from TileMill import * +import os +import shutil + +tilemill_dir = r'C:\Program Files (x86)\TileMill-v0.10.1\tilemill' +projectFilesLocation = r'C:\personal\BeeSafeBoulder\TileMillProjects' + +access_account = r'MAPBOX_USERNAME' +access_token = r'MAPBOX_ACCESS_TOKEN' + +# remove the cache directory so that we can use the most recent outage information +# from the internet. +cachePath = os.path.join(projectFilesLocation, 'cache') +if os.path.exists(cachePath): + shutil.rmtree(cachePath) + +output_dir = os.path.join(projectFilesLocation, 'output') +if os.path.exists(output_dir): + shutil.rmtree(output_dir) + +if not os.path.exists(output_dir): + os.mkdir(output_dir) + +tm = TileMill(tilemill_dir) + + +projects = [ + {'projectName': 'BeeSafeBoulderPublic', + 'bbox': '-105.6674,39.9098,-105.0558,40.2608', + 'minzoom': 0, + 'maxzoom': 15} +] + +for project in projects: + name = project['projectName'] + filename = os.path.join(output_dir, '%s.png' % (name)) + tm.render(name, filename, + format='png', + bbox=project['bbox'], + width=400, + height=400, + files=projectFilesLocation) + + filename = os.path.join(output_dir, '%s.mbtiles' % (name)) + + tm.render(name, filename, + format='mbtiles', + bbox=project['bbox'], + minzoom=project['minzoom'], + maxzoom=project['maxzoom'], + metatile=2, + quiet=True, + files=projectFilesLocation) + + tm.modify_metadata(filename, + {'name': name}) + + tm.upload(name, filename, access_account, access_token, files=projectFilesLocation) \ No newline at end of file diff --git a/RUN-EVERYTHING.bat b/RUN-EVERYTHING.bat new file mode 100644 index 0000000..82cdadd --- /dev/null +++ b/RUN-EVERYTHING.bat @@ -0,0 +1,10 @@ +cd code +c:\Python27-32bit\python.exe update_pledge_spreadsheet.py +c:\Python27-32bit\python.exe update_neighborhoods_and_blocks.py +c:\Python27-32bit\python.exe create_canvass_packages.py +c:\Python27-32bit\python.exe create_private_maps.py +c:\Python27-32bit\python.exe create_pledge_summary.py +cd .. +c:\Python27-32bit\python.exe PublicProjectMiller.py + +pause \ No newline at end of file diff --git a/TileMill/README.md b/TileMill/README.md new file mode 100644 index 0000000..bc37b4b --- /dev/null +++ b/TileMill/README.md @@ -0,0 +1,22 @@ +# TileMill + +This product contains code for automating TileMill rendering and export. It requires that you have [TileMill](http://mapbox.com/tilemill/) installed on your computer. + +The Python wrapper currently supports rendering a project with `render()`, updating an MBTile file's metadata with `modify_metadata()` and uploading an MBTile file to [MapBox](http://mapbox.com) if you have an account with `upload()`. + +Example of rendering a project to PNG file. + +~~~python +from TileMill import * + +tilemill_dir = r'C:\Program Files (x86)\TileMill-v0.10.1\tilemill' +tm = TileMill(tilemill_dir) + +tilemill_project_name = 'SLO' +tm.render(tilemill_project_name,r'c:\temp\SLO.png', + format='png', + width=400, + height=400) +~~~ + +You can review the code in `iFactorSandbox\python\SLOmap\SLOProjectMiller.py` for an example of rendering to MBTile format and then uploading to a MapBox account. \ No newline at end of file diff --git a/TileMill/TileMill.py b/TileMill/TileMill.py new file mode 100644 index 0000000..e04c131 --- /dev/null +++ b/TileMill/TileMill.py @@ -0,0 +1,79 @@ +#------------------------------------------------------------------------------- +# Name: module1 +# Purpose: +# +# Author: Alfred +# +# Created: 12/12/2012 +# Copyright: (c) Alfred 2012 +# Licence: +#------------------------------------------------------------------------------- +import subprocess +import os +import sqlite3 + + +class TileMill(): + """ provides wrappers around some TileMill -export commands + """ + + def __init__(self, tilemill_dir): + """ tilemill_dir : directory that contains + """ + self.__tilemill_dir = tilemill_dir + + def __run_export(self, args): + """ runs TileMill's "index.js export" command line + """ + + full_args = ['node.exe', 'index.js', 'export'] + full_args.extend(args) + print " ".join(full_args) + + + print subprocess.call(full_args, shell=True, cwd=self.__tilemill_dir) + + def render(self, project_name, output_file_name, **kwargs): + """ **kwargs are the same as defined in the help for "index.js export" + """ + args = [project_name, output_file_name] + + job_file_name = os.path.splitext(output_file_name)[0] + ".export" + + for key in kwargs: + args.append("--%s=%s" % (key, str(kwargs[key]))) + + args.append("--log") + if os.path.exists(job_file_name): + args.append("--job=%s" % (job_file_name)) + + self.__run_export(args) + + + def upload(self, mapbox_map_id, mbtiles_file_name, sync_account, sync_access_token, files=None): + + args = [mapbox_map_id, + mbtiles_file_name, + '--format=upload', + '--syncAccount=%s' % sync_account, + '--syncAccessToken=%s' % sync_access_token] + + if files is not None: + args.append('--files={}'.format(files)) + + self.__run_export(args) + + def modify_metadata(self, mbtiles_file_name, data): + ''' modifies metadata in mbtiles_file_name based on values in DATA dict + ''' + conn = sqlite3.connect(mbtiles_file_name) + c = conn.cursor() + + try: + for k in data: + c.execute('REPLACE INTO metadata (name, value) VALUES (?, ?)', (k, data[k])) + + conn.commit() + finally: + c.close() + conn.close() diff --git a/TileMill/TileMillTestCase.py b/TileMill/TileMillTestCase.py new file mode 100644 index 0000000..524380b --- /dev/null +++ b/TileMill/TileMillTestCase.py @@ -0,0 +1,20 @@ +#------------------------------------------------------------------------------- +# Name: module1 +# Purpose: +# +# Author: Alfred +# +# Created: 12/12/2012 +# Copyright: (c) Alfred 2012 +# Licence: +#------------------------------------------------------------------------------- +import unittest +from TileMill import TileMill + +class TileMillTestCase(unittest.TestCase): + ''' + ''' + + def test_constructor(self): + tm = TileMill(r'C:\Program Files (x86)\TileMill-v0.10.1\tilemill') + diff --git a/TileMill/__init__.py b/TileMill/__init__.py new file mode 100644 index 0000000..f079330 --- /dev/null +++ b/TileMill/__init__.py @@ -0,0 +1,3 @@ +from TileMill import TileMill + +__all__ = ['TileMill'] \ No newline at end of file diff --git a/TileMillProjects/app.db b/TileMillProjects/app.db new file mode 100644 index 0000000..e8d1a2a --- /dev/null +++ b/TileMillProjects/app.db @@ -0,0 +1,35 @@ +{"key":"/api/Export/1407202231247","val":{"progress":0,"status":"waiting","id":"1407202231247","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":693,"height":800}} +{"key":"/api/Export/1407202231247","val":{"progress":0,"status":"processing","id":"1407202231247","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":693,"height":800,"pid":270132,"created":1407202355607}} +{"key":"/api/Export/1407202231247","val":{"progress":1,"status":"complete","id":"1407202231247","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":693,"height":800,"pid":270132,"created":1407202355607,"remaining":0,"updated":1407202363529}} +{"key":"/api/Export/1407202538730","val":{"progress":0,"status":"waiting","id":"1407202538730","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914}} +{"key":"/api/Export/1407202538730","val":{"progress":0,"status":"processing","id":"1407202538730","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":270964,"created":1407202548977}} +{"key":"/api/Export/1407202538730","val":{"progress":0,"status":"processing","id":"1407202538730","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_5e16a1.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":270964,"created":1407202548977}} +{"key":"/api/Export/1407202538730","val":{"progress":1,"status":"complete","id":"1407202538730","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_5e16a1.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":270964,"created":1407202548977,"remaining":0,"updated":1407202560264}} +{"key":"/api/Export/1407202638740","val":{"progress":0,"status":"waiting","id":"1407202638740","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1000,"height":1143}} +{"key":"/api/Export/1407202638740","val":{"progress":0,"status":"processing","id":"1407202638740","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1000,"height":1143,"pid":269428,"created":1407202646433}} +{"key":"/api/Export/1407202638740","val":{"progress":0,"status":"processing","id":"1407202638740","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_a6624e.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1000,"height":1143,"pid":269428,"created":1407202646433}} +{"key":"/api/Export/1407202638740","val":{"progress":1,"status":"complete","id":"1407202638740","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_a6624e.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1000,"height":1143,"pid":269428,"created":1407202646433,"remaining":0,"updated":1407202652147}} +{"key":"/api/Export/1407202721031","val":{"progress":0,"status":"waiting","id":"1407202721031","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914}} +{"key":"/api/Export/1407202721031","val":{"progress":0,"status":"processing","id":"1407202721031","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":267428,"created":1407202729159}} +{"key":"/api/Export/1407202721031","val":{"progress":0,"status":"processing","id":"1407202721031","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_3d4500.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":267428,"created":1407202729159}} +{"key":"/api/Export/1407202721031","val":{"progress":1,"status":"complete","id":"1407202721031","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_3d4500.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":267428,"created":1407202729159,"remaining":0,"updated":1407202740403}} +{"key":"/api/Export/1407202884423","val":{"progress":0,"status":"waiting","id":"1407202884423","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":400,"height":457}} +{"key":"/api/Export/1407202884423","val":{"progress":0,"status":"processing","id":"1407202884423","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":400,"height":457,"pid":270024,"created":1407202889515}} +{"key":"/api/Export/1407202884423","val":{"progress":0,"status":"processing","id":"1407202884423","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_1cb07d.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":400,"height":457,"pid":270024,"created":1407202889515}} +{"key":"/api/Export/1407202884423"} +{"key":"/api/Export/1407202898149","val":{"progress":0,"status":"waiting","id":"1407202898149","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914}} +{"key":"/api/Export/1407202898149","val":{"progress":0,"status":"processing","id":"1407202898149","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":272196,"created":1407202904245}} +{"key":"/api/Export/1407202898149","val":{"progress":0,"status":"processing","id":"1407202898149","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_12e28d.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":272196,"created":1407202904245}} +{"key":"/api/Export/1407202898149","val":{"progress":1,"status":"complete","id":"1407202898149","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_12e28d.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":272196,"created":1407202904245,"remaining":0,"updated":1407202916527}} +{"key":"/api/Export/1407203033711","val":{"progress":0,"status":"waiting","id":"1407203033711","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914}} +{"key":"/api/Export/1407203033711","val":{"progress":0,"status":"processing","id":"1407203033711","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":274328,"created":1407203039259}} +{"key":"/api/Export/1407203033711","val":{"progress":0,"status":"processing","id":"1407203033711","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_ce0b6a.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":274328,"created":1407203039259}} +{"key":"/api/Export/1407203033711","val":{"progress":1,"status":"complete","id":"1407203033711","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_ce0b6a.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":800,"height":914,"pid":274328,"created":1407203039259,"remaining":0,"updated":1407203055814}} +{"key":"/api/Export/1407203248993","val":{"progress":0,"status":"waiting","id":"1407203248993","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371}} +{"key":"/api/Export/1407203248993","val":{"progress":0,"status":"processing","id":"1407203248993","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371,"pid":271692,"created":1407203267204}} +{"key":"/api/Export/1407203248993","val":{"progress":0,"status":"processing","id":"1407203248993","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_ee7fbd.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371,"pid":271692,"created":1407203267204}} +{"key":"/api/Export/1407203248993","val":{"progress":1,"status":"complete","id":"1407203248993","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_ee7fbd.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371,"pid":271692,"created":1407203267204,"remaining":0,"updated":1407203286058}} +{"key":"/api/Export/1407203343446","val":{"progress":0,"status":"waiting","id":"1407203343446","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371}} +{"key":"/api/Export/1407203343446","val":{"progress":0,"status":"processing","id":"1407203343446","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371,"pid":267456,"created":1407203348693}} +{"key":"/api/Export/1407203343446","val":{"progress":0,"status":"processing","id":"1407203343446","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_6f715e.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371,"pid":267456,"created":1407203348693}} +{"key":"/api/Export/1407203343446","val":{"progress":1,"status":"complete","id":"1407203343446","format":"png","project":"BeeSafeBoulderPrivate","zooms":[0,22],"metatile":2,"filename":"BeeSafeBoulderPrivate_6f715e.png","bbox":[-105.2619,39.9689,-105.2464,39.9826],"width":1200,"height":1371,"pid":267456,"created":1407203348693,"remaining":0,"updated":1407203363329}} diff --git a/TileMillProjects/project/BeeSafeBoulderCanvass/.thumb.png b/TileMillProjects/project/BeeSafeBoulderCanvass/.thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..cc559ad5593a014f6b9c6201afc2abc4e2157aaa GIT binary patch literal 35524 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�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 literal 0 HcmV?d00001 diff --git a/TileMillProjects/project/BeeSafeBoulderCanvass/project.mml b/TileMillProjects/project/BeeSafeBoulderCanvass/project.mml new file mode 100644 index 0000000..73e0a6c --- /dev/null +++ b/TileMillProjects/project/BeeSafeBoulderCanvass/project.mml @@ -0,0 +1,155 @@ +{ + "bounds": [ + -105.5347, + 39.8971, + -105.0403, + 40.1999 + ], + "center": [ + -105.2758, + 40.0318, + 11 + ], + "format": "png8", + "interactivity": false, + "minzoom": 0, + "maxzoom": 18, + "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", + "Stylesheet": [ + "style.mss" + ], + "Layer": [ + { + "geometry": "polygon", + "extent": [ + -105.28239880715525, + 39.96949006536292, + -105.23634409299235, + 40.04301672473159 + ], + "id": "beesafeneighborhood", + "class": "", + "Datasource": { + "file": "C:\\\\personal\\\\BeeSafeBoulder\\\\data\\\\BeeSafeNeighborhood\\\\BeeSafeNeighborhood.shp", + "id": "beesafeneighborhood", + "project": "BeeSafeBoulderCanvass", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "beesafeneighborhood" + }, + { + "geometry": "polygon", + "extent": [ + -105.28228487905483, + 39.971465107306045, + -105.24144769439353, + 40.04151485313714 + ], + "id": "blocks", + "class": "blocks", + "Datasource": { + "file": "C:\\\\personal\\\\BeeSafeBoulder\\\\data\\\\blocks_sp\\\\blocks.shp", + "id": "blocks", + "project": "BeeSafeBoulderCanvass", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "blocks" + }, + { + "geometry": "polygon", + "extent": [ + -105.30451534568226, + 39.95259088980417, + -105.13119044697125, + 40.1014957934759 + ], + "id": "parcels", + "class": "", + "Datasource": { + "file": "C:\\\\personal\\\\BeeSafeBoulder\\\\data\\\\parcels\\\\Parcels.shp", + "id": "parcels", + "project": "BeeSafeBoulderCanvass", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "parcels" + }, + { + "geometry": "point", + "extent": [ + -105.66365241546686, + 39.913201968546524, + -105.05086537577677, + 40.26275790928157 + ], + "id": "addresses", + "class": "", + "Datasource": { + "file": "C:\\personal\\BeeSafeBoulder\\data\\addresses\\addresses.shp", + "id": "addresses", + "project": "BeeSafeBoulderCanvass", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "addresses" + }, + { + "geometry": "linestring", + "extent": [ + -105.68316323491682, + 39.90503465315868, + -105.01770382711823, + 40.28871932612898 + ], + "id": "streets", + "class": "streets", + "Datasource": { + "file": "C:\\personal\\BeeSafeBoulder\\data\\cdot_boulder_roads\\LOCAL_ROADS.shp", + "id": "streets", + "project": "BeeSafeBoulderCanvass", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "streets" + }, + { + "geometry": "linestring", + "extent": [ + -105.57803053474547, + 39.90815794238495, + -105.03644566380746, + 40.26180180013412 + ], + "id": "majorroads", + "class": "streets", + "Datasource": { + "file": "C:\\personal\\BeeSafeBoulder\\data\\cdot_boulder_roads\\MAJOR_ROADS.shp", + "id": "majorroads", + "project": "BeeSafeBoulderCanvass", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "majorroads" + } + ], + "scale": 1, + "metatile": 2, + "_basemap": "boulderalf.map-5vjafbf3", + "name": "BeeSafeBoulderCanvass", + "description": "BeeSafeBoulderCanvass", + "attribution": "" +} \ No newline at end of file diff --git a/TileMillProjects/project/BeeSafeBoulderCanvass/style.mss b/TileMillProjects/project/BeeSafeBoulderCanvass/style.mss new file mode 100644 index 0000000..86cb591 --- /dev/null +++ b/TileMillProjects/project/BeeSafeBoulderCanvass/style.mss @@ -0,0 +1,85 @@ +@YES: #0f0; +@NO: #cc2121; +@MAYBE: #ff0; +@NOT_REACHED: #ff0; + +#blocks { + line-color:#f45; + line-width:2; + polygon-opacity:.2; + polygon-fill:#ae8; +} + + +#beesafeneighborhood { + line-color:#594; + line-width:0.5; + polygon-opacity:0.5; + polygon-fill:#ae8; +} + + +#parcels { + line-color:gray; + line-width:0.5; +} + +#parcels[PLEDGE='YES'] { + [zoom >= 15] { + polygon-opacity:0.8; + polygon-fill:@YES; + } + [zoom < 15] { + line-width:10; + line-join:round; + line-cap:round; + line-color:@YES; + polygon-opacity:0.8; + polygon-fill:@YES; + } +} + +#parcels[PLEDGE='NO'] { + [zoom >= 15] { + polygon-opacity:0.8; + polygon-fill:@NO; + } + [zoom < 15] { + line-width:10; + line-join:round; + line-cap:round; + line-color:@NO; + polygon-opacity:0.8; + polygon-fill:@NO; + } +} + +#parcels[PLEDGE='MAYBE'] { + [zoom >= 15] { + polygon-opacity:0.8; + polygon-fill:@MAYBE; + } + [zoom < 15] { + line-width:10; + line-join:round; + line-cap:round; + line-color:@MAYBE; + polygon-opacity:0.8; + polygon-fill:@MAYBE; + } +} + +#addresses[ADDR_FMT="EXACT"] { + text-name:"[ADDR_NUM]"; + text-face-name:"Arial Bold"; + text-size:9; +} + +.streets { + line-color:spin(darken(gray,36),-10); + line-cap:round; + line-join:round; + text-name:"[ROUTENAME]"; + text-placement:line; + text-face-name: "Arial Bold"; +} diff --git a/TileMillProjects/project/BeeSafeBoulderPrivate/.thumb.png b/TileMillProjects/project/BeeSafeBoulderPrivate/.thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..411e0cd19cdc284da3800dbbad20984d1cb3d30f GIT binary patch literal 32695 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 15] { + polygon-opacity:0.8; + polygon-fill:@YES; + } + [zoom < 15] { + line-width:10; + line-join:round; + line-cap:round; + line-color:@YES; + polygon-opacity:0.8; + polygon-fill:@YES; + } +} + +#parcels[PLEDGE='NO'] { + [zoom >= 15] { + polygon-opacity:0.8; + polygon-fill:@NO; + } + [zoom < 15] { + line-width:10; + line-join:round; + line-cap:round; + line-color:@NO; + polygon-opacity:0.8; + polygon-fill:@NO; + } +} + +#parcels[PLEDGE='MAYBE'] { + [zoom >= 15] { + polygon-opacity:0.8; + polygon-fill:@MAYBE; + } + [zoom < 15] { + line-width:10; + line-join:round; + line-cap:round; + line-color:@MAYBE; + polygon-opacity:0.8; + polygon-fill:@MAYBE; + } +} + +#parcels { + [zoom >= 15] { + line-width:1; + line-join:round; + line-cap:round; + line-color:lightgray; + } +} + +#parcelcentroids { + marker-width:100; + marker-fill:#f45; + marker-line-color:#813; + marker-allow-overlap:true; + marker-file: url('C:\personal\BeeSafeBoulder\qrcodes\parcels\[ASR_ID].png'); +} + + +#beesafeneighborhood { + line-color:#594; + line-width:0.5; + polygon-opacity:0.5; + polygon-fill:#ae8; +} + +#blocks { + line-color:#f45; + line-width:2; + polygon-opacity:.2; + polygon-fill:#ae8; +} + + +#boulderaddresses[ADDR_FMT="EXACT"] { + text-name:"[ADDR_NUM]"; + text-face-name:"Arial Bold"; + text-size:8; +} + +.labeledroads { + line-color:spin(darken(gray,36),-10); + line-cap:round; + line-join:round; + text-name:"[ROUTENAME]"; + text-placement:line; + text-face-name: "Arial Bold"; +} + +#routes { + line-color:spin(darken(gray,36),-10); + line-cap:round; + line-join:round; +} diff --git a/TileMillProjects/project/BeeSafeBoulderPublic/.thumb.png b/TileMillProjects/project/BeeSafeBoulderPublic/.thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..416e85916cbba32013757c2c3fb47ec66ab2ed5e GIT binary patch literal 7050 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 literal 0 HcmV?d00001 diff --git a/TileMillProjects/project/BeeSafeBoulderPublic/bee.png b/TileMillProjects/project/BeeSafeBoulderPublic/bee.png new file mode 100644 index 0000000000000000000000000000000000000000..5297828d375e6ac098db4806972620a8a6466638 GIT binary patch literal 3689 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\n\n\n \n \n \n \n \n \n \n
Total Addresses{{{add_total}}}
Pledged Addresses{{{add_yes}}}
\n", + "template_full": "", + "fields": [ + "name", + "add_total", + "add_yes", + "not_yes" + ] + }, + "minzoom": 0, + "maxzoom": 15, + "srs": "+proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0.0 +k=1.0 +units=m +nadgrids=@null +wktext +no_defs +over", + "Stylesheet": [ + "style.mss" + ], + "Layer": [ + { + "geometry": "point", + "extent": [ + -105.66365241546686, + 39.913201968546524, + -105.05086537577677, + 40.26275790928157 + ], + "id": "address", + "class": "address", + "Datasource": { + "file": "C:\\personal\\BeeSafeBoulder\\data\\addresses\\addresses.shp", + "id": "address", + "project": "BeeSafeBoulderPublic", + "srs": "" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "address" + }, + { + "geometry": "polygon", + "extent": [ + -105.28237364435249, + 39.97187268471271, + -105.13611760664463, + 40.188596526769444 + ], + "id": "neighborhood", + "class": "neighborhood", + "Datasource": { + "file": "C:/personal/BeeSafeBoulder/data/BeeSafeNeighborhood/BeeSafeNeighborhood.shp" + }, + "srs-name": "autodetect", + "srs": "", + "advanced": {}, + "name": "neighborhood" + } + ], + "scale": 1, + "metatile": 2, + "_basemap": "boulderalf.map-5vjafbf3", + "name": "BeeSafeBoulderPublic", + "description": "public-facing map of Bee Safe Neighborhoods", + "attribution": "", + "legend": "" +} \ No newline at end of file diff --git a/TileMillProjects/project/BeeSafeBoulderPublic/style.mss b/TileMillProjects/project/BeeSafeBoulderPublic/style.mss new file mode 100644 index 0000000..b53c5a5 --- /dev/null +++ b/TileMillProjects/project/BeeSafeBoulderPublic/style.mss @@ -0,0 +1,45 @@ +@YES: #0f0; +@NO: #cc2121; +@MAYBE: #ff0; +@NOT_REACHED: #ff0; +@MARKER_WIDTH: 20; + + +.address[PLEDGE='YES'][SHOW_ON_MA='1'] { + marker-file:url("./bee.png"); + marker-allow-overlap:true; + marker-opacity: 1.0; + marker-width:@MARKER_WIDTH; + [zoom<=11] { marker-allow-overlap:false; } +/* + [zoom=14] { marker-width:@MARKER_WIDTH * 2; } + [zoom=15] { marker-width:@MARKER_WIDTH * 4; } + [zoom=16] { marker-width:@MARKER_WIDTH * 8; } + [zoom=17] { marker-width:@MARKER_WIDTH * 16; } + [zoom=18] { marker-width:@MARKER_WIDTH * 32; } + [zoom=19] { marker-width:@MARKER_WIDTH * 64; } + [zoom=20] { marker-width:@MARKER_WIDTH *128; } + [zoom=21] { marker-width:@MARKER_WIDTH *256; } + [zoom=22] { marker-width:@MARKER_WIDTH *512; } + */ +} + +/* +.address { + marker-fill:#000; + marker-opacity:1.0 + } +*/ + +#streets { + line-width:1; + line-color:lightgray; +} + + +#neighborhood { + line-color:#594; + line-width:0.5; + polygon-opacity:0.5; + polygon-fill:#ae8; +} diff --git a/canvass-packages/st_templates/package.st b/canvass-packages/st_templates/package.st new file mode 100644 index 0000000..d5d5e0f --- /dev/null +++ b/canvass-packages/st_templates/package.st @@ -0,0 +1,22 @@ + + + + + +

Bee Safe Neighborhood: $neighborhood$

+

Block: $block$

Captain: $captain$

+ +
+ +

As bees are endangered by the use of neonicotinoids and other systemic pesticides in the environment, and I am aware of these dangers, I pledge to help reduce the amount of these poisons in the environment by adhering to the level or levels of care described below.

+ +
    +
  • Level 1 (most important): I will not use neonicotinoids or other systemics, and I will not use or buy soils, seeds, or plants that have been treated with neonicotinoids or other systemics.
  • +
  • Level 2: I will not use any poisonous products outdoors.
  • +
  • Level 3: I will not use any poisons outdoors, and I will plant and raise plants that provide the pollen and nectar that bees and other pollinators need.
  • +
+$row_page$ + + \ No newline at end of file diff --git a/canvass-packages/st_templates/row.st b/canvass-packages/st_templates/row.st new file mode 100644 index 0000000..2e724ac --- /dev/null +++ b/canvass-packages/st_templates/row.st @@ -0,0 +1 @@ +$if(is_pledged)$$address$already pledged$else$$address$$endif$ diff --git a/canvass-packages/st_templates/row_page.st b/canvass-packages/st_templates/row_page.st new file mode 100644 index 0000000..e27fc5c --- /dev/null +++ b/canvass-packages/st_templates/row_page.st @@ -0,0 +1,6 @@ +
+ + + $row$ +
AddressNameEmailYes/No/MaybeLevelNot HomeReturn DateASRForm
+
\ No newline at end of file diff --git a/code/1-update_pledge_spreadsheet.bat b/code/1-update_pledge_spreadsheet.bat new file mode 100644 index 0000000..2b21338 --- /dev/null +++ b/code/1-update_pledge_spreadsheet.bat @@ -0,0 +1,3 @@ +c:\Python27-32bit\python.exe update_pledge_spreadsheet.py + +pause \ No newline at end of file diff --git a/code/2-update_neighborhoods_and_blocks.bat b/code/2-update_neighborhoods_and_blocks.bat new file mode 100644 index 0000000..0f46bac --- /dev/null +++ b/code/2-update_neighborhoods_and_blocks.bat @@ -0,0 +1,3 @@ +c:\Python27-32bit\python.exe update_neighborhoods_and_blocks.py + +pause \ No newline at end of file diff --git a/code/3-create_canvass_packages.bat b/code/3-create_canvass_packages.bat new file mode 100644 index 0000000..6c37779 --- /dev/null +++ b/code/3-create_canvass_packages.bat @@ -0,0 +1,3 @@ +c:\Python27-32bit\python.exe create_canvass_packages.py + +pause \ No newline at end of file diff --git a/code/4-create_private_maps.bat b/code/4-create_private_maps.bat new file mode 100644 index 0000000..505cb6f --- /dev/null +++ b/code/4-create_private_maps.bat @@ -0,0 +1,3 @@ +c:\Python27-32bit\python.exe create_private_maps.py + +pause \ No newline at end of file diff --git a/code/5-create_pledge_summary.bat b/code/5-create_pledge_summary.bat new file mode 100644 index 0000000..7e6d9f6 --- /dev/null +++ b/code/5-create_pledge_summary.bat @@ -0,0 +1,3 @@ +c:\Python27-32bit\python.exe create_pledge_summary.py + +pause \ No newline at end of file diff --git a/code/create_canvass_packages.py b/code/create_canvass_packages.py new file mode 100644 index 0000000..a59a099 --- /dev/null +++ b/code/create_canvass_packages.py @@ -0,0 +1,131 @@ +from osgeo import ogr, osr +from stringtemplate3 import StringTemplate, StringTemplateGroup # easy_install stringtemplate3 +import gspread # easy_install gspread +import os +import json +import subprocess +from TileMill import * +from dataset import dataset +import urllib + + +with dataset() as ds: + addressLayer = ds.layers['address'] + blockLayer = ds.layers['block'] + + + stg = StringTemplateGroup('rows', os.path.join('..', 'canvass-packages', 'st_templates')) + + tilemill_dir = r'C:\Program Files (x86)\TileMill-v0.10.1\tilemill' + projectFilesLocation = r'C:\personal\BeeSafeBoulder\TileMillProjects' + + output_dir = r'C:\personal\BeeSafeBoulder\canvass-packages' + + tm = TileMill(tilemill_dir) + name = "BeeSafeBoulderCanvass" + filename = os.path.join(output_dir, '%s.png' % name) + + llSRS = osr.SpatialReference() + llSRS.ImportFromEPSG(4326) + transform = osr.CoordinateTransformation(blockLayer.GetSpatialRef(), llSRS) + + def get_neighborhood_for_block(block): + """ + gets the related neighborhood for BLOCK + """ + layer = ds.layers['neighborhood'] + layer.SetSpatialFilter(block.GetGeometryRef().Centroid()) + + for neighborhood in layer: + return neighborhood + + for block in blockLayer: + + blockName = block.GetField('Name') + + neighborhoodName = get_neighborhood_for_block(block).GetField("name") + + print blockName, neighborhoodName + + geom = block.GetGeometryRef().Clone() + geom.Transform(transform) + + bbox = '{0},{2},{1},{3}'.format(*geom.GetEnvelope()) + + tm.render(name, filename, + format='png', + bbox=bbox, + width=400, + height=400, + files=projectFilesLocation) + + addressLayer.SetSpatialFilter(block.GetGeometryRef()) + addressLayer.SetAttributeFilter('ADDR_FMT = "EXACT"') + + addressList = [] + + for address in addressLayer: + addressList.append(address) + + addressList = sorted(addressList, key=lambda a: "{} {}".format(" ".join(a.GetField('ADDRESS').split(' ')[1:]), a.GetField('ADDRESS').split(' ')[0])) + + package = stg.getInstanceOf('package') + + package.setAttribute('block', blockName) + package.setAttribute('captain', block.GetField("Captain")) + package.setAttribute('neighborhood', neighborhoodName) + package.setAttribute('image_path', filename) + + count = 0 + row_page = stg.getInstanceOf('row_page') + package.setAttribute('row_page', row_page) + firstPageRows = 3 + subsequentPageRows = 7 + rowsPerPage = firstPageRows + + for address in addressList: + count += 1 + + if (count % rowsPerPage) == 0: + # create a new row_page + row_page = stg.getInstanceOf('row_page') + package.setAttribute('row_page', row_page) + count = 0 + rowsPerPage = subsequentPageRows + + row = stg.getInstanceOf('row') + row.setAttribute('address', address.GetField('address')) + row.setAttribute('is_pledged', 'true' if address.GetField("pledge") is not None else None) + + form_address = "{}, {}, {}".format(address.GetField('address'), address.GetField('city'), + address.GetField('state')) + + print form_address + + row.setAttribute('form_address', urllib.quote_plus(form_address)) + row.setAttribute('asr_id', address.GetField('asr_id')) + row_page.setAttribute('row', str(row)) + + htmlFileName = os.path.join('..', 'canvass-packages', 'package-{}.html'.format(blockName)) + pdfFileName = os.path.join('..', 'canvass-packages', 'package-{}.pdf'.format(blockName)) + + with open(htmlFileName, 'wb') as o: + o.write(str(package)) + + subprocess.call(["phantomjs", "rasterize.js", htmlFileName, pdfFileName, "11in*8.5in"]) + # if os.path.exists(htmlFileName): + # os.unlink(htmlFileName) + + if os.path.exists(filename): + os.unlink(filename) + + targetDir = os.path.join(r'C:\personal\BeeSafeBoulder\GoogleDrive-BeeSafe\BeeSafe', neighborhoodName) + if not os.path.exists(targetDir): + os.mkdir(targetDir) + + newPdfFileName = os.path.join(targetDir, os.path.basename(pdfFileName)) + + if os.path.exists(newPdfFileName): + os.unlink(newPdfFileName) + + os.rename(pdfFileName,newPdfFileName) diff --git a/code/create_pledge_summary.py b/code/create_pledge_summary.py new file mode 100644 index 0000000..f5944d8 --- /dev/null +++ b/code/create_pledge_summary.py @@ -0,0 +1,79 @@ +import gspread # easy_install gspread +import os +from dataset import dataset +import csv + +email = 'GOOGLE_EMAIL_ADDRESS' +password = 'GOOGLE_PASSWORD' + +sht = gspread.login(email, password).open("BeeSafe Pledge (Responses)").worksheet("Form Responses 1") + +# call get_all_values() to get the header and +values = sht.get_all_values() + +# first, create a column header lookup +header_column = {} + +for column, header in enumerate(values[0]): + header_column[header] = column + 1 + +print header_column + +def data(row): + data = {} + + for header, column in header_column.iteritems(): + data[header] = None if column > len(row) else row[column-1] + + return data + +asr_id_rows = {} + +for idx, r in enumerate(values[1:]): + row_number = idx + 2 + row = data(r) + asr_id_rows[row['ASR_ID']] = row + +# creates a CSV file with all pledges in the neighborhood boundary. +with dataset() as ds: + addressLayer = ds.layers['address'] + neighborhoodLayer = ds.layers['neighborhood'] + + for neighborhood in neighborhoodLayer: + + neighborhoodName = neighborhood.GetField("name") + + print neighborhoodName + + targetDir = os.path.join(r'C:\personal\BeeSafeBoulder\GoogleDrive-BeeSafe\BeeSafe', neighborhoodName) + if not os.path.exists(targetDir): + os.mkdir(targetDir) + + addressLayer.SetSpatialFilter(neighborhood.GetGeometryRef()) + addressLayer.SetAttributeFilter('ADDR_FMT = "EXACT"') + + addressList = [] + + for address in addressLayer: + addressList.append(address) + + addressList = sorted(addressList, key=lambda a: "{} {}".format(" ".join(a.GetField('ADDRESS').split(' ')[1:]), a.GetField('ADDRESS').split(' ')[0])) + + filename = os.path.join(targetDir,"PrivatePledgeSummary.csv") + + fieldnames = ['Name', 'Address', 'Email', 'Pledge', 'Comments'] + with open(filename, 'wb') as outStream: + writer = csv.DictWriter(outStream, delimiter=',', fieldnames=fieldnames) + writer.writerow(dict((fn, fn) for fn in fieldnames)) + + for address in addressList: + asr_id = address.GetField('asr_id') + + if asr_id in asr_id_rows: + row = asr_id_rows[asr_id] + + writer.writerow({'Name': row['Name'], + 'Address': row['Normalized Street Address'], + 'Email': row['Email Address'], + 'Pledge': row['Pledge Level'], + 'Comments': row['Comments']}) diff --git a/code/create_private_maps.py b/code/create_private_maps.py new file mode 100644 index 0000000..5e0c4cf --- /dev/null +++ b/code/create_private_maps.py @@ -0,0 +1,65 @@ +from osgeo import ogr, osr +from stringtemplate3 import StringTemplate, StringTemplateGroup # easy_install stringtemplate3 +import gspread # easy_install gspread +import os +import json +import subprocess +from TileMill import * +from dataset import dataset +import urllib + + +with dataset() as ds: + neighborhoodLayer = ds.layers['neighborhood'] + + tilemill_dir = r'C:\Program Files (x86)\TileMill-v0.10.1\tilemill' + projectFilesLocation = r'C:\personal\BeeSafeBoulder\TileMillProjects' + + output_dir = r'C:\personal\BeeSafeBoulder\temp' + + tm = TileMill(tilemill_dir) + name = "BeeSafeBoulderPrivate" + filename = os.path.join(output_dir, 'PrivateMap.png') + + llSRS = osr.SpatialReference() + llSRS.ImportFromEPSG(4326) + transform = osr.CoordinateTransformation(neighborhoodLayer.GetSpatialRef(), llSRS) + + def get_neighborhood_for_block(block): + """ + gets the related neighborhood for BLOCK + """ + layer = ds.layers['neighborhood'] + layer.SetSpatialFilter(block.GetGeometryRef().Centroid()) + + for neighborhood in layer: + return neighborhood + + for neighborhood in neighborhoodLayer: + + neighborhoodName = neighborhood.GetField("name") + + print neighborhoodName + + geom = neighborhood.GetGeometryRef().Clone() + geom.Transform(transform) + + bbox = '{0},{2},{1},{3}'.format(*geom.GetEnvelope()) + + tm.render(name, filename, + format='png', + bbox=bbox, + width=1300, + height=1200, + files=projectFilesLocation) + + targetDir = os.path.join(r'C:\personal\BeeSafeBoulder\GoogleDrive-BeeSafe\BeeSafe', neighborhoodName) + if not os.path.exists(targetDir): + os.mkdir(targetDir) + + newFilename = os.path.join(targetDir, os.path.basename(filename)) + + if os.path.exists(newFilename): + os.unlink(newFilename) + + os.rename(filename,newFilename) diff --git a/code/dataset.py b/code/dataset.py new file mode 100644 index 0000000..f2d4e87 --- /dev/null +++ b/code/dataset.py @@ -0,0 +1,36 @@ +from osgeo import ogr, osr + +class dataset(): + """ + provides some common dataset code. + """ + + def __init__(self): + self.layers = {} + self.dataSources = {} + + self.config = {'block': {'driver': 'ESRI Shapefile', + 'filename': r'C:\personal\BeeSafeBoulder\data\blocks_sp\blocks.shp'}, + 'parcel': {'driver': 'ESRI Shapefile', + 'filename': r'C:\personal\BeeSafeBoulder\data\parcels\Parcels.shp'}, + 'address': {'driver': 'ESRI Shapefile', + 'filename': r'C:\personal\BeeSafeBoulder\data\addresses\addresses.shp'}, + 'neighborhood': {'driver': 'ESRI Shapefile', + 'filename': r'C:\personal\BeeSafeBoulder\data\BeeSafeNeighborhood\BeeSafeNeighborhood.shp'}} + + for name, info in self.config.iteritems(): + driver = ogr.GetDriverByName(info['driver']) + dataSource = driver.Open(info['filename'], 1) + self.dataSources[name] = dataSource + + layer = dataSource.GetLayer() + + self.layers[name] = layer + + # define __enter__ and __exit__ to support the "with" pattern. + def __enter__(self): + return self + + def __exit__(self, type, value, traceback): + for name, datasource in self.dataSources.iteritems(): + datasource.Destroy() diff --git a/code/rasterize.js b/code/rasterize.js new file mode 100644 index 0000000..3398f6c --- /dev/null +++ b/code/rasterize.js @@ -0,0 +1,48 @@ +var page = require('webpage').create(), + system = require('system'), + address, output, size; + +if (system.args.length < 3 || system.args.length > 5) { + console.log('Usage: rasterize.js URL filename [paperwidth*paperheight|paperformat] [zoom]'); + console.log(' paper (pdf output) examples: "5in*7.5in", "10cm*20cm", "A4", "Letter"'); + console.log(' image (png/jpg output) examples: "1920px" entire page, window width 1920px'); + console.log(' "800px*600px" window, clipped to 800x600'); + phantom.exit(1); +} else { + address = system.args[1]; + output = system.args[2]; + page.viewportSize = { width: 600, height: 600 }; + if (system.args.length > 3 && system.args[2].substr(-4) === ".pdf") { + size = system.args[3].split('*'); + page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' } + : { format: system.args[3], orientation: 'portrait', margin: '1cm' }; + } else if (system.args.length > 3 && system.args[3].substr(-2) === "px") { + size = system.args[3].split('*'); + if (size.length === 2) { + pageWidth = parseInt(size[0], 10); + pageHeight = parseInt(size[1], 10); + page.viewportSize = { width: pageWidth, height: pageHeight }; + page.clipRect = { top: 0, left: 0, width: pageWidth, height: pageHeight }; + } else { + console.log("size:", system.args[3]); + pageWidth = parseInt(system.args[3], 10); + pageHeight = parseInt(pageWidth * 3/4, 10); // it's as good an assumption as any + console.log ("pageHeight:",pageHeight); + page.viewportSize = { width: pageWidth, height: pageHeight }; + } + } + if (system.args.length > 4) { + page.zoomFactor = system.args[4]; + } + page.open(address, function (status) { + if (status !== 'success') { + console.log('Unable to load the address!'); + phantom.exit(); + } else { + window.setTimeout(function () { + page.render(output); + phantom.exit(); + }, 200); + } + }); +} \ No newline at end of file diff --git a/code/update_neighborhoods_and_blocks.py b/code/update_neighborhoods_and_blocks.py new file mode 100644 index 0000000..13ee720 --- /dev/null +++ b/code/update_neighborhoods_and_blocks.py @@ -0,0 +1,34 @@ +from osgeo import ogr, osr +from stringtemplate3 import StringTemplate, StringTemplateGroup # easy_install stringtemplate3 +import gspread # easy_install gspread +import os +import json +import subprocess +from TileMill import * +from dataset import dataset +import urllib + + +with dataset() as ds: + neighborhoodLayer = ds.layers['neighborhood'] + blockLayer = ds.layers['block'] + addressLayer = ds.layers['address'] + + for layer in [neighborhoodLayer, blockLayer]: + for feature in layer: + addressLayer.SetSpatialFilter(feature.GetGeometryRef()) + addressLayer.SetAttributeFilter(None) + total = len(list(addressLayer)) + feature.SetField('add_total', total) + + addressLayer.SetSpatialFilter(feature.GetGeometryRef()) + addressLayer.SetAttributeFilter('PLEDGE = "YES"') + yes = len(list(addressLayer)) + feature.SetField('add_yes', yes) + feature.SetField('not_yes', total - yes) + + addressLayer.SetSpatialFilter(feature.GetGeometryRef()) + addressLayer.SetAttributeFilter('PLEDGE = "NO"') + feature.SetField('add_no', len(list(addressLayer))) + + layer.SetFeature(feature) diff --git a/code/update_pledge_spreadsheet.py b/code/update_pledge_spreadsheet.py new file mode 100644 index 0000000..a49e20a --- /dev/null +++ b/code/update_pledge_spreadsheet.py @@ -0,0 +1,170 @@ +from osgeo import ogr +import gspread # easy_install gspread +import os +import json +from pprint import pprint +from dataset import dataset +import winsound + +email = 'GOOGLE_EMAIL_ADDRESS' +password = 'GOOGLE_PASSWORD' + +# updates pledge spreadsheet with ASR_ID and Normalized Address +# updates parcels with pledge level +# updates addresses with pledge level + + + +with dataset() as ds: + sht = gspread.login(email, password).open("BeeSafe Pledge (Responses)").worksheet("Form Responses 1") + + # call get_all_values() to get the header and + values = sht.get_all_values() + + # first, create a column header lookup + header_column = {} + + for column, header in enumerate(values[0]): + header_column[header] = column + 1 + + print header_column + + def data(row): + data = {} + + for header, column in header_column.iteritems(): + data[header] = None if column > len(row) else row[column-1] + + return data + + updated_cells = [] + + def update_cell(sht, col_number, row_number, value): + c = sht.cell(row_number, col_number) + c.value = value + updated_cells.append(c) + + def update_feature(addressLayer, addressFeature, parcelLayer, sht, row_number, data_row): + col_number = header_column['Normalized Street Address'] + value = "{}, {}, {}".format(addressFeature.GetField('ADDRESS'), + addressFeature.GetField('CITY'), + addressFeature.GetField('STATE')) + update_cell(sht, col_number, row_number, value) + + col_number = header_column['ASR_ID'] + value = addressFeature.GetField('ASR_ID') + update_cell(sht, col_number, row_number, value) + + addressFeature.SetField('PLEDGE', 'YES') + if data_row['May we show your pledge on a public map?'] is not None and data_row['May we show your pledge on a public map?'].lower() == 'yes': + addressFeature.SetField('SHOW_ON_MA', 1) + addressLayer.SetFeature(addressFeature) + + parcelLayer.SetAttributeFilter('ASR_ID = "{}"'.format(addressFeature.GetField('ASR_ID'))) + parcels = list(parcelLayer) + + if len(parcels) > 0: + parcelFeature = parcels[0] + parcelFeature.SetField('PLEDGE', 'YES') + if data_row['May we show your pledge on a public map?'] is not None and data_row['May we show your pledge on a public map?'].lower() == 'yes': + parcelFeature.SetField('SHOW_ON_MA', 1) + parcelLayer.SetFeature(parcelFeature) + + addressLayer = ds.layers['address'] + parcelLayer = ds.layers['parcel'] + + for idx, r in enumerate(values[1:]): + if len(updated_cells) >= 10: + print updated_cells + sht.update_cells(updated_cells) + del updated_cells[:] + + row_number = idx + 2 + row = data(r) + print row_number, row + + if len(row['Normalized Street Address'].strip()) > 0: + # if we have a normalized street address then we can assume that this row has been + # updated by this script. Continue to the next row. + continue + + entered_street_address = row['Street Address'] + + matches = [] + # first, try a strict match + matches.append(entered_street_address.upper().strip().replace('.', '')) + # then try a match on first two elements + matches.append(" ".join([x for x in entered_street_address.upper().strip().replace(',', '').replace('.', '').split(' ') if x][0:2])) + # finally try a match on first element only + matches.append(" ".join([x for x in entered_street_address.upper().strip().replace(',', '').replace('.', '').split(' ') if x][0:1])) + + for match in matches: + print "match: {} ".format(match) + addressLayer.SetAttributeFilter('(ADDR_FMT = "EXACT") AND (ADDRESS like "{} %")'.format(match)) + addressFeatures = list(addressLayer) + + # pledgeLevel = d['Pledge Level'].split(' ')[-1] + # print "pledgeLevel {}".format(pledgeLevel) + if len(addressFeatures) == 1: + print "For entered address '{}' we have found the following single match:".format(entered_street_address) + addressFeature = addressFeatures[0] + print "\t'{}, {}, {}' (ASR_ID={})\n".format(addressFeature.GetField('ADDRESS'), + addressFeature.GetField('CITY'), + addressFeature.GetField('STATE'), + addressFeature.GetField('ASR_ID')) + update_feature(addressLayer, addressFeature, parcelLayer, sht, row_number, row) + break + + if len(addressFeatures) == 0: + #update_cell(sht, header_column['Normalized Street Address'], row_number, entered_street_address) + print "\tskipping because we found no matches" + continue + + # if we do not find a strict match, the do it based on address number and prompt the user for feedback + print "For entered address '{}' we have found the following matches:".format(entered_street_address) + + addressList = [] + for address in addressFeatures: + addressList.append(address) + + skip = "SKIP" + less_strict = "LESS STRICT" + + addressList = sorted(addressList, key = lambda a: a.GetField('ADDRESS')) + addressList.append(skip) + addressList.append(less_strict) + + for idx, address in enumerate(addressList): + if str(address) == skip: + print "\t{}) {}".format(idx, skip) + elif str(address) == less_strict: + print "\t{}) {}".format(idx, less_strict) + else: + print "\t{}) {}, {}, {} (ASR_ID={})".format(idx, address.GetField('ADDRESS'), + address.GetField('CITY'), + address.GetField('STATE'), + address.GetField('ASR_ID')) + + winsound.Beep(1000,1000) + id = int(raw_input("Enter # of matching address > ")) + + addressFeature = addressList[id] + + if str(addressFeature) == less_strict: + continue + + elif str(addressFeature) == skip: + sht.update_cell(row_number, header_column['Normalized Street Address'], skip) + sht.update_cell(row_number, header_column['ASR_ID'], skip) + break + else: + print "you chose '{}, {}, {}' (ASR_ID={})\n".format(addressFeature.GetField('ADDRESS'), + addressFeature.GetField('CITY'), + addressFeature.GetField('STATE'), + addressFeature.GetField('ASR_ID')) + + update_feature(addressLayer, addressFeature, parcelLayer, sht, row_number, row) + break + + print updated_cells + sht.update_cells(updated_cells) \ No newline at end of file