Easy access to global administrative boundaries and geometries via Overture Maps data
Project description
wkls: Well-Known Locations
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.Tablewith 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: country → region → county 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:
-
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.
-
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:
- © OpenStreetMap contributors. Available under the Open Database License.
- geoBoundaries. Available under CC BY 4.0.
- Esri Community Maps contributors. Available under CC BY 4.0.
- Land Information New Zealand (LINZ). Available under CC BY 4.0.
Acknowledgments
- Overture Maps Foundation for providing high-quality, open geospatial data.
- AWS Open Data Registry for hosting the dataset.
- Apache SedonaDB for the high-performance, single-node spatial query and analytics engine.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fb69261fc97987dfe6aacdb6a3f0171da72c4a0d0be3b29fff739a3248652ace
|
|
| MD5 |
81e8da3b8b59b0fdf79342db09add7bf
|
|
| BLAKE2b-256 |
64baa37fd7357c6278c96fe77d543e680768ed2cabb521c5c80a94491888e852
|
Provenance
The following attestation bundles were made for wkls-1.2.0.tar.gz:
Publisher:
pypi-publish.yaml on wherobots/wkls
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wkls-1.2.0.tar.gz -
Subject digest:
fb69261fc97987dfe6aacdb6a3f0171da72c4a0d0be3b29fff739a3248652ace - Sigstore transparency entry: 1532005584
- Sigstore integration time:
-
Permalink:
wherobots/wkls@966257fa9dfaed338e82e2ed2d03c9791f47e204 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/wherobots
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yaml@966257fa9dfaed338e82e2ed2d03c9791f47e204 -
Trigger Event:
push
-
Statement type:
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59b45d8677dcf4cf3da2a2dcd955264d1a722deab553bdf39c71c72b31fc0216
|
|
| MD5 |
b6b86319372c6d1264c11b423b2cb39f
|
|
| BLAKE2b-256 |
10499264f7643bf63d4b9962d28399a48882f9d9b5b24804152534cae09b61ff
|
Provenance
The following attestation bundles were made for wkls-1.2.0-py3-none-any.whl:
Publisher:
pypi-publish.yaml on wherobots/wkls
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
wkls-1.2.0-py3-none-any.whl -
Subject digest:
59b45d8677dcf4cf3da2a2dcd955264d1a722deab553bdf39c71c72b31fc0216 - Sigstore transparency entry: 1532005683
- Sigstore integration time:
-
Permalink:
wherobots/wkls@966257fa9dfaed338e82e2ed2d03c9791f47e204 -
Branch / Tag:
refs/tags/v1.2.0 - Owner: https://github.com/wherobots
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi-publish.yaml@966257fa9dfaed338e82e2ed2d03c9791f47e204 -
Trigger Event:
push
-
Statement type: