Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Unwetterwarnungen nach PLZ #8

Open
CrazyMarvin opened this issue Nov 28, 2021 · 2 comments
Open

Unwetterwarnungen nach PLZ #8

CrazyMarvin opened this issue Nov 28, 2021 · 2 comments

Comments

@CrazyMarvin
Copy link

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.

@BenjaminHae
Copy link
Contributor

BenjaminHae commented Dec 15, 2021

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.

@CrazyMarvin
Copy link
Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants