Skip to main content

Python SDK for the MapLark OSM GeoJSON API to query OpenStreetMap data easily.

Project description

OSMGeoJSON API

This API keeps OpenStreetMap semantics intact and returns GeoJSON FeatureCollections you can feed straight into Leaflet, MapLibre, OpenLayers, or any geospatial toolchain. All you need to do is specify a bounding box and geometry types. The translation layer is very simple:

  • node - GeoJSON Point
  • way - LineString or Polygon
  • relation - MultiPolygon or grouped geometries

You filter with the same tags mappers already use (amenity=cafe, building=yes, and so on). Knowledge from OSM, Overpass, and tagging docs transfers immediately.

To narrow down between "open ways" and "closed ways", use the shape parameter:

  • shape=line - open ways (roads, paths, rivers) or line-shaped relations (routes, boundaries)
  • shape=polygon - closed ways (buildings, parks) or multipolygon relations.
  • shape=all - both shapes (default when shape is omitted).

For example, to get all buildings in an area:

type=way & tags=building

This is the equivalent of the Overpass query way[building].

Read the full API reference here https://maplark.com/developer.

Python SDK

This client library comes with auto-pagination, bounding box chunking, retry/backoff, pandas/geopandas output, async support, and convenience methods to get common OSM data such as buildings, amenities, bike roads, etc.

pip install osmgeojson
pip install "osmgeojson[geo]"   # pandas / geopandas / shapely support

The SDK talks to api.maplark.com by default.

Quick start

from osmgeojson import OSMGeoJSONClient

with OSMGeoJSONClient(api_key="sk-...") as client:
    fc = client.query(bbox="18.06,59.32,18.09,59.34", tags=["building"])
    print(len(fc.features), "buildings found")

Basic API usage

1) Create a client

from osmgeojson import OSMGeoJSONClient

client = OSMGeoJSONClient(api_key="sk-...")

You can use the client directly and close it when done, or use a context manager:

from osmgeojson import OSMGeoJSONClient

with OSMGeoJSONClient(api_key="sk-...") as client:
    ...

2) Query OSM elements

query() fetches a single page:

fc = client.query(
    bbox="18.063,59.322,18.082,59.332",
    type="way",
    shape="line",
    tags=["highway=cycleway"],
    limit=500,
)

for feature in fc.features:
    print(feature["id"], feature["geometry"]["type"], feature.tags)

Common filters:

  • bbox="min_lon,min_lat,max_lon,max_lat"
  • around="lon,lat,radius_m"
  • tags=["amenity=restaurant"] (AND)
  • or_tags=["bicycle=yes", "bicycle=designated"] (OR)
  • not_tags=["access=private"] (exclude)
  • type="node" | "way" | "relation"
  • shape="polygon" | "line" | "all" (omit = both shapes; all also means both)
  • cursor (pagination; use meta.next_cursor from previous page)

3) Auto-pagination

Use query_all() to fetch all pages and deduplicate by OSM feature id:

all_restaurants = client.query_all(
    bbox="18.063,59.322,18.082,59.332",
    tags="amenity=restaurant",
    page_size=1000,
)

print(all_restaurants.meta.returned)

4) Async client

Async methods mirror the sync API (query_async, query_all_async, query_large_area_async):

import asyncio
from osmgeojson import AsyncOSMGeoJSONClient


async def main() -> None:
    async with AsyncOSMGeoJSONClient(api_key="sk-...") as client:
        fc = await client.query_async(
            bbox="18.06,59.32,18.09,59.34",
            tags=["building"],
        )
        print(len(fc.features))


asyncio.run(main())

5) Convenience helpers

For common datasets, use convenience methods built on top of query_all():

from osmgeojson import OSMGeoJSONClient, get_buildings, get_restaurants

with OSMGeoJSONClient(api_key="sk-...") as client:
    buildings = get_buildings(client, bbox="18.063,59.322,18.082,59.332")
    restaurants = get_restaurants(client, bbox="18.063,59.322,18.082,59.332")
    print(len(buildings.features), len(restaurants.features))

6) Cost and usage

estimate = client.estimate_cost(
    bbox="18.063,59.322,18.082,59.332",
    tags=["building"],
)
print("estimated credits:", estimate.estimated_credits)

usage = client.usage()
print("Usage:", usage)

7) CLI usage

If the package is installed, the CLI is available as osmgeojson:

export MAPLARK_API_KEY="sk-..."
osmgeojson query --bbox "18.063,59.322,18.082,59.332" --tags building --type way

Example apps

The repository includes runnable example-app tests in tests/example_apps/ showing end-to-end usage patterns against real OSM data.

  • test_restaurant_guide.py: restaurant discovery list with names/cuisines and map coordinates.
  • test_park_bench_finder.py: bench finder for park maps (amenity=bench).
  • test_park_explorer.py: park browser with polygon boundaries, centroids, and area estimates.
  • test_cycling_trails.py: unpaved cycling trail layer for MTB/gravel planning.
  • test_city_cycling_infrastructure.py: city cycling overlay combining cycleways and bike lanes.
  • test_lakeside_ice_cream_hunt.py: nearest ice cream shops to waterfront edges.
  • test_pedestrian_shortest_path.py: shortest walking route via graph + Dijkstra.
  • test_pedestrian_wavefront_bfs.py: hop-based accessibility rings via BFS.
  • test_bike_path_dijkstra_liljeholmen_to_djurgarden.py: tiled corridor bike routing from Liljeholmen to Djurgarden.
  • test_geometry_filters.py: zoom + area/length filters for large buildings and long roads.

Run all example apps:

pytest tests/example_apps -v

Run one example app:

pytest tests/example_apps/test_restaurant_guide.py -v

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

osmgeojson-0.2.0.tar.gz (40.3 kB view details)

Uploaded Source

Built Distribution

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

osmgeojson-0.2.0-py3-none-any.whl (26.5 kB view details)

Uploaded Python 3

File details

Details for the file osmgeojson-0.2.0.tar.gz.

File metadata

  • Download URL: osmgeojson-0.2.0.tar.gz
  • Upload date:
  • Size: 40.3 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for osmgeojson-0.2.0.tar.gz
Algorithm Hash digest
SHA256 5eec30e99503286156f7fd1881941b908ad2b11c4eb3883e7cdc5aef3b807758
MD5 d773ae0a6d3434ce1b63cfaf6adda314
BLAKE2b-256 a0b36153e13b883dbe0978e696c233677ed9c9e7a197359c4deb2629ad053b34

See more details on using hashes here.

File details

Details for the file osmgeojson-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: osmgeojson-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 26.5 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.12.3

File hashes

Hashes for osmgeojson-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c2526b837a1ae9b6c4ec90eeff02aedfc8a9714f486dbb279d79b9d73f6f359b
MD5 87693232587b790fdce388756262267d
BLAKE2b-256 b1eacadcd83abcb98ed5ff1cb1a1a04df6023cf6d86570cd1ab67d765d224a6d

See more details on using hashes here.

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