[FOSSGIS-Talk] Frage zu etwas aufwendigerem PostGIS Query

Stefan Keller sfkeller at gmail.com
So Aug 4 03:06:48 CEST 2013


Hallo Sven

Ohne genau nachvollzogen zu haben, ob die Lösung mit deinen drei
Schritten korrekt ist, kann ich vom Schiff aus höchstens folgenden
Tipp geben:
Probiere es mal mit einer WITH-Query (sog. CTE) [1]: Damit kannst du
zwei Vorverarbeitungsschritte separat berechnen lassen.

LG, Stefan

[1] http://www.postgresql.org/docs/9.2/static/queries-with.html




Am 7. Juli 2013 01:03 schrieb Sven Geggus <lists at fuchsschwanzdomain.de>:
> 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
> --
> ....................................................................
>
> FOSSGIS e.V, der Verein zur Förderung von Freier Software aus dem
> GIS-Bereich und Freier Geodaten!
> http://www.fossgis.de/             https://twitter.com/fossgis_eV
>
> ____________________________________________________________________
> FOSSGIS-Talk-Liste mailing list
> FOSSGIS-Talk-Liste at fossgis.de
> https://lists.fossgis.de/mailman/listinfo/fossgis-talk-liste