Also im deutschen Stil spielen noch die Innenwinkel, die Längen der Seiten und die Gesamtfläche eine Rolle, alles in bestimmten Toleranzintervallen.
Wer es genauer wissen will kann ja im dt. Stil nach sports-soccer suchen. Die Vorlage dafür stammt aus dem französischen Stil, der schon in cartocss vorliegt.
“Profi”-Tipp: am besten einen Platz bei dem es funktioniert per Copy und Paste an den Zielort verfrachten (sofern passend natürlich!)
Ohne sport=* oder auf was spielst du an? Das würde mich sehr wundern, da pitch ja für sehr viele verschiedene Felder/Plätze steht. Tennis hat ja z.B. auch einen eigenen style.
Meine geometrische Vorstellungsfähigkeit ist gerade blockiert…
Könnte bitte jemand ohne Blockade mal im Stil ganz unten die Berechnung der Winkel dahingehend überprüfen, ob die auch mit negativen Breitengraden funktioniert?
Alternativ: Kennt jemand ein bemaltes Fußballfeld in Südafrika oder Australien? Vielleicht ist der Gegenbeweis leichter
Habs durchprobiert, 2 Felder, einmal links- und einmal rechtsdrehend in jedem Quadranten: Da werden 2 Winkel berechnet, angle_diff und angle. “angle_diff” ist richtig, damit wird ermittelt, ob das Ding ungefähr ein Rechteck ist. “angle” nimmt auf der Südhalbkugel merkwürdige Werte an, 270 z.B. Damit werden aber nur die Linien in die Ausrichtung des Spielfeldes gedreht, und ich kann mir nicht vorstellen, dass Mapnik mit “290° nach links drehen” Schwierigkeiten hätte.
Ich hab ein hübsch und ein weniger hübsch gerendertes gefunden. Allerdings geschätzt 20-30 unmarkierte. Hab allerdings nicht nachgesehen, ob da überall auch sport=* eingetragen ist.
Der Stil erkennt Fussballfelder unter anderem daran, dass der Winkel zwischen der ersten und der zweiten Linie ca. 90° beträgt. Dazu rechnet er mit st_azimuth die Winkel (a12 und a23) der beiden Linien gegen die Senkrechte aus, bildet die Differenz und nimmt dann den Betrag.
Bei einem Polygon aus (-2 -3) (-3 -2) (-2 -1) (-1 -2) geht das schief…
Die Winkel:
osm=> select degrees(st_azimuth(st_pointn(way2,1),st_pointn(way2,2))) as a12 , degrees(st_azimuth(st_pointn(way2,2),st_pointn(way2,3))) as a23
from (select ST_ExteriorRing('POLYGON((-2 -3,-3 -2,-2 -1,-1 -2,-2 -3))') as way2) as foo1;
a12 | a23
-----+-----
315 | 45
Der Betrag (die Codestücke hier sind so ziemlich das gleiche wie im deutschen Stil)
osm=> select abs(a12-a23) as angle_diff,(a12+a23+90)/2 as angle
from (select degrees(st_azimuth(st_pointn(way2,1),st_pointn(way2,2))) as a12 , degrees(st_azimuth(st_pointn(way2,2),st_pointn(way2,3))) as a23
from (select ST_ExteriorRing('POLYGON((-2 -3,-3 -2,-2 -1,-1 -2,-2 -3))') as way2) as foo1) as foo2;
angle_diff | angle
------------+-------
270 | 225
Als Bild:
Allerdings ist dieser Fehler überall drin, wenn man irgendwo anfängt, wo die beiden Linien links und rechts der Senkrechten liegen, auch auf der Nordhalbkugel. Gibt es irgendeinen Grund, warum die Linien in Südamerika häufiger so liegen als in Europa? Z.B. weil ST_ExteriorRing() immer näher bei der Nulllinie anfängt, oder weil osm2pgsql Flächen so importiert? Falls das nicht so ist, ist zwar ein potentieller Fehler, aber keine Erklärung gefunden
Mit einem angle_diff von 270 wird da erstmal nichts angezeigt, der Winkel muss lt. Bedingung im Stil im Wertebereich 86 bis 94 (einschl.) liegen. Vielleicht müsste man für Werte x > 180° entsprechend mit 360° - x rechnen?
Auf jeden Fall hört sich das nach einem neuen Trac-Ticket (http://trac.openstreetmap.fr) für Komponente “style osmfr” und später auch für den deutschen Stil an.
Vielleicht verlaufe ich mich auch in Rechnerei… Ich habe noch eine andere Theorie, die was mit Mercator und Äquatornähe zu tun hat (da sind die Felder ja deutlich kleiner). Es wäre also gut zu wissen, ob das wirklich die Ursache für Brasiliens Fussballfelder ist…
Könnte bitte mal jemand, der den Planeten in einer Datenbank hat diese Abfrage ausführen:
select osm_id,way_area,d12,d23,d13,a12,a23, abs(a12-a23) as angle_diff, (a12+a23+90)/2 as angle from (select *, st_npoints(way2) as nb, ST_Distance(st_pointn(way2,1),st_pointn(way2,2)) as d12, ST_Distance(st_pointn(way2,3),st_pointn(way2,2)) as d23, ST_Distance(st_pointn(way2,1),st_pointn(way2,3)) as d13, degrees(st_azimuth(st_pointn(way2,1),st_pointn(way2,2))) as a12, degrees(st_azimuth(st_pointn(way2,2),st_pointn(way2,3))) as a23 from (select *, st_area(way) as way_area, ST_ExteriorRing(ST_SimplifyPreserveTopology(way,100)) as way2 from (select osm_id,(st_dump(way)).geom as way from osm_polygon where osm_id in ( 17752531 , 123121774,231001446,230996845,197101255,273618870,231005583,119202184 )) as dump ) as simplified) as simplified2;
osm_id | way_area | d12 | d23 | d13 | a12 | a23 | angle_diff | angle
-----------+------------------+------------------+------------------+------------------+------------------+------------------+------------------+------------------
17752531 | 16016.2461500168 | 100.52086400347 | 158.917015451705 | 189.030475056445 | 58.874951968682 | 148.205193244697 | 89.3302412760151 | 148.54007260669
123121774 | 15899.274600029 | 101.455847539591 | 156.94597350703 | 186.501847711844 | 76.7869662763087 | 167.043144041439 | 90.2561777651306 | 166.915055158874
Anzupassen wäre vielleicht der Tabellenname (“osm_polygon”). Die heisst ja oft anders… Die beiden Felder 17752531 und 123121774 sind Fussballplätze in Deutschland mit Bemalung, die IDs 231001446, 230996845, 197101255, 273618870, 231005583 und 119202184 sind aus couchmappers Overpass-Abfrage oben und Beitrag Nr 1.
d12, d13, d23 sollten je nachdem, wie das Feld in OSM gezeichnet wurde, Länge, Breite und Diagonale darstellen.
Die way_area sollte keine Rolle spielen, da der Stil zwar 3 Fälle unterscheidet (kleiner 12000, 12000…17000 und größer 17000), aber damit praktisch alle Möglichkeiten abdeckt.
Danke, die Winkel waren ne lustige Theorie, aber sind unschuldig
Das Feld aus Nr. 1 (119202184) sollte an den Längen scheitern.
Das grosse Feld 231001446 wird bemalt. 230996845 auch…
Ich schätze die Mercatorprojektion ist schuld. Diese “mindestens 130 Einheiten”-Regel passt in Deutschland und Frankreich ganz gut. Da sind 130 Einheiten ca 85 Meter (130cos(50°)). Ein Spielfeld am 20. Breitengrad in Rio muss mindestens 130cos(20°)=122 Meter lang und 68*cos(20°)=63 Meter breit sein, um als ordentliches Spielfeld zu gelten.
Das passt dann auch zu den Werten, die mir JOSM anzeigt. Bedingung und SQL Statement im frz+dt. Stil müssten dann wohl überarbeitet werden.
ST_Distance_sphere(st_transform(st_pointn(way2,1),4326),st_transform(st_pointn(way2,2),4326)) as d12,
ST_Distance_sphere(st_transform(st_pointn(way2,3),4326),st_transform(st_pointn(way2,2),4326)) as d23,
ST_Distance_sphere(st_transform(st_pointn(way2,1),4326),st_transform(st_pointn(way2,3),4326)) as d13,