[object Object]

← back to Nationalrealestate

Add LA County CA parcel source (arcgis_sales la-county, 2.37M parcels — largest US county, West Coast); cursor-paginating. Residential coverage: CA 3->4 counties incl LA

a5c9eb5a8464e8f11e4715da75c2428610edb128 · 2026-07-30 19:48:25 -0700 · steve@designerwallcoverings.com

Files touched

Diff

commit a5c9eb5a8464e8f11e4715da75c2428610edb128
Author: steve@designerwallcoverings.com <steve@designerwallcoverings.com>
Date:   Thu Jul 30 19:48:25 2026 -0700

    Add LA County CA parcel source (arcgis_sales la-county, 2.37M parcels — largest US county, West Coast); cursor-paginating. Residential coverage: CA 3->4 counties incl LA
---
 src/ingest/parcels/arcgis_sales.ts | 16 ++++++++++++++++
 src/ingest/parcels/engine.ts       |  1 +
 2 files changed, 17 insertions(+)

diff --git a/src/ingest/parcels/arcgis_sales.ts b/src/ingest/parcels/arcgis_sales.ts
index 292bb8b..783e7b3 100644
--- a/src/ingest/parcels/arcgis_sales.ts
+++ b/src/ingest/parcels/arcgis_sales.ts
@@ -198,6 +198,22 @@ const SOURCES: Record<string, Source> = {
       return { fips: '04013', apn, address: addr, city: clean(a.PHYSICAL_CITY), zip: s(a.PHYSICAL_ZIP),
         price: anyPrice(a.SALE_PRICE), saleDate: anyDate(a.SALE_DATE) || anyDate(a.DEED_DATE), docNum: s(a.DEED_NUMBER), raw: a } as Rec; }).filter(Boolean) as Rec[],
   },
+  'la-county': {
+    // Los Angeles County — the largest US county (~2.43M parcels), West Coast.
+    // Assessor roll layer: no per-parcel sale price, but rich value + characteristics.
+    key: 'la-county', label: 'Los Angeles County CA (Assessor parcels)', cursorKey: 'la_county', geometry: false, orderBy: 'OBJECTID', pageSize: 2000,
+    layer: 'https://public.gis.lacounty.gov/public/rest/services/LACounty_Cache/LACounty_Parcel/MapServer/0',
+    where: 'Roll_LandValue>0',
+    outFields: 'APN,SitusFullAddress,SitusCity,SitusZIP,UseDescription,YearBuilt1,Bedrooms1,Bathrooms1,SQFTmain1,Roll_LandValue,Roll_ImpValue',
+    fieldMap: { source_id: 'APN', address: 'SitusFullAddress', city: 'SitusCity', zip: 'SitusZIP',
+      use_desc: 'UseDescription', year_built: 'YearBuilt1', beds: 'Bedrooms1', baths: 'Bathrooms1',
+      sqft: 'SQFTmain1', land_value: 'Roll_LandValue', improvement_value: 'Roll_ImpValue' },
+    toRecords: (fs) => fs.map(f => { const a = f.attributes; const apn = s(a.APN); if (!apn) return null;
+      const land = num(a.Roll_LandValue), imp = num(a.Roll_ImpValue);
+      return { fips: '06037', apn, address: clean(a.SitusFullAddress), city: clean(a.SitusCity), zip: s(a.SitusZIP),
+        use: clean(a.UseDescription), year: num(a.YearBuilt1), beds: num(a.Bedrooms1), baths: num(a.Bathrooms1),
+        sqft: num(a.SQFTmain1), totalValue: (land || imp) ? (land || 0) + (imp || 0) : null, raw: a } as Rec; }).filter(Boolean) as Rec[],
+  },
   thurston: {
     key: 'thurston', label: 'Thurston County WA (Olympia)', cursorKey: 'thurston', geometry: false, orderBy: 'OBJECTID', pageSize: 1000,
     layer: 'https://map.co.thurston.wa.us/arcgis/rest/services/Thurston/Thurston_Parcels/FeatureServer/0',
diff --git a/src/ingest/parcels/engine.ts b/src/ingest/parcels/engine.ts
index 41ae6c0..00dc87f 100644
--- a/src/ingest/parcels/engine.ts
+++ b/src/ingest/parcels/engine.ts
@@ -28,6 +28,7 @@ const ADAPTERS: Record<string, () => Promise<{ run: () => Promise<{ upserted: nu
   sonoma: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('sonoma') }; },
   colorado: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('colorado') }; },
   maricopa: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('maricopa') }; },
+  'la-county': async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('la-county') }; },
   thurston: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('thurston') }; },
   'palm-beach': async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('palm-beach') }; },
   klamath: async () => { const m = await import('./arcgis_sales.ts'); return { run: m.ingestArcgisSales('klamath') }; },

← 77583bc Fix parcel upsert crash on within-batch duplicate (county_fi  ·  back to Nationalrealestate  ·  auto-save: 2026-07-30T19:50:45 (2 files) — src/ingest/parcel a77a687 →