How the Lancaster County 911 dashboard works
Nothing on this site is reported, observed, or written by us. It is one public county feed, parsed and re-drawn. This page explains that pipeline in enough detail that you can judge what the numbers are worth.
The feed, and why its format matters
Lancaster County-Wide Communications publishes its live incident list as an RSS document, open to anyone, with no login and no key. That is unusual among the counties covered by these dashboards: the others publish a web page built for human eyes, and reading them means pulling apart HTML table markup that can change shape whenever the county edits its site. Here the unit of data is a feed item, and each item has named parts.
A single function running on our host requests that XML, walks the item elements, and for each one takes three things: the title, the publication timestamp, and the description. The description is a short semicolon-separated line, the first piece of which is a municipality and the second a location. The function returns the collected items as JSON; your browser renders them. No database sits in between, no history is kept, and no editorial step exists.
Two practical consequences follow from the format. Parsing is more stable than it would be against a table layout, because named elements are far less likely to move than table cells. And there is less of it: an item that carries three fields cannot be made to yield more, so this dashboard is thinner than its siblings by necessity rather than by choice.
Every field you can see on a card
The list below is the whole vocabulary. If something is not here, the feed does not publish it and this site does not have it.
- Category and type
- Both come from the same place: the title of the feed item, which is a short label such as a fire alarm or a medical emergency. It is shown twice because the label doubles as the heading of the card and as the badge that drives the colour and the filters.
- Municipality
- The first field of the feed item description, and the only location the feed gives that can be placed on a map. It names a township, a borough, or the city; house numbers are never published.
- Street
- The second field of the description, carried through as written. On a road it is a road name with no block or house number; at an interchange or an intersection it may be a pair of roads.
- Cross street
- Filled in only when the street field named two roads. The site splits that field on an ampersand, the word "and", or an at sign, and keeps the second road here.
- Near
- The street field exactly as the feed published it, before the split above. Useful when the split guessed wrong, and always searchable.
- Dispatch time
- The publication timestamp of the feed item. It arrives with a timezone offset attached, so the instant is unambiguous; the card shows how long ago it was and the Eastern clock time it corresponds to.
Splitting a location into two roads
Dispatch locations often name a pair of roads rather than one. The feed gives no hint about which case a given line is, so the location text is tested against a single pattern: two stretches of text separated by an ampersand, the bare word and, or an @ sign. On a match, the left side is stored as the street, the right side as the cross street, and the entire untouched line is stored a third time so the original wording is never lost.
This is a string operation, not a road network lookup, so it can be fooled — a road whose own name contains “and” will be cut in half. That is why the unmodified line is kept and why search runs across all three fields: a call is findable even when the split guessed badly.
What Lancaster’s feed does not include
- No road closures. The API layer of this site returns an empty closure list on every request, because there is nothing in the feed to fill it with. The advisories section of the dashboard consequently never appears here.
- No hydrant status. Same situation, same empty list.
- No responding units. There is no per-incident page to follow, so an incident card cannot tell you which station, engine, or ambulance was assigned.
- No coordinates and no house numbers. Which is what forces the map design described below.
Grouping calls into five buckets
The call label that arrives in the feed title is free text, which is unusable for filtering directly. So it is upper-cased and tested for keywords in a fixed order, and the first match wins:
- Fire — the label contains “FIRE”, “RESCUE”, “HAZMAT”.
- EMS — the label contains “MEDICAL”, “EMS”, “AMBULANCE”.
- Traffic — the label contains “TRAFFIC”, “ROAD”, “MVA”.
- Police — the label contains “POLICE”, “LAW”.
- Other — everything that matched none of the keywords above.
These five groups are this site’s own invention. They exist to colour the cards and drive the filter chips, they are not county classifications, and the rules above are read straight out of the same table the classifier uses, so this page cannot drift out of step with the code.
Why the map draws shapes and not pins
The most precise location the feed offers is the name of a municipality. Everything finer than that would have to be invented, so the map does not attempt it: each municipality with an open call is drawn as one circle whose area equals that municipality’s real land area, and a numbered badge on it says how many calls are open there. Boundary figures come from US Census Bureau TIGERweb data, which is public domain.
Three reasons this stays as it is:
- A road name without a block number describes miles of pavement. A pin would assert a precision the source does not contain.
- Medical calls at private homes make up a large share of any dispatch feed. Resolving those to an address would publish, in effect, the home of the person who called 911 — the county withholds it deliberately, and so do we.
- Matching is done on the municipality name together with its type, because Lancaster is the name of both a city and a township. Name-only matching would put calls in the wrong place.
Coverage
60 municipalities are matched: 41 townships, 18 boroughs, and one city, together covering roughly 944 square miles. By land area the largest are Rapho Township (~47 sq mi), Salisbury Township (~42 sq mi), Manor Township (~38 sq mi), and among the smallest are Terre Hill Borough (~0.5 sq mi), Christiana Borough (~0.5 sq mi), Marietta Borough (~0.7 sq mi).
A call whose municipality does not resolve to one of those 60 — a run outside the county line, or a spelling the matcher does not recognise — is counted and reported in a note under the map rather than dropped without comment.
Timestamps
Each feed item carries a publication timestamp in the standard RSS form, which includes a timezone offset. That makes the instant unambiguous, so elapsed times such as “7 min ago” are arithmetic rather than estimation — a real advantage over feeds that publish a bare local clock reading. Clock times are then formatted in the America/New_York zone, so a call shown at 8:07 PM went out at 8:07 PM in Lancaster County no matter where you are reading from.
Known limits
- Four minutes of lag, at worst. Plus whatever delay LCWC adds before a call reaches the feed. The header shows the countdown; the refresh button skips it.
- Open calls only. Cleared calls vanish from the feed and then from here. There is no archive to search and no permalink to a past incident.
- Incomplete on purpose. Not everything dispatch handles reaches a public feed.
- Reliant on the county’s XML. If the feed is renamed, restructured, or taken down, this page has nothing to show until the parser is updated.
- Unattended. No one is watching this dashboard, and nothing typed into it reaches a dispatcher.
Who is behind it
An independent volunteer project, with no affiliation to, endorsement from, or role in Lancaster County government or Lancaster County-Wide Communications. The name overlaps with the county’s emergency communications function only because that is what the data is about.
Parsing bugs, wrong municipality matches, and corrections are genuinely welcome at [email protected]. Also worth reading: the privacy policy and the terms of use.