Skip to content

Kentucky's geospatial data,
one import away

The fastest way for GIS analysts, surveyors, and engineers to find, inspect, compare, and operationalize KyFromAbove elevation, imagery, and LiDAR data.
pip install abovepy

Index

🔍

Search & Discover

Find DEM, ortho, LiDAR, and oblique tiles by county, bbox, point+buffer in feet, or custom geometry. 13 products across 3 acquisition phases.

Download & Export

Concurrent downloads with resume. Estimate size before committing. Export to GeoTIFF, GeoPackage, Shapefile, GeoParquet, or LandXML.

🌎

Analyze & Visualize

Local terrain analysis — hillshade, slope, flood, contours, volume, profiles. Server-side TiTiler. Interactive notebook maps.

📋

Provenance & QA

Source documentation for deliverables — acquisition dates, CRS, tile counts, coverage gaps, mixed-phase warnings. Built for survey-grade work.

🗺

ArcGIS Pro & QGIS

ArcGIS Pro toolbox with 5 tools. QGIS plugin coming in v2.1. No STAC knowledge required — county dropdown, click, go.

📐

Engineering CRS

First-class EPSG:3089 support. Buffer in feet, corridor centerline search, polygon clips. Built for Kentucky surveyors and engineers.

13
Data Products
3
Acquisition Phases
120
KY Counties
0
Credentials Needed

Search, estimate, download

import abovepy

# Search by county — returns a SearchResult workflow object
result = abovepy.search(county="Franklin", product="dem_phase3")
print(result)  # SearchResult('dem_phase3', 342 tiles, ~1710.0 MB)

# Check provenance for deliverable documentation
result.provenance()
# {'product': 'dem_phase3', 'acquisition_period': '2022–2025', ...}

# Validate data quality
result.validate()
# ['3 tile(s) have no acquisition date metadata.']

# Concurrent download (4 threads, resumable)
paths = result.download("./data")

# Mosaic into a single VRT
vrt = result.mosaic(output="frankfort.vrt")

Feet-based search & corridor buffers

# Point search with 1000-foot buffer (accurate in EPSG:3089)
result = abovepy.search(
    point=(-84.85, 38.19), buffer_feet=1000, product="dem_phase3"
)

# Corridor search along a road centerline
from shapely.geometry import LineString
road = LineString([(-84.9, 38.2), (-84.8, 38.2)])
result = abovepy.search(geometry=road, buffer_feet=200, product="ortho_phase3")

# Phase comparison
phase2 = abovepy.search(county="Franklin", product="dem_phase2")
overlap = result.compare(phase2)

Supported Products

Product Resolution Format Phases
DEM 5 ft / 2 ft Cloud-Optimized GeoTIFF 1, 2, 3
Orthoimagery 6 in / 3 in Cloud-Optimized GeoTIFF 1, 2, 3
LiDAR Point Cloud varies LAZ / COPC 1, 2, 3
Oblique Imagery 3 in Cloud-Optimized GeoTIFF 3

All data in EPSG:3089 (Kentucky Single Zone, US survey feet). abovepy accepts EPSG:4326 bounding boxes by default and converts transparently. No API keys or credentials required.


What abovepy is not

abovepy is not a general STAC client, tile server, or point cloud processor. It is a sharp-focus library for one dataset: KyFromAbove.

Use pystac-client for general STAC. Use TiTiler for tile serving. Use PDAL for heavy LiDAR workflows.