Skip to content

Ejemplo 1: canal de noticias local

Cómo un canal de noticias local podría usar la API de CalHeatScore para mostrar los puntajes de calor de CalHeatScores para un área durante la sección del pronóstico meteorológico.

Integración de CalHeatScore al pronóstico meteorológico

Imagine que es meteorólogo en una estación de televisión local y quiere integrar los pronósticos de CalHeatScore mediante la API en sus reportes del estado del clima.

La API es gratuita, pública y no requiere credenciales, lo que significa que integrar CalHeatScore en su flujo de trabajo de transmisión es simple. Puede consultar los puntajes de cada código postal en su área de cobertura, obtener el pronóstico a 7 días para alinearlo con su pronóstico meteorológico semanal y aplicar una codificación por colores en su mapa de transmisión que refleje la escala de CalHeatScore.

El flujo de trabajo que se muestra a continuación explica cómo obtener los puntajes de calor para su área de cobertura y prepararlos para la transmisión, desde una única llamada a la API hasta un conjunto de datos formateado que su equipo de gráficos pueda utilizar.

Paso a paso: obtenga los datos de CalHeatScores para su área de cobertura

Paso 1: identifique los códigos postales de su área de cobertura

Determine los códigos postales que forman parte de su zona de transmisión. Por ejemplo, una estación en el área de Fresno podría cubrir estos códigos postales: 93650, 93711, 93720, 93722, 93726, 93727, 93741.

Paso 2: consulte a la API sobre sus códigos postales

Recupere el pronóstico a 7 días para su área de cobertura en una sola solicitud.

curl "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query?where=ZIP_CODE+IN+('93650','93711','93720','93722','93726','93727','93741')&outFields=ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6&returnGeometry=false&f=json"
import requests

BASE_URL = (
    "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/"
    "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query"
)

# Fresno-area ZIP codes
zip_codes = ["93650", "93711", "93720", "93722", "93726", "93727", "93741"]
where_clause = "ZIP_CODE IN (" + ",".join(f"'{z}'" for z in zip_codes) + ")"

params = {
    "where": where_clause,
    "outFields": "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6",
    "returnGeometry": "false",
    "f": "json",
}

response = requests.get(BASE_URL, params=params)
data = response.json()

if "error" in data:
    print(f"Error: {data['error']['message']}")
else:
    for feature in data["features"]:
        attrs = feature["attributes"]
        scores = [attrs[f"CHS_Day_{d}"] for d in range(7)]
        print(f"ZIP {attrs['ZIP_CODE']}: {' → '.join(scores)}")
const baseUrl =
  "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/" +
  "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query";

// Fresno-area ZIP codes
const zipCodes = ["93650", "93711", "93720", "93722", "93726", "93727", "93741"];
const whereClause = `ZIP_CODE IN (${zipCodes.map((z) => `'${z}'`).join(",")})`;

const params = new URLSearchParams({
  where: whereClause,
  outFields: "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6",
  returnGeometry: "false",
  f: "json",
});

fetch(`${baseUrl}?${params}`)
  .then((res) => res.json())
  .then((data) => {
    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      return;
    }
    data.features.forEach((feature) => {
      const a = feature.attributes;
      const scores = Array.from({ length: 7 }, (_, d) => a[`CHS_Day_${d}`]).join(" → ");
      console.log(`ZIP ${a.ZIP_CODE}: ${scores}`);
    });
  })
  .catch((err) => console.error("Request failed:", err));
Ejemplo de respuesta
{
  "features": [
    {
      "attributes": {
        "ZIP_CODE": "93650",
        "DATE": "2026-07-15",
        "CHS_Day_0": "3",
        "CHS_Day_1": "4",
        "CHS_Day_2": "4",
        "CHS_Day_3": "3",
        "CHS_Day_4": "2",
        "CHS_Day_5": "1",
        "CHS_Day_6": "0"
      }
    },
    {
      "attributes": {
        "ZIP_CODE": "93711",
        "DATE": "2026-07-15",
        "CHS_Day_0": "3",
        "CHS_Day_1": "4",
        "CHS_Day_2": "4",
        "CHS_Day_3": "3",
        "CHS_Day_4": "2",
        "CHS_Day_5": "1",
        "CHS_Day_6": "1"
      }
    }
  ]
}

Paso 3: asocie los puntajes con etiquetas y colores

Traduzca los puntajes de 0 a 4 a un lenguaje comprensible para su audiencia y aplíqueles una codificación por colores.

Valor de CalHeatScore Etiqueta Código de color HEX Significado
0 Bajo #DEDEDE Se espera que los efectos sobre la salud relacionados con el calor sean mínimos o nulos.
1 Leve #FAE0C8 Día cálido. Se espera un aumento menor en efectos sobre la salud relacionados con el calor entre las personas sensibles al calor.
2 Moderado #EA8753 Día muy cálido. Se espera un aumento moderado en efectos sobre la salud relacionados con el calor entre las personas sensibles al calor.
3 Alto #C23A00 Día caluroso. Se espera un aumento de los efectos del calor sobre la salud de todas las personas, especialmente de aquellas que no tienen acceso a sistemas adecuados de refrigeración e hidratación o que realizan actividades físicas extenuantes al aire libre. Este nivel de calor puede suponer un riesgo significativo para la salud.
4 Grave #700006 Día de calor extremo. Se espera un aumento significativo de los efectos del calor sobre la salud de todas las personas, especialmente de aquellas que no tienen acceso a sistemas adecuados de refrigeración e hidratación o que realizan actividades físicas extenuantes al aire libre. Este nivel de calor puede suponer un riesgo muy grave para la salud.

Paso 4: desarrolle su pronóstico de riesgo por calor a 7 días

Alinee el pronóstico de 7 días de CalHeatScore con su pronóstico meteorológico semanal. Cada campo CHS_Day_ se corresponde directamente con los días de su pronóstico:

Campo de la API Día del pronóstico
CHS_Day_0 Hoy
CHS_Day_1 Mañana
CHS_Day_2 Día 3 de su pronóstico
CHS_Day_3 Día 4 de su pronóstico
CHS_Day_4 Día 5 de su pronóstico
CHS_Day_5 Día 6 de su pronóstico
CHS_Day_6 Día 7 de su pronóstico

Paso 5: automatice las actualizaciones diarias

Dado que los datos de CalHeatScore se actualizan cada día, configure un guion programado para obtener los puntajes más recientes cada mañana antes de su primera transmisión:

import requests
import csv
from datetime import datetime

BASE_URL = (
    "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/"
    "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query"
)

# Your station's coverage ZIP codes
zip_codes = ["93650", "93711", "93720", "93722", "93726", "93727", "93741"]
where_clause = "ZIP_CODE IN (" + ",".join(f"'{z}'" for z in zip_codes) + ")"

params = {
    "where": where_clause,
    "outFields": "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6",
    "returnGeometry": "false",
    "f": "json",
}

response = requests.get(BASE_URL, params=params)
data = response.json()

if "error" in data:
    print(f"Error: {data['error']['message']}")
else:
    # Export to CSV for your graphics team
    filename = f"heat_scores_{datetime.now().strftime('%Y-%m-%d')}.csv"
    with open(filename, "w", newline="") as f:
        writer = csv.writer(f)
        writer.writerow(["ZIP Code", "Date", "Today", "Day 1", "Day 2", "Day 3", "Day 4", "Day 5", "Day 6"])
        for feature in data["features"]:
            a = feature["attributes"]
            writer.writerow([
                a["ZIP_CODE"], a["DATE"],
                a["CHS_Day_0"], a["CHS_Day_1"], a["CHS_Day_2"],
                a["CHS_Day_3"], a["CHS_Day_4"], a["CHS_Day_5"], a["CHS_Day_6"]
            ])
    print(f"Saved {len(data['features'])} ZIP codes to {filename}")
const fs = require("fs");

const baseUrl =
  "https://services1.arcgis.com/PCHfdHz4GlDNAhBb/arcgis/rest/services/" +
  "CalHeatScore_Live_Data_for_API_Use/FeatureServer/0/query";

// Your station's coverage ZIP codes
const zipCodes = ["93650", "93711", "93720", "93722", "93726", "93727", "93741"];
const whereClause = `ZIP_CODE IN (${zipCodes.map((z) => `'${z}'`).join(",")})`;

const params = new URLSearchParams({
  where: whereClause,
  outFields: "ZIP_CODE,DATE,CHS_Day_0,CHS_Day_1,CHS_Day_2,CHS_Day_3,CHS_Day_4,CHS_Day_5,CHS_Day_6",
  returnGeometry: "false",
  f: "json",
});

fetch(`${baseUrl}?${params}`)
  .then((res) => res.json())
  .then((data) => {
    if (data.error) {
      console.error(`Error: ${data.error.message}`);
      return;
    }

    // Export to CSV for your graphics team
    const header = "ZIP Code,Date,Today,Day 1,Day 2,Day 3,Day 4,Day 5,Day 6";
    const rows = data.features.map((f) => {
      const a = f.attributes;
      return [a.ZIP_CODE, a.DATE,
        a.CHS_Day_0, a.CHS_Day_1, a.CHS_Day_2,
        a.CHS_Day_3, a.CHS_Day_4, a.CHS_Day_5, a.CHS_Day_6
      ].join(",");
    });

    const today = new Date().toISOString().split("T")[0];
    const filename = `heat_scores_${today}.csv`;
    fs.writeFileSync(filename, [header, ...rows].join("\n"));
    console.log(`Saved ${data.features.length} ZIP codes to ${filename}`);
  })
  .catch((err) => console.error("Request failed:", err));

Programe este guion para que se ejecute cada mañana (por ejemplo, mediante cron, el programador de tareas de Windows o un proceso de Continuous Integration (CI)) y entregue el archivo CSV en la unidad compartida de su equipo de gráficos. Los datos se actualizan cada día, por lo que una única consulta matutina le brinda puntajes precisos para toda la jornada de transmisión.