Physical geography
Each covered profile acts as a compact physical-geography reference: land and water area, coastline, elevation, named highest and lowest points, source-listed major rivers and lakes, a plain-language climate summary, and represented Köppen-Geiger climate classes. Everything works offline.
240
elevation-extreme profiles
375
source-listed river and lake records
241
Köppen-Geiger profiles
A country in four lines
8,358,140 km² land · 157,630 km² water · 7,491 km coastline · highest point Pico da Neblina · dominant represented class Aw
>>> from pyworldatlas import Atlas
>>> with Atlas() as atlas:
... brazil = atlas.country("Brazil")
... print(f"{brazil.flag} {brazil.name}")
... print(f"Land {brazil.land_area_km2:,.0f} km² | Water {brazil.water_area_km2:,.0f} km²")
... print(brazil.highest_point.name, f"{brazil.highest_point.elevation_m:,.0f} m")
... print(brazil.climate.summary)
🇧🇷 Brazil
Land 8,358,140 km² | Water 157,630 km²
Pico da Neblina 2,994 m
mostly tropical, but temperate in south
Area and coastline
Country.area_km2 is total area. land_area_km2 and water_area_km2
are its source components when available, while water_percent is calculated
from water divided by total area. coastline_km is the source-reported
coastline length.
>>> with Atlas() as atlas:
... japan = atlas.country("Japan")
... print(japan.area_km2, japan.land_area_km2, japan.water_area_km2)
... print(round(japan.water_percent, 2), japan.coastline_km)
... print(japan.is_coastal, japan.is_landlocked)
377915.0 364485.0 13430.0
3.55 29751.0
True False
The boolean conveniences remain None when coastline data is unavailable.
They never treat a missing coastline as zero. A coastline value of zero means
the source describes the profile as landlocked; it is not a measurement of
international boundaries.
Elevation and named extremes
The highest and lowest points are ElevationPoint
objects. Elevations use metres relative to sea level, so a negative lowest
point is below sea level.
>>> with Atlas() as atlas:
... japan = atlas.country("Japan")
... print(japan.mean_elevation_m)
... print(japan.highest_point.name, japan.highest_point.elevation_m)
... print(japan.lowest_point.name, japan.lowest_point.elevation_m)
438.0
Mount Fuji 3776.0
Hachiro-gata -4.0
source_label preserves the compact source wording. is_approximate is
true only when the source explicitly marked its measurement as approximate.
This release does not publish a separate “major mountains” inventory: a named
highest point is not automatically labelled as a mountain.
Rivers and lakes
Rivers and lakes are immutable typed records. Search helpers make shared features easy to discover:
>>> with Atlas() as atlas:
... print([country.name for country in atlas.countries_with_river("Amazon")])
... print([country.name for country in atlas.countries_with_lake("Geneva")])
['Brazil', 'Peru']
['France', 'Switzerland']
The feature tuples are source-listed major features, not exhaustive inventories. An empty tuple means the source did not list a feature for that profile. It does not mean that no river or lake exists.
For a shared river, River.length_km is the full source-reported river
length, not the portion inside one country. Likewise, Lake.area_km2 is the
full lake area rather than the area inside one profile. The original compact
wording remains available in source_label.
Climate profiles
Country.climate combines two deliberately separate views:
summaryis a short source-provided description.koppen_geiger_zonescontains classes derived from the 1991–2020 global Köppen-Geiger raster.
>>> with Atlas() as atlas:
... brazil = atlas.country("Brazil")
... print(brazil.climate.reference_period)
... print(brazil.climate.zone_codes[:4])
... zone = brazil.climate.dominant_zone
... print(zone.code, zone.name, round(zone.share_percent, 2))
1991-2020
('Aw', 'Am', 'Af', 'BSh')
Aw Tropical, savannah 46.33
Zone shares are latitude-area-weighted estimates from a 0.1-degree raster and pinned map-unit polygons. Classes below the documented 0.1% extraction threshold are omitted. They are useful for broad educational comparison, not site-level climate determination.
>>> with Atlas() as atlas:
... print(len(atlas.countries_in_climate_zone("Af")))
... print(atlas.climate_zone_codes()[-2:])
73
('ET', 'EF')
Physical filters and rankings
Physical filters compose with the existing region and metadata filters:
atlas.countries(continent="Europe", coastal=False)
atlas.countries(koppen_geiger_code="Af")
atlas.countries(has_rivers=True, has_lakes=True)
Physical ranking metrics include land_area, water_area,
water_percent, coastline, mean_elevation, highest_elevation,
lowest_elevation, river_count, lake_count, and
climate_zone_count.
>>> with Atlas() as atlas:
... rows = atlas.rank("coastline", limit=5)
... print([(row.country.name, row.value) for row in rows])
[('Canada', 202080.0), ('Indonesia', 54716.0), ('Greenland', 44087.0), ('Russia', 37653.0), ('Philippines', 36289.0)]
Rankings describe the bundled source fields; they do not judge countries. Missing values are excluded and ties use the country name for deterministic ordering. Feature-count rankings count source-listed records, not every feature on the ground.
Learning prompts
The deterministic flashcard API now supports climate_zones,
coastlines, highest_points, rivers, and lakes. These are
structured prompts and answers that can be used in a notebook, command-line
lesson, or application without adding game state to the package.
Executable example
1"""Explore physical geography without a network connection."""
2
3from pyworldatlas import Atlas
4
5
6with Atlas() as atlas:
7 brazil = atlas.country("Brazil")
8 print(
9 brazil.flag,
10 brazil.name,
11 f"{brazil.land_area_km2:,.0f} km² of land",
12 f"{brazil.water_area_km2:,.0f} km² of water",
13 )
14 print(
15 "Highest point:",
16 brazil.highest_point.name,
17 f"({brazil.highest_point.elevation_m:,.0f} m)",
18 )
19 print("Source-listed rivers:", ", ".join(river.name for river in brazil.rivers))
20 print("Climate classes:", ", ".join(brazil.climate.zone_codes))
21
22 print(
23 "Amazon profiles:",
24 ", ".join(country.name for country in atlas.countries_with_river("Amazon")),
25 )
26 print(
27 "Lake Geneva profiles:",
28 ", ".join(country.name for country in atlas.countries_with_lake("Geneva")),
29 )
30
31 print("Longest sourced coastlines:")
32 for row in atlas.rank("coastline", limit=5):
33 print(f"{row.position}. {row.country.name}: {row.value:,.0f} {row.unit}")