Quadratgrad einer Bounding Box berechnen

Hallo,

Ich möchte gerne wissen wie man aus einer gegebenen BBox (southWest lat+long und northEast lat+long) den Raumwinkel berechnen kann oder ob irgendjemand eine Formel aus dem Ärmel schütteln könnte.
In diesem Thread gab es schon einen Hinweis (letzte Posts), allerdings fehlt mir das mathematische Verständnis dafür.

Hintergrund ist folgender:
Ich möchte gerne ein kleines Userscript schreiben und dabei die Notes API benutzen. Die lässt nur Abfragen bis 25 Quadratgrad zu, weshalb ich den Nutzer solche Anfragen gar nicht erst stellen lassen möchte. Weiterhin hab ich gesehen, dass Quadratgrad auch bei anderen API Abfragen verwendet werden, weshalb es möglicherweise für mehrere Leute interessant sein könnte, um Beschränkungen vorzunehmen.

Vielleicht ist ja jemand mathematisch begabter…

Viele Grüße

Ich denke, jemand der eine Begrenzung in Quadratgrad einführt, will sich eben gerade nicht mit irgendwelchen komplizierten Rechnereien auf der Kugel abmühen, sonst würde er eine Flächenbegrenzung nicht in so einer schrägen Einheit angeben. Das benachteiligt zwar Polbewohner und -mapper, aber 5x5 Grad sind recht grosszügig bemessen und auch auf Spitzbergen noch 100 km x 550 km.

Du kannst also auch deinen Nutzern eine Sperre bei (lat_oben - lat_unten)*(lon_rechts-lon_links)>25 setzen…

Grüße, Max

Nachtrag: Die Stelle in der API, wo die das prüft, fine ich nicht, aber es gibt einbounding_box_test.rb, wo die Quadratgrad berechnet werden.

Nahmd,

Ich geh davon aus, dass Du minlon, maxlon, minlat und maxlat in Bogenmaß umgerechnet hast (Bogenmaß = Grad / 180 * Pi): dann hat am Äquator einer Einheitskugel die Linie von minlon bis maxlon die Länge “maxlon-minlon”.

Die Länge der parallelen Bogenstücke reduziert sich mit steigender Breite “lat” auf “cos(lat) * (maxlon-minlon)”. Das integrierst Du von minlat bis maxlat und erhältst (Stammfunktion von cos ist sin): “(sin(maxlat)-sin(minlat)) * (maxlon-minlon)” (=gesuchte Formel).

Probe für die Vollkugel (es sollte 4pir², also auf Einheitskugel 4*pi herauskommen):
minlon=-180°=-pi
maxlon=+180°=+pi
minlat=-90°=-½pi
maxlat=+90°=½pi
[sin(½pi)-sin(-½pi)] * [(+pi) - (-pi)] = [(+1) - (-1)] * 2Pi = 2 * 2Pi = 4Pi

Heureka.

Gruß Wolf

Wow ihr Beiden danke für die Hilfen :slight_smile:

Also wenn ich das richtig sehe, so in JS: (die oberen Zuweisungen sind natürlich Quatsch, aber so erhalte ich die Daten von Leaflet)

var bboxExample= {
    swLng: -3.515625, 
    swLat: 50.2612538275847, 
    neLng: 23.510742187499996, 
    neLat: 58.0546319113729
}

minlon = bboxExample.swLng;
minlat = bboxExample.swLat;
maxlon = bboxExample.neLng;
maxlat = bboxExample.neLat;


var res = (Math.sin(maxlat)-Math.sin(minlat)) * (maxlon-minlon);
console.log(res); //27.08387247236192


Im geposteteten Ruby-Code finde ich mich nicht sonderlich gut zurecht, aber es geht denke ich vorallem um diese Definition, oder? Ich hoffe mal und geh davon aus, dass die Berechnung im Backend genau so laufen (bzw. nicht quick&dirty gerechnet werden), sonst wäre der Aufwand ja unnötig :wink:

Jetzt muss ich mir noch das areaSelect-Plugin von Leaflet angucken, ob man da eine Beschränkung einbauen kann.

Danke nochmals!

Ich auch nicht… Fremdsprachen waren nie meine stärke…

Ich meinte das hier

def test_bbox_area
@good_bbox.each do |string|
bbox = BoundingBox.from_s(string)
array = string.split(',')
assert_equal ((array[2].to_f - array[0].to_f) * (array[3].to_f - array[1].to_f)), bbox.area
end
end

Die rechnen da ganz ohne Winkelfunktionen und ohne die Kugeligkeit der Erde zu berücksichtigen. So als wäre die Erde flach, rechteckig und alle Längengrade parallel. 5Gradx5Grad sind überall 25 Quadratgrad, egal ob am Äquator oder in Polnähe. Passt ja auch, man will da keine Flächen berechnen, sondern nur irgendeine willkürliche Grenze setzen, damit keiner den Server leersaugt.

Grüße, Max