This interactive Google Map shows the vote margin for Hillary Clinton over Bernie Sanders in Albany County. Bernie Sanders won the county with about 52.2% of the vote, or a fairly comfortable 1,884 vote margin. Hillary Clinton's support was concentrated in urban, African American portions of the county, while Bernie Sanders had his strength in rural and outer suburbs, along with Downtown Albany and Delmar. Bernie Sander's coalition certainly was an interesting one.
Geographic Information Services (GIS) – Maps – Cartography
I am an amateur cartographer who designs maps and does a wide variety geospatial analysis using free and open-source geographic information software (GIS) and public sources of data to design quality maps, graphs, charts and datasets. I am looking for new and interesting projects to improve my skills, make connections and expand my portfolio.
Are you looking for my personal blog with it’s hiking, camping and outdoor recreation maps, along with a variety of charts, photos, and stories? Please visit andyarthur.org.
Mapping Avaliable
Tax/Property Mapping
High Resolution Aerial Photography
Recreational Maps – Hunting, Camping, Hiking
Georeference addresses using State Address Mapping service, plot them on a map
Wetlands, Topographic Contours, Land Cover
Compare historical aerial photos or maps to current photography
Web mapping using leaflet (HTML/Javascript file to embed on a website or use at home)
For most projects, there is no fee. I am looking for experience, references, mentors and connections in the geospatial community.
If you have a large project, let’s talk about it. I might be willing to do it for free, if it’s something really interesting or important like fighting suburban sprawl and pollution. I don’t a business or taxes set up, so I can’t really charge at this point.
How to get started?
Please send me an email describing the mapping or data project in as much detail as possible.
US Census – 2019 American Community Survey, 2020 US Census
NYS Tax and Assessment Rolls (2020)
NYSDOT Traffic Counts and Road Data
Historical Aerial Photography (primarily 1952, but earlier and later exist)
ArcGIS REST/Services and WMS Services from state and local agencies
LiDAR Elevation Profiles
USGS Topographic Maps, historic and modern – with overlays if requested
Data Repositories like CUGIR, DataNY.gov and NYSGIS
Recreation data from NYSDEC
Software Used
Quantum GIS (QGIS) including 3D Mapping
Geodata Abstraction Library (GDAL, ogr2ogr)
Python, including the data-science libraries PANDAS and GeoPANDAS
LeafletJS Web Mapping Services
Geographies Avaliable
Primary Capital Region and also much of New York State, also some for Pennsylvania, Vermont, West Virginia
State, county, municipal, school districts – Most data sets
Parks, highways, buffer (distance to) – Most data sets
Election districts – Roughly 75% of NYS counties
Census Tract or Blockgroup – 2019 American Community Survey
Tabulation Block – 2020 US Census
Are printed maps avaliable at this time?
Not currently. I can send you a file based on your specifications to print at your local print shop.
How long do mapping projects take?
Depends on complexity of the project. Many projects only take minutes, however if a project requires georeferencing, data cleaning, or custom shapes or layouts, it might take significantly longer. More revisions lead to better quality output.
Do you make maps professionally?
No! This is just a hobby. But I’m interested in expanding my skills. I do a lot of mapping for my blog and in support of community organizations like Save the Pine Bush.
Are my maps of good quality?
Thats for you to decide. I don’t have formal education in map making, and I don’t have professional tools. But do take a look at the work I’ve done below.
Examples of Maps
This shows a 3D rendering of the Buckville Canal north of Hamilton
This map shows the use of 2020 PL 94-171 data to calculate population density in City of Albany.
This 1985 aerial photo shows Crossgates Mall prior to it’s expansion.
This GIF image shows the change in unemployment during Coronavirus panademic.
This image shows hiking trails near Brooktrout, Falls Pond and Deep Lake.
Peebles Island, a Comparison 1952
3D Interactive of campsites at Moose River Plains.
import pandas as pd
import geopandas as gpd
# path to overlay shapefile
overlayshp = r'/tmp/dis_to_albany.gpkg'
# summary level -- 750 is tabulation block, 150 is blockgroup
# large areas over about 50 miles much faster to use bg
summaryLevel = 150
#summaryLevel = 750
# path to block or blockgroup file
if summaryLevel == 150:
blockshp = r'/home/andy/Documents/GIS.Data/census.tiger/36_New_York/tl_2020_36_bg20.shp.gpkg'
else:
blockshp = r'/home/andy/Documents/GIS.Data/census.tiger/36_New_York/tl_2020_36_tabblock20.shp.gpkg'
# path to PL 94-171 redistricting geoheader file
pl94171File = '/home/andy/Desktop/nygeo2020.pl'
# field to categorize on (such as Ward -- required!)
catField = 'Name'
# geo header contains 2020 census population in column 90
# per PL 94-171 documentation, low memory chunking disabled
# as it causes issues with the geoid column being mixed types
df=pd.read_csv(pl94171File,delimiter='|',header=None, low_memory=False )
# column 2 is summary level
population=df[(df.iloc[:,2] == summaryLevel)][[9,90]]
# load overlay
overlay = gpd.read_file(overlayshp).to_crs(epsg='3857')
# shapefile of nys 2020 blocks, IMPORTANT (!) mask by output file for speed
blocks = gpd.read_file(blockshp,mask=overlay).to_crs(epsg='3857')
# geoid for linking to shapefile is column 9
joinedBlocks=blocks.set_index('GEOID20').join(population.set_index(9))
# store the size of unbroken blocks
# in case overlay lines break blocks into two
joinedBlocks['area']=joinedBlocks.area
# run union
unionBlocks=gpd.overlay(overlay, joinedBlocks, how='union')
# drop blocks outside of overlay
unionBlocks=unionBlocks.dropna(subset=[catField])
# create population projection when a block crosses
# an overlay line -- avoid double counting -- this isn't perfect
# as we loose a 0.15 percent due to floating point errors
unionBlocks['sublock']=unionBlocks[90]*(unionBlocks.area/unionBlocks['area'])
# sum blocks in category
unionBlocks=pd.DataFrame(unionBlocks.groupby(catField).sum()['sublock'])
# rename columns
unionBlocks=unionBlocks.rename({'sublock': '2020 Census Population'},axis=1)
# calculate cumulative sum as you go out each ring
unionBlocks['millions']=unionBlocks.cumsum(axis=0)['2020 Census Population']/1000000
# each ring is 50 miles
unionBlocks['miles']=unionBlocks.index*50
# output
unionBlocks
Land use in town of Berne (from 2016 National Land Cover Dataset)
Most highly assessed properties in Albany County …