Last year I got drawn into the #30DayMapChallenge and made it to day 19. I was pretty disorganized, didn’t timebox my days, and had a couple double-map days. I’m not sure how much better this year will go, but I’m going to try and keep this page updated with the maps and methods throughout the month.
30 Day Map Challenge Categories
Dot density/proportional symbol map recording parking violations in Brooklyn.
Data Sources
Tools
What a start! Wouldn’t be a challenge without diving into some data. I love a good dot density map, many of which have been popping up since the challenge started. As with last year, it is tough not to be inspired by the content posted from those in time zones ahead.
For today’s map, I started surfing the NYC open data portal by most recent datasets which is where I found Parking Violations Issued - Fiscal Year 2020, though I would come to find this data contains way more than that. It comprises 43 columns and 12.5 million rows, with parking violations going back way further than 2020. One thing it is lacking though, is any sort of geocoded locations. Instead we’re given “House Number”, “Street” and “StreetCode1”, “StreetCode2”, “StreetCode3”. Along with some other geo-identifying columns.
Note not all results shown for each query.
First I loaded it into Postgresql.
1 | |
And running some fun fact queries, like which makes have the most tickets.
1 | |
And then look a look at some rows related to location
1 | |
After doing some Googling, it looks like “streetcode” is a reference to the LION dataset, which contains all the streets in NYC. Downloaded that dataset (which happened to be a ArcGIS File Geodatabase), loaded it into QGIS and attempted to import into my local PostgreSQL (with the PostGIS extension of course). It failed due to the geometry containing both MultiLineString and MultiCurve shapes. No problem, ran “Multipart to Singleparts” in the QGIS processing toolbox and was off on my way.
A look at the LION street data, this time informed by a handy metadata dictionary. The dictionary let me know some things like the streetcode in the lion dataset starts with the borough code. And that “FromLeft” to “ToLeft” describe the street numbers contained on that geometry (similarly there is a “FromRight” to “ToRight”).
1 | |
In order to figure out how to join the streetcodes between these two datasets, I started with one example from the parking dataset and kept refining the query until I found the matching street. Lets use one of the examples above, 3604 PAUL AVE with street code 57310.
1 | |
Here we can see the code 57310 with the borough code 2 (Bronx) appended in front.
I decided I wanted to look just at Brooklyn parking violations in 2020, and made a handy table with the subset of those violations. One of the columns, “violationlocation”, included a precinct number which could be filtered on to Brooklyn precincts (between 60 and 94).
1 | |
Now let’s take a look at the number of violations per street.
1 | |
It’s at this point I learn my SQL browser (Dbeaver) supports exporting tables in markdown.
| streetname | FromLeft | ToLeft | count | geom |
|---|---|---|---|---|
| 9th St | 309 | 375 | 1084 | LINESTRING (988049.3131903708 183074.34281355143, 988704.4266214818 182658.4445938021) |
| 13th Ave | 4701 | 4799 | 359 | LINESTRING (986760.1262291372 171041.54244202375, 986598.2860214412 170836.28363227844) |
| 38th St | 1201 | 1299 | 336 | LINESTRING (987605.216469273 173362.79415227473, 988216.0877982825 172877.91662925482) |
| 13th Ave | 4601 | 4699 | 329 | LINESTRING (986921.8352368176 171245.3182516992, 986760.1262291372 171041.54244202375) |
| 5th Ave | 7101 | 7199 | 319 | LINESTRING (978317.2496281117 169742.54238031805, 978216.5444233418 169418.05476491153) |
| 13th Ave | 4001 | 4099 | 316 | LINESTRING (987892.2825829089 172471.13260993361, 987731.4988752753 172265.2964001447) |
| 9th St | 241 | 307 | 306 | LINESTRING (987399.3146594912 183493.9646334797, 988049.3131903708 183074.34281355143) |
| 38th St | 1301 | 1399 | 306 | LINESTRING (988216.0877982825 172877.91662925482, 988828.8882273883 172394.2554062754) |
| 13th Ave | 3901 | 3999 | 301 | LINESTRING (988054.470690608 172673.61901953816, 987892.2825829089 172471.13260993361) |
This makes sense, that block of 9th street is particularly busy and has a bus stops and bike lanes.
There is a problem though, I’m only going to know which stretch of street each parking violation is on. For a quick workaround I used ST_LineInterpolatePoints, using the house number as a rough proxy for distance along the street.
A bunch of fiddling later and…
the (almost) final query:
1 | |
I then opened the newly created positions table in QGIS. This resulted in a ton of points overlapping and I couldn’t quiet figure out a good way to display them. Well why not throw in some porportional symbols then?
And finally another query - grouping by the geometry of each of those points in order to get a count of overlapping points.
1 | |
I popped this final query into the QGIS Database Manager, threw on some styling to match the yellow of a parking violation, and there we have it. I skipped quite a few steps and directions I took while figuring this all out. If you have any questions feel free to reach out!
Routes from subway stops to closet coffee shops, in the style of the Anthora coffee cup.
Data Sources:
Tools:
No write up today, similar process to the pizza map.
Cartogram of NYC boroughs based on population.
Data Sources:
Tools:
For today’s map I decided to create a cartogram of NYC using the population of each borough as the area for each polygon. After an initial sketch on paper I opened up a jupyter notebook, and started plotting away…
Some utils
1 | |
And then the shapes
1 | |
1 | |
And for the final shape WKT’s
1 | |
1 | |
Prospect Park with a simplified hexagon boundary.
Data Sources:
Tools:
Who says all these hexagon day maps need to be hexbins? This map has six(ish) sides! It’s also rotated aggressively because this is how I map Prospect Park in my mind.
First time using Affinity Designer. I like it a lot, it definitely makes more sense to be using vector image software for my maps than a raster program like Photoshop. It was easier to pick up today than any of the times I’ve ever tried to use Inkscape.
Unnamed coastline in minimal style.
Data Sources:
Tools:
2019 Algal booms status, Finger Lakes.
Data Sources:
Tools:
Stuck with the basics today, load some data in QGIS and fiddle with the knobs.
Fort Greene Park in Green.
Data Sources:
Tools:
Ufa in Yellow
Data Sources:
Tools:
Monochrome Bathymetry of Lake Crescent.
Data Sources:
Tools:
Preview moving around NYC in interactive webmap GRID.
Data Sources:
Tools:
Controls are WASD or directional arrows. Tried to make it work on mobile but it’s going to be a bumpy ride. Use portrait mode if you do.
Theme music - Tron Legacy - Soundtrack OST - 02 The Grid - Daft Punk
Sunset Park Hillshade.
Data Sources:
Tools:
Need to spend some time looking into how to make those fancy Blender maps.
Handdrawn map of fictional happy junction.
Data Sources:
Tools:
Landsat-8 True Color along Danjiang River.
Data Sources:
Tools:
Followed this great tutorial from NASA Earth Observatory on creating true color images from Landsat 8 data. Also helped to read this article on the different bands.
Mockup new bike lanes around Bartel Pritchard Square.
Data Sources:
Tools:
Think about where you could use some bike lanes.
Nearby stops between 2 train and B99 buses.
Data Sources:
Tools:
The b99 train was added after the nightly subway shutdowns to replace the 2 train. I didn’t realize this until too far into placing the labels, otherwise I belive the A/C and b25 would have made more sense to pair. Wrote some wild queries to explore this stuff, though most I didn’t end up using. One even included HAVING.
Governors Island.
Data Sources:
Tools:
Brooklyn Union Gas Company Metropolitan Works Branch, Gowanus.
Data Sources:
Tools:
A rough estimate of landuse on Manhattan Island.
Data Sources:
Tools:
Shoutout to this method of stacked porportional fills using QGIS geometry generator.
The expression boils down to:
1 | |
Restaurants without a phone number or website on OpenStreetMap.
Data Sources:
Tools:
NYC Community Board Populations.
Data Sources:
Tools:
Gowanus Canal Bridges.
Data Sources:
Tools:
The bounds of a week in my COVID bubble.
Data Sources:
Tools:
Boundary between Manhattan and Brooklyn.
Data Sources:
Tools:
Tallest buildings per block clipped on Brooklyn Heights.
Data Sources:
Tools:
Brooklyn's "OpenStreets."
Data Sources:
Tools:
Attempt at adding 3D with Blender.
Data Sources:
Tools:
A small cat in a small spot.
Data Sources:
Tools:
Movement In a Game of Super Bomberman R Online.
Data Sources:
Tools:
All the places called Long Beach according to Wikipedia.
Data Sources:
Tools:
The genders depicted in Central Park statues.
Data Sources:
Tools:
Well that was a fun! 30 maps in around 30 days. I can’t say I love them all, but I’m glad I put something together for each day.