Ten collections describing property, zoning, vacancy, and affordable housing in Philadelphia, mirrored from the City of Philadelphia's ArcGIS services via OpenDataPhilly.
Guidance for AI agents and LLMs working with this collection.
Parcels the City of Philadelphia's Vacant Property Indicators model flags as likely vacant buildings. 9,041 parcels.
The model was built by the Office of Innovation and Technology with Licenses and Inspections, the Office of Property Assessment, the Philadelphia Land Bank, and the Philadelphia Water Department. It reads administrative traces rather than observing the ground: a recently disconnected gas supply is one such signal, which is why a property that looks occupied from the street can still appear here.
The distribution leans low: only 135 parcels reach full agreement, so confident identification of a vacant building is rarer than for vacant land.
Coordinates are EPSG:3857 (Web Mercator) metres. DuckDB reads geometry
natively, so do not wrap it in ST_GeomFromWKB.
build_rank — the model's confidence, from 0.5 to 1.0. It measures how many independent administrative signals agree, so a higher value means more agreement. Distribution: 0.5 (5,778 parcels), 0.667 (2,988), 0.833 (140), 1.0 (135).address — street address. Join on this, normalized, to dor_parcel.owner1, owner2 — recorded owners.bldg_desc — description of the structure.opa_id — Office of Property Assessment account number.lniaddresskey — Licenses and Inspections address key.councildistrict, zoningbasedistrict, zipcode — carried through by the publisher, so aggregating by district needs no spatial join.date_update — when the model last scored this parcel.Rank semantics come from the city data team's post on the OpenDataPhilly forum, which states that a BUILD_RANK of 0.50 or higher marks a property as likely vacant, and that "the greater the percentage value of either indicator, the more likely the property is vacant".
The build_rank values are repeating decimals. They are stored as 0.5, 0.6666666700000001, 0.8333333300000001, and 1.0. Comparing with = 0.67 or = 0.83 silently matches nothing. Use ranges:
Every parcel here scores at least 0.5, because that threshold is the condition for inclusion. This collection is not a census: it holds no record of parcels the model judged occupied, so you cannot compute a vacancy rate from it alone.
A flag is a model output, not a legal finding of vacancy.
opa_id does not join to dor_parcel.pin. They are identifiers from different departments and the join returns zero rows. Join on normalized address instead.
Distribution of confidence:
By council district, using the publisher's own column rather than a spatial join:
Highest-confidence parcels joined to their legal boundaries:
development_type = 'Rehab (unoccupied or vacant)' records buildings returned to use.