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

Brazil flag emoji Brazil at a glance

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:

  • summary is a short source-provided description.

  • koppen_geiger_zones contains 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}")