Skip to main content

Easy access to global administrative boundaries and geometries via Overture Maps data

Project description

wkls: Well-Known Locations

PyPI version PyPI downloads Python versions License CI

wkls gives you administrative boundaries — countries, regions, counties, and cities — in one line of Python.

import wkls

wkls.us.ca.sanfrancisco.wkt()
# "MULTIPOLYGON (((-122.5279985 37.8155806...)))"
  • Chainable attribute access by ISO code or English name (wkls.us.ca.sanfrancisco, wkls.india.maharashtra)
  • .search("query") at any chain level — scoped to the current subtree
  • Precise geometries from Overture Maps Foundation — no bounding boxes, no shapefiles
  • Outputs boundaries in WKT, WKB, or GeoJSON
  • Bulk export to pyarrow.Table with all Overture Maps columns via .to_arrow_table()
  • Zero configuration — no API keys, no downloads, no setup
  • Automatically uses the latest Overture Maps release

Installation

pip install wkls

Usage

Countries, regions, counties, and cities

Chain up to 3 levels: countryregioncounty or city.

import wkls

wkls.us.wkt()                  # United States
wkls.us.ca.wkt()               # California
wkls.us.ca.sanfrancisco.wkt()  # San Francisco

Every level accepts an ISO 3166-1 alpha-2 code or the English name (lowercase, spaces removed):

wkls.india.maharashtra.wkt()   # country name + region name
wkls.us.oregon                 # sidesteps the `or` keyword collision
wkls.austria.burgenland        # sidesteps numeric region suffixes (AT-1)

If you prefer explicit instantiation over the module singleton:

from wkls import Wkl
wkl = Wkl()
wkl.us.ca.sanfrancisco.wkt()

Geometry formats

wkls.de.wkt()      # Well-Known Text string
wkls.de.wkb()      # Well-Known Binary bytes
wkls.de.geojson()  # GeoJSON string

Exploring the dataset

Listing methods scope to the current chain, all the way up to the dataset root:

wkls.countries()       # all countries
wkls.dependencies()    # all dependencies
wkls.regions()         # every region worldwide
wkls.counties()        # every county worldwide
wkls.cities()          # every city worldwide

wkls.us.regions()      # regions in the US
wkls.us.counties()     # every county in the US
wkls.us.cities()       # every city in the US

wkls.us.ca.counties()  # counties in California
wkls.us.ca.cities()    # cities in California

dir(wkls) and dir(wkls.us) list every attribute that resolves at that level — both ISO codes and English names — for interactive exploration and tab completion.

Search

.search(query) finds every row whose name contains the query substring. Scope narrows with chain depth:

wkls.search("san francisco")        # anywhere in the dataset
wkls.us.search("san francisco")     # anywhere in the US
wkls.us.ca.search("san francisco")  # anywhere in California

Results come back as a Wkl — the same type every other access returns. Use len(), list(), slicing, or .to_dicts() for inspection, or .wkt() / .wkb() / .geojson() on a single-row result to fetch geometry in one step. .to_dicts() is the easiest way to iterate rows in plain Python:

non_us = [r for r in wkls.search("franklin").to_dicts() if r["country"] != "US"]

Resolving ambiguity

Some locations share names. 18 Pennsylvania townships are named "Franklin"; "York" in PA matches both a locality and a county. When a chain resolves to more than one row, geometry methods raise AmbiguousLocationError rather than silently picking one — and the error message lists copy-pasteable chains to run next.

Dot access is strictly admin-hierarchy. One way to narrow is via the chain; one escape hatch covers everything else.

4-level parent narrower — name the parent in the chain:

wkls.us.pa.adamscounty.franklin.wkt()   # Franklin township in Adams County

Intermediate ambiguity — if the middle of a chain is ambiguous (e.g. wkls.us.pa.york matches both a locality and a county), use the unambiguous full normalized name of the intermediate row:

wkls.us.pa.york.wkt()                   # raises — ambiguous
wkls.us.pa.yorkcounty.franklin.wkt()    # ✓ pick the County, then drill

by_id() escape hatch — when no dot path can narrow, pick by UUID. The ambiguity error lists each candidate's id as a literal wkls.by_id('...').wkt() line so you can copy-paste directly:

wkls.by_id('273bc9a0-96a1-402c-992c-84f5c2f212cb').wkt()

Navigating the hierarchy

Dots go down the tree; .parent goes up:

wkls.us.ca.sanfrancisco.parent          # California
wkls.us.ca.sanfrancisco.parent.parent   # United States

Every single-row Wkl has a .path that round-trips to the dot chain:

wkls.us.ca.sanfrancisco.path            # 'wkls.us.ca.sanfrancisco'

resolved = wkls.us.ca.search("oakland")
resolved.path                            # 'wkls.us.ca.alamedacounty.oakland'
eval(resolved.path).wkt() == resolved.wkt()   # True

Pinning an Overture version

wkls auto-detects the latest Overture Maps release. To pin a specific version:

wkls.overture_releases()  # list currently available versions
wkls.configure(overture_version="2026-04-15.0")
wkls.overture_version()   # current version

Or set the WKLS_OVERTURE_VERSION environment variable:

export WKLS_OVERTURE_VERSION=2026-04-15.0

Priority: configure() > environment variable > auto-detect.

Overture retains only the 2 most recent releases on S3, so long-lived pins eventually become invalid. Use overture_releases() to check what's currently available.

Handoff to your engine (to_arrow_table)

When you need more than admin-boundary lookup — filtering, joins, spatial analysis — escape to a pyarrow.Table with the full Overture Maps schema:

tbl = wkls.us.ca.cities().to_arrow_table()

The table includes all Overture Maps columns (id, country, region, subtype, names, sources, admin_level, bbox, etc.) plus a geometry column typed as GeoArrow WKB with OGC:CRS84 CRS. Hand it to any Arrow-aware engine:

ctx.create_data_frame(tbl)

For metadata-only inspection (no geometry fetch), use .to_dicts():

[r for r in wkls.search("franklin").to_dicts() if r["country"] != "US"]

How it works

wkls resolves locations in two stages:

  1. Metadata resolution — your chained attributes are matched against a bundled metadata table (country by ISO code, region by code suffix, county or city by name). No geometry is loaded at this stage.

  2. Geometry fetch — when you call .wkt(), .wkb(), or .geojson(), the geometry is fetched from Overture Maps GeoParquet on S3 via Apache SedonaDB.

Contributing

We welcome contributions! Please see our Contributing Guide for details on how to get started, development setup, and submission guidelines.

License

This project is licensed under the Apache License 2.0 - see the LICENSE file for details. wkls includes, references, and leverages data from the "Divisions" theme of Overture, from Overture Maps Foundation:

Acknowledgments

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

wkls-1.2.0.tar.gz (18.2 MB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

wkls-1.2.0-py3-none-any.whl (18.2 MB view details)

Uploaded Python 3

File details

Details for the file wkls-1.2.0.tar.gz.

File metadata

  • Download URL: wkls-1.2.0.tar.gz
  • Upload date:
  • Size: 18.2 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wkls-1.2.0.tar.gz
Algorithm Hash digest
SHA256 fb69261fc97987dfe6aacdb6a3f0171da72c4a0d0be3b29fff739a3248652ace
MD5 81e8da3b8b59b0fdf79342db09add7bf
BLAKE2b-256 64baa37fd7357c6278c96fe77d543e680768ed2cabb521c5c80a94491888e852

See more details on using hashes here.

Provenance

The following attestation bundles were made for wkls-1.2.0.tar.gz:

Publisher: pypi-publish.yaml on wherobots/wkls

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file wkls-1.2.0-py3-none-any.whl.

File metadata

  • Download URL: wkls-1.2.0-py3-none-any.whl
  • Upload date:
  • Size: 18.2 MB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for wkls-1.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 59b45d8677dcf4cf3da2a2dcd955264d1a722deab553bdf39c71c72b31fc0216
MD5 b6b86319372c6d1264c11b423b2cb39f
BLAKE2b-256 10499264f7643bf63d4b9962d28399a48882f9d9b5b24804152534cae09b61ff

See more details on using hashes here.

Provenance

The following attestation bundles were made for wkls-1.2.0-py3-none-any.whl:

Publisher: pypi-publish.yaml on wherobots/wkls

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page