@halfdays/resolve-parcel
v0.1.0
Published
Address/TMS → parcel resolver for Charleston County, powered by the lowcountry Supabase ETL
Readme
@halfdays/resolve-parcel
Address/TMS → fully-attributed Charleston County parcel resolver, backed by the lowcountry Supabase ETL.
Install
npm install @halfdays/resolve-parcelUsage
import { resolveParcel } from "@halfdays/resolve-parcel";
const parcel = await resolveParcel(
{ address: "87 Tradd Street, Charleston, SC 29401" },
{
supabaseUrl: process.env.LOWCOUNTRY_URL,
supabaseAnonKey: process.env.LOWCOUNTRY_ANON_KEY,
}
);
if (parcel) {
console.log(parcel.pid, parcel.site_address, parcel.zoning_district);
}You can also pass a pre-built Supabase client:
import { createClient } from "@supabase/supabase-js";
import { resolveParcel } from "@halfdays/resolve-parcel";
const client = createClient(url, serviceKey, { auth: { persistSession: false } });
const parcel = await resolveParcel({ tms: "4570600118" }, { client });Resolution order
- TMS lookup (digits-only normalized)
- Address trigram match against
address_points - Address trigram match against
parcels.address - ArcGIS geocoder → spatial lookup via
parcel_at_point() nullif nothing matches
API
resolveParcel(input, options?)
input:{ address?: string; tms?: string }options:client?: SupabaseClient— pre-built client (skips env-var lookup)supabaseUrl?: string— falls back toSUPABASE_URL/NEXT_PUBLIC_SUPABASE_URLsupabaseAnonKey?: string— falls back toSUPABASE_ANON_KEY/NEXT_PUBLIC_SUPABASE_ANON_KEYminSimilarity?: number— trigram threshold for non-exact matches (default0.6)geocoderUrl?: string— override the ArcGIS geocoder URLfetchImpl?: typeof fetch— override the globalfetch
Returns Promise<ResolvedParcel | null>.
See resolve-parcel.ts for the full ResolvedParcel shape (geometry, overlays, jurisdiction, etc.).
License
MIT
