[FOSSGIS-Talk] Frage zu etwas aufwendigerem PostGIS Query

Sven Geggus lists at fuchsschwanzdomain.de
So Jul 7 01:03:19 CEST 2013


Hallo zusammen,

immer noch das Thema "Dominanz" von Gipfeln, aber inzwischen bin ich
einen Schritt weiter :)

"Manuell" kriege ich das schon hin, aber eben halt noch nicht in einem
einzigen query.  Mit diesem spatial join Zeug tue ich mich irgendwie immer
noch schwer.

Folgender Query gibt mir alle Gipfel und deren auf 10m gerundete
Höhen innerhalb einer Bounding-Box. 

Das ist erstmal nichts besonderes:

SELECT osm_id,
       name,
       10 * Round(ele / 10.0) AS ele,
       St_askml(way)          AS koordinaten
FROM   topo_view_osm_poi
WHERE  "nature" = 'peak'
       AND ele IS NOT NULL
       AND name IS NOT NULL
       AND way && St_transform(St_setsrid('BOX3D(7.62697 45.88989,7.79726 46.00626)' ::box3d,4326), 3857);

   osm_id   |          name          | ele  | koordinaten                                   
------------+------------------------+------+--------------------------------------------------------------------------------
 1749686878 | Furggen                | 3490 |<Point><coordinates>7.681258276575474,45.9568183575227</coordinates></Point>
  401234276 | Theodulhorn            | 3470 |<Point><coordinates>7.710857226198042,45.950145638504821</coordinates></Point>
 1288626069 | Palon di Tzere         | 2670 |<Point><coordinates>7.713213327525231,45.893277952466434</coordinates></Point>
  241018688 | Klein Matterhorn       | 3880 |<Point><coordinates>7.729951097225059,45.93843644500631</coordinates></Point>
  365064161 | Breithorn/Westgipfel   | 4160 |<Point><coordinates>7.748094371018422,45.94090714252183</coordinates></Point>
  393165629 | Riffelhorn             | 2930 |<Point><coordinates>7.757941523499883,45.982161445085175</coordinates></Point>
  393171089 | Breithorn/Ostgipfel    | 4140 |<Point><coordinates>7.758711828856015,45.939275370042026</coordinates></Point>
  393165636 | Gugle                  | 2700 |<Point><coordinates>7.76820693157763,45.997034253265859</coordinates></Point>
  364072386 | Castor                 | 4230 |<Point><coordinates>7.793273341602645,45.920849082674465</coordinates></Point>
  364072387 | Pollux                 | 4090 |<Point><coordinates>7.785347236356273,45.927782136284257</coordinates></Point>
 1356298379 | Breithorn Mittelgipfel | 4160 |<Point><coordinates>7.75708641718093,45.938644662524126</coordinates></Point>
 1356298439 | Breithorn Ostgipfel    | 4140 |<Point><coordinates>7.767109998784193,45.937499362791321</coordinates></Point>
 1356298568 | Roccia Nera            | 4080 |<Point><coordinates>7.775033139590126,45.932645585740957</coordinates></Point>
 1356298598 | Gendarm                | 4110 |<Point><coordinates>7.770395676767389,45.93586155494264</coordinates></Point>
 1373112102 | Gobba di Rollin        | 3900 |<Point><coordinates>7.735114164320536,45.924030555222643</coordinates></Point>
   26863664 | Matterhorn             | 4480 |<Point><coordinates>7.658565664688745,45.976450942324817</coordinates></Point>
(16 Zeilen)

Nun möchte ich bei allen diesen Gipfeln die Distanz zur nächsten
Höhenline mit der selben Höhe also die "Dominanz" berechnen.

Manuell kann ich mir diese Höhenlinie nun z.B. beim Matterhorn wie folgt selektieren:

SELECT id,
       st_astext(geom)	AS linie
FROM contours
WHERE height = 4480
ORDER BY geom <->
st_transform(st_setsrid(st_makepoint(7.658565664688745,45.976450942324817),4326),3857)
LIMIT 1;

    id     | linie                                                                                        
-----------+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 224489405 | LINESTRING(872141.824547766 5768071.92650356,872188.20766893 5768084.89183404,872195.043076259 5768071.92650356,872188.20766893 5768061.19535574,872141.824547766 5768071.92650356)
(1 Zeile)

Als dritten Schritt nun noch den Abstand Zwischen gefundener Höhenlinie und
Matterhorn:

SELECT ST_Distance(peak.way, contour.geom) AS dominanz
FROM topo_view_osm_poi peak,
     contours contour
WHERE peak.osm_id='26863664'
  AND contour.id='224489405';

     dominanz     
------------------
 21360.1572625574
(1 Zeile)

Das Matterhorn hat also eine Dominanz von 21,4 Kilometern.

Bleibt die Frage wie man diese 3 Schritte nun so in ein view packt, dass
eine Tabelle in dieser Art dabei rauskommt:

   osm_id   |          name          | ele  | dominanz         | koordinaten
------------+------------------------+------+--------------------------------------------------------------------------------
   26863664 | Matterhorn             | 4480 | 21360.1572625574 |<Point><coordinates>7.658565664688745,45.976450942324817</coordinates></Point>
(16 Zeilen)


Gruss

Sven

-- 
Microsoft ist offenbar die einzige Firma, die in der Lage ist, ein mit
Office nicht kompatibles Bürosoftwarepaket einzuführen.
                            (Florian Weimer in de.alt.sysadmin.recovery)
/me is giggls at ircnet, http://sven.gegg.us/ on the Web