Observed since 20 Oct, 17:51 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
acadgis
Publication-ready academic GIS study-area maps in a few lines of Python.
Publication-ready study area maps for research — in a few lines of Python.
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)
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.
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.
mapclassify schemes.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.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.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).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).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)
Apache License 2.0.
Download counts and popularity will appear here as the collector receives them.
| Package / target | Requirement | Relationship |
|---|---|---|
geopandasEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | geopandas>=0.12 | runtime |
matplotlibEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | matplotlib>=3.6 | runtime |
numpyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | numpy>=1.22 | runtime |
pandasEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pandas>=1.5 | runtime |
shapelyEnvironment{
"extras": "",
"marker": null,
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | shapely>=2.0 | runtime |
pygadmEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pygadm>=0.5; extra == "full" | runtime |
rapidfuzzEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rapidfuzz>=3.0; extra == "full" | runtime |
mapclassifyEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | mapclassify>=2.5; extra == "full" | runtime |
rasterioEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rasterio>=1.3; extra == "full" | runtime |
rioxarrayEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rioxarray>=0.13; extra == "full" | runtime |
pyshedsEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pysheds>=0.3; extra == "full" | runtime |
contextilyEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | contextily>=1.3; extra == "full" | runtime |
xyzservicesEnvironment{
"extras": "",
"marker": "extra == \"full\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | xyzservices>=2023.0; extra == "full" | runtime |
pygadmEnvironment{
"extras": "",
"marker": "extra == \"download\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pygadm>=0.5; extra == "download" | runtime |
rapidfuzzEnvironment{
"extras": "",
"marker": "extra == \"match\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rapidfuzz>=3.0; extra == "match" | runtime |
rasterioEnvironment{
"extras": "",
"marker": "extra == \"terrain\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rasterio>=1.3; extra == "terrain" | runtime |
rioxarrayEnvironment{
"extras": "",
"marker": "extra == \"terrain\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rioxarray>=0.13; extra == "terrain" | runtime |
rasterioEnvironment{
"extras": "",
"marker": "extra == \"raster\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rasterio>=1.3; extra == "raster" | runtime |
rioxarrayEnvironment{
"extras": "",
"marker": "extra == \"raster\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rioxarray>=0.13; extra == "raster" | runtime |
contextilyEnvironment{
"extras": "",
"marker": "extra == \"basemap\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | contextily>=1.3; extra == "basemap" | runtime |
xyzservicesEnvironment{
"extras": "",
"marker": "extra == \"basemap\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | xyzservices>=2023.0; extra == "basemap" | runtime |
pyshedsEnvironment{
"extras": "",
"marker": "extra == \"drainage\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pysheds>=0.3; extra == "drainage" | runtime |
rasterioEnvironment{
"extras": "",
"marker": "extra == \"drainage\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rasterio>=1.3; extra == "drainage" | runtime |
pytestEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pytest>=7.0; extra == "dev" | runtime |
pygadmEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pygadm>=0.5; extra == "dev" | runtime |
rapidfuzzEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rapidfuzz>=3.0; extra == "dev" | runtime |
mapclassifyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | mapclassify>=2.5; extra == "dev" | runtime |
rasterioEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rasterio>=1.3; extra == "dev" | runtime |
rioxarrayEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | rioxarray>=0.13; extra == "dev" | runtime |
pyshedsEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | pysheds>=0.3; extra == "dev" | runtime |
contextilyEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | contextily>=1.3; extra == "dev" | runtime |
xyzservicesEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | xyzservices>=2023.0; extra == "dev" | runtime |
jupyterEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | jupyter; extra == "dev" | runtime |
nbconvertEnvironment{
"extras": "",
"marker": "extra == \"dev\"",
"requires_python": ">=3.9",
"evaluation": "NOT_EVALUATED"
} | nbconvert; extra == "dev" | runtime |
bdist_wheel · 1,762.9 KB · Python py3
sdist · 1,764.38 KB · Python source
Observed since 20 Oct, 17:51 UTC
No superseded metadata states collected. Unchanged observations do not create new revisions.
package_version:a6b2fec67036c1116e41f68518a704cec0bbda1d5d73cbf8f872d04885dcfd65