Hallo,ich habe mir eine OSM-Datenbank importiert (mit osmosis) und würde der Linestrings erzeugen. In der DB sind in der Tabelle ‘ways’ die ‘nodes’ über die ID referenziert die letztendlich den way bilden. Z. B:
Tabelle ways:
id(bigint); nodes(bigint[])
46274796; "{591050823,591050828}";
46276198; "{332143747,332143748}";
46276199; "{332143748,332143024,332142803}";
Tabelle nodes:
id(bigint); geom(geometry)
332142803; "0101000020E6100000FE6D0503BE79134042695EC42D294A40"
332143024; "0101000020E6100000D522A298BC791340D6879A8D3A294A40"
332143748; "0101000020E61000002C56C334C27913409A58857247294A40"
Es gibt noch eine weitere Tabelle ‘way_nodes’ die die einzelnen nodes mit den zugehörigen ways in Verbindung bringt, diese über ich aber gerne aus Zeitgründen übergehen. Momentan nutze ich sie allerdings um die Linestrings zu erzeugen:
UPDATE ways w1 SET linestring =
(SELECT st_MakeLine(geom)
FROM ( SELECT n.geom, w.id AS wID
FROM ways w
JOIN way_nodes wn
ON w.id=wn.way_id
JOIN nodes n
ON wn.node_id=n.id
ORDER BY wn.sequence_id
) foo
WHERE w1.id=foo.wid
GROUP BY foo.wid)
Diese Abfrage ist bei der Datenmenge allerdings sehr langsam, da es zwei joins beinhalten, sortieren muss etc. Man könnte, wie gesagt, die way_nodes-Tabelle auslassen, da die ways-Tabelle bereits ein Array mit den notwendigen Referenzen beinhalten. Dessen Reihenfolge müsste aber eingehalten werden. Allerdings ist mir nicht ganz klar wie ich das richtig nutze. Bisherige Versuche sind gescheitert und sahen z. B. so aus:
UPDATE ways w1 SET linestring =
(SELECT st_MakeLine(geom)
FROM ( SELECT n.geom, w.id AS wID
FROM ways w
JOIN nodes n
ON n.id= ANY(w.nodes)
) foo
WHERE w1.id=foo.wid
GROUP BY foo.wid)
Hätte jemand nen Vorschlag wie man das möglichst effektiv gewährleisten kann?
Danke.
Edit: Warum fliegen alle meine Umbrüche beim ersten Erstellen aus dem Text hier raus?