Catalog PyPI
Back to packageRELEASE DETAILS

0.2.0

PyPI

acadgis

Publication-ready academic GIS study-area maps in a few lines of Python.

academicadministrative-boundariesbasemapbivariate-mapcartogramcartographychoroplethchoropleth-mapcontourdemdot-densityesa-worldcovergadmgeopandasgeospatialgis
All keywords (40)
heatmaphillshadeisoplethland-coverlocator-mapmapmappingmatplotlibndviopenstreetmappublicationqgis-alternativerasterremote-sensingresearchresearch-mapriverssatellitesentinel-2spatial-analysisstudy-area-mapterrainthematic-mapthesis-map
Published5 Jul 2026
Direct dependencies16
Transitive dependenciesNot calculated

README

Version 0.2.0 documentation

AcadGIS

AcadGIS

Publication-ready study area maps for research — in a few lines of Python.

Version Downloads Downloads/month Python License Docs

Website  ·  Documentation  ·  Source


AcadGIS is a Python package (and a no-code web app) for making publication-ready study area maps, choropleth and the full thematic-map catalogue, locator insets, terrain relief, raster & vector layers, satellite basemaps and river maps — for research papers, theses and reports. Name a place, add your data, and export a journal-ready figure in a few lines: no QGIS, ArcGIS or shapefiles required. Everything works through a single import acadgis as agis.

import acadgis as agis

sa = agis.StudyArea("Iraq").zoom_into("Babil")
sa.figure(suptitle="Study Area: Babil Governorate, Iraq")
sa.save("study_area.png", dpi=300)

locator figure

Sentinel-2 NDVI DEM topography XYZ tile basemaps
ESA WorldCover land cover ESA WorldCover (Dhaka) OpenStreetMap roads
rivers + field sites study area with terrain grid drill-down
cascade drill-down series layout USA locator
China cascade sea / ocean layer India context map
UK / London palettes & themes USA states poster
choropleth interpolated isopleth labelled isolines
dot-density world vegetation classed world choropleth

Curated raster & satellite (NDVI · land cover · DEM · basemaps · roads) · study-area layouts · sea/ocean · choropleth · isopleth / isolines · dot-density · world thematic maps — every figure made with import acadgis as agis.

Install

pip install acadgis                 # core (offline demo data + plotting)
pip install "acadgis[full]"         # + live download, fuzzy matching, terrain, drainage

Optional extras: acadgis[download] (any-country boundaries via pygadm), acadgis[match] (fuzzy names), acadgis[terrain] (DEM relief), acadgis[drainage] (streams from a DEM). Bangladesh, Iraq, India and the USA ship bundled — everything works offline.

What it does

  • Boundaries on demand — country, state, district and sub-district, by name, from GADM.
  • One-line styled maps — 12 palettes, 6 themes, north arrows, scale bars, checker borders, graticules and legends.
  • Choropleths and graduated symbols with automatic name matching (Chittagong matches Chattogram, dropped admin-suffixes, diacritics) and mapclassify schemes.
  • Locator insets — the country to region to detail figure with connecting arrows.
  • Layout presets — study_area() builds the whole multi-panel figure in one call (single, two, cascade, series, grid) with uniform or custom panel sizes, customizable connectors and region highlighting.
  • Terrain — shaded relief and hypsometric tint from Copernicus GLO-30 (no API key), with realistic land-to-ocean colouring.
  • Hydrology — Natural Earth or dense OpenStreetMap river networks and water bodies.
  • Sea / ocean — sea=True (or agis.add_sea) draws a clean ocean around coastal countries (source="ne10m" for crisp coasts); sliver-free, landlocked is a no-op.
  • Drainage — stream networks extracted from a DEM.
  • Layers — add_raster (any GeoTIFF: continuous / categorical / RGB), add_layer (any vector, auto-styled, label control), add_basemap/add_satellite (6 tile styles), add_topography, add_cities, add_roads, and curated real data: add_landcover (ESA WorldCover 10 m) + add_ndvi (Sentinel-2).
  • Thematic maps — the full catalogue: heat maps (add_heatmap), interpolated isopleth surfaces and labelled isolines (interpolate_field → add_isopleth/add_contours), dot-density (dot_density), bivariate choropleths with a 2-D legend (bivariate), Dorling / non-contiguous cartograms (cartogram).
  • Export — PNG, PDF or SVG at any DPI.

Quick start

import acadgis as agis

gdf = agis.load_boundaries("Bangladesh", level="district")     # auto-download + cache
agis.plot(gdf, palette="spectral", title="Bangladesh — Districts")

agis.choropleth(gdf, df, value="incidence", palette="magma")   # messy names welcome

ax = agis.plot(gdf, highlight="Comilla")
agis.points(ax, survey_df, value="value", size_by="value", cmap="magma", legend=True)

dem = agis.load_dem("Bagrote Valley")
agis.relief(dem, hillshade=True, ocean_color="#cce5f0")

agis.study_area("Bangladesh",                                  # whole layout, one call
    steps=[("division", "Dhaka"), ("district", "Madaripur")],
    template="cascade", terrain=True)

License

Apache License 2.0.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 34

Native requirements
16 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
geopandas
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
geopandas>=0.12runtime
matplotlib
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
matplotlib>=3.6runtime
numpy
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
numpy>=1.22runtime
pandas
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pandas>=1.5runtime
shapely
Environment
{
  "extras": "",
  "marker": null,
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
shapely>=2.0runtime
pygadm
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pygadm>=0.5; extra == "full"runtime
rapidfuzz
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rapidfuzz>=3.0; extra == "full"runtime
mapclassify
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
mapclassify>=2.5; extra == "full"runtime
rasterio
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.3; extra == "full"runtime
rioxarray
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rioxarray>=0.13; extra == "full"runtime
pysheds
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pysheds>=0.3; extra == "full"runtime
contextily
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
contextily>=1.3; extra == "full"runtime
xyzservices
Environment
{
  "extras": "",
  "marker": "extra == \"full\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
xyzservices>=2023.0; extra == "full"runtime
pygadm
Environment
{
  "extras": "",
  "marker": "extra == \"download\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pygadm>=0.5; extra == "download"runtime
rapidfuzz
Environment
{
  "extras": "",
  "marker": "extra == \"match\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rapidfuzz>=3.0; extra == "match"runtime
rasterio
Environment
{
  "extras": "",
  "marker": "extra == \"terrain\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.3; extra == "terrain"runtime
rioxarray
Environment
{
  "extras": "",
  "marker": "extra == \"terrain\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rioxarray>=0.13; extra == "terrain"runtime
rasterio
Environment
{
  "extras": "",
  "marker": "extra == \"raster\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.3; extra == "raster"runtime
rioxarray
Environment
{
  "extras": "",
  "marker": "extra == \"raster\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rioxarray>=0.13; extra == "raster"runtime
contextily
Environment
{
  "extras": "",
  "marker": "extra == \"basemap\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
contextily>=1.3; extra == "basemap"runtime
xyzservices
Environment
{
  "extras": "",
  "marker": "extra == \"basemap\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
xyzservices>=2023.0; extra == "basemap"runtime
pysheds
Environment
{
  "extras": "",
  "marker": "extra == \"drainage\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pysheds>=0.3; extra == "drainage"runtime
rasterio
Environment
{
  "extras": "",
  "marker": "extra == \"drainage\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.3; extra == "drainage"runtime
pytest
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pytest>=7.0; extra == "dev"runtime
pygadm
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pygadm>=0.5; extra == "dev"runtime
rapidfuzz
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rapidfuzz>=3.0; extra == "dev"runtime
mapclassify
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
mapclassify>=2.5; extra == "dev"runtime
rasterio
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rasterio>=1.3; extra == "dev"runtime
rioxarray
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
rioxarray>=0.13; extra == "dev"runtime
pysheds
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
pysheds>=0.3; extra == "dev"runtime
contextily
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
contextily>=1.3; extra == "dev"runtime
xyzservices
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
xyzservices>=2023.0; extra == "dev"runtime
jupyter
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
jupyter; extra == "dev"runtime
nbconvert
Environment
{
  "extras": "",
  "marker": "extra == \"dev\"",
  "requires_python": ">=3.9",
  "evaluation": "NOT_EVALUATED"
}
nbconvert; extra == "dev"runtime

Distribution files

2 collected
acadgis-0.2.0-py3-none-any.whl

bdist_wheel · 1,762.9 KB · Python py3

Source file
acadgis-0.2.0.tar.gz

sdist · 1,764.38 KB · Python source

Source file

Repository

PENDING
riponcm/acadgis

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 17:51 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:a6b2fec67036c1116e41f68518a704cec0bbda1d5d73cbf8f872d04885dcfd65

Other collected versions

View all collected versions →