dwd-api icon indicating copy to clipboard operation
dwd-api copied to clipboard

Unwetterwarnungen nach PLZ

Open CrazyMarvin opened this issue 4 years ago • 2 comments

Unterstützt die API das Ausgeben von Wetterwarnungen bei Angabe einer PLZ? Ich spiele mit der Idee, einen Telegram Bot zu erstellen, der die Nutzer nach der PLZ fragt und anschließend über Wetterwarnungen informiert.

CrazyMarvin avatar Nov 28 '21 19:11 CrazyMarvin

Ich hab da mal eine Prüfung auf Warnungen an Koordinaten gebastelt. Das basiert auf den Polygonen aus /gemeinde_warnings_v2_en.json, die Prüfung ob ein Punkt in einem Polygon ist habe ich von hier.

function insidePolygon(point, vs) {
    // ray-casting algorithm based on
    // https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html/pnpoly.html
    
    var x = point[0], y = point[1];
    
    var inside = false;
    for (var i = 0, j = vs.length - 1; i < vs.length; j = i++) {
        var xi = vs[i][0], yi = vs[i][1];
        var xj = vs[j][0], yj = vs[j][1];
        
        var intersect = ((yi > y) != (yj > y))
            && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);
        if (intersect) inside = !inside;
    }
    
    return inside;
};

function createPolygonFromDwdData(dwd) {
 let result = [];
 for (let i=0; i < dwd.length / 2; i++) {
    result.push([dwd[2*i], dwd[2*i + 1]]);
 }
 return result;
}

function checkWarningForLocation(warning, location) {
    for(let region of warning.regions) {
        let poly = createPolygonFromDwdData(region.polygon);
        if (insidePolygon(location, poly))
            return true;
     }
    return false;
}

function getWarningsForLocation(data, location) {
    return data.warnings.filter( warning => checkWarningForLocation(warning, location));
}

Wenn man die Daten herunterlädt

curl --compressed -X 'GET' \
  'https://s3.eu-central-1.amazonaws.com/app-prod-static.warnwetter.de/v16/gemeinde_warnings_v2_en.json' \
  -H 'accept: application/json' > test.json

kann man die Funktionen z.B. wie folgt nutzen:

const fs = require('fs');
function loadJSON(file) {
    return new Promise((resolve, reject) => {
        fs.readFile(file, (err, data) => {
            if (err) reject(err);
            let result = JSON.parse(data);
            resolve(result);
        });
    })
}

const data = await loadJSON('./test.json');
const location = [52.518611, 13.408333] //Berlin
for (let warning of getWarningsForLocation(data, location)) {
    console.log(`${warning.warnId}`);
    console.log(` ${warning.headLine}`);
    let description = warning.description.split(/\r?\n/);
    console.log(`  ${description.join('\r\n  ')}`);
}

P.S: Die Koordinaten gibts in Wikipedia bei Artikeln zu Orten ganz oben rechts in sehr klein. Klickt man darauf, bekommt man auf der nächsten Seite auch die Dezimaldarstellung.

BenjaminHae avatar Dec 15 '21 19:12 BenjaminHae

Vielen Dank für deinen Input! Das hilft mir sehr. 👍

CrazyMarvin avatar Dec 18 '21 18:12 CrazyMarvin