Rerun prepare script

This commit is contained in:
Andras Schmelczer 2026-04-06 11:13:52 +01:00
parent 349a6c1d53
commit 8614acdfae
24 changed files with 1132 additions and 226 deletions

View file

@ -3,31 +3,13 @@
## Area
uv run python scripts/remove_bg.py house-og.png 200 house.png
4. ambiance
- nature / greenery within 5 mins walk
8. current listings
rightmove:
curl '<https://www.rightmove.co.uk/api/property-search/listing/search?searchLocation=E14&useLocationIdentifier=true&locationIdentifier=OUTCODE%5E749&buy=For+sale&radius=20.0&_includeSSTC=on&index=0&sortType=2&channel=BUY&transactionType=BUY>'
curl '<https://www.onthemarket.com/async/search/properties-v2/?search-type=for-sale&location-id=e13&view=map-list>'
interesting links
- https://propertydata.co.uk/videos/quick-overview
- https://osdatahub.os.uk/data/downloads/open
mkdir -p data/crime
unzip data/d29f0314840ef7dcbb5cde66e383fe08059dab5a.zip -d data/crime/
rm data/d29f0314840ef7dcbb5cde66e383fe08059dab5a.zip
https://xploria.co.uk/data-sources/
---
- stripe
- Why hexagons?
@ -37,27 +19,6 @@ https://xploria.co.uk/data-sources/
make -f Makefile.data prepare
make -f Makefile.data tiles
- padding between email and resend verification
- make the active filters much bigger on the demo page
- make demo filters adjustable
- add next button to cards
- make filters half-page or interleaved
- fix dev redirect
- start epxloring should bring to dashboard
- referal link is broken
- load test
imrpove walkthrough
load tests with grafana
@ -69,27 +30,14 @@ enum colour coding
Better school searchs
save -> dashboard
fix links to markets,
404,
Jittery slider number label
Odd vertical spacing on mobile
Show even number of cards on mobile
Construction year is spaced oit
Make prop density smaller
Test on safari
Test on android
check rendered index html,

View file

@ -1,6 +1,6 @@
import { useMemo } from 'react';
import { SEGMENT_COLORS } from '../../lib/consts';
import { formatValue } from '../../lib/format';
import { formatValue, roundedPercentages } from '../../lib/format';
interface Segment {
name: string;
@ -30,6 +30,10 @@ function shortenLabel(name: string): string {
export default function StackedBarChart({ segments, total, colorMap }: StackedBarChartProps) {
const sortedSegments = useMemo(() => [...segments].sort((a, b) => b.value - a.value), [segments]);
const roundedPcts = useMemo(
() => roundedPercentages(sortedSegments.map((s) => s.value), total, 1),
[sortedSegments, total]
);
if (total === 0) {
return <div className="text-xs text-warm-400 dark:text-warm-500 italic">No data</div>;
@ -51,7 +55,7 @@ export default function StackedBarChart({ segments, total, colorMap }: StackedBa
backgroundColor:
colorMap?.[segment.name] ?? SEGMENT_COLORS[i % SEGMENT_COLORS.length],
}}
title={`${shortenLabel(segment.name)}: ${formatValue(segment.value)} (${pct.toFixed(1)}%)`}
title={`${shortenLabel(segment.name)}: ${formatValue(segment.value)} (${roundedPcts[i].toFixed(1)}%)`}
/>
);
})}

View file

@ -1,4 +1,5 @@
import type { EnumFeatureStats } from '../../types';
import { roundedPercentages } from '../../lib/format';
interface StackedEnumChartProps {
components: { label: string; stats: EnumFeatureStats }[];
@ -30,7 +31,9 @@ export default function StackedEnumChart({
return (
<div className="space-y-1.5">
{visibleRows.map(({ label, stats }) => {
const total = Object.values(stats.counts).reduce((a, b) => a + b, 0);
const counts = valueOrder.map((value) => stats.counts[value] ?? 0);
const total = counts.reduce((a, b) => a + b, 0);
const roundedPcts = roundedPercentages(counts, total, 0);
return (
<div key={label} className="flex items-center gap-2 text-xs">
@ -39,7 +42,7 @@ export default function StackedEnumChart({
</span>
<div className="flex-1 flex h-3.5 rounded overflow-hidden bg-warm-200 dark:bg-warm-700">
{valueOrder.map((value, i) => {
const count = stats.counts[value] ?? 0;
const count = counts[i];
const pct = (count / total) * 100;
if (pct < 0.5) return null;
return (
@ -50,7 +53,7 @@ export default function StackedEnumChart({
width: `${pct}%`,
backgroundColor: valueColors[i],
}}
title={`${value}: ${count} (${pct.toFixed(0)}%)`}
title={`${value}: ${count} (${roundedPcts[i]}%)`}
/>
);
})}

View file

@ -18,7 +18,7 @@ const descriptions: Record<string, Record<string, string>> = {
'Estimated current price': 'Estimation du prix actuel ajusté à linflation',
'Price per sqm': 'Prix de vente divisé par la surface totale',
'Est. price per sqm': 'Prix actuel estimé divisé par la surface totale',
'Estimated monthly rent': 'Loyer mensuel privé médian pour le secteur',
'Estimated monthly rent': 'Loyer mensuel privé moyen pour le secteur',
'Total floor area (sqm)': 'Surface intérieure issue du diagnostic EPC',
'Number of bedrooms & living rooms': 'Nombre de pièces habitables selon le diagnostic EPC',
'Construction year': 'Année de construction estimée selon lEPC',
@ -82,8 +82,6 @@ const descriptions: Record<string, Record<string, string>> = {
'Parti vainqueur dans la circonscription lors des élections générales de 2024',
'Voter turnout (%)':
'Pourcentage délecteurs inscrits ayant voté aux élections générales de 2024',
'Majority (%)':
'Marge de victoire en pourcentage des votes valides aux élections générales de 2024',
'% Labour': 'Part des voix travaillistes aux élections générales de 2024',
'% Conservative': 'Part des voix conservatrices aux élections générales de 2024',
'% Liberal Democrat': 'Part des voix libérales-démocrates aux élections générales de 2024',
@ -106,7 +104,7 @@ const descriptions: Record<string, Record<string, string>> = {
'Estimated current price': 'Inflationsbereinigter Schätzwert der Immobilie',
'Price per sqm': 'Verkaufspreis geteilt durch die Gesamtfläche',
'Est. price per sqm': 'Geschätzter aktueller Preis geteilt durch die Gesamtfläche',
'Estimated monthly rent': 'Mittlere monatliche Privatmiete in der Gegend',
'Estimated monthly rent': 'Durchschnittliche monatliche Privatmiete in der Gegend',
'Total floor area (sqm)': 'Wohnfläche laut EPC-Gutachten',
'Number of bedrooms & living rooms': 'Anzahl bewohnbarer Räume laut EPC-Gutachten',
'Construction year': 'Geschätztes Baujahr laut EPC',
@ -172,8 +170,6 @@ const descriptions: Record<string, Record<string, string>> = {
'Siegreiche Partei im Wahlkreis bei der Parlamentswahl 2024',
'Voter turnout (%)':
'Anteil der registrierten Wähler, die bei der Parlamentswahl 2024 gewählt haben',
'Majority (%)':
'Gewinnspanne als Prozentsatz der gültigen Stimmen bei der Parlamentswahl 2024',
'% Labour': 'Labour-Stimmenanteil bei der Parlamentswahl 2024',
'% Conservative': 'Stimmenanteil der Konservativen bei der Parlamentswahl 2024',
'% Liberal Democrat': 'Stimmenanteil der Liberaldemokraten bei der Parlamentswahl 2024',
@ -196,7 +192,7 @@ const descriptions: Record<string, Record<string, string>> = {
'Estimated current price': '经通胀调整后的当前估计价值',
'Price per sqm': '售价除以总建筑面积',
'Est. price per sqm': '估计当前价格除以总建筑面积',
'Estimated monthly rent': '当地私人租赁的中位月租',
'Estimated monthly rent': '当地私人租赁的平均月租',
'Total floor area (sqm)': 'EPC评估的室内建筑面积',
'Number of bedrooms & living rooms': 'EPC评估的宜居房间数',
'Construction year': 'EPC评估的建造年份',
@ -244,7 +240,6 @@ const descriptions: Record<string, Record<string, string>> = {
'% Other': '其他族裔人口比例',
'Winning party': '2024年大选中该选区获胜的政党',
'Voter turnout (%)': '2024年大选中登记选民的投票率',
'Majority (%)': '2024年大选中获胜者的得票优势占有效票的百分比',
'% Labour': '2024年大选中工党得票率',
'% Conservative': '2024年大选中保守党得票率',
'% Liberal Democrat': '2024年大选中自由民主党得票率',
@ -265,7 +260,7 @@ const descriptions: Record<string, Record<string, string>> = {
'Estimated current price': 'Inflációval korrigált becsült jelenlegi érték',
'Price per sqm': 'Eladási ár osztva az összes alapterülettel',
'Est. price per sqm': 'Becsült jelenlegi ár osztva az összes alapterülettel',
'Estimated monthly rent': 'A környék medián havi magánbérleti díja',
'Estimated monthly rent': 'A környék átlagos havi magánbérleti díja',
'Total floor area (sqm)': 'Az EPC felmérésből származó belső alapterület',
'Number of bedrooms & living rooms': 'Lakószobák száma az EPC felmérés alapján',
'Construction year': 'Becsült építési év az EPC alapján',
@ -326,8 +321,6 @@ const descriptions: Record<string, Record<string, string>> = {
'A 2024-es parlamenti választáson a választókerületben győztes párt',
'Voter turnout (%)':
'A regisztrált választók szavazási aránya a 2024-es parlamenti választáson',
'Majority (%)':
'Győzelmi előny az érvényes szavazatok százalékában a 2024-es parlamenti választáson',
'% Labour': 'A Munkáspárt szavazataránya a 2024-es parlamenti választáson',
'% Conservative': 'A Konzervatív Párt szavazataránya a 2024-es parlamenti választáson',
'% Liberal Democrat': 'A Liberális Demokraták szavazataránya a 2024-es parlamenti választáson',

View file

@ -18,7 +18,7 @@ export const details: Record<string, Record<string, string>> = {
'Est. price per sqm':
"Calculé en divisant le prix actuel estimé et ajusté à l'inflation (y compris toute prime de rénovation) par la surface habitable totale indiquée dans le certificat EPC. Fournit une comparaison prix/superficie plus actualisée que le prix au sqm basé sur le prix de vente historique.",
'Estimated monthly rent':
"Prix médian mensuel de location provenant des statistiques sommaires du marché locatif privé de l'ONS (octobre 2022 - septembre 2023), correspondant à l'autorité locale et au nombre de chambres. Basé sur les données de locations de l'Agence d'évaluation (Valuation Office Agency).",
"Prix moyen mensuel de location provenant de l'indice des loyers privés de l'ONS (PIPR), correspondant à l'autorité locale et au nombre de chambres.",
'Total floor area (sqm)':
"Surface habitable totale en mètres carrés telle que mesurée lors de l'évaluation du certificat de performance énergétique (EPC). Inclut toutes les pièces habitables mais exclut les garages, dépendances et espaces extérieurs.",
'Number of bedrooms & living rooms':
@ -113,8 +113,6 @@ export const details: Record<string, Record<string, string>> = {
"Le parti politique qui a obtenu le plus de votes dans la circonscription couvrant ce code postal, lors des élections générales britanniques de juillet 2024. Basé sur les résultats au scrutin uninominal majoritaire publiés par le Parlement britannique. Les circonscriptions ont été redessinées pour 2024 selon la révision de la Commission des limites de 2023.",
'Voter turnout (%)':
"La proportion de l'électorat inscrit qui a voté de manière valide lors des élections générales britanniques de juillet 2024. Calculée comme le nombre de votes valides divisé par la taille de l'électorat. Une participation plus élevée est généralement corrélée avec des zones plus aisées et des scrutins plus serrés.",
'Majority (%)':
"La différence de voix entre le candidat vainqueur et le second, exprimée en pourcentage du total des votes valides. Une faible majorité indique un siège marginal (compétitif) ; une forte majorité indique un siège sûr. Provient des résultats des élections générales britanniques de juillet 2024 publiés par le Parlement britannique.",
'% Labour':
"Pourcentage des votes valides exprimés pour le Parti travailliste dans la circonscription couvrant ce code postal, lors des élections générales britanniques de juillet 2024. Comprend les votes de tous les candidats travaillistes.",
'% Conservative':
@ -154,7 +152,7 @@ export const details: Record<string, Record<string, string>> = {
'Est. price per sqm':
'Berechnet durch Division des inflationsbereinigten geschätzten aktuellen Preises (einschließlich etwaiger Renovierungsaufschläge) durch die Gesamtnutzfläche aus dem EPC-Zertifikat. Bietet einen aktuelleren Preis-pro-Fläche-Vergleich als der historische Verkaufspreis pro sqm.',
'Estimated monthly rent':
'Monatlicher Median-Mietpreis aus den ONS Private Rental Market Summary Statistics (Okt. 2022 Sep. 2023), abgeglichen nach Gemeinde und Zimmeranzahl. Basiert auf Vermietungsdaten der Valuation Office Agency.',
'Durchschnittlicher monatlicher Mietpreis aus dem ONS Price Index of Private Rents (PIPR), abgeglichen nach Gemeinde und Zimmeranzahl.',
'Total floor area (sqm)':
'Gesamte nutzbare Wohnfläche in Quadratmetern, gemessen während der Bewertung für das Energieausweis-Zertifikat. Umfasst alle Wohnräume, schließt jedoch Garagen, Nebengebäude und Außenbereiche aus.',
'Number of bedrooms & living rooms':
@ -249,8 +247,6 @@ export const details: Record<string, Record<string, string>> = {
'Die politische Partei, die im Wahlkreis dieser Postleitzahl bei der britischen Parlamentswahl im Juli 2024 die meisten Stimmen erhalten hat. Basierend auf den Ergebnissen des Mehrheitswahlrechts, veröffentlicht vom britischen Parlament. Die Wahlkreise wurden für 2024 nach der Überprüfung der Boundary Commission 2023 neu eingeteilt.',
'Voter turnout (%)':
'Der Anteil der registrierten Wahlberechtigten, die bei der britischen Parlamentswahl im Juli 2024 eine gültige Stimme abgegeben haben. Berechnet als gültige Stimmen geteilt durch die Größe der Wählerschaft. Eine höhere Wahlbeteiligung korreliert im Allgemeinen mit wohlhabenderen Gebieten und knapperen Ergebnissen.',
'Majority (%)':
'Die Stimmendifferenz zwischen dem Gewinner und dem Zweitplatzierten, ausgedrückt als Prozentsatz der gesamten gültigen Stimmen. Eine kleine Mehrheit weist auf einen umkämpften Wahlkreis hin; eine große Mehrheit auf einen sicheren Sitz. Aus den Ergebnissen der britischen Parlamentswahl vom Juli 2024, veröffentlicht vom britischen Parlament.',
'% Labour':
'Prozentsatz der gültigen Stimmen für die Labour Party im Wahlkreis dieser Postleitzahl bei der britischen Parlamentswahl im Juli 2024.',
'% Conservative':
@ -290,7 +286,7 @@ export const details: Record<string, Record<string, string>> = {
'Est. price per sqm':
'用经通胀调整的估算当前价格含装修溢价除以EPC证书中的总建筑面积计算得出。与历史成交价格每平方米相比提供更为最新的单位面积价格对比。',
'Estimated monthly rent':
'来自ONS私人租赁市场摘要统计2022年10月至2023年9月的月租金中位数按地方政府和卧室数量匹配。基于估价署租赁数据。',
'来自ONS私人租赁价格指数PIPR的平均月租金按地方政府和卧室数量匹配。',
'Total floor area (sqm)':
'在能源性能证书EPC评估期间测量的总可用建筑面积平方米。包括所有可居住房间但不含车库、附属建筑和外部区域。',
'Number of bedrooms & living rooms':
@ -383,8 +379,6 @@ export const details: Record<string, Record<string, string>> = {
'在2024年7月英国大选中该邮编所属选区得票最多的政党。基于英国议会公布的简单多数制选举结果。选区根据2023年边界委员会审查进行了重新划分。',
'Voter turnout (%)':
'2024年7月英国大选中投出有效选票的登记选民比例。计算方式为有效票数除以选民总数。较高的投票率通常与较富裕地区和竞争更激烈的选举相关。',
'Majority (%)':
'获胜候选人与第二名之间的票数差距以有效投票总数的百分比表示。小的多数票表示边缘选区竞争激烈大的多数票表示安全席位。数据来自英国议会公布的2024年7月大选结果。',
'% Labour':
'2024年7月英国大选中该邮编所属选区投给工党的有效选票百分比。包括所有工党候选人的选票。',
'% Conservative':
@ -424,7 +418,7 @@ export const details: Record<string, Record<string, string>> = {
'Est. price per sqm':
'Az inflációval korrigált becsült aktuális árat (beleértve az esetleges felújítási prémiumot) az EPC tanúsítványból származó teljes alapterülettel elosztva számítják ki. Naprakészebb ár/terület összehasonlítást nyújt, mint a korábbi adásvételi ár per sqm.',
'Estimated monthly rent':
'Az ONS Magánbérleti Piaci Összefoglaló Statisztikákból (2022. október 2023. szeptember) származó medián havi bérleti díj, helyi hatóság és hálószobák száma szerint párosítva. A Valuation Office Agency bérbeadási adatain alapul.',
'Az ONS Price Index of Private Rents (PIPR) alapján számított átlagos havi bérleti díj, helyi hatóság és hálószobák száma szerint párosítva.',
'Total floor area (sqm)':
'Az Energy Performance Certificate felmérése során mért teljes hasznos alapterület négyzetméterben. Tartalmazza az összes lakható helyiséget, de kizárja a garázsokat, melléképületeket és külső területeket.',
'Number of bedrooms & living rooms':
@ -519,8 +513,6 @@ export const details: Record<string, Record<string, string>> = {
'Az a politikai párt, amely a legtöbb szavazatot kapta az adott irányítószámhoz tartozó választókerületben a 2024. júliusi brit parlamenti választáson. Az Egyesült Királyság Parlamentje által közzétett, egyéni választókerületi rendszer szerinti eredmények alapján. A választókerületeket a 2023-as Határbizottsági felülvizsgálat alapján alakították át 2024-re.',
'Voter turnout (%)':
'A regisztrált szavazók azon aránya, akik érvényes szavazatot adtak le a 2024. júliusi brit parlamenti választáson. Az érvényes szavazatok száma osztva a választói névjegyzékben szereplők számával. A magasabb részvétel általában a tehetősebb területekkel és a szorosabb versenyekkel korrelál.',
'Majority (%)':
'A győztes jelölt és a második helyezett közötti szavazatkülönbség, az összes érvényes szavazat százalékában kifejezve. Kis többség billegő körzetre utal (versenyképes); nagy többség biztos körzetre. A 2024. júliusi brit parlamenti választás eredményeiből, amelyeket az Egyesült Királyság Parlamentje tett közzé.',
'% Labour':
'Az érvényes szavazatok százaléka, amelyeket a Munkáspártra adtak le az adott irányítószámhoz tartozó választókerületben a 2024. júliusi brit parlamenti választáson.',
'% Conservative':

View file

@ -788,7 +788,6 @@ const de: Translations = {
// ─ Feature names (Politics) ─
'Winning party': 'Siegreiche Partei',
'Voter turnout (%)': 'Wahlbeteiligung (%)',
'Majority (%)': 'Mehrheit (%)',
'% Labour': '% Labour',
'% Conservative': '% Conservative',
'% Liberal Democrat': '% Liberal Democrat',
@ -826,6 +825,7 @@ const de: Translations = {
'Serious crime': 'Schwere Straftaten',
'Minor crime': 'Leichte Straftaten',
'Ethnic composition': 'Ethnische Zusammensetzung',
'Political vote share': 'Stimmenverteilung',
// ─ POI group names ─
'Public Transport': 'Öffentlicher Nahverkehr',

View file

@ -773,7 +773,6 @@ const en = {
// ─ Feature names (Politics) ─
'Winning party': 'Winning party',
'Voter turnout (%)': 'Voter turnout (%)',
'Majority (%)': 'Majority (%)',
'% Labour': '% Labour',
'% Conservative': '% Conservative',
'% Liberal Democrat': '% Liberal Democrat',
@ -811,6 +810,7 @@ const en = {
'Serious crime': 'Serious crime',
'Minor crime': 'Minor crime',
'Ethnic composition': 'Ethnic composition',
'Political vote share': 'Political vote share',
// ─ POI group names ─
'Public Transport': 'Public Transport',

View file

@ -789,7 +789,6 @@ const fr: Translations = {
// ─ Feature names (Politics) ─
'Winning party': 'Parti vainqueur',
'Voter turnout (%)': 'Participation électorale (%)',
'Majority (%)': 'Majorité (%)',
'% Labour': '% Travaillistes',
'% Conservative': '% Conservateurs',
'% Liberal Democrat': '% Libéraux-démocrates',
@ -827,6 +826,7 @@ const fr: Translations = {
'Serious crime': 'Crimes graves',
'Minor crime': 'Délits mineurs',
'Ethnic composition': 'Composition ethnique',
'Political vote share': 'Répartition des voix',
// ─ POI group names ─
'Public Transport': 'Transports en commun',

View file

@ -782,7 +782,6 @@ const hu: Translations = {
// ─ Feature names (Politics) ─
'Winning party': 'Győztes párt',
'Voter turnout (%)': 'Választási részvétel (%)',
'Majority (%)': 'Többség (%)',
'% Labour': '% Munkáspárt',
'% Conservative': '% Konzervatív',
'% Liberal Democrat': '% Liberális Demokrata',
@ -820,6 +819,7 @@ const hu: Translations = {
'Serious crime': 'Súlyos bűncselekmény',
'Minor crime': 'Kisebb bűncselekmény',
'Ethnic composition': 'Etnikai összetétel',
'Political vote share': 'Szavazati megoszlás',
// ─ POI group names ─
'Public Transport': 'Tömegközlekedés',

View file

@ -756,7 +756,6 @@ const zh: Translations = {
// ─ Feature names (Politics) ─
'Winning party': '获胜政党',
'Voter turnout (%)': '投票率(%',
'Majority (%)': '多数票(%',
'% Labour': '% 工党',
'% Conservative': '% 保守党',
'% Liberal Democrat': '% 自由民主党',
@ -793,6 +792,7 @@ const zh: Translations = {
'Serious crime': '严重犯罪',
'Minor crime': '轻微犯罪',
'Ethnic composition': '族裔组成',
'Political vote share': '政党得票率',
// ─ POI group names ─
'Public Transport': '公共交通',

View file

@ -44,7 +44,7 @@ export class PieHexExtension extends LayerExtension {
return layer.id.endsWith('-fill');
}
getShaders(extension: any): any {
getShaders(this: any, extension: any): any {
if (!extension.isEnabled(this)) return null;
return {
modules: [
@ -74,7 +74,7 @@ in vec4 vRatios0;
in vec4 vRatios1;
in vec2 vRatios2;
const vec3 pieColors[10] = vec3[10](
${this.paletteGlsl}
${extension.paletteGlsl}
);`,
'fs:DECKGL_FILTER_COLOR': `\
{

View file

@ -156,6 +156,20 @@ export const STACKED_GROUPS: Record<
components: ['% White', '% South Asian', '% East Asian', '% Black', '% Mixed', '% Other'],
},
],
Politics: [
{
label: 'Political vote share',
unit: '%',
components: [
'% Labour',
'% Conservative',
'% Liberal Democrat',
'% Reform UK',
'% Green',
'% Other parties',
],
},
],
};
/**

Binary file not shown.

View file

@ -5,11 +5,26 @@ from pathlib import Path
from pipeline.utils import download, extract_zip
URL = "https://www.arcgis.com/sharing/rest/content/items/077631e063eb4e1ab43575d01381ec33/data"
URL = "https://www.arcgis.com/sharing/rest/content/items/36b718ad00de49afb9ad364f8b815b9e/data"
def convert_to_parquet(data_path: Path, parquet_path: Path) -> None:
df = pl.scan_csv(data_path / "Data/NSPL_MAY_2025_UK.csv", try_parse_dates=True)
# Classification code columns (ruc21ind, oac11ind, imd20ind) look numeric
# in early rows but contain string codes like "UN1" (Unclassified) later
# on. Force them to String to avoid mid-stream dtype inference failures.
# Note: NSPL renames these year suffixes as new releases roll in (e.g.
# Feb 2026 bumped oac from oac21ind → oac11ind, imd from imd19ind →
# imd20ind), so keep this dict in sync with the current CSV headers —
# polars silently ignores overrides for missing columns, masking drift.
df = pl.scan_csv(
data_path / "Data/NSPL_FEB_2026_UK.csv",
try_parse_dates=True,
schema_overrides={
"ruc21ind": pl.String,
"oac11ind": pl.String,
"imd20ind": pl.String,
},
)
print(f"Columns: {df.collect_schema().names()}")
parquet_path.parent.mkdir(parents=True, exist_ok=True)
df.sink_parquet(parquet_path, compression="zstd")

View file

@ -1,14 +1,53 @@
import argparse
import shutil
import sys
import tempfile
import polars as pl
from pathlib import Path
import httpx
from pipeline.utils import download, extract_zip
# Ofcom Connected Nations 2025 - Fixed broadband performance (output area & local authority level)
# Source: https://www.ofcom.org.uk/phones-and-broadband/coverage-and-speeds/connected-nations-20252/data-downloads-2025
PERFORMANCE_URL = "https://www.ofcom.org.uk/siteassets/resources/documents/research-and-data/multi-sector/infrastructure-research/connected-nations-2025/202507_fixed_broadband_coverage_r01.zip?v=407830"
# Pre-staged file path. Ofcom put the entire ofcom.org.uk domain behind
# Cloudflare's Managed Challenge in 2026, which requires a JS-executing
# browser to pass — no amount of User-Agent / TLS-impersonation spoofing
# (curl_cffi chrome120..131, safari17, firefox133, chrome_android) gets
# past it. When the automated download fails, the user must download the
# zip manually from the Source URL above and place it at this path.
MANUAL_ZIP_PATH = Path("manual-data/fixed_broadband_coverage.zip")
def _manual_download_instructions() -> str:
return (
f"\nOfcom has blocked automated downloads via Cloudflare's Managed\n"
f"Challenge. Download the zip manually and re-run:\n\n"
f" 1. Open in a browser:\n"
f" {PERFORMANCE_URL}\n"
f" 2. Save the downloaded zip to:\n"
f" {MANUAL_ZIP_PATH.resolve()}\n"
f" 3. Re-run `make -f Makefile.data property-data/broadband.parquet`\n"
)
def _obtain_zip(dest: Path) -> None:
"""Copy the pre-staged manual zip if present; otherwise attempt download."""
if MANUAL_ZIP_PATH.exists():
print(f"Using pre-staged zip: {MANUAL_ZIP_PATH}")
shutil.copyfile(MANUAL_ZIP_PATH, dest)
return
try:
download(PERFORMANCE_URL, dest)
except httpx.HTTPStatusError as e:
if e.response.status_code == 403:
print(_manual_download_instructions(), file=sys.stderr)
raise
def convert_to_parquet(extract_dir: Path, parquet_path: Path) -> None:
# Find CSV files in the extracted directory
@ -51,7 +90,7 @@ def main() -> None:
extract_dir = cache / "extracted"
extracted_again_dir = cache / "extracted-again"
download(PERFORMANCE_URL, zip_path)
_obtain_zip(zip_path)
extract_zip(zip_path, extract_dir)
extract_zip(
extract_dir

View file

@ -41,9 +41,6 @@ def download_and_convert(output_path: Path) -> None:
winners = df.filter(pl.col("Candidate result position") == 1).select(
pl.col("Constituency geographic code").alias("pcon"),
pl.col("party_group").alias("winning_party"),
(pl.col("Majority") / pl.col("Election valid vote count") * 100)
.round(1)
.alias("majority_pct"),
(pl.col("Election valid vote count") / pl.col("Electorate") * 100)
.round(1)
.alias("turnout_pct"),

View file

@ -5,9 +5,9 @@ from pathlib import Path
from pipeline.utils import download
# Management information - state-funded schools - latest inspections (as at 30 Apr 2025)
# Management information - state-funded schools - latest inspections (as at 28 Feb 2026)
# Source: https://www.gov.uk/government/statistical-data-sets/monthly-management-information-ofsteds-school-inspections-outcomes
URL = "https://assets.publishing.service.gov.uk/media/681cd390275cb67b18d870fc/Management_information_-_state-funded_schools_-_latest_inspections_as_at_30_Apr_2025.csv"
URL = "https://assets.publishing.service.gov.uk/media/69c5269b4a06660f0854427b/Management_information_-_state-funded_schools_-_latest_inspections_as_at_28_Feb_2026.csv"
def convert_to_parquet(csv_path: Path, parquet_path: Path) -> None:

View file

@ -1,125 +1,91 @@
"""Download ONS Price Index of Private Rents (PIPR) monthly price statistics.
Provides mean monthly private rent by local authority and bedroom count.
Replaces the discontinued Private Rental Market Summary Statistics.
Source: https://www.ons.gov.uk/economy/inflationandpriceindices/datasets/priceindexofprivaterentsukmonthlypricestatistics
License: Open Government Licence v3.0
"""
import argparse
import tempfile
from pathlib import Path
import polars as pl
from pathlib import Path
from pipeline.utils import download
URL = "https://www.ons.gov.uk/file?uri=/peoplepopulationandcommunity/housing/datasets/privaterentalmarketsummarystatisticsinengland/october2022toseptember2023/privaterentalmarketstatistics231220.xls"
URL = "https://www.ons.gov.uk/file?uri=/economy/inflationandpriceindices/datasets/priceindexofprivaterentsukmonthlypricestatistics/25march2026/priceindexofprivaterentsukmonthlypricestatistics.xlsx"
# Sheets 12-16 are LA-level breakdowns: Studio, 1 Bed, 2 Bed, 3 Bed, 4+ Bed
# (Sheet 11 is "Room" — shared house rooms, not self-contained, so skip it)
BEDROOM_SHEETS = {
12: 0, # Studio
13: 1, # One Bedroom
14: 2, # Two Bedrooms
15: 3, # Three Bedrooms
16: 4, # Four or more Bedrooms
}
# Local authority district codes in England, https://en.wikipedia.org/wiki/ONS_coding_system
# Local authority district codes in England
LA_PREFIXES = ("E06", "E07", "E08", "E09")
# April 2021 + April 2023 LA reorganizations: old district codes → new unitary authority codes.
# The ONS rental data (Oct 2022 Sep 2023) uses the old codes; IoD 2025 uses the new ones.
# We remap old → new and average the medians so the join in merge.py works.
LA_CONSOLIDATION = {
# North Northamptonshire (April 2021)
"E07000150": "E06000061", # Corby
"E07000152": "E06000061", # East Northamptonshire
"E07000153": "E06000061", # Kettering
"E07000156": "E06000061", # Wellingborough
# West Northamptonshire (April 2021)
"E07000151": "E06000062", # Daventry
"E07000154": "E06000062", # Northampton
"E07000155": "E06000062", # South Northamptonshire
# Cumberland (April 2023)
"E07000026": "E06000063", # Allerdale
"E07000028": "E06000063", # Carlisle
"E07000029": "E06000063", # Copeland
# Westmorland and Furness (April 2023)
"E07000027": "E06000064", # Barrow-in-Furness
"E07000030": "E06000064", # Eden
"E07000031": "E06000064", # South Lakeland
# North Yorkshire (April 2023)
"E07000163": "E06000065", # Craven
"E07000164": "E06000065", # Hambleton
"E07000165": "E06000065", # Harrogate
"E07000166": "E06000065", # Richmondshire
"E07000167": "E06000065", # Ryedale
"E07000168": "E06000065", # Scarborough
"E07000169": "E06000065", # Selby
# Somerset (April 2023)
"E07000187": "E06000066", # Mendip
"E07000188": "E06000066", # Sedgemoor
"E07000189": "E06000066", # South Somerset
"E07000246": "E06000066", # Somerset West and Taunton
}
def convert_to_parquet(xlsx_path: Path, parquet_path: Path) -> None:
print("Reading PIPR Excel file (Table 1)...")
def _read_sheet(xls_path: Path, sheet_id: int, bedrooms: int) -> pl.DataFrame:
"""Read one bedroom category sheet, extract LA-level median rents."""
df = pl.read_excel(xls_path, sheet_id=sheet_id)
# Table 1 layout: row 0 = title, row 1 = column headers, row 2+ = data.
# 40 columns in repeating blocks of 4 (index, monthly change, annual change,
# rental price) for each category. Rental price columns (0-indexed):
# 7 = All categories, 11 = One bed, 15 = Two bed, 19 = Three bed,
# 23 = Four or more bed
df = pl.read_excel(xlsx_path, sheet_name="Table 1", has_header=False)
df = df.slice(2) # Skip title and header rows
# Columns are unnamed; positional:
# 0=LA Code, 1=Area Code, 2=Area Name, 3=Count, 4=Mean, 5=LQ, 6=Median, 7=UQ
# First 4 rows are headers (title, notes, bedroom label, column headers)
df = df.slice(4)
df = df.select(
pl.col("column_1").alias("time_period"),
pl.col("column_2").alias("area_code"),
pl.col("column_12").cast(pl.Float32, strict=False).alias("rent_1bed"),
pl.col("column_16").cast(pl.Float32, strict=False).alias("rent_2bed"),
pl.col("column_20").cast(pl.Float32, strict=False).alias("rent_3bed"),
pl.col("column_24").cast(pl.Float32, strict=False).alias("rent_4plus"),
)
area_code_col = df.columns[1]
median_col = df.columns[6]
return (
df.select(
pl.col(area_code_col).alias("area_code"),
pl.col(median_col).alias("median_monthly_rent"),
)
.filter(
pl.col("area_code").is_not_null()
& pl.any_horizontal(
pl.col("area_code").str.starts_with(p) for p in LA_PREFIXES
)
)
.with_columns(
# Suppressed values are ".." — cast will turn them to null
pl.col("median_monthly_rent").cast(pl.Float32, strict=False),
pl.lit(bedrooms).cast(pl.UInt8).alias("bedrooms"),
# Filter to English local authorities
df = df.filter(
pl.any_horizontal(
pl.col("area_code").str.starts_with(p) for p in LA_PREFIXES
)
)
# Use only the latest month
latest = df["time_period"].max()
print(f"Latest month in data: {latest}")
df = df.filter(pl.col("time_period") == latest)
print(f"LAs in latest month: {df.height}")
def convert_to_parquet(xls_path: Path, parquet_path: Path) -> None:
# Melt to long format: one row per area x bedroom count.
# PIPR has no Studio category — one-bed rent used as proxy for bedrooms=0.
frames = []
for sheet_id, bedrooms in BEDROOM_SHEETS.items():
df = _read_sheet(xls_path, sheet_id, bedrooms)
print(f" Sheet {sheet_id} (bedrooms={bedrooms}): {df.height} rows")
frames.append(df)
for col, bedrooms in [
("rent_1bed", 0), # Studio (proxy)
("rent_1bed", 1),
("rent_2bed", 2),
("rent_3bed", 3),
("rent_4plus", 4),
]:
frames.append(
df.select(
pl.col("area_code"),
pl.col(col).alias("mean_monthly_rent"),
pl.lit(bedrooms).cast(pl.UInt8).alias("bedrooms"),
)
)
combined = pl.concat(frames)
# Remap old LA codes to new unitary authority codes and average medians
combined = (
combined.with_columns(
pl.col("area_code").replace(LA_CONSOLIDATION),
)
.group_by("area_code", "bedrooms")
.agg(
pl.col("median_monthly_rent").mean(),
)
)
print(f"Combined: {combined.shape}")
print(f"Non-null medians: {combined['median_monthly_rent'].drop_nulls().len()}")
print(f"Non-null rents: {combined['mean_monthly_rent'].drop_nulls().len()}")
print(combined.head(10))
parquet_path.parent.mkdir(parents=True, exist_ok=True)
combined.write_parquet(parquet_path, compression="zstd")
print(f"Saved to {parquet_path}")
def main() -> None:
parser = argparse.ArgumentParser(
description="Download and convert ONS private rental market statistics"
description="Download ONS private rent monthly price statistics"
)
parser.add_argument(
"--output", type=Path, required=True, help="Output parquet file path"
@ -127,9 +93,9 @@ def main() -> None:
args = parser.parse_args()
with tempfile.TemporaryDirectory() as cache_dir:
xls_path = Path(cache_dir) / "rental_prices.xls"
download(URL, xls_path, timeout=60)
convert_to_parquet(xls_path, args.output)
xlsx_path = Path(cache_dir) / "pipr_monthly.xlsx"
download(URL, xlsx_path, timeout=120)
convert_to_parquet(xlsx_path, args.output)
if __name__ == "__main__":

View file

@ -65,7 +65,6 @@ _AREA_COLUMNS = [
# Politics
"Winning party",
"Voter turnout (%)",
"Majority (%)",
"% Labour",
"% Conservative",
"% Liberal Democrat",
@ -116,15 +115,19 @@ def _build(
arcgis = (
pl.scan_parquet(arcgis_path)
.filter(pl.col("ctry") == "E92000001") # England only
.filter(pl.col("ctry25cd") == "E92000001") # England only
.filter(pl.col("doterm").is_null()) # Active postcodes only
# NSPL Feb 2026 renamed geographic code columns to {field}{year}cd.
# Alias them back to the short canonical names used across the
# pipeline so downstream joins don't need to know about NSPL's
# versioning scheme.
.select(
pl.col("pcds").alias("postcode"),
"lat",
pl.col("long").alias("lon"),
"lsoa21",
"oa21",
"pcon",
pl.col("lsoa21cd").alias("lsoa21"),
pl.col("oa21cd").alias("oa21"),
pl.col("pcon24cd").alias("pcon"),
)
)
wide = wide.join(arcgis, on="postcode", how="left")
@ -354,13 +357,12 @@ def _build(
"minor_crime_avg_yr": "Minor crime (avg/yr)",
"serious_crime_per_1k": "Serious crime per 1k residents (avg/yr)",
"minor_crime_per_1k": "Minor crime per 1k residents (avg/yr)",
"median_monthly_rent": "Estimated monthly rent",
"mean_monthly_rent": "Estimated monthly rent",
"floor_height": "Interior height (m)",
"was_council_house": "Former council house",
"median_age": "Median age",
"winning_party": "Winning party",
"turnout_pct": "Voter turnout (%)",
"majority_pct": "Majority (%)",
}
)
)

View file

@ -28,10 +28,14 @@ def main():
)
args = parser.parse_args()
# Load Ofsted data: filter to good+ (1, 2) primary/secondary schools
# Load Ofsted data: filter to good+ (1, 2) primary/secondary schools.
# Post-2025 reform the single "Overall effectiveness" grade was retired;
# the legacy 14 scale is now carried forward under "Latest OEIF overall
# effectiveness" (OEIF = the previous Ofsted Education Inspection
# Framework). The new report-card columns use text judgements instead.
ofsted = pl.read_parquet(args.ofsted).filter(
pl.col("Ofsted phase").is_in(["Primary", "Secondary"])
& pl.col("Overall effectiveness").is_in(["1", "2"])
& pl.col("Latest OEIF overall effectiveness").is_in(["1", "2"])
)
print(f"Good+ schools: {len(ofsted):,}")

View file

@ -10,19 +10,19 @@ from scipy.spatial import cKDTree
def build_postcode_mapping(arcgis_path: Path) -> pl.DataFrame:
"""Build a mapping from terminated England postcodes to their nearest active postcode.
Uses OS National Grid coordinates (oseast1m, osnrth1m) which are Cartesian metres,
Uses OS National Grid coordinates (east1m, north1m) which are Cartesian metres,
so Euclidean distance via cKDTree gives accurate results without projection.
"""
arcgis = pl.scan_parquet(arcgis_path).filter(pl.col("ctry") == "E92000001")
arcgis = pl.scan_parquet(arcgis_path).filter(pl.col("ctry25cd") == "E92000001")
active = (
arcgis.filter(pl.col("doterm").is_null())
.select("pcds", "oseast1m", "osnrth1m")
.select("pcds", "east1m", "north1m")
.collect()
)
terminated = (
arcgis.filter(pl.col("doterm").is_not_null())
.select("pcds", "oseast1m", "osnrth1m")
.select("pcds", "east1m", "north1m")
.collect()
)
@ -39,10 +39,10 @@ def build_postcode_mapping(arcgis_path: Path) -> pl.DataFrame:
)
active_coords = np.column_stack(
[active["oseast1m"].to_numpy(), active["osnrth1m"].to_numpy()]
[active["east1m"].to_numpy(), active["north1m"].to_numpy()]
)
terminated_coords = np.column_stack(
[terminated["oseast1m"].to_numpy(), terminated["osnrth1m"].to_numpy()]
[terminated["east1m"].to_numpy(), terminated["north1m"].to_numpy()]
)
tree = cKDTree(active_coords)

View file

@ -1015,3 +1015,941 @@
2026-04-04T17:59:55.677260Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1843 filters=1 travel=0 total=1843 filters_raw="Listing status:Historical sale|For sale|For rent" ms=0.1
2026-04-04T17:59:56.342774Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=112 postcodes_after_filter=12 filtered_out=100 truncated=false bounds=51.675683,-0.036147,51.676772,-0.034244 filters=1 filters_raw="Listing status:Historical sale|For sale|For rent" fields=1 travel_entries=0 agg_ms=0.2 json_ms=0.1 total_ms=0.2
2026-04-04T17:59:56.590966Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1843 filters=1 travel=0 total=1843 filters_raw="Listing status:Historical sale|For sale|For rent" ms=0.1
2026-04-04T18:03:26.287698Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T18:03:26.310730Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T18:03:26.317881Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T18:03:26.363818Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T18:03:26.784277Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=199182 parallel=true cells_before_filter=520 cells_after_filter=420 truncated=false bounds=51.4896,-0.1743,51.5404,-0.0857 filters=5 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.2 total_ms=1.7
2026-04-04T18:03:26.805224Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=112 postcodes_after_filter=11 filtered_out=101 truncated=false bounds=51.675640,-0.036179,51.676760,-0.034221 filters=1 filters_raw="Listing status:Historical sale|For sale|For rent" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T18:03:26.996715Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=199182 filters=5 travel=0 total=7158 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" ms=1.3
2026-04-04T18:03:27.016443Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1843 filters=1 travel=0 total=1843 filters_raw="Listing status:Historical sale|For sale|For rent" ms=0.1
2026-04-04T18:04:01.598855Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=199182 parallel=true cells_before_filter=520 cells_after_filter=420 truncated=false bounds=51.4896,-0.1743,51.5404,-0.0857 filters=5 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.2 total_ms=1.8
2026-04-04T18:04:01.634761Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=112 postcodes_after_filter=11 filtered_out=101 truncated=false bounds=51.675640,-0.036179,51.676760,-0.034221 filters=1 filters_raw="Listing status:Historical sale|For sale|For rent" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.0 total_ms=0.3
2026-04-04T18:04:01.842193Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=199182 filters=5 travel=0 total=7158 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" ms=1.6
2026-04-04T18:04:01.870993Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1843 filters=1 travel=0 total=1843 filters_raw="Listing status:Historical sale|For sale|For rent" ms=0.1
2026-04-04T18:04:09.995591Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=112 postcodes_after_filter=11 filtered_out=101 truncated=false bounds=51.675640,-0.036179,51.676760,-0.034221 filters=1 filters_raw="Listing status:Historical sale|For sale|For rent" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.0 total_ms=0.2
2026-04-04T18:04:10.034451Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=199182 parallel=true cells_before_filter=520 cells_after_filter=420 truncated=false bounds=51.4896,-0.1743,51.5404,-0.0857 filters=5 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.3 total_ms=1.8
2026-04-04T18:04:10.244143Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1843 filters=1 travel=0 total=1843 filters_raw="Listing status:Historical sale|For sale|For rent" ms=0.1
2026-04-04T18:04:10.259598Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=199182 filters=5 travel=0 total=7158 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" ms=1.1
2026-04-04T18:04:17.017893Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=112 postcodes_after_filter=11 filtered_out=101 truncated=false bounds=51.675640,-0.036179,51.676760,-0.034221 filters=1 filters_raw="Listing status:Historical sale|For sale|For rent" fields=0 travel_entries=0 agg_ms=0.3 json_ms=0.1 total_ms=0.4
2026-04-04T18:04:17.031082Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=199182 parallel=true cells_before_filter=520 cells_after_filter=420 truncated=false bounds=51.4896,-0.1743,51.5404,-0.0857 filters=5 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.4 json_ms=0.2 total_ms=1.6
2026-04-04T18:04:17.269932Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1843 filters=1 travel=0 total=1843 filters_raw="Listing status:Historical sale|For sale|For rent" ms=0.1
2026-04-04T18:04:17.285691Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=199182 filters=5 travel=0 total=7158 filters_raw="Listing status:Historical sale|For sale|For rent;;Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other;;Leasehold/Freehold:Freehold|Leasehold;;Asking price:1:inf;;Asking price per sqm:0:49347.58" ms=1.4
2026-04-04T18:06:34.470364Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T18:06:34.470528Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet, /app/data-scraped/online_listings_buy.parquet, /app/data-scraped/online_listings_rent.parquet
2026-04-04T18:06:34.470540Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T18:06:34.590502Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T18:06:34.590511Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T18:06:36.790692Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T18:06:36.790703Z INFO property_map_server::data::property: Loading buy listings from "/app/data-scraped/online_listings_buy.parquet"
2026-04-04T18:06:37.182048Z INFO property_map_server::data::property: buy listings joined rows=1060501
2026-04-04T18:06:37.182066Z INFO property_map_server::data::property: Loading rent listings from "/app/data-scraped/online_listings_rent.parquet"
2026-04-04T18:06:37.289399Z INFO property_map_server::data::property: rent listings joined rows=266585
2026-04-04T18:06:37.289409Z INFO property_map_server::data::property: Concatenating all data sources
2026-04-04T18:06:50.790710Z INFO property_map_server::data::property: All data sources combined properties=15203393 buy_listings=1060501 rent_listings=266585 total=16530479
2026-04-04T18:12:36.704296Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T18:13:12.473174Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T18:13:42.494116Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T18:13:59.841398Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T18:58:25.950686Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T18:58:25.950839Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T18:58:25.950845Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T18:58:26.022537Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T18:58:26.022548Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T18:58:28.362018Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T18:58:28.362056Z INFO property_map_server::data::property: Feature columns from config numeric=54 enums=7 total=61
2026-04-04T18:58:29.258036Z INFO property_map_server::data::property: Combined data selected rows=15203393
2026-04-04T18:58:29.411124Z INFO property_map_server::data::property: Extracting numeric feature columns
2026-04-04T18:58:29.740495Z INFO property_map_server::data::property: Computing histograms for numeric features
2026-04-04T18:58:31.008391Z INFO property_map_server::data::property: Extracting string columns
2026-04-04T18:58:32.331403Z INFO property_map_server::data::property: Building enum features
2026-04-04T18:58:33.634312Z INFO property_map_server::data::property: Extracting renovation history
2026-04-04T18:58:36.314390Z INFO property_map_server::data::property: Renovation history extracted properties_with_events=1829784
2026-04-04T18:58:36.314399Z INFO property_map_server::data::property: Sorting rows by spatial locality
2026-04-04T18:58:37.165783Z INFO property_map_server::data::property: Building interned strings
2026-04-04T18:58:42.517924Z INFO property_map_server::data::property: Transposing to row-major layout (spatially sorted, quantized to u16)
2026-04-04T18:58:44.809406Z INFO property_map_server::data::property: Data loading complete
2026-04-04T18:58:45.707780Z INFO property_map_server: Property data loaded rows=15203393 features=61 enums=7
2026-04-04T18:58:45.707789Z INFO property_map_server: Building spatial grid index (0.01° cells)
2026-04-04T18:58:45.799140Z INFO property_map_server: Precomputing H3 cells at resolution 12
2026-04-04T18:58:45.799148Z INFO property_map_server::data::property: Precomputing H3 cells at resolution 12
2026-04-04T18:58:46.168573Z INFO property_map_server::data::property: H3 precomputation complete (15203393 cells)
2026-04-04T18:58:46.168598Z INFO property_map_server: Loading POI data from /app/data/filtered_uk_pois.parquet
2026-04-04T18:58:46.168603Z INFO property_map_server::data::poi: Loading POI data from "/app/data/filtered_uk_pois.parquet"...
2026-04-04T18:58:46.186973Z INFO property_map_server::data::poi: Loaded 550611 POIs
2026-04-04T18:58:46.274891Z INFO property_map_server::data::poi: POI string columns interned category_unique=74 group_unique=11 emoji_unique=71
2026-04-04T18:58:46.275351Z INFO property_map_server::data::poi: POI data loading complete.
2026-04-04T18:58:46.304620Z INFO property_map_server: POI data loaded pois=550611
2026-04-04T18:58:46.304630Z INFO property_map_server: Building POI spatial grid index
2026-04-04T18:58:46.309434Z INFO property_map_server: Loading place data from /app/data/places.parquet
2026-04-04T18:58:46.309449Z INFO property_map_server::data::places: Loading place data from "/app/data/places.parquet"...
2026-04-04T18:58:46.309898Z INFO property_map_server::data::places: Loaded 3474 places
2026-04-04T18:58:46.310655Z INFO property_map_server::data::places: Place data loaded places=3474 types=2 with_population=71 with_city=3392
2026-04-04T18:58:46.310713Z INFO property_map_server: Place data loaded places=3474
2026-04-04T18:58:46.310722Z INFO property_map_server: Loading postcode boundaries from /app/data/postcode_boundaries
2026-04-04T18:58:46.310726Z INFO property_map_server::data::postcodes: Loading postcode boundaries from "/app/data/postcode_boundaries"
2026-04-04T18:58:46.311535Z INFO property_map_server::data::postcodes: Found GeoJSON files to process files=2361
2026-04-04T18:58:53.123995Z INFO property_map_server::data::postcodes: Postcode boundary data ready postcodes=1490140
2026-04-04T18:58:53.357586Z INFO property_map_server: Postcode boundaries loaded postcodes=1490140
2026-04-04T18:58:53.499271Z INFO property_map_server::data::postcodes: Outcode data derived from postcodes outcodes=2361
2026-04-04T18:58:53.499331Z INFO property_map_server: Loading PMTiles from /app/data/uk.pmtiles
2026-04-04T18:58:53.502003Z INFO property_map_server: PMTiles loaded successfully
2026-04-04T18:58:53.536536Z INFO property_map_server: No --dist provided; static serving and OG injection disabled
2026-04-04T18:58:53.562184Z INFO property_map_server: Screenshot service configured: http://screenshot:8002
2026-04-04T18:58:53.562329Z INFO property_map_server: Precomputed features response groups=8
2026-04-04T18:58:53.562345Z INFO property_map_server: PocketBase configured: http://pocketbase:8090
2026-04-04T18:58:53.622270Z INFO property_map_server::pocketbase: PocketBase users collection already has all required fields
2026-04-04T18:58:53.625633Z INFO property_map_server::pocketbase: PocketBase collection 'saved_searches' API rules updated
2026-04-04T18:58:53.628760Z INFO property_map_server::pocketbase: PocketBase collection 'saved_properties' API rules updated
2026-04-04T18:58:53.632492Z INFO property_map_server::pocketbase: Created PocketBase collection: location_logs
2026-04-04T18:58:53.679393Z INFO property_map_server::pocketbase: PocketBase meta.appURL set to https://perfect-postcodes.co.uk/pb
2026-04-04T18:58:53.682963Z INFO property_map_server::pocketbase: PocketBase OAuth configured on users collection
2026-04-04T18:58:53.682996Z INFO property_map_server: Gemini configured (model: gemini-3-flash-preview)
2026-04-04T18:58:53.683012Z INFO property_map_server: Loading travel time data from /app/data/travel-times
2026-04-04T18:58:53.684265Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="bicycle" destinations=2753
2026-04-04T18:58:53.685400Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="walking" destinations=2753
2026-04-04T18:58:53.686635Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="car" destinations=2753
2026-04-04T18:58:53.687682Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="transit" destinations=2752
2026-04-04T18:58:53.687700Z INFO property_map_server: Travel time store loaded modes=4
2026-04-04T18:58:53.687785Z INFO property_map_server: Precomputed AI filters system prompt
2026-04-04T18:58:58.030005Z INFO property_map_server: All memory pages locked (mlockall)
2026-04-04T18:58:58.030041Z INFO property_map_server: Server listening on 0.0.0.0:8001
2026-04-04T18:58:59.823013Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T18:58:59.879273Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T18:59:00.090793Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=163447 parallel=true cells_before_filter=563 cells_after_filter=445 truncated=false bounds=51.4896,-0.1743,51.5404,-0.0857 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.7 json_ms=0.3 total_ms=7.0
2026-04-04T19:07:08.593720Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T19:07:08.594267Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T19:09:28.490027Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T19:09:28.490252Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T19:09:28.807330Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=163447 parallel=true cells_before_filter=563 cells_after_filter=445 truncated=false bounds=51.4896,-0.1743,51.5404,-0.0857 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=3.7 json_ms=0.2 total_ms=4.0
2026-04-04T19:09:30.432238Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=305945 parallel=true cells_before_filter=1029 cells_after_filter=908 truncated=false bounds=51.4761,-0.1947,51.5509,-0.0644 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.2 json_ms=0.7 total_ms=2.9
2026-04-04T19:09:30.972518Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=87742 parallel=true cells_before_filter=321 cells_after_filter=275 truncated=false bounds=51.4962,-0.1642,51.5353,-0.0962 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.8 json_ms=0.1 total_ms=0.9
2026-04-04T19:09:33.346023Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=87742 parallel=true cells_before_filter=321 cells_after_filter=275 truncated=false bounds=51.4962,-0.1642,51.5353,-0.0962 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.0 json_ms=0.2 total_ms=1.3
2026-04-04T19:09:34.538255Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=163447 parallel=true cells_before_filter=563 cells_after_filter=465 truncated=false bounds=51.4895,-0.1757,51.5420,-0.0842 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.9 json_ms=0.4 total_ms=2.3
2026-04-04T19:09:35.572199Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=1606 postcodes_after_filter=925 filtered_out=681 truncated=false bounds=51.506447,-0.142031,51.520817,-0.116995 filters=0 filters_raw="-" fields=1 travel_entries=0 agg_ms=1.4 json_ms=2.2 total_ms=3.6
2026-04-04T19:09:36.874859Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=668 postcodes_after_filter=210 filtered_out=458 truncated=false bounds=51.510893,-0.135029,51.516555,-0.125165 filters=0 filters_raw="-" fields=1 travel_entries=0 agg_ms=0.9 json_ms=0.5 total_ms=1.4
2026-04-04T19:09:37.662705Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=60356 parallel=true cells_before_filter=232 cells_after_filter=189 truncated=false bounds=51.4973,-0.1564,51.5296,-0.1002 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.0 json_ms=0.2 total_ms=1.2
2026-04-04T19:09:38.897200Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=522269 parallel=true cells_before_filter=1914 cells_after_filter=1793 truncated=false bounds=51.4585,-0.2175,51.5667,-0.0289 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.1 json_ms=1.4 total_ms=6.5
2026-04-04T19:09:39.706765Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=750424 parallel=true cells_before_filter=3022 cells_after_filter=2970 truncated=false bounds=51.4430,-0.2468,51.5859,0.0022 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.4 json_ms=2.8 total_ms=9.2
2026-04-04T19:09:41.420321Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=1592747 parallel=true cells_before_filter=8727 cells_after_filter=8611 truncated=false bounds=51.3838,-0.3367,51.6434,0.1155 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=16.8 json_ms=9.7 total_ms=26.5
2026-04-04T19:09:43.653419Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=846882 parallel=true cells_before_filter=5922 cells_after_filter=5845 truncated=false bounds=51.5121,-0.2506,51.7709,0.2016 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.0 json_ms=5.6 total_ms=14.6
2026-04-04T19:10:09.335765Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T19:10:09.337693Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T19:10:31.643735Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T19:10:31.644866Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T19:10:32.573892Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=101 cells_after_filter=57 truncated=false bounds=51.5095,-0.1429,51.5205,-0.1171 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.5 json_ms=0.1 total_ms=0.6
2026-04-04T19:10:34.180904Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=101 cells_after_filter=80 truncated=false bounds=51.5048,-0.1429,51.5252,-0.1171 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.5 json_ms=0.1 total_ms=0.6
2026-04-04T19:10:35.518428Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=101 cells_after_filter=80 truncated=false bounds=51.5051,-0.1429,51.5249,-0.1171 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.1 total_ms=0.5
2026-04-04T19:12:24.311006Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=101 cells_after_filter=67 truncated=false bounds=51.5080,-0.1429,51.5220,-0.1171 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.3 json_ms=0.1 total_ms=0.4
2026-04-04T19:12:25.258385Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=101 cells_after_filter=55 truncated=false bounds=51.5099,-0.1429,51.5201,-0.1171 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.0 total_ms=0.4
2026-04-04T19:12:28.774542Z INFO property_map_server::routes::ai_filters: POST /api/ai-filters query=Best ex-council houses under 200k user_id=pyja9yzzek267px
2026-04-04T19:12:30.706074Z INFO property_map_server::routes::ai_filters: AI filter match count match_count=35818 round=0
2026-04-04T19:12:30.967720Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=0 cells_after_filter=0 truncated=false bounds=51.5099,-0.1429,51.5201,-0.1171 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.1 json_ms=0.0 total_ms=0.1
2026-04-04T19:12:31.213160Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=18876 filters=3 travel=0 total=0 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=0.2
2026-04-04T19:12:33.333012Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=18876 parallel=false cells_before_filter=0 cells_after_filter=0 truncated=false bounds=51.5076,-0.1429,51.5224,-0.1171 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.1 json_ms=0.0 total_ms=0.1
2026-04-04T19:12:33.575664Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=18876 filters=3 travel=0 total=0 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=0.2
2026-04-04T19:12:35.864410Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=264742 parallel=true cells_before_filter=0 cells_after_filter=0 truncated=false bounds=51.4820,-0.1724,51.5614,-0.0333 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.8 json_ms=0.0 total_ms=0.8
2026-04-04T19:12:36.356585Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=473845 parallel=true cells_before_filter=2 cells_after_filter=2 truncated=false bounds=51.4711,-0.2080,51.5780,-0.0205 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.3 json_ms=0.0 total_ms=1.3
2026-04-04T19:12:36.891556Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=701500 parallel=true cells_before_filter=4 cells_after_filter=4 truncated=false bounds=51.4642,-0.2401,51.6017,0.0010 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.9 json_ms=0.0 total_ms=1.9
2026-04-04T19:12:38.050425Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=2671464 parallel=true cells_before_filter=25 cells_after_filter=25 truncated=false bounds=51.3063,-0.6784,51.8466,0.2698 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.3 json_ms=0.0 total_ms=6.3
2026-04-04T19:12:38.301989Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2671464 filters=3 travel=0 total=34 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=23.7
2026-04-04T19:12:40.047478Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=6800296 parallel=true cells_before_filter=418 cells_after_filter=418 truncated=false bounds=50.8261,-1.9170,52.6475,1.2907 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=32.7 json_ms=0.2 total_ms=33.0
2026-04-04T19:12:40.375886Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6800296 filters=3 travel=0 total=4276 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=82.2
2026-04-04T19:12:40.860846Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=10312897 parallel=true cells_before_filter=338 cells_after_filter=338 truncated=false bounds=50.3952,-3.2077,53.3335,1.9831 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.3 agg_ms=45.4 json_ms=0.2 total_ms=45.9
2026-04-04T19:12:41.187128Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=10312897 filters=3 travel=0 total=14773 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=125.3
2026-04-04T19:12:41.826819Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=13619907 parallel=true cells_before_filter=475 cells_after_filter=475 truncated=false bounds=49.7272,-5.0533,54.3143,3.0844 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.5 agg_ms=60.0 json_ms=0.2 total_ms=60.7
2026-04-04T19:12:42.179520Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=13619907 filters=3 travel=0 total=28736 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=167.9
2026-04-04T19:12:43.998301Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=13616809 parallel=true cells_before_filter=482 cells_after_filter=482 truncated=false bounds=49.9223,-4.5757,54.4903,3.5619 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.4 agg_ms=63.8 json_ms=0.2 total_ms=64.4
2026-04-04T19:12:44.348104Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=13616809 filters=3 travel=0 total=28757 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=166.7
2026-04-04T19:17:54.103760Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=846882 parallel=true cells_before_filter=5922 cells_after_filter=5845 truncated=false bounds=51.5121,-0.2506,51.7709,0.2016 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=8.7 json_ms=5.8 total_ms=14.4
2026-04-04T19:17:55.724332Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3151293 parallel=true cells_before_filter=1629 cells_after_filter=1629 truncated=false bounds=51.3279,-0.5602,52.0611,0.7222 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=14.5 json_ms=1.3 total_ms=15.8
2026-04-04T19:17:57.502505Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=6131735 parallel=true cells_before_filter=1183 cells_after_filter=1183 truncated=false bounds=50.5815,-1.3577,52.5394,2.0576 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=38.8 json_ms=0.9 total_ms=39.8
2026-04-04T19:17:58.444531Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=11000920 parallel=true cells_before_filter=2642 cells_after_filter=2642 truncated=false bounds=49.5744,-2.7201,53.5676,4.2517 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.3 agg_ms=58.2 json_ms=2.0 total_ms=60.5
2026-04-04T19:18:00.646435Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14459864 parallel=true cells_before_filter=683 cells_after_filter=683 truncated=false bounds=47.7865,-7.4288,55.7459,6.5636 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=88.2 json_ms=0.6 total_ms=89.8
2026-04-04T19:18:01.613204Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14031672 parallel=true cells_before_filter=4007 cells_after_filter=4007 truncated=false bounds=49.3349,-5.3139,54.8230,4.3842 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=95.9 json_ms=3.5 total_ms=100.1
2026-04-04T19:18:02.489569Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=5896958 parallel=true cells_before_filter=1212 cells_after_filter=1212 truncated=false bounds=51.1805,-1.7929,52.8495,1.1478 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=22.1 json_ms=0.9 total_ms=23.1
2026-04-04T19:18:03.645638Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=6189883 parallel=true cells_before_filter=1165 cells_after_filter=1165 truncated=false bounds=50.7464,-1.6539,52.4312,1.2868 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=22.3 json_ms=0.9 total_ms=23.3
2026-04-04T19:18:05.647790Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=6189883 parallel=true cells_before_filter=1165 cells_after_filter=1165 truncated=false bounds=50.7464,-1.6539,52.4312,1.2868 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=28.1 json_ms=0.8 total_ms=29.0
2026-04-04T19:18:06.970953Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=11654088 parallel=true cells_before_filter=2748 cells_after_filter=2748 truncated=false bounds=50.2448,-2.6527,53.7960,3.6087 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.4 agg_ms=60.5 json_ms=1.9 total_ms=62.7
2026-04-04T19:18:08.264331Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13319995 parallel=true cells_before_filter=3393 cells_after_filter=3393 truncated=false bounds=48.9280,-3.7156,54.2031,5.4991 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=78.1 json_ms=2.6 total_ms=81.2
2026-04-04T19:18:09.441619Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13466452 parallel=true cells_before_filter=3490 cells_after_filter=3490 truncated=false bounds=48.8970,-4.2559,54.1755,4.9588 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=73.4 json_ms=2.5 total_ms=76.4
2026-04-04T19:18:10.998471Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14362638 parallel=true cells_before_filter=4102 cells_after_filter=4102 truncated=false bounds=49.9216,-5.2151,55.0871,3.9996 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=95.5 json_ms=3.4 total_ms=99.4
2026-04-04T19:18:11.248970Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14364425 parallel=true cells_before_filter=4103 cells_after_filter=4103 truncated=false bounds=49.9187,-5.2285,55.0845,3.9862 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=95.1 json_ms=3.4 total_ms=99.0
2026-04-04T19:18:12.462881Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14046788 parallel=true cells_before_filter=4018 cells_after_filter=4018 truncated=false bounds=50.6881,-5.3356,55.7680,3.8792 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=72.1 json_ms=2.7 total_ms=75.5
2026-04-04T19:18:12.795860Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13826657 parallel=true cells_before_filter=3965 cells_after_filter=3965 truncated=false bounds=50.7587,-5.2999,55.8307,3.9149 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=77.8 json_ms=2.8 total_ms=81.1
2026-04-04T19:18:14.615357Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13598177 parallel=true cells_before_filter=3720 cells_after_filter=3720 truncated=false bounds=49.1784,-4.6682,54.4260,4.5465 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=72.3 json_ms=3.1 total_ms=76.1
2026-04-04T19:18:22.211050Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13598177 parallel=true cells_before_filter=3720 cells_after_filter=3720 truncated=false bounds=49.1784,-4.6682,54.4260,4.5465 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=75.4 json_ms=3.0 total_ms=78.9
2026-04-04T19:18:26.281216Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5498670 parallel=true cells_before_filter=5780 cells_after_filter=5780 truncated=false bounds=50.7941,-1.2035,52.2935,1.4109 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=25.8 json_ms=4.0 total_ms=29.9
2026-04-04T19:18:27.229769Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3235129 parallel=true cells_before_filter=1652 cells_after_filter=1652 truncated=false bounds=51.0899,-0.5985,51.8285,0.6869 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=14.9 json_ms=1.2 total_ms=16.1
2026-04-04T19:18:28.522374Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3938637 parallel=true cells_before_filter=3101 cells_after_filter=3101 truncated=false bounds=50.9700,-0.7230,52.0193,1.1045 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=17.7 json_ms=2.0 total_ms=19.8
2026-04-04T19:18:29.937282Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3938637 parallel=true cells_before_filter=3101 cells_after_filter=3101 truncated=false bounds=50.9700,-0.7230,52.0193,1.1045 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=18.0 json_ms=2.4 total_ms=20.5
2026-04-04T19:18:31.148003Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3938637 parallel=true cells_before_filter=3101 cells_after_filter=3101 truncated=false bounds=50.9700,-0.7230,52.0193,1.1045 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=8.7 json_ms=1.7 total_ms=10.5
2026-04-04T19:18:34.274469Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3938637 parallel=true cells_before_filter=3101 cells_after_filter=3101 truncated=false bounds=50.9700,-0.7230,52.0193,1.1045 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=16.4 json_ms=2.1 total_ms=18.5
2026-04-04T19:18:36.314875Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3938637 parallel=true cells_before_filter=3101 cells_after_filter=3101 truncated=false bounds=50.9700,-0.7230,52.0193,1.1045 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=9.6 json_ms=1.4 total_ms=11.1
2026-04-04T19:27:53.245205Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T19:27:53.246199Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T19:27:53.713571Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=13109445 parallel=true cells_before_filter=430 cells_after_filter=430 truncated=false bounds=50.5312,-4.5849,53.9337,3.5711 filters=3 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.3 agg_ms=57.6 json_ms=0.2 total_ms=58.2
2026-04-04T19:27:54.070663Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=13109445 filters=3 travel=0 total=27503 filters_raw="Estimated current price:23036.77734375:200000;;Former council house:Yes;;Property type:Detached|Semi-Detached|Terraced" ms=168.9
2026-04-04T21:15:02.264425Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:15:02.265558Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:15:02.624018Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4035864 parallel=true cells_before_filter=3246 cells_after_filter=3246 truncated=false bounds=50.9572,-0.7449,52.0317,1.1265 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=10.3 json_ms=1.9 total_ms=12.2
2026-04-04T21:15:06.357168Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4035864 parallel=true cells_before_filter=3246 cells_after_filter=3246 truncated=false bounds=50.9572,-0.7449,52.0317,1.1265 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.0 json_ms=2.8 total_ms=20.9
2026-04-04T21:15:08.234117Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=7328700 parallel=true cells_before_filter=1598 cells_after_filter=1598 truncated=false bounds=50.2800,-1.8107,52.7988,2.5816 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=44.5 json_ms=1.5 total_ms=46.2
2026-04-04T21:15:08.973679Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4844845 parallel=true cells_before_filter=4829 cells_after_filter=4829 truncated=false bounds=50.9058,-0.9537,52.2612,1.4115 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=36.1 json_ms=4.0 total_ms=40.1
2026-04-04T21:15:10.167709Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4844845 parallel=true cells_before_filter=4829 cells_after_filter=4829 truncated=false bounds=50.9058,-0.9537,52.2612,1.4115 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=26.6 json_ms=2.2 total_ms=28.9
2026-04-04T21:15:11.217257Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4844845 parallel=true cells_before_filter=4829 cells_after_filter=4829 truncated=false bounds=50.9058,-0.9537,52.2612,1.4115 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=35.0 json_ms=2.2 total_ms=37.3
2026-04-04T21:15:11.483301Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=4844845 filters=1 travel=0 total=4844845 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=51.0
2026-04-04T21:15:13.605750Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4844845 parallel=true cells_before_filter=4829 cells_after_filter=4829 truncated=false bounds=50.9058,-0.9537,52.2612,1.4115 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=35.8 json_ms=4.1 total_ms=40.0
2026-04-04T21:15:14.878982Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4844845 parallel=true cells_before_filter=4829 cells_after_filter=4829 truncated=false bounds=50.9058,-0.9537,52.2612,1.4115 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=36.0 json_ms=2.1 total_ms=38.3
2026-04-04T21:15:15.506971Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4844845 parallel=true cells_before_filter=4829 cells_after_filter=4829 truncated=false bounds=50.9058,-0.9537,52.2612,1.4115 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=34.9 json_ms=4.0 total_ms=39.0
2026-04-04T21:16:05.839673Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2130219 parallel=true cells_before_filter=3951 cells_after_filter=3936 truncated=false bounds=51.3214,-0.2549,51.8002,0.5802 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=12.4 json_ms=3.9 total_ms=16.3
2026-04-04T21:16:06.073443Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2130219 filters=1 travel=0 total=2130219 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=18.0
2026-04-04T21:16:07.804822Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2130219 parallel=true cells_before_filter=3951 cells_after_filter=3936 truncated=false bounds=51.3214,-0.2549,51.8002,0.5802 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=7.8 json_ms=1.8 total_ms=9.7
2026-04-04T21:16:08.934250Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=88194e68a5fffff resolution=8 total_count=801 filters=0 filters_raw="-" ms=0.5
2026-04-04T21:16:09.330456Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1425363 parallel=true cells_before_filter=2870 cells_after_filter=2866 truncated=false bounds=51.3214,-0.1385,51.8002,0.4637 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=5.3 json_ms=1.7 total_ms=6.9
2026-04-04T21:16:17.920627Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=88194e6133fffff resolution=8 total_count=1007 filters=0 filters_raw="-" ms=0.4
2026-04-04T21:16:18.982200Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=88194e6847fffff resolution=8 total_count=983 filters=0 filters_raw="-" ms=0.6
2026-04-04T21:16:19.599388Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=88194e69c9fffff resolution=8 total_count=1308 filters=0 filters_raw="-" ms=0.6
2026-04-04T21:16:20.381134Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=2514759 parallel=true cells_before_filter=1387 cells_after_filter=1387 truncated=false bounds=51.1721,-0.2436,51.9682,0.7579 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=5.8 json_ms=0.8 total_ms=6.6
2026-04-04T21:16:20.692754Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=87194ad2effffff resolution=7 total_count=7392 filters=0 filters_raw="-" ms=2.7
2026-04-04T21:17:31.050847Z INFO property_map_server::routes::ai_filters: POST /api/ai-filters query=Flats around good primary schools not too far from Manchester user_id=pyja9yzzek267px
2026-04-04T21:17:33.587477Z INFO property_map_server::routes::ai_filters: AI called tool function="search_destinations" round=0 tool_call=1
2026-04-04T21:17:34.992473Z INFO property_map_server::routes::ai_filters: AI filter match count match_count=44148 round=1
2026-04-04T21:17:35.034575Z INFO property_map_server::routes::travel_destinations: GET /api/travel-destinations mode="transit" results=2752 ms=1.3
2026-04-04T21:17:35.035913Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=87194ad2effffff resolution=7 total_count=4492 filters=2 filters_raw="Good+ primary schools within 2km:2:49;;Property type:Flats/Maisonettes" ms=1.8
2026-04-04T21:17:35.067913Z INFO property_map_server::routes::travel_destinations: GET /api/travel-destinations mode="transit" results=2752 ms=1.3
2026-04-04T21:17:35.315202Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1336988 parallel=true cells_before_filter=37 cells_after_filter=37 truncated=false bounds=53.0966,-2.7459,53.8589,-1.7444 filters=2 filters_raw="Good+ primary schools within 2km:2:49;;Property type:Flats/Maisonettes" fields=0 travel_entries=1 grid_ms=0.0 agg_ms=6.4 json_ms=0.0 total_ms=6.5
2026-04-04T21:17:35.579723Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1336988 filters=3 travel=1 total=44148 filters_raw="Good+ primary schools within 2km:2:49;;Property type:Flats/Maisonettes" ms=33.0
2026-04-04T21:17:59.613602Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=87194ad2effffff resolution=7 total_count=7392 filters=1 filters_raw="Good+ primary schools within 2km:2:49" ms=2.6
2026-04-04T21:17:59.771297Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1336988 parallel=true cells_before_filter=41 cells_after_filter=41 truncated=false bounds=53.0966,-2.7459,53.8589,-1.7444 filters=1 filters_raw="Good+ primary schools within 2km:2:49" fields=0 travel_entries=1 grid_ms=0.0 agg_ms=4.7 json_ms=0.0 total_ms=4.8
2026-04-04T21:18:00.034060Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1336988 parallel=true cells_before_filter=834 cells_after_filter=834 truncated=false bounds=53.0966,-2.7459,53.8589,-1.7444 filters=1 filters_raw="Good+ primary schools within 2km:2:49" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.2 json_ms=0.4 total_ms=6.7
2026-04-04T21:18:00.283601Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1336988 filters=1 travel=0 total=1277693 filters_raw="Good+ primary schools within 2km:2:49" ms=5.8
2026-04-04T21:18:01.574940Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=87194ad2effffff resolution=7 total_count=7392 filters=0 filters_raw="-" ms=2.5
2026-04-04T21:18:01.682923Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1336988 parallel=true cells_before_filter=1172 cells_after_filter=1172 truncated=false bounds=53.0966,-2.7459,53.8589,-1.7444 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=3.9 json_ms=0.6 total_ms=4.5
2026-04-04T21:18:06.530263Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1336988 parallel=true cells_before_filter=1172 cells_after_filter=1172 truncated=false bounds=53.0966,-2.7459,53.8589,-1.7444 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.1 json_ms=0.8 total_ms=7.9
2026-04-04T21:18:29.362901Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:18:29.367513Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:18:29.686683Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1826282 parallel=true cells_before_filter=1696 cells_after_filter=1696 truncated=false bounds=53.0885,-2.9542,53.8669,-1.5360 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=5.1 json_ms=0.8 total_ms=5.9
2026-04-04T21:18:34.992978Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1826282 parallel=true cells_before_filter=1696 cells_after_filter=1696 truncated=false bounds=53.0885,-2.9542,53.8669,-1.5360 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.4 json_ms=1.4 total_ms=10.8
2026-04-04T21:18:37.555732Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=212401 parallel=true cells_before_filter=2268 cells_after_filter=2236 truncated=false bounds=53.4767,-2.3506,53.6179,-2.0930 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=3.2 json_ms=1.8 total_ms=5.0
2026-04-04T21:21:31.346209Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=212401 parallel=true cells_before_filter=2268 cells_after_filter=2236 truncated=false bounds=53.4767,-2.3506,53.6179,-2.0930 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.4 json_ms=1.1 total_ms=3.5
2026-04-04T21:21:32.233775Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=891951b2cabffff resolution=9 total_count=110 filters=0 filters_raw="-" ms=0.3
2026-04-04T21:21:32.605729Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=171338 parallel=true cells_before_filter=1758 cells_after_filter=1673 truncated=false bounds=53.4767,-2.3147,53.6179,-2.1289 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.6 json_ms=0.9 total_ms=3.5
2026-04-04T21:21:38.513149Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=8919424dc1bffff resolution=9 total_count=153 filters=0 filters_raw="-" ms=0.3
2026-04-04T21:21:40.994679Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=8919424da9bffff resolution=9 total_count=209 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:21:42.017604Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=8919424da17ffff resolution=9 total_count=86 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:21:42.980235Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=778383 parallel=true cells_before_filter=2695 cells_after_filter=2695 truncated=false bounds=53.3572,-2.5218,53.8559,-1.8645 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=4.1 json_ms=1.2 total_ms=5.4
2026-04-04T21:21:44.159590Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=881951b75dfffff resolution=8 total_count=4177 filters=0 filters_raw="-" ms=1.3
2026-04-04T21:21:45.138081Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=762091 parallel=true cells_before_filter=2726 cells_after_filter=2721 truncated=false bounds=53.2675,-2.4988,53.7674,-1.8415 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=3.8 json_ms=1.3 total_ms=5.1
2026-04-04T21:21:47.457979Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=881951b627fffff resolution=8 total_count=871 filters=0 filters_raw="-" ms=0.4
2026-04-04T21:23:16.650476Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=762091 parallel=true cells_before_filter=2726 cells_after_filter=2721 truncated=false bounds=53.2675,-2.4988,53.7674,-1.8415 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.2 json_ms=2.6 total_ms=8.8
2026-04-04T21:23:17.018996Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=881951b627fffff resolution=8 total_count=871 filters=1 filters_raw="Leasehold/Freehold:Freehold|Leasehold" ms=0.3
2026-04-04T21:23:17.175210Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=762091 parallel=true cells_before_filter=2726 cells_after_filter=2721 truncated=false bounds=53.2675,-2.4988,53.7674,-1.8415 filters=1 filters_raw="Leasehold/Freehold:Freehold|Leasehold" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.9 json_ms=2.2 total_ms=8.1
2026-04-04T21:23:17.406892Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=762091 filters=1 travel=0 total=762072 filters_raw="Leasehold/Freehold:Freehold|Leasehold" ms=6.6
2026-04-04T21:23:18.315814Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=762091 parallel=true cells_before_filter=2726 cells_after_filter=2721 truncated=false bounds=53.2675,-2.4988,53.7674,-1.8415 filters=1 filters_raw="Leasehold/Freehold:Freehold|Leasehold" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.0 json_ms=1.4 total_ms=7.4
2026-04-04T21:23:18.887438Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=881951b627fffff resolution=8 total_count=449 filters=1 filters_raw="Leasehold/Freehold:Freehold" ms=0.2
2026-04-04T21:23:19.026066Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=762091 parallel=true cells_before_filter=2699 cells_after_filter=2694 truncated=false bounds=53.2675,-2.4988,53.7674,-1.8415 filters=1 filters_raw="Leasehold/Freehold:Freehold" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=5.5 json_ms=1.3 total_ms=6.8
2026-04-04T21:23:19.279450Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=762091 filters=1 travel=0 total=396227 filters_raw="Leasehold/Freehold:Freehold" ms=8.3
2026-04-04T21:23:24.230721Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:23:24.232501Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:23:29.794131Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:23:29.794142Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:23:35.110692Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:23:35.110752Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:23:40.188053Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:23:40.188054Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:23:45.139219Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:23:45.139435Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:24:03.100735Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:24:03.101704Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:24:15.902912Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:24:15.902964Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:24:16.202086Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=994657 parallel=true cells_before_filter=3840 cells_after_filter=3832 truncated=false bounds=53.2609,-2.6381,53.7740,-1.7023 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.2 json_ms=1.9 total_ms=8.1
2026-04-04T21:24:19.131858Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=994657 parallel=true cells_before_filter=3840 cells_after_filter=3832 truncated=false bounds=53.2609,-2.6381,53.7740,-1.7023 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=7.8 json_ms=1.7 total_ms=9.5
2026-04-04T21:24:19.358775Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=994657 filters=1 travel=0 total=994657 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=8.0
2026-04-04T21:24:21.428258Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=994657 parallel=true cells_before_filter=3840 cells_after_filter=3832 truncated=false bounds=53.2609,-2.6381,53.7740,-1.7023 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.7 json_ms=3.3 total_ms=13.1
2026-04-04T21:24:22.589944Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=62512 parallel=true cells_before_filter=699 cells_after_filter=661 truncated=false bounds=53.4481,-2.1985,53.5157,-2.0754 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.4 json_ms=0.5 total_ms=1.9
2026-04-04T21:24:22.851217Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=62512 filters=1 travel=0 total=62512 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.9
2026-04-04T21:24:23.402508Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=490 postcodes_after_filter=348 filtered_out=142 truncated=false bounds=53.477143,-2.152315,53.491718,-2.125757 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.5 json_ms=1.0 total_ms=1.5
2026-04-04T21:24:23.666695Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5706 filters=1 travel=0 total=5706 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:24:24.568711Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=189 postcodes_after_filter=56 filtered_out=133 truncated=false bounds=53.482183,-2.144906,53.487085,-2.135973 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.2 json_ms=0.2 total_ms=0.4
2026-04-04T21:24:25.389443Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=490 postcodes_after_filter=359 filtered_out=131 truncated=false bounds=53.476876,-2.152708,53.491964,-2.125216 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.6 json_ms=1.0 total_ms=1.7
2026-04-04T21:24:25.593220Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5706 filters=1 travel=0 total=5706 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:24:41.891969Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=125872 parallel=true cells_before_filter=1415 cells_after_filter=1288 truncated=false bounds=53.4320,-2.2230,53.5317,-2.0413 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.1 json_ms=1.1 total_ms=3.2
2026-04-04T21:24:42.170303Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=125872 filters=1 travel=0 total=125872 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.3
2026-04-04T21:24:42.688720Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=196711 parallel=true cells_before_filter=2085 cells_after_filter=1991 truncated=false bounds=53.4175,-2.2456,53.5445,-2.0142 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.8 json_ms=1.6 total_ms=4.4
2026-04-04T21:24:42.988758Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=196711 filters=1 travel=0 total=196711 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=2.1
2026-04-04T21:24:43.709197Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=435862 parallel=true cells_before_filter=4860 cells_after_filter=4855 truncated=false bounds=53.3643,-2.3421,53.5966,-1.9189 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.4 json_ms=3.9 total_ms=10.3
2026-04-04T21:24:44.015987Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=435862 filters=1 travel=0 total=435862 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=3.5
2026-04-04T21:24:44.624079Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=893715 parallel=true cells_before_filter=3540 cells_after_filter=3529 truncated=false bounds=53.2120,-2.5934,53.7180,-1.6718 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.9 json_ms=2.8 total_ms=9.7
2026-04-04T21:24:45.350639Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1734886 parallel=true cells_before_filter=1581 cells_after_filter=1581 truncated=false bounds=53.0782,-2.8134,53.8241,-1.4553 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.1 json_ms=1.4 total_ms=10.5
2026-04-04T21:24:45.604975Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1734886 filters=1 travel=0 total=1734886 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=13.9
2026-04-04T21:24:46.180287Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3892616 parallel=true cells_before_filter=5366 cells_after_filter=5366 truncated=false bounds=52.6235,-3.5562,54.1803,-0.7247 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=19.3 json_ms=4.2 total_ms=23.5
2026-04-04T21:24:46.449876Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3892616 filters=1 travel=0 total=3892616 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=31.8
2026-04-04T21:24:47.819112Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=6818445 parallel=true cells_before_filter=2211 cells_after_filter=2211 truncated=false bounds=51.8572,-4.7014,54.7296,0.5116 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=42.3 json_ms=1.8 total_ms=44.3
2026-04-04T21:24:48.094435Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6818445 filters=1 travel=0 total=6818445 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=69.3
2026-04-04T21:24:49.333863Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13027236 parallel=true cells_before_filter=3669 cells_after_filter=3669 truncated=false bounds=50.9369,-5.8570,55.1567,1.7615 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.6 agg_ms=78.8 json_ms=3.2 total_ms=82.5
2026-04-04T21:24:49.683517Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=13027236 filters=1 travel=0 total=13027236 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=128.8
2026-04-04T21:24:50.662829Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=12202101 parallel=true cells_before_filter=3277 cells_after_filter=3277 truncated=false bounds=51.2675,-5.5838,55.4564,2.0348 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.4 agg_ms=83.4 json_ms=3.2 total_ms=87.1
2026-04-04T21:24:51.137905Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=2026522 parallel=true cells_before_filter=1888 cells_after_filter=1888 truncated=false bounds=53.1545,-2.9036,53.9816,-1.3936 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.8 json_ms=1.5 total_ms=12.4
2026-04-04T21:24:51.388879Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2026522 filters=1 travel=0 total=2026522 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=16.5
2026-04-04T21:24:51.929091Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1241531 parallel=true cells_before_filter=911 cells_after_filter=911 truncated=false bounds=53.2937,-2.7014,53.8681,-1.6523 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.0 json_ms=0.8 total_ms=6.8
2026-04-04T21:24:52.190753Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1241531 filters=1 travel=0 total=1241531 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=10.1
2026-04-04T21:24:52.803403Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:24:52.808290Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:24:53.118091Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1297595 parallel=true cells_before_filter=974 cells_after_filter=974 truncated=false bounds=53.2866,-2.7142,53.8751,-1.6394 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.3 json_ms=0.5 total_ms=6.8
2026-04-04T21:24:53.364315Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1297595 filters=1 travel=0 total=1297595 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=10.5
2026-04-04T21:24:54.379717Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1475448 parallel=true cells_before_filter=1184 cells_after_filter=1184 truncated=false bounds=53.2526,-2.7695,53.9027,-1.5822 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=7.6 json_ms=0.6 total_ms=8.2
2026-04-04T21:24:54.655040Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1475448 filters=1 travel=0 total=1475448 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=12.9
2026-04-04T21:24:55.395013Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1475448 parallel=true cells_before_filter=1184 cells_after_filter=1184 truncated=false bounds=53.2526,-2.7695,53.9027,-1.5822 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.4 json_ms=0.9 total_ms=8.3
2026-04-04T21:24:57.930373Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=630781 parallel=true cells_before_filter=2018 cells_after_filter=2017 truncated=false bounds=53.4130,-2.5358,53.7751,-1.8742 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.3 json_ms=2.1 total_ms=9.4
2026-04-04T21:24:58.165801Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=630781 filters=1 travel=0 total=630781 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=5.5
2026-04-04T21:24:59.358368Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=141544 parallel=true cells_before_filter=2109 cells_after_filter=2007 truncated=false bounds=53.5270,-2.3691,53.6839,-2.0824 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=3.7 json_ms=1.7 total_ms=5.5
2026-04-04T21:24:59.601734Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=141544 filters=1 travel=0 total=141544 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.7
2026-04-04T21:25:01.456217Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=482887 parallel=true cells_before_filter=1484 cells_after_filter=1484 truncated=false bounds=53.4465,-2.4869,53.7484,-1.9353 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=3.8 json_ms=1.1 total_ms=4.9
2026-04-04T21:25:01.709375Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=482887 filters=1 travel=0 total=482887 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=4.3
2026-04-04T21:25:02.488592Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=21121 parallel=false cells_before_filter=338 cells_after_filter=308 truncated=false bounds=53.5811,-2.2899,53.6405,-2.1814 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.9 json_ms=0.3 total_ms=1.2
2026-04-04T21:25:02.734923Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=21121 filters=1 travel=0 total=21121 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.3
2026-04-04T21:25:03.366449Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=6807 parallel=false cells_before_filter=135 cells_after_filter=120 truncated=false bounds=53.5960,-2.2681,53.6285,-2.2086 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.2 json_ms=0.1 total_ms=0.4
2026-04-04T21:25:03.614054Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6807 filters=1 travel=0 total=6807 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:25:04.217278Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=134 postcodes_after_filter=48 filtered_out=86 truncated=false bounds=53.602861,-2.258041,53.623019,-2.221200 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.2 json_ms=0.2 total_ms=0.3
2026-04-04T21:25:04.497463Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1187 filters=1 travel=0 total=1187 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:25:05.401826Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=11630 parallel=false cells_before_filter=219 cells_after_filter=202 truncated=false bounds=53.5898,-2.2773,53.6336,-2.1972 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.5 json_ms=0.2 total_ms=0.7
2026-04-04T21:25:05.626108Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=11630 filters=1 travel=0 total=11630 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.2
2026-04-04T21:25:06.999635Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=45039 parallel=false cells_before_filter=735 cells_after_filter=668 truncated=false bounds=53.5648,-2.3138,53.6536,-2.1516 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.4 json_ms=0.6 total_ms=2.0
2026-04-04T21:25:07.291454Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=45039 filters=1 travel=0 total=45039 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.6
2026-04-04T21:25:08.673601Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=6807 parallel=false cells_before_filter=135 cells_after_filter=111 truncated=false bounds=53.5917,-2.2702,53.6233,-2.2123 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.2 json_ms=0.1 total_ms=0.4
2026-04-04T21:25:08.889264Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6807 filters=1 travel=0 total=6807 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:25:11.869639Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=5043 parallel=false cells_before_filter=122 cells_after_filter=107 truncated=false bounds=53.5943,-2.2762,53.6260,-2.2183 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T21:25:12.136461Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5043 filters=1 travel=0 total=5043 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:25:13.346199Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=13775 parallel=false cells_before_filter=219 cells_after_filter=191 truncated=false bounds=53.5874,-2.2839,53.6292,-2.2075 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.5 json_ms=0.2 total_ms=0.6
2026-04-04T21:25:13.636105Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=13775 filters=1 travel=0 total=13775 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.2
2026-04-04T21:25:15.227143Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=30294 parallel=false cells_before_filter=491 cells_after_filter=481 truncated=false bounds=53.5647,-2.3123,53.6388,-2.1769 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.9 json_ms=0.4 total_ms=1.3
2026-04-04T21:25:15.500335Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=30294 filters=1 travel=0 total=30294 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.5
2026-04-04T21:25:17.186115Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=39234 parallel=false cells_before_filter=599 cells_after_filter=550 truncated=false bounds=53.5434,-2.2831,53.6175,-2.1477 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.4 json_ms=0.6 total_ms=2.0
2026-04-04T21:25:17.379726Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=39234 filters=1 travel=0 total=39234 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.5
2026-04-04T21:25:18.196119Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=80938 parallel=true cells_before_filter=1122 cells_after_filter=1029 truncated=false bounds=53.5290,-2.3100,53.6269,-2.1314 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.9 json_ms=0.9 total_ms=2.8
2026-04-04T21:25:18.502221Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=80938 filters=1 travel=0 total=80938 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.9
2026-04-04T21:25:19.555827Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=87450 parallel=true cells_before_filter=1165 cells_after_filter=1091 truncated=false bounds=53.5171,-2.3084,53.6150,-2.1297 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.0 json_ms=1.0 total_ms=3.1
2026-04-04T21:25:20.251105Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=6799 parallel=false cells_before_filter=101 cells_after_filter=86 truncated=false bounds=53.5581,-2.2420,53.5838,-2.1950 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T21:25:20.469556Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6799 filters=1 travel=0 total=6799 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:25:20.875551Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=4514 parallel=false cells_before_filter=75 cells_after_filter=75 truncated=false bounds=53.5536,-2.2417,53.5793,-2.1947 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.3 json_ms=0.1 total_ms=0.4
2026-04-04T21:25:21.578531Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=113944 parallel=true cells_before_filter=1485 cells_after_filter=1385 truncated=false bounds=53.5055,-2.3235,53.6155,-2.1226 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.2 json_ms=1.1 total_ms=3.3
2026-04-04T21:25:21.789192Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=113944 filters=1 travel=0 total=113944 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.0
2026-04-04T21:25:22.365967Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=495522 parallel=true cells_before_filter=5928 cells_after_filter=5922 truncated=false bounds=53.4138,-2.4802,53.6854,-1.9846 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.3 json_ms=5.1 total_ms=12.4
2026-04-04T21:25:22.611118Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=495522 filters=1 travel=0 total=495522 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=3.8
2026-04-04T21:25:23.470771Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1233394 parallel=true cells_before_filter=909 cells_after_filter=909 truncated=false bounds=53.2464,-2.7654,53.8121,-1.7334 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.6 json_ms=0.8 total_ms=7.4
2026-04-04T21:25:23.675686Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1233394 filters=1 travel=0 total=1233394 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=9.6
2026-04-04T21:25:25.802554Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=5193892 parallel=true cells_before_filter=1431 cells_after_filter=1431 truncated=false bounds=52.3020,-4.3764,54.4993,-0.3794 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=21.6 json_ms=1.0 total_ms=22.8
2026-04-04T21:25:26.130438Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5193892 filters=1 travel=0 total=5193892 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=41.5
2026-04-04T21:25:26.790247Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=11373033 parallel=true cells_before_filter=3016 cells_after_filter=3016 truncated=false bounds=51.3516,-6.4391,55.4512,1.0238 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=78.7 json_ms=2.6 total_ms=81.8
2026-04-04T21:25:27.139727Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=11373033 filters=1 travel=0 total=11373033 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=120.5
2026-04-04T21:25:28.269198Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1196051 parallel=true cells_before_filter=1270 cells_after_filter=1270 truncated=false bounds=53.4643,-2.4750,54.1562,-1.2044 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.0 json_ms=1.0 total_ms=8.0
2026-04-04T21:25:28.564797Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1196051 filters=1 travel=0 total=1196051 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=9.8
2026-04-04T21:25:29.820690Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=2131285 parallel=true cells_before_filter=2231 cells_after_filter=2231 truncated=false bounds=53.2194,-2.7823,54.1303,-1.1149 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.3 json_ms=1.6 total_ms=12.0
2026-04-04T21:25:30.099688Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2131285 filters=1 travel=0 total=2131285 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=17.3
2026-04-04T21:25:52.728795Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T21:25:52.728945Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T21:25:52.728952Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T21:25:52.788147Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T21:25:52.788157Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T21:25:55.029247Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T21:25:55.029283Z INFO property_map_server::data::property: Feature columns from config numeric=54 enums=7 total=61
2026-04-04T21:25:56.017191Z INFO property_map_server::data::property: Combined data selected rows=15203393
2026-04-04T21:25:56.174457Z INFO property_map_server::data::property: Extracting numeric feature columns
2026-04-04T21:25:56.506324Z INFO property_map_server::data::property: Computing histograms for numeric features
2026-04-04T21:25:57.577038Z INFO property_map_server::data::property: Extracting string columns
2026-04-04T21:25:58.922509Z INFO property_map_server::data::property: Building enum features
2026-04-04T21:26:00.188231Z INFO property_map_server::data::property: Extracting renovation history
2026-04-04T21:26:02.819456Z INFO property_map_server::data::property: Renovation history extracted properties_with_events=1829784
2026-04-04T21:26:02.819464Z INFO property_map_server::data::property: Sorting rows by spatial locality
2026-04-04T21:26:03.747644Z INFO property_map_server::data::property: Building interned strings
2026-04-04T21:26:09.179209Z INFO property_map_server::data::property: Transposing to row-major layout (spatially sorted, quantized to u16)
2026-04-04T21:26:11.598079Z INFO property_map_server::data::property: Data loading complete
2026-04-04T21:26:12.610123Z INFO property_map_server: Property data loaded rows=15203393 features=61 enums=7
2026-04-04T21:26:12.610132Z INFO property_map_server: Building spatial grid index (0.01° cells)
2026-04-04T21:26:12.703456Z INFO property_map_server: Precomputing H3 cells at resolution 12
2026-04-04T21:26:12.703466Z INFO property_map_server::data::property: Precomputing H3 cells at resolution 12
2026-04-04T21:26:13.062704Z INFO property_map_server::data::property: H3 precomputation complete (15203393 cells)
2026-04-04T21:26:13.062729Z INFO property_map_server: Loading POI data from /app/data/filtered_uk_pois.parquet
2026-04-04T21:26:13.062735Z INFO property_map_server::data::poi: Loading POI data from "/app/data/filtered_uk_pois.parquet"...
2026-04-04T21:26:13.083743Z INFO property_map_server::data::poi: Loaded 550611 POIs
2026-04-04T21:26:13.168120Z INFO property_map_server::data::poi: POI string columns interned category_unique=74 group_unique=11 emoji_unique=71
2026-04-04T21:26:13.168628Z INFO property_map_server::data::poi: POI data loading complete.
2026-04-04T21:26:13.199418Z INFO property_map_server: POI data loaded pois=550611
2026-04-04T21:26:13.199428Z INFO property_map_server: Building POI spatial grid index
2026-04-04T21:26:13.204105Z INFO property_map_server: Loading place data from /app/data/places.parquet
2026-04-04T21:26:13.204119Z INFO property_map_server::data::places: Loading place data from "/app/data/places.parquet"...
2026-04-04T21:26:13.206303Z INFO property_map_server::data::places: Loaded 3474 places
2026-04-04T21:26:13.207009Z INFO property_map_server::data::places: Place data loaded places=3474 types=2 with_population=71 with_city=3392
2026-04-04T21:26:13.207058Z INFO property_map_server: Place data loaded places=3474
2026-04-04T21:26:13.207066Z INFO property_map_server: Loading postcode boundaries from /app/data/postcode_boundaries
2026-04-04T21:26:13.207068Z INFO property_map_server::data::postcodes: Loading postcode boundaries from "/app/data/postcode_boundaries"
2026-04-04T21:26:13.207815Z INFO property_map_server::data::postcodes: Found GeoJSON files to process files=2361
2026-04-04T21:26:21.471682Z INFO property_map_server::data::postcodes: Postcode boundary data ready postcodes=1490140
2026-04-04T21:26:21.699479Z INFO property_map_server: Postcode boundaries loaded postcodes=1490140
2026-04-04T21:26:21.837577Z INFO property_map_server::data::postcodes: Outcode data derived from postcodes outcodes=2361
2026-04-04T21:26:21.837632Z INFO property_map_server: Loading PMTiles from /app/data/uk.pmtiles
2026-04-04T21:26:21.837864Z INFO property_map_server: PMTiles loaded successfully
2026-04-04T21:26:21.874519Z INFO property_map_server: No --dist provided; static serving and OG injection disabled
2026-04-04T21:26:21.909323Z INFO property_map_server: Screenshot service configured: http://screenshot:8002
2026-04-04T21:26:21.909469Z INFO property_map_server: Precomputed features response groups=8
2026-04-04T21:26:21.909487Z INFO property_map_server: PocketBase configured: http://pocketbase:8090
2026-04-04T21:26:21.956480Z INFO property_map_server::pocketbase: PocketBase users collection already has all required fields
2026-04-04T21:26:21.961990Z INFO property_map_server::pocketbase: PocketBase collection 'saved_searches' API rules updated
2026-04-04T21:26:21.965566Z INFO property_map_server::pocketbase: PocketBase collection 'saved_properties' API rules updated
2026-04-04T21:26:22.012192Z INFO property_map_server::pocketbase: PocketBase meta.appURL set to https://perfect-postcodes.co.uk/pb
2026-04-04T21:26:22.015233Z INFO property_map_server::pocketbase: PocketBase OAuth configured on users collection
2026-04-04T21:26:22.015258Z INFO property_map_server: Gemini configured (model: gemini-3-flash-preview)
2026-04-04T21:26:22.015274Z INFO property_map_server: Loading travel time data from /app/data/travel-times
2026-04-04T21:26:22.017206Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="bicycle" destinations=2753
2026-04-04T21:26:22.018731Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="walking" destinations=2753
2026-04-04T21:26:22.020529Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="car" destinations=2753
2026-04-04T21:26:22.021875Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="transit" destinations=2752
2026-04-04T21:26:22.021901Z INFO property_map_server: Travel time store loaded modes=4
2026-04-04T21:26:22.021946Z INFO property_map_server: Precomputed AI filters system prompt
2026-04-04T21:26:23.341053Z INFO property_map_server: All memory pages locked (mlockall)
2026-04-04T21:26:23.341094Z INFO property_map_server: Server listening on 0.0.0.0:8001
2026-04-04T21:27:11.787474Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=347953 parallel=true cells_before_filter=1551 cells_after_filter=1547 truncated=false bounds=53.6208,-2.1919,53.9374,-1.6111 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.1 json_ms=1.5 total_ms=11.6
2026-04-04T21:27:12.024401Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=347953 filters=1 travel=0 total=347953 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=3.3
2026-04-04T21:27:12.466998Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=53069 parallel=true cells_before_filter=873 cells_after_filter=857 truncated=false bounds=53.7628,-1.9818,53.8685,-1.7877 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.8 total_ms=2.3
2026-04-04T21:27:12.717108Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=53069 filters=1 travel=0 total=53069 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.7
2026-04-04T21:27:15.745951Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=91391 parallel=true cells_before_filter=1334 cells_after_filter=1299 truncated=false bounds=53.7628,-2.0381,53.8685,-1.7314 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.0 json_ms=1.2 total_ms=3.2
2026-04-04T21:27:15.993312Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=91391 filters=1 travel=0 total=91391 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.7
2026-04-04T21:27:17.058890Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=99218 parallel=true cells_before_filter=1495 cells_after_filter=1382 truncated=false bounds=53.7793,-2.0193,53.8849,-1.7126 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.0 json_ms=1.2 total_ms=3.2
2026-04-04T21:27:17.305051Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=99218 filters=1 travel=0 total=99218 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.0
2026-04-04T21:27:28.664809Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T21:27:28.664958Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T21:27:28.664964Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T21:27:28.723545Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T21:27:28.723555Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T21:27:34.972862Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T21:27:34.973031Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T21:27:34.973044Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T21:27:35.033910Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T21:27:35.033922Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T21:27:37.455602Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T21:27:37.455638Z INFO property_map_server::data::property: Feature columns from config numeric=54 enums=7 total=61
2026-04-04T21:27:38.400727Z INFO property_map_server::data::property: Combined data selected rows=15203393
2026-04-04T21:27:38.555238Z INFO property_map_server::data::property: Extracting numeric feature columns
2026-04-04T21:27:38.888730Z INFO property_map_server::data::property: Computing histograms for numeric features
2026-04-04T21:27:39.916371Z INFO property_map_server::data::property: Extracting string columns
2026-04-04T21:27:41.225969Z INFO property_map_server::data::property: Building enum features
2026-04-04T21:27:42.501599Z INFO property_map_server::data::property: Extracting renovation history
2026-04-04T21:27:45.093068Z INFO property_map_server::data::property: Renovation history extracted properties_with_events=1829784
2026-04-04T21:27:45.093077Z INFO property_map_server::data::property: Sorting rows by spatial locality
2026-04-04T21:27:45.925955Z INFO property_map_server::data::property: Building interned strings
2026-04-04T21:27:51.209417Z INFO property_map_server::data::property: Transposing to row-major layout (spatially sorted, quantized to u16)
2026-04-04T21:27:53.761298Z INFO property_map_server::data::property: Data loading complete
2026-04-04T21:27:54.975285Z INFO property_map_server: Property data loaded rows=15203393 features=61 enums=7
2026-04-04T21:27:54.975295Z INFO property_map_server: Building spatial grid index (0.01° cells)
2026-04-04T21:27:55.076486Z INFO property_map_server: Precomputing H3 cells at resolution 12
2026-04-04T21:27:55.076495Z INFO property_map_server::data::property: Precomputing H3 cells at resolution 12
2026-04-04T21:27:55.450871Z INFO property_map_server::data::property: H3 precomputation complete (15203393 cells)
2026-04-04T21:27:55.450896Z INFO property_map_server: Loading POI data from /app/data/filtered_uk_pois.parquet
2026-04-04T21:27:55.450903Z INFO property_map_server::data::poi: Loading POI data from "/app/data/filtered_uk_pois.parquet"...
2026-04-04T21:27:55.469364Z INFO property_map_server::data::poi: Loaded 550611 POIs
2026-04-04T21:27:55.557922Z INFO property_map_server::data::poi: POI string columns interned category_unique=74 group_unique=11 emoji_unique=71
2026-04-04T21:27:55.558367Z INFO property_map_server::data::poi: POI data loading complete.
2026-04-04T21:27:55.595244Z INFO property_map_server: POI data loaded pois=550611
2026-04-04T21:27:55.595259Z INFO property_map_server: Building POI spatial grid index
2026-04-04T21:27:55.600118Z INFO property_map_server: Loading place data from /app/data/places.parquet
2026-04-04T21:27:55.600131Z INFO property_map_server::data::places: Loading place data from "/app/data/places.parquet"...
2026-04-04T21:27:55.600656Z INFO property_map_server::data::places: Loaded 3474 places
2026-04-04T21:27:55.601496Z INFO property_map_server::data::places: Place data loaded places=3474 types=2 with_population=71 with_city=3392
2026-04-04T21:27:55.601547Z INFO property_map_server: Place data loaded places=3474
2026-04-04T21:27:55.601556Z INFO property_map_server: Loading postcode boundaries from /app/data/postcode_boundaries
2026-04-04T21:27:55.601559Z INFO property_map_server::data::postcodes: Loading postcode boundaries from "/app/data/postcode_boundaries"
2026-04-04T21:27:55.602358Z INFO property_map_server::data::postcodes: Found GeoJSON files to process files=2361
2026-04-04T21:28:01.839376Z INFO property_map_server::data::postcodes: Postcode boundary data ready postcodes=1490140
2026-04-04T21:28:02.059240Z INFO property_map_server: Postcode boundaries loaded postcodes=1490140
2026-04-04T21:28:02.200249Z INFO property_map_server::data::postcodes: Outcode data derived from postcodes outcodes=2361
2026-04-04T21:28:02.200307Z INFO property_map_server: Loading PMTiles from /app/data/uk.pmtiles
2026-04-04T21:28:02.200608Z INFO property_map_server: PMTiles loaded successfully
2026-04-04T21:28:02.235489Z INFO property_map_server: No --dist provided; static serving and OG injection disabled
2026-04-04T21:28:02.262240Z INFO property_map_server: Screenshot service configured: http://screenshot:8002
2026-04-04T21:28:02.262409Z INFO property_map_server: Precomputed features response groups=8
2026-04-04T21:28:02.262422Z INFO property_map_server: PocketBase configured: http://pocketbase:8090
2026-04-04T21:28:02.320610Z INFO property_map_server::pocketbase: PocketBase users collection already has all required fields
2026-04-04T21:28:02.322978Z INFO property_map_server::pocketbase: PocketBase collection 'saved_searches' API rules updated
2026-04-04T21:28:02.387943Z INFO property_map_server::pocketbase: PocketBase collection 'saved_properties' API rules updated
2026-04-04T21:28:02.434871Z INFO property_map_server::pocketbase: PocketBase meta.appURL set to https://perfect-postcodes.co.uk/pb
2026-04-04T21:28:02.438845Z INFO property_map_server::pocketbase: PocketBase OAuth configured on users collection
2026-04-04T21:28:02.438873Z INFO property_map_server: Gemini configured (model: gemini-3-flash-preview)
2026-04-04T21:28:02.438890Z INFO property_map_server: Loading travel time data from /app/data/travel-times
2026-04-04T21:28:02.440124Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="bicycle" destinations=2753
2026-04-04T21:28:02.441306Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="walking" destinations=2753
2026-04-04T21:28:02.442591Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="car" destinations=2753
2026-04-04T21:28:02.443956Z INFO property_map_server::data::travel_time: Travel time mode discovered mode="transit" destinations=2752
2026-04-04T21:28:02.443974Z INFO property_map_server: Travel time store loaded modes=4
2026-04-04T21:28:02.444024Z INFO property_map_server: Precomputed AI filters system prompt
2026-04-04T21:28:03.733901Z INFO property_map_server: All memory pages locked (mlockall)
2026-04-04T21:28:03.733937Z INFO property_map_server: Server listening on 0.0.0.0:8001
2026-04-04T21:28:10.011222Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=426 postcodes_after_filter=311 filtered_out=115 truncated=false bounds=53.824509,-1.880638,53.847026,-1.815260 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.6 json_ms=1.7 total_ms=2.3
2026-04-04T21:28:10.323621Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5085 filters=1 travel=0 total=5085 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:10.989272Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=426 postcodes_after_filter=292 filtered_out=134 truncated=false bounds=53.821303,-1.881892,53.843821,-1.816513 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.5 json_ms=1.1 total_ms=1.6
2026-04-04T21:28:11.380501Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=38339 parallel=false cells_before_filter=597 cells_after_filter=562 truncated=false bounds=53.8007,-1.9389,53.8611,-1.7636 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.6 total_ms=2.1
2026-04-04T21:28:11.677279Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=38339 filters=1 travel=0 total=38339 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.6
2026-04-04T21:28:15.722697Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=7132 parallel=false cells_before_filter=131 cells_after_filter=115 truncated=false bounds=53.8174,-1.8898,53.8433,-1.8145 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.3 json_ms=0.1 total_ms=0.4
2026-04-04T21:28:15.969692Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=7132 filters=1 travel=0 total=7132 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:18.463608Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=190 postcodes_after_filter=95 filtered_out=95 truncated=false bounds=53.823693,-1.871321,53.837419,-1.831471 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.2 json_ms=0.3 total_ms=0.6
2026-04-04T21:28:18.748191Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2315 filters=1 travel=0 total=2315 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:19.685883Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=201 postcodes_after_filter=184 filtered_out=17 truncated=false bounds=53.820906,-1.879234,53.839748,-1.824532 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.2 json_ms=0.6 total_ms=0.8
2026-04-04T21:28:20.057723Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=201 postcodes_after_filter=192 filtered_out=9 truncated=false bounds=53.820751,-1.879673,53.839877,-1.824147 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.3 json_ms=0.6 total_ms=1.0
2026-04-04T21:28:20.494347Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=590 postcodes_after_filter=283 filtered_out=307 truncated=false bounds=53.819134,-1.884266,53.841229,-1.820119 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.8 json_ms=1.1 total_ms=1.9
2026-04-04T21:28:20.736977Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=7132 filters=1 travel=0 total=7132 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:21.116412Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=7132 parallel=false cells_before_filter=131 cells_after_filter=115 truncated=false bounds=53.8168,-1.8908,53.8431,-1.8144 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.2 total_ms=0.5
2026-04-04T21:28:21.387966Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=7132 filters=1 travel=0 total=7132 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.2
2026-04-04T21:28:23.333561Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=201 postcodes_after_filter=170 filtered_out=31 truncated=false bounds=53.821830,-1.876286,53.839491,-1.825012 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.3 json_ms=0.6 total_ms=0.9
2026-04-04T21:28:23.644233Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2390 filters=1 travel=0 total=2390 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.0
2026-04-04T21:28:26.939418Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=577 postcodes_after_filter=259 filtered_out=318 truncated=false bounds=53.819923,-1.881362,53.841155,-1.819720 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 agg_ms=0.6 json_ms=0.8 total_ms=1.4
2026-04-04T21:28:27.640195Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=7132 parallel=false cells_before_filter=131 cells_after_filter=113 truncated=false bounds=53.8179,-1.8868,53.8429,-1.8141 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.2 total_ms=0.5
2026-04-04T21:28:27.890095Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=7132 filters=1 travel=0 total=7132 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:31.722654Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=891942cd14bffff resolution=9 total_count=87 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:32.081693Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=7047 parallel=false cells_before_filter=120 cells_after_filter=98 truncated=false bounds=53.8179,-1.8803,53.8429,-1.8205 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.3 json_ms=0.1 total_ms=0.4
2026-04-04T21:28:32.343104Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=7047 filters=1 travel=0 total=7047 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.1
2026-04-04T21:28:55.584614Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=23936 parallel=false cells_before_filter=382 cells_after_filter=348 truncated=false bounds=53.8052,-1.9143,53.8569,-1.7907 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.0 json_ms=0.3 total_ms=1.3
2026-04-04T21:28:55.827169Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=23936 filters=1 travel=0 total=23936 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.4
2026-04-04T21:28:56.478664Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=8750 parallel=false cells_before_filter=155 cells_after_filter=142 truncated=false bounds=53.8143,-1.8899,53.8469,-1.8121 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.2 total_ms=0.6
2026-04-04T21:28:56.722027Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=8750 filters=1 travel=0 total=8750 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.2
2026-04-04T21:29:07.746246Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=20144 parallel=false cells_before_filter=345 cells_after_filter=292 truncated=false bounds=53.8038,-1.9140,53.8514,-1.8003 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.7 json_ms=0.3 total_ms=1.0
2026-04-04T21:29:07.999314Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=20144 filters=1 travel=0 total=20144 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.4
2026-04-04T21:29:13.081915Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=138104 parallel=true cells_before_filter=2157 cells_after_filter=2100 truncated=false bounds=53.7500,-2.0477,53.9030,-1.6821 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=8.2 json_ms=3.0 total_ms=11.3
2026-04-04T21:29:13.318739Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=138104 filters=1 travel=0 total=138104 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.3
2026-04-04T21:29:13.990666Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=35316 parallel=false cells_before_filter=555 cells_after_filter=499 truncated=false bounds=53.7954,-1.9349,53.8594,-1.7818 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.1 json_ms=0.4 total_ms=1.5
2026-04-04T21:29:14.265038Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=35316 filters=1 travel=0 total=35316 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.6
2026-04-04T21:29:14.914390Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=891942cd14bffff resolution=9 total_count=87 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:29:14.914700Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=35316 parallel=false cells_before_filter=555 cells_after_filter=499 truncated=false bounds=53.7954,-1.9349,53.8594,-1.7818 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.8 json_ms=0.3 total_ms=1.1
2026-04-04T21:29:21.096776Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=35316 parallel=false cells_before_filter=555 cells_after_filter=499 truncated=false bounds=53.7954,-1.9349,53.8594,-1.7818 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.6 json_ms=0.6 total_ms=2.2
2026-04-04T21:29:23.135019Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=35316 parallel=false cells_before_filter=555 cells_after_filter=504 truncated=false bounds=53.7952,-1.9352,53.8596,-1.7814 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.1 json_ms=0.4 total_ms=1.6
2026-04-04T21:29:24.036190Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=39490 parallel=false cells_before_filter=624 cells_after_filter=553 truncated=false bounds=53.7943,-1.9374,53.8603,-1.7798 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.1 json_ms=0.5 total_ms=1.6
2026-04-04T21:29:24.522514Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=73569 parallel=true cells_before_filter=1143 cells_after_filter=1080 truncated=false bounds=53.7771,-1.9798,53.8736,-1.7492 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.6 json_ms=0.8 total_ms=5.4
2026-04-04T21:29:26.348676Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=65304 parallel=true cells_before_filter=1040 cells_after_filter=1038 truncated=false bounds=53.7813,-1.9748,53.8777,-1.7442 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.4 json_ms=1.2 total_ms=2.6
2026-04-04T21:29:28.594018Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=82796 parallel=true cells_before_filter=1241 cells_after_filter=1218 truncated=false bounds=53.7813,-1.9995,53.8777,-1.7195 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.7 json_ms=1.1 total_ms=2.9
2026-04-04T21:29:49.305834Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=294467 parallel=true cells_before_filter=4705 cells_after_filter=4576 truncated=false bounds=53.7161,-2.1842,53.9316,-1.5588 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.9 json_ms=5.5 total_ms=11.5
2026-04-04T21:29:50.604880Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=337834 parallel=true cells_before_filter=5113 cells_after_filter=4939 truncated=false bounds=53.7096,-2.1449,53.9251,-1.5194 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.4 json_ms=4.8 total_ms=11.1
2026-04-04T21:29:56.752721Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=2397191 parallel=true cells_before_filter=2201 cells_after_filter=2201 truncated=false bounds=53.3479,-3.3374,54.1166,-1.1108 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=14.1 json_ms=1.8 total_ms=16.0
2026-04-04T21:29:57.713703Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=5087858 parallel=true cells_before_filter=1489 cells_after_filter=1489 truncated=false bounds=52.4699,-6.3671,54.6166,-0.1754 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.3 agg_ms=24.1 json_ms=1.4 total_ms=25.7
2026-04-04T21:30:01.060907Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=684 cells_after_filter=684 truncated=false bounds=48.8064,-13.1250,56.4830,8.6250 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=66.7 json_ms=0.6 total_ms=68.1
2026-04-04T21:30:02.219696Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13169637 parallel=true cells_before_filter=3374 cells_after_filter=3374 truncated=false bounds=50.2432,-6.3164,53.8345,3.6939 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=59.9 json_ms=2.9 total_ms=63.3
2026-04-04T21:30:02.874487Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5607163 parallel=true cells_before_filter=6865 cells_after_filter=6865 truncated=false bounds=51.0991,-1.9396,52.4124,1.6959 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=25.6 json_ms=5.5 total_ms=31.2
2026-04-04T21:30:03.690035Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5528601 parallel=true cells_before_filter=6901 cells_after_filter=6901 truncated=false bounds=50.9828,-2.0299,52.2995,1.6056 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=29.9 json_ms=5.7 total_ms=35.7
2026-04-04T21:30:06.102583Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=3013192 parallel=true cells_before_filter=6695 cells_after_filter=6688 truncated=false bounds=51.3269,-0.7786,51.8230,0.5891 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.0 json_ms=5.7 total_ms=23.8
2026-04-04T21:30:07.773783Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4117670 parallel=true cells_before_filter=3011 cells_after_filter=3011 truncated=false bounds=51.1921,-1.3108,52.0032,0.9263 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.1 json_ms=2.4 total_ms=20.5
2026-04-04T21:30:12.502609Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=592886 parallel=true cells_before_filter=5330 cells_after_filter=5281 truncated=false bounds=51.5610,-0.3722,51.7634,0.1871 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.5 json_ms=4.6 total_ms=12.2
2026-04-04T21:30:14.708086Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=297106 parallel=true cells_before_filter=2754 cells_after_filter=2722 truncated=false bounds=51.5933,-0.2872,51.7371,0.1100 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.4 json_ms=2.3 total_ms=6.7
2026-04-04T21:30:36.062858Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=1004997 parallel=true cells_before_filter=8555 cells_after_filter=8488 truncated=false bounds=51.5353,-0.4799,51.7896,0.2228 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=12.5 json_ms=7.9 total_ms=20.4
2026-04-04T21:30:40.917272Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=1170804 parallel=true cells_before_filter=9057 cells_after_filter=9032 truncated=false bounds=51.5124,-0.4667,51.7669,0.2359 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=13.5 json_ms=8.4 total_ms=21.8
2026-04-04T21:30:50.744626Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=1411338 parallel=true cells_before_filter=9609 cells_after_filter=9578 truncated=false bounds=51.4806,-0.4669,51.7353,0.2357 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=16.7 json_ms=8.7 total_ms=25.5
2026-04-04T21:30:58.389937Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1773792 parallel=true cells_before_filter=2705 cells_after_filter=2699 truncated=false bounds=51.4581,-0.5455,51.7568,0.2785 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.4 json_ms=2.0 total_ms=12.5
2026-04-04T21:30:59.298129Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2160118 parallel=true cells_before_filter=3703 cells_after_filter=3702 truncated=false bounds=51.4272,-0.6534,51.7863,0.3372 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=11.6 json_ms=2.7 total_ms=14.4
2026-04-04T21:30:59.866035Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=1045678 parallel=true cells_before_filter=6917 cells_after_filter=6685 truncated=false bounds=51.5066,-0.3761,51.7104,0.1862 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.6 json_ms=6.7 total_ms=17.3
2026-04-04T21:31:00.598034Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=532096 parallel=true cells_before_filter=3591 cells_after_filter=3554 truncated=false bounds=51.5403,-0.2689,51.6831,0.1252 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.9 json_ms=3.1 total_ms=9.0
2026-04-04T21:31:01.673510Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=765887 parallel=true cells_before_filter=5083 cells_after_filter=5002 truncated=false bounds=51.5256,-0.3207,51.6998,0.1600 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=8.2 json_ms=4.1 total_ms=12.3
2026-04-04T21:31:03.865297Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=786332 parallel=true cells_before_filter=5323 cells_after_filter=5159 truncated=false bounds=51.5248,-0.3236,51.7007,0.1619 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=8.1 json_ms=4.3 total_ms=12.4
2026-04-04T21:31:12.740369Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=786332 parallel=true cells_before_filter=5323 cells_after_filter=5159 truncated=false bounds=51.5248,-0.3236,51.7007,0.1619 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.9 json_ms=4.6 total_ms=12.5
2026-04-04T21:31:13.248482Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=786332 parallel=true cells_before_filter=5323 cells_after_filter=5159 truncated=false bounds=51.5248,-0.3236,51.7007,0.1619 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.0 json_ms=2.8 total_ms=8.8
2026-04-04T21:31:13.856771Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=786332 parallel=true cells_before_filter=5323 cells_after_filter=5159 truncated=false bounds=51.5248,-0.3236,51.7007,0.1619 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=8.1 json_ms=5.2 total_ms=13.2
2026-04-04T21:31:30.556844Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=627630 parallel=true cells_before_filter=4637 cells_after_filter=4582 truncated=false bounds=51.5412,-0.2778,51.7171,0.2077 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.6 json_ms=4.6 total_ms=11.2
2026-04-04T21:31:32.422114Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=391345 parallel=true cells_before_filter=3031 cells_after_filter=2926 truncated=false bounds=51.5644,-0.2187,51.7009,0.1583 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.6 json_ms=2.3 total_ms=6.9
2026-04-04T21:31:37.600351Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221277 parallel=true cells_before_filter=1537 cells_after_filter=1428 truncated=false bounds=51.5792,-0.1423,51.6644,0.0928 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.8 json_ms=1.2 total_ms=4.0
2026-04-04T21:31:38.415050Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221277 parallel=true cells_before_filter=1537 cells_after_filter=1422 truncated=false bounds=51.5793,-0.1417,51.6641,0.0922 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.9 json_ms=1.3 total_ms=4.2
2026-04-04T21:31:38.943318Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=336467 parallel=true cells_before_filter=2450 cells_after_filter=2324 truncated=false bounds=51.5696,-0.1920,51.6882,0.1354 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.1 json_ms=2.1 total_ms=6.2
2026-04-04T21:31:56.678110Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=483490 parallel=true cells_before_filter=3617 cells_after_filter=3397 truncated=false bounds=51.5584,-0.2429,51.7075,0.1688 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.6 json_ms=3.5 total_ms=9.1
2026-04-04T21:32:05.629616Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3344923 parallel=true cells_before_filter=1652 cells_after_filter=1652 truncated=false bounds=51.3368,-0.9063,51.9227,0.7110 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=14.6 json_ms=1.3 total_ms=15.9
2026-04-04T21:32:06.669355Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=6697945 parallel=true cells_before_filter=9464 cells_after_filter=9464 truncated=false bounds=50.8847,-2.4875,52.4676,1.8868 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=39.3 json_ms=8.3 total_ms=47.7
2026-04-04T21:32:07.699409Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14461269 parallel=true cells_before_filter=683 cells_after_filter=683 truncated=false bounds=47.9331,-13.1250,55.7502,8.6250 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=64.6 json_ms=0.6 total_ms=66.0
2026-04-04T21:32:09.967169Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=684 cells_after_filter=684 truncated=false bounds=48.9908,-13.1250,56.6376,8.6250 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.9 json_ms=0.6 total_ms=62.4
2026-04-04T21:32:13.933486Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=8373227 parallel=true cells_before_filter=2077 cells_after_filter=2077 truncated=false bounds=51.3092,-3.9232,53.3230,1.7224 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=36.0 json_ms=1.6 total_ms=37.8
2026-04-04T21:32:16.663258Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.0 json_ms=0.5 total_ms=61.4
2026-04-04T21:32:17.817855Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.9 agg_ms=33.0 json_ms=0.4 total_ms=34.3
2026-04-04T21:32:19.556047Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=60.6 json_ms=0.5 total_ms=62.1
2026-04-04T21:32:22.335116Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=1.2 agg_ms=61.5 json_ms=0.5 total_ms=63.3
2026-04-04T21:32:22.665769Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=14454856 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=120.4
2026-04-04T21:32:23.735404Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=1.0 agg_ms=64.7 json_ms=0.3 total_ms=66.1
2026-04-04T21:32:24.281296Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.9 agg_ms=58.3 json_ms=0.4 total_ms=59.6
2026-04-04T21:32:24.636997Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=10723799 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other" ms=156.8
2026-04-04T21:32:25.094978Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other|Semi-Detached" fields=0 travel_entries=0 grid_ms=1.1 agg_ms=60.8 json_ms=0.4 total_ms=62.3
2026-04-04T21:32:25.384531Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=14454856 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other|Semi-Detached" ms=121.9
2026-04-04T21:32:26.613557Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.9 agg_ms=60.5 json_ms=0.4 total_ms=61.8
2026-04-04T21:32:26.892632Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=10723799 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other" ms=158.7
2026-04-04T21:32:28.668464Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other" fields=1 travel_entries=0 grid_ms=1.2 agg_ms=61.2 json_ms=0.6 total_ms=63.0
2026-04-04T21:32:31.751601Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other|Semi-Detached" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.2 json_ms=0.5 total_ms=61.7
2026-04-04T21:32:32.055189Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=14454856 filters_raw="Property type:Detached|Terraced|Flats/Maisonettes|Other|Semi-Detached" ms=121.3
2026-04-04T21:32:33.490781Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other|Semi-Detached" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=62.6 json_ms=0.5 total_ms=64.0
2026-04-04T21:32:33.812666Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=11724005 filters_raw="Property type:Detached|Terraced|Other|Semi-Detached" ms=139.1
2026-04-04T21:32:40.739326Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=64.6 json_ms=0.9 total_ms=66.4
2026-04-04T21:32:41.073620Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.6 json_ms=0.6 total_ms=62.1
2026-04-04T21:32:41.440620Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=10723799 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=154.9
2026-04-04T21:32:42.371088Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=58.4 json_ms=0.6 total_ms=59.9
2026-04-04T21:32:42.726570Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=7992948 filters_raw="Property type:Detached|Terraced|Other" ms=168.8
2026-04-04T21:32:43.395357Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=62.2 json_ms=0.5 total_ms=63.7
2026-04-04T21:32:43.722558Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=10723799 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=151.6
2026-04-04T21:32:44.510833Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=59.1 json_ms=0.6 total_ms=60.7
2026-04-04T21:32:44.864173Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=7992948 filters_raw="Property type:Detached|Terraced|Other" ms=166.8
2026-04-04T21:32:45.584213Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=674 cells_after_filter=674 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.2 json_ms=0.5 total_ms=61.7
2026-04-04T21:32:45.927175Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=10723799 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=155.7
2026-04-04T21:32:53.444776Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=12780596 parallel=true cells_before_filter=3350 cells_after_filter=3350 truncated=false bounds=49.4203,-7.2158,53.7443,4.7186 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=56.6 json_ms=2.5 total_ms=59.7
2026-04-04T21:32:53.768234Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=12780596 filters=1 travel=0 total=9552008 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=137.8
2026-04-04T21:32:54.752631Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=9995567 parallel=true cells_before_filter=2685 cells_after_filter=2685 truncated=false bounds=50.1790,-4.6985,52.9895,3.0545 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.3 agg_ms=45.4 json_ms=2.1 total_ms=47.8
2026-04-04T21:32:55.059537Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=9995567 filters=1 travel=0 total=7648127 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=107.1
2026-04-04T21:33:02.804486Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=10722150 parallel=true cells_before_filter=2991 cells_after_filter=2991 truncated=false bounds=49.9036,-5.5531,53.2819,3.7696 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.4 agg_ms=44.9 json_ms=2.7 total_ms=47.9
2026-04-04T21:33:03.097495Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=10722150 filters=1 travel=0 total=8166919 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=110.9
2026-04-04T21:33:03.770963Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13702207 parallel=true cells_before_filter=3737 cells_after_filter=3737 truncated=false bounds=48.8917,-8.6525,54.3257,6.3632 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=63.8 json_ms=3.0 total_ms=67.4
2026-04-04T21:33:04.513496Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=10438893 parallel=true cells_before_filter=2876 cells_after_filter=2876 truncated=false bounds=50.0106,-5.2217,53.1687,3.4923 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.3 agg_ms=43.5 json_ms=2.5 total_ms=46.3
2026-04-04T21:33:04.812953Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=10438893 filters=1 travel=0 total=7963651 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=110.7
2026-04-04T21:33:05.601752Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=8625609 parallel=true cells_before_filter=2017 cells_after_filter=2017 truncated=false bounds=50.7299,-3.3220,52.6362,1.9472 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=33.5 json_ms=1.6 total_ms=35.4
2026-04-04T21:33:05.965054Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=8625609 filters=1 travel=0 total=6631072 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=87.7
2026-04-04T21:33:06.553583Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5248528 parallel=true cells_before_filter=6023 cells_after_filter=6023 truncated=false bounds=51.1160,-2.2110,52.2923,1.0414 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=25.3 json_ms=5.1 total_ms=30.5
2026-04-04T21:33:06.829140Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5248528 filters=1 travel=0 total=4117755 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=51.8
2026-04-04T21:33:08.289506Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=96360 parallel=true cells_before_filter=1196 cells_after_filter=1054 truncated=false bounds=51.5790,-0.5645,51.6610,-0.3382 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.2 json_ms=0.9 total_ms=3.0
2026-04-04T21:33:08.544379Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=96360 filters=1 travel=0 total=71786 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=1.2
2026-04-04T21:33:15.174577Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=96360 parallel=true cells_before_filter=1196 cells_after_filter=1054 truncated=false bounds=51.5790,-0.5645,51.6610,-0.3382 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.9 json_ms=0.6 total_ms=2.5
2026-04-04T21:33:17.969720Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=96360 parallel=true cells_before_filter=1196 cells_after_filter=1054 truncated=false bounds=51.5790,-0.5645,51.6610,-0.3382 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.8 json_ms=1.2 total_ms=3.0
2026-04-04T21:33:24.018929Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=96360 parallel=true cells_before_filter=1196 cells_after_filter=1054 truncated=false bounds=51.5790,-0.5645,51.6610,-0.3382 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.1 json_ms=0.9 total_ms=3.0
2026-04-04T21:33:25.744941Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=300642 parallel=true cells_before_filter=3566 cells_after_filter=3422 truncated=false bounds=51.5368,-0.6873,51.7005,-0.2356 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.0 json_ms=3.0 total_ms=7.9
2026-04-04T21:33:26.049103Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=300642 filters=1 travel=0 total=221606 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=3.1
2026-04-04T21:33:27.027382Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=317371 parallel=true cells_before_filter=3513 cells_after_filter=3489 truncated=false bounds=51.5446,-0.6467,51.7082,-0.1950 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.6 json_ms=2.8 total_ms=7.5
2026-04-04T21:33:27.268262Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=317371 filters=1 travel=0 total=235468 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=3.0
2026-04-04T21:33:28.294642Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1496786 parallel=true cells_before_filter=3104 cells_after_filter=3097 truncated=false bounds=51.4283,-0.9955,51.7611,-0.0776 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.9 json_ms=2.9 total_ms=12.8
2026-04-04T21:33:28.674613Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1496786 filters=1 travel=0 total=1242092 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=14.0
2026-04-04T21:33:29.660478Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1652635 parallel=true cells_before_filter=3080 cells_after_filter=3080 truncated=false bounds=51.4538,-0.8821,51.7864,0.0358 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.4 json_ms=2.2 total_ms=11.7
2026-04-04T21:33:29.894294Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1652635 filters=1 travel=0 total=1408419 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=15.9
2026-04-04T21:33:30.802591Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3978898 parallel=true cells_before_filter=3037 cells_after_filter=3037 truncated=false bounds=51.2323,-1.6770,52.0479,0.5749 filters=1 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.8 json_ms=2.4 total_ms=21.3
2026-04-04T21:33:31.014860Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3978898 filters=1 travel=0 total=3175557 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes" ms=38.4
2026-04-04T21:33:31.720801Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3978898 parallel=true cells_before_filter=3037 cells_after_filter=3037 truncated=false bounds=51.2323,-1.6770,52.0479,0.5749 filters=2 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes;;Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.3 json_ms=2.3 total_ms=20.6
2026-04-04T21:33:32.074454Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3978898 filters=2 travel=0 total=3175557 filters_raw="Property type:Detached|Terraced|Other|Flats/Maisonettes;;Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=55.7
2026-04-04T21:33:33.284872Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3978898 parallel=true cells_before_filter=3055 cells_after_filter=3055 truncated=false bounds=51.2323,-1.6770,52.0479,0.5749 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.5 json_ms=2.3 total_ms=20.8
2026-04-04T21:33:33.581183Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3978898 filters=1 travel=0 total=3978898 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=30.6
2026-04-04T21:33:34.812002Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=8610789 parallel=true cells_before_filter=1928 cells_after_filter=1928 truncated=false bounds=50.6957,-2.7809,52.6612,2.6512 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=36.4 json_ms=1.7 total_ms=38.2
2026-04-04T21:33:35.112097Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=8610789 filters=1 travel=0 total=8610789 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=70.0
2026-04-04T21:33:37.073037Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14458756 parallel=true cells_before_filter=680 cells_after_filter=680 truncated=false bounds=47.7854,-13.1250,55.6261,8.6250 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.1 json_ms=0.6 total_ms=61.5
2026-04-04T21:33:37.380857Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14458756 filters=1 travel=0 total=14458756 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=119.2
2026-04-04T21:33:39.333761Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=6975809 parallel=true cells_before_filter=1435 cells_after_filter=1435 truncated=false bounds=50.6529,-2.1414,52.4436,2.7932 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=25.7 json_ms=1.1 total_ms=26.9
2026-04-04T21:33:39.556716Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6975809 filters=1 travel=0 total=6975809 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=54.8
2026-04-04T21:33:40.318427Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=7228971 parallel=true cells_before_filter=1502 cells_after_filter=1502 truncated=false bounds=50.6799,-2.2522,52.4696,2.6825 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=27.0 json_ms=1.2 total_ms=28.3
2026-04-04T21:33:40.626590Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=7228971 filters=1 travel=0 total=7228971 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=55.8
2026-04-04T21:33:41.103738Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3336426 parallel=true cells_before_filter=1702 cells_after_filter=1702 truncated=false bounds=51.2009,-0.7268,51.8159,0.9664 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=15.6 json_ms=1.5 total_ms=17.1
2026-04-04T21:33:41.386105Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3336426 filters=1 travel=0 total=3336426 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=26.3
2026-04-04T21:33:42.650652Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3449672 parallel=true cells_before_filter=1762 cells_after_filter=1762 truncated=false bounds=51.3044,-0.8347,51.9181,0.8585 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=15.3 json_ms=1.5 total_ms=16.8
2026-04-04T21:33:42.856936Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3449672 filters=1 travel=0 total=3449672 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=27.9
2026-04-04T21:33:43.509968Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4616617 parallel=true cells_before_filter=4112 cells_after_filter=4112 truncated=false bounds=51.1627,-1.3048,52.1586,1.4460 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=21.1 json_ms=3.5 total_ms=24.7
2026-04-04T21:33:43.817241Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=4616617 filters=1 travel=0 total=4616617 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=36.5
2026-04-04T21:33:44.410347Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4581448 parallel=true cells_before_filter=4161 cells_after_filter=4161 truncated=false bounds=51.0203,-1.3756,52.0193,1.3752 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=21.7 json_ms=3.5 total_ms=25.3
2026-04-04T21:33:44.665899Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=4581448 filters=1 travel=0 total=4581448 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=36.6
2026-04-04T21:33:46.098357Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=3163783 parallel=true cells_before_filter=7660 cells_after_filter=7660 truncated=false bounds=51.3468,-0.7578,51.8980,0.7634 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=19.5 json_ms=6.6 total_ms=26.1
2026-04-04T21:33:47.102965Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2876922 parallel=true cells_before_filter=7402 cells_after_filter=7402 truncated=false bounds=51.4036,-0.7471,51.9541,0.7741 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=18.4 json_ms=5.9 total_ms=24.3
2026-04-04T21:33:47.643017Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=905425 parallel=true cells_before_filter=2623 cells_after_filter=2621 truncated=false bounds=51.5540,-0.3978,51.8679,0.4704 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.9 json_ms=1.9 total_ms=8.9
2026-04-04T21:33:47.940483Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=905425 filters=1 travel=0 total=905425 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=7.1
2026-04-04T21:33:54.308913Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=442152 parallel=true cells_before_filter=5520 cells_after_filter=5474 truncated=false bounds=51.5903,-0.3059,51.8377,0.3782 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.9 json_ms=5.4 total_ms=12.2
2026-04-04T21:33:54.545434Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=442152 filters=1 travel=0 total=442152 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=3.6
2026-04-04T21:34:00.609508Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=184887 parallel=true cells_before_filter=2446 cells_after_filter=2327 truncated=false bounds=51.6277,-0.1985,51.7855,0.2379 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=3.7 json_ms=2.1 total_ms=5.9
2026-04-04T21:34:00.863349Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=184887 filters=1 travel=0 total=184887 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=1.6
2026-04-04T21:34:01.584377Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=64255 parallel=true cells_before_filter=809 cells_after_filter=728 truncated=false bounds=51.6585,-0.1097,51.7423,0.1221 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.3 json_ms=0.6 total_ms=1.9
2026-04-04T21:34:01.819812Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=64255 filters=1 travel=0 total=64255 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=0.5
2026-04-04T21:34:03.343292Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1202000 filters=1 travel=0 total=1202000 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=12.7
2026-04-04T21:34:03.344856Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1202000 parallel=true cells_before_filter=2915 cells_after_filter=2915 truncated=false bounds=51.5245,-0.4309,51.8515,0.4729 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.6 json_ms=3.6 total_ms=14.2
2026-04-04T21:34:10.096157Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=906401 parallel=true cells_before_filter=8776 cells_after_filter=8682 truncated=false bounds=51.5432,-0.3747,51.8268,0.4092 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=11.7 json_ms=7.8 total_ms=19.6
2026-04-04T21:34:10.330836Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=906401 filters=1 travel=0 total=906401 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=6.9
2026-04-04T21:34:11.754185Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=138 postcodes_after_filter=22 filtered_out=116 truncated=false bounds=51.648854,-0.025588,51.661937,0.010543 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 agg_ms=0.2 json_ms=0.1 total_ms=0.4
2026-04-04T21:34:11.976400Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2437 filters=1 travel=0 total=2437 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=0.0
2026-04-04T21:34:12.414072Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=374 postcodes_after_filter=99 filtered_out=275 truncated=false bounds=51.646012,-0.033694,51.664773,0.018120 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 agg_ms=0.7 json_ms=0.5 total_ms=1.2
2026-04-04T21:34:12.721667Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6305 filters=1 travel=0 total=6305 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=0.1
2026-04-04T21:34:17.223018Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=141611 parallel=true cells_before_filter=1256 cells_after_filter=1170 truncated=false bounds=51.6075,-0.1403,51.6940,0.0986 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=2.6 json_ms=1.1 total_ms=3.7
2026-04-04T21:34:17.450476Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=141611 filters=1 travel=0 total=141611 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=1.3
2026-04-04T21:34:18.366970Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1780314 parallel=true cells_before_filter=3128 cells_after_filter=3112 truncated=false bounds=51.4692,-0.5229,51.7989,0.3874 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=11.1 json_ms=2.7 total_ms=13.8
2026-04-04T21:34:18.604580Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1780314 filters=1 travel=0 total=1780314 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=16.6
2026-04-04T21:34:20.168537Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=3790705 parallel=true cells_before_filter=2355 cells_after_filter=2355 truncated=false bounds=51.2527,-1.1190,51.9618,0.8373 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=17.5 json_ms=2.0 total_ms=19.6
2026-04-04T21:34:20.433499Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=3790705 filters=1 travel=0 total=3790705 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=31.2
2026-04-04T21:34:21.487553Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4871923 parallel=true cells_before_filter=5125 cells_after_filter=5125 truncated=false bounds=51.0307,-1.7276,52.1276,1.2968 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=23.6 json_ms=4.2 total_ms=27.9
2026-04-04T21:34:21.918633Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5189397 parallel=true cells_before_filter=5986 cells_after_filter=5986 truncated=false bounds=50.9715,-1.8893,52.1715,1.4188 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=24.1 json_ms=4.6 total_ms=28.8
2026-04-04T21:34:22.210585Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5189397 filters=1 travel=0 total=5189397 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=40.0
2026-04-04T21:34:24.872990Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5057538 parallel=true cells_before_filter=5403 cells_after_filter=5403 truncated=false bounds=50.9449,-1.5349,52.1455,1.7732 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=28.5 json_ms=4.4 total_ms=33.0
2026-04-04T21:34:25.122132Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=5057538 filters=1 travel=0 total=5057538 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=39.7
2026-04-04T21:34:26.174410Z INFO property_map_server::routes::places: GET /api/places query="ig" results=7 scanned=3474 mode="-" ms=0.2
2026-04-04T21:34:26.668635Z INFO property_map_server::routes::places: GET /api/places query="ig9" results=1 scanned=3474 mode="-" ms=0.3
2026-04-04T21:34:27.725653Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=46658 parallel=false cells_before_filter=457 cells_after_filter=429 truncated=false bounds=51.6004,-0.0297,51.6512,0.1104 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.3 json_ms=0.3 total_ms=1.6
2026-04-04T21:34:28.031054Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=46658 filters=1 travel=0 total=46658 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=0.5
2026-04-04T21:34:29.448006Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=222483 parallel=true cells_before_filter=1789 cells_after_filter=1649 truncated=false bounds=51.5788,-0.1022,51.6842,0.1888 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=3.2 json_ms=1.6 total_ms=4.7
2026-04-04T21:34:29.741161Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=222483 filters=1 travel=0 total=222483 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=1.7
2026-04-04T21:34:30.362629Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=517738 parallel=true cells_before_filter=4314 cells_after_filter=4280 truncated=false bounds=51.5510,-0.2095,51.7331,0.2932 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.2 json_ms=4.1 total_ms=10.3
2026-04-04T21:34:30.603802Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=517738 filters=1 travel=0 total=517738 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=3.9
2026-04-04T21:34:34.058158Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1911310 parallel=true cells_before_filter=3447 cells_after_filter=3446 truncated=false bounds=51.4520,-0.5384,51.8030,0.4304 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=11.0 json_ms=2.6 total_ms=13.6
2026-04-04T21:34:34.314443Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1911310 filters=1 travel=0 total=1911310 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=15.1
2026-04-04T21:34:34.778117Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1643034 parallel=true cells_before_filter=3333 cells_after_filter=3332 truncated=false bounds=51.4816,-0.4301,51.8324,0.5388 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=9.9 json_ms=2.6 total_ms=12.5
2026-04-04T21:34:34.957632Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1643034 parallel=true cells_before_filter=3333 cells_after_filter=3332 truncated=false bounds=51.4818,-0.4301,51.8326,0.5388 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.4 json_ms=2.6 total_ms=13.0
2026-04-04T21:34:35.489104Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1588958 parallel=true cells_before_filter=3277 cells_after_filter=3277 truncated=false bounds=51.4851,-0.3927,51.8359,0.5762 filters=1 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=10.0 json_ms=2.7 total_ms=12.7
2026-04-04T21:34:35.798299Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1588958 filters=1 travel=0 total=1588958 filters_raw="Winning party:Labour|Conservative|Liberal Democrat|Reform UK|Green|Independent" ms=12.5
2026-04-04T21:34:37.946631Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1588958 parallel=true cells_before_filter=1824 cells_after_filter=1824 truncated=false bounds=51.4851,-0.3927,51.8359,0.5762 filters=1 filters_raw="Winning party:Conservative|Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.3 json_ms=1.6 total_ms=8.9
2026-04-04T21:34:38.247378Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1588958 parallel=true cells_before_filter=373 cells_after_filter=373 truncated=false bounds=51.4851,-0.3927,51.8359,0.5762 filters=1 filters_raw="Winning party:Liberal Democrat|Reform UK|Green|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.3 json_ms=0.3 total_ms=5.6
2026-04-04T21:34:38.501167Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1588958 parallel=true cells_before_filter=373 cells_after_filter=373 truncated=false bounds=51.4851,-0.3927,51.8359,0.5762 filters=1 filters_raw="Winning party:Liberal Democrat|Reform UK|Independent" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.6 json_ms=0.3 total_ms=4.9
2026-04-04T21:34:38.893838Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1588958 parallel=true cells_before_filter=351 cells_after_filter=351 truncated=false bounds=51.4851,-0.3927,51.8359,0.5762 filters=1 filters_raw="Winning party:Liberal Democrat|Reform UK" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.4 json_ms=0.3 total_ms=5.8
2026-04-04T21:34:39.217363Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1588958 parallel=true cells_before_filter=114 cells_after_filter=114 truncated=false bounds=51.4851,-0.3927,51.8359,0.5762 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.5 json_ms=0.1 total_ms=4.6
2026-04-04T21:34:39.481759Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1588958 filters=1 travel=0 total=23724 filters_raw="Winning party:Reform UK" ms=11.5
2026-04-04T21:34:40.592521Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454412 parallel=true cells_before_filter=23 cells_after_filter=23 truncated=false bounds=47.6020,-13.0060,55.4246,8.6012 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=45.5 json_ms=0.0 total_ms=46.6
2026-04-04T21:34:40.993926Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454412 filters=1 travel=0 total=137862 filters_raw="Winning party:Reform UK" ms=114.0
2026-04-04T21:34:42.850563Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=8095554 parallel=true cells_before_filter=26 cells_after_filter=26 truncated=false bounds=50.7556,-3.0700,52.5569,1.9058 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=19.2 json_ms=0.0 total_ms=19.4
2026-04-04T21:34:44.626220Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1505290 parallel=true cells_before_filter=120 cells_after_filter=120 truncated=false bounds=51.4015,-0.1662,51.7257,0.7276 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.5 json_ms=0.1 total_ms=4.6
2026-04-04T21:34:44.889173Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1505290 filters=1 travel=0 total=23927 filters_raw="Winning party:Reform UK" ms=11.4
2026-04-04T21:34:46.351838Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=1898446 parallel=true cells_before_filter=120 cells_after_filter=120 truncated=false bounds=51.3895,-0.2292,51.7440,0.7480 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=5.5 json_ms=0.1 total_ms=5.7
2026-04-04T21:34:46.760113Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2914623 parallel=true cells_before_filter=120 cells_after_filter=120 truncated=false bounds=51.3336,-0.5236,51.8294,0.8434 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.3 json_ms=0.1 total_ms=7.4
2026-04-04T21:34:47.035753Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=2914623 filters=1 travel=0 total=23927 filters_raw="Winning party:Reform UK" ms=21.2
2026-04-04T21:34:47.859550Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4532133 parallel=true cells_before_filter=91 cells_after_filter=91 truncated=false bounds=51.0793,-1.0447,52.0868,1.7337 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=11.2 json_ms=0.1 total_ms=11.3
2026-04-04T21:34:48.218667Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=4532133 filters=1 travel=0 total=58449 filters_raw="Winning party:Reform UK" ms=32.9
2026-04-04T21:34:51.181626Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=6177894 parallel=true cells_before_filter=91 cells_after_filter=91 truncated=false bounds=50.8101,-1.9583,52.3644,2.3284 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=20.1 json_ms=0.1 total_ms=20.4
2026-04-04T21:34:51.512056Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=6177894 filters=1 travel=0 total=58449 filters_raw="Winning party:Reform UK" ms=50.1
2026-04-04T21:34:52.289263Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=5764353 parallel=true cells_before_filter=98 cells_after_filter=98 truncated=false bounds=50.9925,-1.6526,52.5407,2.6342 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=14.7 json_ms=0.1 total_ms=15.0
2026-04-04T21:34:52.762463Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=10232695 parallel=true cells_before_filter=78 cells_after_filter=78 truncated=false bounds=50.3850,-3.6798,53.2070,4.1416 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.3 agg_ms=31.9 json_ms=0.1 total_ms=32.3
2026-04-04T21:34:53.421123Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=13914967 parallel=true cells_before_filter=81 cells_after_filter=81 truncated=false bounds=49.0383,-8.0832,54.6194,7.4159 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.6 agg_ms=42.3 json_ms=0.1 total_ms=43.0
2026-04-04T21:34:53.790052Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=13914967 filters=1 travel=0 total=137862 filters_raw="Winning party:Reform UK" ms=111.1
2026-04-04T21:34:54.688105Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14443214 parallel=true cells_before_filter=81 cells_after_filter=81 truncated=false bounds=49.7372,-7.9159,55.2363,7.5832 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=44.2 json_ms=0.1 total_ms=45.0
2026-04-04T21:34:55.029873Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14443214 filters=1 travel=0 total=137862 filters_raw="Winning party:Reform UK" ms=113.5
2026-04-04T21:34:55.623318Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=23 cells_after_filter=23 truncated=false bounds=48.4957,-13.1250,56.2224,8.6250 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=44.7 json_ms=0.0 total_ms=45.6
2026-04-04T21:34:55.969917Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=137862 filters_raw="Winning party:Reform UK" ms=115.6
2026-04-04T21:34:59.516657Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=23 cells_after_filter=23 truncated=false bounds=48.4957,-13.1250,56.2224,8.6250 filters=1 filters_raw="Winning party:Reform UK" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=45.7 json_ms=0.0 total_ms=46.6
2026-04-04T21:34:59.866028Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=137862 filters_raw="Winning party:Reform UK" ms=111.8
2026-04-04T21:35:02.024747Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=54 cells_after_filter=54 truncated=false bounds=48.4957,-13.1250,56.2224,8.6250 filters=1 filters_raw="Winning party:Reform UK|Green" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=44.1 json_ms=0.1 total_ms=45.0
2026-04-04T21:35:02.405437Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=32 cells_after_filter=32 truncated=false bounds=48.4957,-13.1250,56.2224,8.6250 filters=1 filters_raw="Winning party:Green" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=47.6 json_ms=0.1 total_ms=48.7
2026-04-04T21:35:02.722751Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=104986 filters_raw="Winning party:Green" ms=114.5
2026-04-04T21:35:04.481723Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=54 cells_after_filter=54 truncated=false bounds=48.4957,-13.1250,56.2224,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=44.7 json_ms=0.1 total_ms=45.7
2026-04-04T21:35:04.786633Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=242848 filters_raw="Winning party:Green|Reform UK" ms=113.7
2026-04-04T21:35:06.130310Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=48.4957,-13.1250,56.2224,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.1 agg_ms=51.8 json_ms=0.3 total_ms=53.1
2026-04-04T21:35:06.425432Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=116.7
2026-04-04T21:35:11.045354Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=9319504 parallel=true cells_before_filter=996 cells_after_filter=996 truncated=false bounds=50.5012,-5.1122,52.8404,1.3522 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.2 agg_ms=28.3 json_ms=0.8 total_ms=29.4
2026-04-04T21:35:11.363468Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=9319504 filters=1 travel=0 total=1764408 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=68.9
2026-04-04T21:35:11.846675Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1551509 parallel=true cells_before_filter=1552 cells_after_filter=1552 truncated=false bounds=51.2115,-2.8795,52.0558,-0.5488 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.5 json_ms=1.4 total_ms=8.9
2026-04-04T21:35:12.154907Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1551509 filters=1 travel=0 total=623376 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=12.7
2026-04-04T21:35:14.187993Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1551509 parallel=true cells_before_filter=2370 cells_after_filter=2370 truncated=false bounds=51.2115,-2.8795,52.0558,-0.5488 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Conservative" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=9.2 json_ms=1.9 total_ms=11.1
2026-04-04T21:35:14.470001Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=1551509 filters=1 travel=0 total=836475 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Conservative" ms=12.1
2026-04-04T21:35:15.118211Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1551509 parallel=true cells_before_filter=1552 cells_after_filter=1552 truncated=false bounds=51.2115,-2.8795,52.0558,-0.5488 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.5 json_ms=1.2 total_ms=8.7
2026-04-04T21:35:15.666065Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=48.8 json_ms=0.2 total_ms=49.9
2026-04-04T21:35:15.979603Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=118.5
2026-04-04T21:35:17.441822Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=549 cells_after_filter=549 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Conservative" fields=1 travel_entries=0 grid_ms=1.2 agg_ms=52.8 json_ms=0.4 total_ms=54.4
2026-04-04T21:35:17.766179Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=5320601 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Conservative" ms=117.0
2026-04-04T21:35:18.645371Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=47.9 json_ms=0.2 total_ms=49.1
2026-04-04T21:35:18.958197Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=114.0
2026-04-04T21:35:19.946778Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=48.4054,-13.1250,56.1467,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.2 agg_ms=48.4 json_ms=0.3 total_ms=49.8
2026-04-04T21:35:20.690264Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.1 agg_ms=48.9 json_ms=0.3 total_ms=50.3
2026-04-04T21:35:20.953731Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=115.3
2026-04-04T21:35:21.522823Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=549 cells_after_filter=549 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Conservative" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=56.9 json_ms=0.5 total_ms=58.2
2026-04-04T21:35:21.829962Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=5320601 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Conservative" ms=120.3
2026-04-04T21:35:22.608721Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=47.6 json_ms=0.3 total_ms=48.7
2026-04-04T21:35:22.913435Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=114.9
2026-04-04T21:35:23.240102Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Labour" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=62.8 json_ms=0.6 total_ms=64.4
2026-04-04T21:35:23.549864Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Labour" ms=120.4
2026-04-04T21:35:24.108518Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=47.9 json_ms=0.3 total_ms=49.1
2026-04-04T21:35:24.420390Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=115.6
2026-04-04T21:35:24.742814Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Labour" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=61.7 json_ms=0.6 total_ms=63.3
2026-04-04T21:35:25.069014Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Liberal Democrat|Labour" ms=123.5
2026-04-04T21:35:25.793100Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=292 cells_after_filter=292 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=49.6 json_ms=0.3 total_ms=50.8
2026-04-04T21:35:26.104011Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=2115234 filters_raw="Winning party:Green|Reform UK|Liberal Democrat" ms=113.3
2026-04-04T21:35:26.830822Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=54 cells_after_filter=54 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=47.0 json_ms=0.1 total_ms=47.9
2026-04-04T21:35:27.090832Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=242848 filters_raw="Winning party:Green|Reform UK" ms=112.2
2026-04-04T21:35:27.453146Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=55.2 json_ms=0.4 total_ms=56.4
2026-04-04T21:35:27.749477Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=117.6
2026-04-04T21:35:28.931173Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=57.3 json_ms=0.8 total_ms=59.0
2026-04-04T21:35:29.232496Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=120.3
2026-04-04T21:35:30.129697Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=59.4 json_ms=0.4 total_ms=60.7
2026-04-04T21:35:30.439775Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=117.5
2026-04-04T21:35:30.967049Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=58.1 json_ms=0.5 total_ms=59.4
2026-04-04T21:35:31.229150Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=119.0
2026-04-04T21:35:31.894064Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.8 json_ms=0.5 total_ms=62.2
2026-04-04T21:35:32.211781Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=120.2
2026-04-04T21:35:32.677098Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.1 agg_ms=56.9 json_ms=0.5 total_ms=58.4
2026-04-04T21:35:32.990170Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=118.1
2026-04-04T21:35:33.583218Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=57.1 json_ms=0.5 total_ms=58.4
2026-04-04T21:35:33.902623Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=119.0
2026-04-04T21:35:34.284033Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=58.7 json_ms=0.5 total_ms=60.0
2026-04-04T21:35:34.577920Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=118.8
2026-04-04T21:35:35.186152Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=58.3 json_ms=0.5 total_ms=59.6
2026-04-04T21:35:35.487468Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=120.2
2026-04-04T21:35:35.871633Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=58.4 json_ms=0.5 total_ms=59.7
2026-04-04T21:35:36.200053Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=121.2
2026-04-04T21:35:36.658644Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=61.8 json_ms=0.5 total_ms=63.2
2026-04-04T21:35:36.966099Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=122.5
2026-04-04T21:35:37.225723Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=55.9 json_ms=0.5 total_ms=57.2
2026-04-04T21:35:37.534988Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=119.7
2026-04-04T21:35:38.120966Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=58.9 json_ms=0.4 total_ms=60.2
2026-04-04T21:35:38.443275Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=123.5
2026-04-04T21:35:38.629145Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=62.2 json_ms=0.6 total_ms=63.6
2026-04-04T21:35:38.966481Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=123.1
2026-04-04T21:35:40.047096Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=61.0 json_ms=0.4 total_ms=62.2
2026-04-04T21:35:40.326619Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=125.0
2026-04-04T21:35:40.822849Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.3 agg_ms=61.1 json_ms=0.6 total_ms=63.0
2026-04-04T21:35:41.126778Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=120.5
2026-04-04T21:35:41.563604Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=56.3 json_ms=0.4 total_ms=57.5
2026-04-04T21:35:41.896909Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=121.4
2026-04-04T21:35:42.206736Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=60.2 json_ms=0.5 total_ms=61.5
2026-04-04T21:35:42.495066Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=121.0
2026-04-04T21:35:43.033375Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=57.5 json_ms=0.5 total_ms=58.8
2026-04-04T21:35:43.329333Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=117.1
2026-04-04T21:35:43.592213Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=59.1 json_ms=0.5 total_ms=60.4
2026-04-04T21:35:43.908952Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=121.0
2026-04-04T21:35:44.291828Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=58.5 json_ms=0.4 total_ms=59.8
2026-04-04T21:35:44.604219Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=122.0
2026-04-04T21:35:44.908697Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=1.0 agg_ms=57.6 json_ms=0.5 total_ms=59.1
2026-04-04T21:35:45.225069Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=120.7
2026-04-04T21:35:45.987762Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=462 cells_after_filter=462 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=57.5 json_ms=0.5 total_ms=58.8
2026-04-04T21:35:46.330560Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=9260246 filters_raw="Winning party:Green|Reform UK|Labour" ms=116.4
2026-04-04T21:35:46.647462Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.8157,-13.1250,56.4908,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=56.5 json_ms=0.5 total_ms=57.8
2026-04-04T21:35:46.956511Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=120.2
2026-04-04T21:36:01.330250Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14045925 parallel=true cells_before_filter=2736 cells_after_filter=2736 truncated=false bounds=50.5747,-7.0728,55.0361,5.5864 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=56.6 json_ms=2.2 total_ms=59.4
2026-04-04T21:36:01.627587Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14045925 filters=1 travel=0 total=10753259 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=110.8
2026-04-04T21:36:02.483250Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=14024616 parallel=true cells_before_filter=2741 cells_after_filter=2741 truncated=false bounds=50.5406,-7.0163,55.0053,5.6429 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=58.1 json_ms=2.4 total_ms=61.2
2026-04-04T21:36:02.863125Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14024616 filters=1 travel=0 total=10727200 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=116.5
2026-04-04T21:36:03.343460Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=49.1254,-10.9481,55.9051,8.1896 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=56.3 json_ms=0.5 total_ms=57.6
2026-04-04T21:36:03.663597Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=118.0
2026-04-04T21:36:04.925580Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.6940,-12.3567,56.0897,8.4713 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=56.8 json_ms=0.5 total_ms=58.2
2026-04-04T21:36:05.221348Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=120.1
2026-04-04T21:36:10.972821Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14462999 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=49.9023,-12.3567,57.1098,8.4713 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=58.5 json_ms=0.6 total_ms=59.8
2026-04-04T21:36:11.359802Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=49.7028,-13.1250,57.2339,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.7 agg_ms=58.8 json_ms=0.4 total_ms=60.0
2026-04-04T21:36:11.715332Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14463003 filters=1 travel=0 total=11132632 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=117.6
2026-04-04T21:36:12.077501Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.7014,-13.1250,56.3950,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=55.6 json_ms=0.4 total_ms=56.8
2026-04-04T21:36:12.485677Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=593 cells_after_filter=593 truncated=false bounds=48.6199,-13.1250,56.3267,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.8 agg_ms=57.6 json_ms=0.5 total_ms=58.9
2026-04-04T21:36:13.330892Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=584 cells_after_filter=584 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=1 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" fields=1 travel_entries=0 grid_ms=0.9 agg_ms=56.4 json_ms=0.5 total_ms=57.8
2026-04-04T21:36:13.571023Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=14454856 filters=1 travel=0 total=11124485 filters_raw="Winning party:Green|Reform UK|Labour|Liberal Democrat" ms=119.0
2026-04-04T21:36:14.414861Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.9 agg_ms=35.9 json_ms=0.3 total_ms=37.2
2026-04-04T21:36:15.458618Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=684 cells_after_filter=684 truncated=false bounds=48.5455,-13.1250,56.2642,8.6250 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.8 agg_ms=32.0 json_ms=0.3 total_ms=33.2
2026-04-04T21:36:18.806088Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14460268 parallel=true cells_before_filter=682 cells_after_filter=682 truncated=false bounds=50.0796,-13.1250,57.5491,8.6250 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.7 agg_ms=28.4 json_ms=0.3 total_ms=29.4
2026-04-04T21:36:19.138865Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14454856 parallel=true cells_before_filter=675 cells_after_filter=675 truncated=false bounds=47.5926,-13.1250,55.4640,8.6250 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.9 agg_ms=30.5 json_ms=0.3 total_ms=31.7
2026-04-04T21:36:20.866206Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=5 rows=14463003 parallel=true cells_before_filter=684 cells_after_filter=684 truncated=false bounds=48.1692,-13.1250,55.9484,8.6250 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.9 agg_ms=33.7 json_ms=0.3 total_ms=34.9
2026-04-04T21:36:27.899368Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=505647 parallel=true cells_before_filter=1373 cells_after_filter=1373 truncated=false bounds=52.7519,-1.3296,53.3146,0.2738 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.5 json_ms=0.6 total_ms=3.2
2026-04-04T21:36:28.441741Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4211261 parallel=true cells_before_filter=7635 cells_after_filter=7635 truncated=false bounds=52.2236,-2.7498,53.6408,1.2793 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=13.5 json_ms=4.0 total_ms=17.6
2026-04-04T21:36:31.593251Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=2684196 parallel=true cells_before_filter=4951 cells_after_filter=4951 truncated=false bounds=52.3200,-2.3356,53.4389,0.8411 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=9.5 json_ms=2.8 total_ms=12.4
2026-04-04T21:36:32.142315Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=751705 parallel=true cells_before_filter=4686 cells_after_filter=4684 truncated=false bounds=52.5028,-1.5483,53.0523,0.0081 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.2 json_ms=3.0 total_ms=9.2
2026-04-04T21:36:32.814217Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=26001 parallel=false cells_before_filter=726 cells_after_filter=707 truncated=false bounds=52.6495,-1.0307,52.8422,-0.4854 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.6 json_ms=0.3 total_ms=0.9
2026-04-04T21:36:34.145726Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=1144 parallel=false cells_before_filter=66 cells_after_filter=64 truncated=false bounds=52.7089,-0.8470,52.7761,-0.6569 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.1 json_ms=0.0 total_ms=0.1
2026-04-04T21:36:35.017113Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=26 postcodes_after_filter=22 filtered_out=4 truncated=false bounds=52.736777,-0.782517,52.760060,-0.716610 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.0 json_ms=0.1 total_ms=0.1
2026-04-04T21:36:35.799745Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=890 parallel=false cells_before_filter=56 cells_after_filter=55 truncated=false bounds=52.7149,-0.8332,52.7727,-0.6697 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.1 json_ms=0.0 total_ms=0.1
2026-04-04T21:36:36.576034Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=8919434611bffff resolution=9 total_count=1 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:36:36.920228Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=720 parallel=false cells_before_filter=42 cells_after_filter=42 truncated=false bounds=52.7149,-0.8187,52.7727,-0.6841 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.0 json_ms=0.0 total_ms=0.1
2026-04-04T21:36:42.802418Z INFO property_map_server::routes::properties: GET /api/hexagon-properties h3=8919434611bffff resolution=9 total=1 returned=1 offset=0 filters=0 filters_raw="-" ms=0.0
2026-04-04T21:36:46.232229Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=1560768 parallel=true cells_before_filter=3628 cells_after_filter=3628 truncated=false bounds=52.2728,-1.7523,53.3197,0.6909 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.1 agg_ms=6.3 json_ms=1.8 total_ms=8.2
2026-04-04T21:36:48.381138Z INFO property_map_server::routes::places: GET /api/places query="ig" results=7 scanned=3474 mode="-" ms=0.3
2026-04-04T21:36:48.742228Z INFO property_map_server::routes::places: GET /api/places query="ig19" results=0 scanned=3474 mode="-" ms=0.2
2026-04-04T21:36:49.871398Z INFO property_map_server::routes::places: GET /api/places query="ig1" results=3 scanned=3474 mode="-" ms=0.2
2026-04-04T21:36:50.251990Z INFO property_map_server::routes::places: GET /api/places query="ig10" results=1 scanned=3474 mode="-" ms=0.3
2026-04-04T21:36:51.211015Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=22316 parallel=false cells_before_filter=312 cells_after_filter=295 truncated=false bounds=51.6230,-0.0048,51.6738,0.1353 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.2 total_ms=0.6
2026-04-04T21:36:55.672355Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=610 postcodes_after_filter=506 filtered_out=104 truncated=false bounds=51.637862,0.028422,51.658848,0.086372 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.5 json_ms=1.1 total_ms=1.5
2026-04-04T21:36:56.790785Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=610 postcodes_after_filter=509 filtered_out=101 truncated=false bounds=51.637035,0.028361,51.658021,0.086311 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.5 json_ms=1.1 total_ms=1.7
2026-04-04T21:36:57.821493Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=610 postcodes_after_filter=356 filtered_out=254 truncated=false bounds=51.639905,0.034227,51.655713,0.077878 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.6 json_ms=0.9 total_ms=1.5
2026-04-04T21:37:00.813913Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=610 postcodes_after_filter=356 filtered_out=254 truncated=false bounds=51.639822,0.034227,51.655630,0.077878 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.5 json_ms=0.8 total_ms=1.3
2026-04-04T21:37:02.512274Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=610 postcodes_after_filter=352 filtered_out=258 truncated=false bounds=51.639507,0.034134,51.655314,0.077784 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.5 json_ms=0.9 total_ms=1.4
2026-04-04T21:37:03.022186Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=610 postcodes_after_filter=354 filtered_out=256 truncated=false bounds=51.639374,0.034077,51.655182,0.077728 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.6 json_ms=0.8 total_ms=1.5
2026-04-04T21:37:03.518316Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=635 postcodes_after_filter=567 filtered_out=68 truncated=false bounds=51.634829,0.024776,51.658656,0.090571 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.6 json_ms=1.3 total_ms=1.9
2026-04-04T21:37:25.033579Z INFO property_map_server::routes::places: GET /api/places query="hazel" results=1 scanned=3474 mode="-" ms=0.2
2026-04-04T21:37:25.611549Z INFO property_map_server::routes::places: GET /api/places query="hazelwoo" results=0 scanned=3474 mode="-" ms=0.2
2026-04-04T21:37:26.475382Z INFO property_map_server::routes::places: GET /api/places query="hazelwoos" results=0 scanned=3474 mode="-" ms=0.2
2026-04-04T21:37:27.255510Z INFO property_map_server::routes::places: GET /api/places query="hazelwoo" results=0 scanned=3474 mode="-" ms=0.2
2026-04-04T21:37:44.753537Z INFO property_map_server::routes::postcodes: GET /api/postcode/IG10 4ET postcode=IG10 4ET
2026-04-04T21:37:44.801429Z INFO property_map_server::routes::postcode_stats: GET /api/postcode-stats postcode=IG10 4ET total_count=34 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:37:44.991971Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=270 postcodes_after_filter=190 filtered_out=80 truncated=false bounds=51.637064,0.029855,51.649747,0.064874 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.3 json_ms=0.5 total_ms=0.7
2026-04-04T21:37:45.230708Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=270 postcodes_after_filter=175 filtered_out=95 truncated=false bounds=51.637064,0.032945,51.649747,0.061784 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.3 json_ms=0.4 total_ms=0.7
2026-04-04T21:37:46.268468Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=55 filtered_out=49 truncated=false bounds=51.640616,0.041801,51.645589,0.053110 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.1 json_ms=0.2 total_ms=0.3
2026-04-04T21:37:46.787363Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=33 filtered_out=71 truncated=false bounds=51.641502,0.044011,51.644552,0.050946 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T21:37:47.397342Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=47 filtered_out=57 truncated=false bounds=51.640722,0.042979,51.644787,0.052221 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.2 total_ms=0.4
2026-04-04T21:37:48.401301Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=49 filtered_out=55 truncated=false bounds=51.640891,0.043035,51.644955,0.052277 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T21:37:50.590145Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=41 filtered_out=63 truncated=false bounds=51.640891,0.044155,51.644955,0.051157 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T21:38:47.273738Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=184 postcodes_after_filter=114 filtered_out=70 truncated=false bounds=51.638001,0.038846,51.648158,0.056343 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.3 total_ms=0.5
2026-04-04T21:38:52.326536Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=184 postcodes_after_filter=122 filtered_out=62 truncated=false bounds=51.637653,0.038206,51.648544,0.056968 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.3 json_ms=0.4 total_ms=0.6
2026-04-04T21:40:14.216803Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=13255 parallel=false cells_before_filter=161 cells_after_filter=142 truncated=false bounds=51.6252,0.0173,51.6602,0.0776 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=0.4 json_ms=0.1 total_ms=0.6
2026-04-04T21:40:15.138048Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=184 postcodes_after_filter=102 filtered_out=82 truncated=false bounds=51.638654,0.039881,51.647610,0.055309 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.3 json_ms=0.3 total_ms=0.6
2026-04-04T21:40:15.714074Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=63 filtered_out=41 truncated=false bounds=51.640010,0.042149,51.646345,0.053063 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.2 total_ms=0.4
2026-04-04T21:40:19.720322Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=104 postcodes_after_filter=62 filtered_out=42 truncated=false bounds=51.640703,0.041865,51.647039,0.052779 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.2 total_ms=0.4
2026-04-04T21:40:23.570688Z INFO property_map_server::routes::postcode_stats: GET /api/postcode-stats postcode=IG10 4EN total_count=12 filters=0 filters_raw="-" ms=0.2
2026-04-04T21:40:44.920616Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=184 postcodes_after_filter=108 filtered_out=76 truncated=false bounds=51.638187,0.037818,51.648260,0.055170 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.2 json_ms=0.3 total_ms=0.6
2026-04-04T21:40:50.919051Z INFO property_map_server::routes::postcode_stats: GET /api/postcode-stats postcode=IG10 4RB total_count=24 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:41:21.790521Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=270 postcodes_after_filter=147 filtered_out=123 truncated=false bounds=51.638187,0.032588,51.648260,0.060400 filters=0 filters_raw="-" fields=0 travel_entries=0 agg_ms=0.3 json_ms=0.4 total_ms=0.7
2026-04-04T21:42:31.670809Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:42:31.671934Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:42:33.670038Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=258378 parallel=true cells_before_filter=858 cells_after_filter=697 truncated=false bounds=51.4896,-0.2000,51.5404,-0.0600 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.0 json_ms=0.4 total_ms=2.5
2026-04-04T21:42:55.340208Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=627 filters=0 filters_raw="-" ms=0.3
2026-04-04T21:42:55.647321Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=744 cells_after_filter=576 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.4 total_ms=1.9
2026-04-04T21:43:56.051389Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=627 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.4
2026-04-04T21:43:56.234038Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=744 cells_after_filter=576 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.0 json_ms=0.3 total_ms=2.3
2026-04-04T21:43:56.635476Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=221163 filters=1 travel=0 total=221163 filters_raw="Property type:Detached|Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.7
2026-04-04T21:43:56.944504Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=627 filters=1 filters_raw="Property type:Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=0.4
2026-04-04T21:43:57.159258Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=743 cells_after_filter=575 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Property type:Semi-Detached|Terraced|Flats/Maisonettes|Other" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.3 json_ms=0.3 total_ms=2.6
2026-04-04T21:43:57.431262Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=221163 filters=1 travel=0 total=220241 filters_raw="Property type:Semi-Detached|Terraced|Flats/Maisonettes|Other" ms=1.7
2026-04-04T21:43:57.658461Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=84 filters=1 filters_raw="Property type:Semi-Detached|Terraced|Other" ms=0.2
2026-04-04T21:43:57.805634Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=682 cells_after_filter=533 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Property type:Semi-Detached|Terraced|Other" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.6 json_ms=0.3 total_ms=1.9
2026-04-04T21:43:57.969849Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=83 filters=1 filters_raw="Property type:Semi-Detached|Terraced" ms=0.2
2026-04-04T21:43:58.126020Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=680 cells_after_filter=532 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Property type:Semi-Detached|Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.7 json_ms=0.3 total_ms=2.0
2026-04-04T21:43:58.374443Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=221163 filters=1 travel=0 total=25481 filters_raw="Property type:Semi-Detached|Terraced" ms=1.9
2026-04-04T21:43:58.622285Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=77 filters=1 filters_raw="Property type:Terraced" ms=0.2
2026-04-04T21:43:58.794308Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=670 cells_after_filter=525 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Property type:Terraced" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.6 json_ms=0.3 total_ms=2.0
2026-04-04T21:43:59.022106Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=221163 filters=1 travel=0 total=22903 filters_raw="Property type:Terraced" ms=1.8
2026-04-04T21:43:59.691928Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=627 filters=0 filters_raw="-" ms=0.4
2026-04-04T21:43:59.839226Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=744 cells_after_filter=576 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.3 json_ms=0.3 total_ms=1.7
2026-04-04T21:44:01.485685Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=627 filters=1 filters_raw="Leasehold/Freehold:Freehold|Leasehold" ms=0.4
2026-04-04T21:44:01.652266Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=744 cells_after_filter=576 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Leasehold/Freehold:Freehold|Leasehold" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=2.0 json_ms=0.3 total_ms=2.3
2026-04-04T21:44:01.909500Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=221163 filters=1 travel=0 total=221161 filters_raw="Leasehold/Freehold:Freehold|Leasehold" ms=1.7
2026-04-04T21:44:02.363804Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=90 filters=1 filters_raw="Leasehold/Freehold:Freehold" ms=0.2
2026-04-04T21:44:02.517400Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=658 cells_after_filter=512 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=1 filters_raw="Leasehold/Freehold:Freehold" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.7 json_ms=0.3 total_ms=2.0
2026-04-04T21:44:02.809239Z INFO property_map_server::routes::filter_counts: GET /api/filter-counts rows=221163 filters=1 travel=0 total=26584 filters_raw="Leasehold/Freehold:Freehold" ms=1.8
2026-04-04T21:44:03.654031Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195da4823ffff resolution=9 total_count=627 filters=0 filters_raw="-" ms=0.3
2026-04-04T21:44:03.830901Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=744 cells_after_filter=576 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.6 json_ms=0.4 total_ms=1.9
2026-04-04T21:44:05.327990Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:44:05.327995Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:44:05.653521Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=221163 parallel=true cells_before_filter=744 cells_after_filter=576 truncated=false bounds=51.4896,-0.1877,51.5404,-0.0723 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=1.4 json_ms=0.3 total_ms=1.7
2026-04-04T21:44:09.499224Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2245395 parallel=true cells_before_filter=3260 cells_after_filter=3255 truncated=false bounds=51.3484,-0.6803,51.7060,0.1309 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=7.1 json_ms=1.6 total_ms=8.7
2026-04-04T21:44:10.795438Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2798500 parallel=true cells_before_filter=5597 cells_after_filter=5597 truncated=false bounds=51.3064,-0.7967,51.7972,0.3170 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=9.8 json_ms=4.8 total_ms=14.6
2026-04-04T21:44:45.224717Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2798500 parallel=true cells_before_filter=5597 cells_after_filter=5597 truncated=false bounds=51.3064,-0.7967,51.7972,0.3170 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=15.3 json_ms=4.4 total_ms=19.7
2026-04-04T21:44:46.515104Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=7 rows=4166588 parallel=true cells_before_filter=3186 cells_after_filter=3186 truncated=false bounds=51.0597,-1.2948,51.9687,0.7665 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.1 agg_ms=17.5 json_ms=2.7 total_ms=20.2
2026-04-04T21:44:47.462054Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=8297017 parallel=true cells_before_filter=1913 cells_after_filter=1913 truncated=false bounds=50.1955,-3.0188,52.5575,2.3221 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.3 agg_ms=36.0 json_ms=1.5 total_ms=37.7
2026-04-04T21:44:48.682744Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=6 rows=10251727 parallel=true cells_before_filter=2772 cells_after_filter=2772 truncated=false bounds=49.3622,-4.6521,53.1081,3.7958 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.5 agg_ms=44.9 json_ms=2.0 total_ms=47.4
2026-04-04T21:44:49.455807Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=176 postcodes_after_filter=32 filtered_out=144 truncated=false bounds=51.593016,-0.214608,51.595820,-0.208239 filters=0 filters_raw="-" fields=1 travel_entries=0 agg_ms=0.3 json_ms=0.1 total_ms=0.4
2026-04-04T21:44:50.454096Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=78707 parallel=true cells_before_filter=608 cells_after_filter=581 truncated=false bounds=51.5639,-0.2738,51.6163,-0.1548 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.3 json_ms=0.5 total_ms=1.8
2026-04-04T21:44:50.821537Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=87502 parallel=true cells_before_filter=654 cells_after_filter=610 truncated=false bounds=51.5627,-0.2764,51.6172,-0.1525 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.5 json_ms=0.6 total_ms=2.1
2026-04-04T21:44:51.225834Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=599643 parallel=true cells_before_filter=3675 cells_after_filter=3591 truncated=false bounds=51.5100,-0.3835,51.6543,-0.0558 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.3 json_ms=3.1 total_ms=9.4
2026-04-04T21:44:51.744606Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=2249943 parallel=true cells_before_filter=3371 cells_after_filter=3371 truncated=false bounds=51.3780,-0.6517,51.7471,0.1861 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=14.7 json_ms=2.5 total_ms=17.2
2026-04-04T21:44:53.893048Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=25715 parallel=false cells_before_filter=294 cells_after_filter=249 truncated=false bounds=51.6458,-0.1957,51.6906,-0.0938 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.7 json_ms=0.2 total_ms=0.9
2026-04-04T21:44:55.293351Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=16281 parallel=false cells_before_filter=249 cells_after_filter=201 truncated=false bounds=51.6563,-0.2141,51.7011,-0.1122 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.7 json_ms=0.2 total_ms=0.9
2026-04-04T21:44:55.365850Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195db5d5bffff resolution=9 total_count=2 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:44:57.376117Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=51 postcodes_after_filter=21 filtered_out=30 truncated=false bounds=51.673118,-0.176167,51.689250,-0.139455 filters=0 filters_raw="-" fields=1 travel_entries=0 agg_ms=0.1 json_ms=0.1 total_ms=0.2
2026-04-04T21:44:57.801580Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=51 postcodes_after_filter=32 filtered_out=19 truncated=false bounds=51.672484,-0.177597,51.689695,-0.138428 filters=0 filters_raw="-" fields=1 travel_entries=0 agg_ms=0.1 json_ms=0.1 total_ms=0.2
2026-04-04T21:44:58.478708Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=5352 parallel=false cells_before_filter=108 cells_after_filter=107 truncated=false bounds=51.6623,-0.2004,51.6968,-0.1220 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.2 json_ms=0.1 total_ms=0.3
2026-04-04T21:45:00.616153Z INFO property_map_server::routes::properties: GET /api/hexagon-properties h3=89195db5d5bffff resolution=9 total=2 returned=2 offset=0 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:46:14.691802Z INFO property_map_server::routes::hexagon_stats: GET /api/hexagon-stats h3=89195db580fffff resolution=9 total_count=20 filters=0 filters_raw="-" ms=0.1
2026-04-04T21:46:21.544828Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=79231 parallel=true cells_before_filter=1063 cells_after_filter=967 truncated=false bounds=51.6395,-0.3226,51.7458,-0.0807 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.7 json_ms=0.8 total_ms=2.5
2026-04-04T21:46:22.187720Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=654750 parallel=true cells_before_filter=2029 cells_after_filter=2028 truncated=false bounds=51.5772,-0.6558,51.8792,0.0322 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.9 json_ms=1.6 total_ms=6.5
2026-04-04T21:46:23.376338Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=825079 parallel=true cells_before_filter=2567 cells_after_filter=2567 truncated=false bounds=51.5620,-0.7121,51.9056,0.0708 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=6.3 json_ms=2.1 total_ms=8.3
2026-04-04T21:46:24.219315Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=8 rows=643620 parallel=true cells_before_filter=1974 cells_after_filter=1964 truncated=false bounds=51.5794,-0.6476,51.8754,0.0266 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=4.7 json_ms=1.5 total_ms=6.1
2026-04-04T21:46:25.273154Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=474082 parallel=true cells_before_filter=5676 cells_after_filter=5600 truncated=false bounds=51.5945,-0.5921,51.8494,-0.0115 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=7.1 json_ms=5.2 total_ms=12.3
2026-04-04T21:46:33.950421Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:46:33.953241Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:46:34.627661Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:46:34.628653Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:46:36.070620Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:46:36.071602Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:46:36.780674Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:46:36.781649Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:46:37.900752Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:46:37.900800Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:47:01.665280Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=522404 parallel=true cells_before_filter=6462 cells_after_filter=6312 truncated=false bounds=51.5972,-0.6467,51.8466,0.0431 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.5 json_ms=3.4 total_ms=10.0
2026-04-04T21:47:03.659452Z INFO property_map_server::routes::features: GET /api/features
2026-04-04T21:47:03.659455Z INFO property_map_server::routes::pois: GET /api/poi-categories count=74 groups=11
2026-04-04T21:47:03.895166Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=522404 parallel=true cells_before_filter=6462 cells_after_filter=6312 truncated=false bounds=51.5972,-0.6467,51.8466,0.0431 filters=0 filters_raw="-" fields=0 travel_entries=0 grid_ms=0.0 agg_ms=6.2 json_ms=3.5 total_ms=9.7
2026-04-04T21:47:05.827262Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=522404 parallel=true cells_before_filter=6462 cells_after_filter=6312 truncated=false bounds=51.5972,-0.6467,51.8466,0.0431 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=8.7 json_ms=6.6 total_ms=15.3
2026-04-04T21:47:08.484428Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=44327 parallel=false cells_before_filter=633 cells_after_filter=609 truncated=false bounds=51.6833,-0.4435,51.7559,-0.2428 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=1.2 json_ms=0.5 total_ms=1.7
2026-04-04T21:47:09.293742Z INFO property_map_server::routes::postcodes: GET /api/postcodes postcodes_before_filter=247 postcodes_after_filter=161 filtered_out=86 truncated=false bounds=51.712326,-0.374885,51.725168,-0.339368 filters=0 filters_raw="-" fields=1 travel_entries=0 agg_ms=0.3 json_ms=0.5 total_ms=0.7
2026-04-04T21:47:10.166091Z INFO property_map_server::routes::hexagons: GET /api/hexagons resolution=9 rows=6899 parallel=false cells_before_filter=154 cells_after_filter=140 truncated=false bounds=51.7034,-0.3959,51.7346,-0.3098 filters=0 filters_raw="-" fields=1 travel_entries=0 grid_ms=0.0 agg_ms=0.2 json_ms=0.1 total_ms=0.4
2026-04-04T21:52:05.887374Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T21:52:05.887553Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T21:52:05.887562Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T21:52:05.956667Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T21:52:05.956678Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T21:52:08.252894Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T21:52:44.403359Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T21:52:44.403527Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T21:52:44.403535Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T21:52:44.467977Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T21:52:44.467987Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T21:52:46.817826Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T21:54:19.810668Z INFO property_map_server: Prometheus metrics initialized
2026-04-04T21:54:19.810815Z INFO property_map_server: Loading property data from /app/data/properties.parquet, /app/data/postcode.parquet
2026-04-04T21:54:19.810822Z INFO property_map_server::data::property: Loading postcode features from "/app/data/postcode.parquet"
2026-04-04T21:54:19.870046Z INFO property_map_server::data::property: Postcode features loaded rows=1262364
2026-04-04T21:54:19.870055Z INFO property_map_server::data::property: Loading properties from "/app/data/properties.parquet"
2026-04-04T21:54:22.182709Z INFO property_map_server::data::property: Properties joined with postcodes rows=15203393
2026-04-04T22:00:48.160218Z INFO property_map_server: Prometheus metrics initialized

View file

@ -705,12 +705,19 @@ impl PropertyData {
})
.collect::<anyhow::Result<Vec<_>>>()?;
// Compute quantization parameters from feature stats (numeric features)
// Compute quantization parameters from feature stats (numeric features).
// For features with Fixed bounds, use those bounds so the full configured range
// is representable — the histogram refinement can narrow min/max to exclude
// "outliers" that are actually valid data (e.g. ethnicity percentages).
// For Percentile-bounded features, use the (possibly refined) histogram range
// so extreme outliers don't destroy precision for the main distribution.
let mut quant_min = Vec::with_capacity(num_features);
let mut quant_range = Vec::with_capacity(num_features);
for stats in &numeric_feature_stats {
let min = stats.histogram.min;
let max = stats.histogram.max;
for (feat_idx, stats) in numeric_feature_stats.iter().enumerate() {
let (min, max) = match features::bounds_for(numeric_names[feat_idx]) {
Some(Bounds::Fixed { min, max }) => (*min, *max),
_ => (stats.histogram.min, stats.histogram.max),
};
quant_min.push(min);
quant_range.push(if max > min { max - min } else { 0.0 });
}

View file

@ -143,8 +143,8 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[
name: "Estimated monthly rent",
bounds: Bounds::Percentile { low: 2.0, high: 98.0 },
step: 25.0,
description: "Median monthly private rent for the local area",
detail: "Median monthly rental price from ONS Private Rental Market Summary Statistics (Oct 2022 - Sep 2023), matched by local authority and bedroom count. Based on Valuation Office Agency lettings data.",
description: "Mean monthly private rent for the local area",
detail: "Mean monthly rental price from ONS Price Index of Private Rents (PIPR), matched by local authority and bedroom count.",
source: "ons-rental",
prefix: "£",
suffix: "/mo",
@ -947,22 +947,6 @@ pub static FEATURE_GROUPS: &[FeatureGroup] = &[
raw: false,
absolute: false,
}),
Feature::Numeric(FeatureConfig {
name: "Majority (%)",
bounds: Bounds::Percentile {
low: 2.0,
high: 98.0,
},
step: 0.5,
description:
"Winning margin as a percentage of valid votes in the 2024 General Election",
detail: "The difference in votes between the winning candidate and the runner-up, expressed as a percentage of total valid votes cast. A small majority indicates a marginal seat (competitive); a large majority indicates a safe seat. From the July 2024 UK General Election results published by the UK Parliament.",
source: "election-results",
prefix: "",
suffix: "%",
raw: false,
absolute: false,
}),
],
},
FeatureGroup {