x

Quadratgrad einer Bounding Box berechnen


  1. Quadratgrad einer Bounding Box berechnen · kerosin (Gast) · 12.08.2014 19:18 · [flux]

    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


    • Re: Quadratgrad einer Bounding Box berechnen · maxbe (Gast) · 12.08.2014 19:42 · [flux]

      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.


    • Re: Quadratgrad einer Bounding Box berechnen · Netzwolf (Gast) · 12.08.2014 22:29 · [flux]

      Nahmd,

      kerosin wrote:

      Ich möchte gerne wissen wie man aus einer gegebenen BBox (southWest lat+long und northEast lat+long) den Raumwinkel berechnen kann.

      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 4*pi*r², 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


    • Re: Quadratgrad einer Bounding Box berechnen · kerosin (Gast) · 13.08.2014 08:51 · [flux]

      Wow ihr Beiden danke für die Hilfen 🙂

      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 😉

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

      Danke nochmals!


    • Re: Quadratgrad einer Bounding Box berechnen · maxbe (Gast) · 13.08.2014 10:56 · [flux]

      kerosin wrote:

      Im geposteteten Ruby-Code finde ich mich nicht sonderlich gut zurecht

      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